@meta2d/core 1.0.98 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/canvas/canvas.d.ts +3 -0
- package/src/canvas/canvas.js +65 -32
- package/src/canvas/canvas.js.map +1 -1
- package/src/core.js +18 -3
- package/src/core.js.map +1 -1
- package/src/options.d.ts +1 -0
- package/src/options.js.map +1 -1
- package/src/pen/model.d.ts +3 -1
- package/src/pen/model.js.map +1 -1
- package/src/pen/render.js +148 -29
- package/src/pen/render.js.map +1 -1
package/src/options.d.ts
CHANGED
package/src/options.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../../packages/core/src/options.ts"],"names":[],"mappings":"AAIA,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,8CAAS,CAAA;IACT,qDAAQ,CAAA;IACR,iDAAM,CAAA;AACR,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB;
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../../packages/core/src/options.ts"],"names":[],"mappings":"AAIA,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,8CAAS,CAAA;IACT,qDAAQ,CAAA;IACR,iDAAM,CAAA;AACR,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB;AAuHD,MAAM,CAAC,MAAM,cAAc,GAAY;IACrC,UAAU,EACR,2EAA2E;IAC7E,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,GAAG;IACf,SAAS,EAAE,QAAQ;IACnB,YAAY,EAAE,QAAQ;IACtB,KAAK,EAAE,SAAS;IAChB,WAAW,EAAE,SAAS;IACtB,UAAU,EAAE,uBAAuB;IACnC,WAAW,EAAE,SAAS;IACtB,gBAAgB,EAAE,SAAS;IAC3B,YAAY,EAAE,CAAC;IACf,gBAAgB,EAAE,MAAM;IACxB,SAAS,EAAE,uBAAuB;IAClC,YAAY,EAAE,SAAS;IACvB,SAAS,EAAE,SAAS;IACpB,YAAY,EAAE,YAAY;IAC1B,WAAW,EAAE,WAAW;IACxB,UAAU,EAAE,UAAU;IACtB,WAAW,EAAE,SAAS;IACtB,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,WAAW,CAAC,QAAQ;IAC7B,QAAQ,EAAE,EAAE;IACZ,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,SAAS;IACpB,eAAe,EAAE,OAAO;IACxB,QAAQ,EAAE,EAAE;IACZ,eAAe,EAAE,EAAE;IACnB,YAAY,EAAE,IAAI;IAClB,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,KAAK;IACpB,YAAY,EAAE,SAAS;IACvB,aAAa,EAAE,SAAS;IACxB,aAAa,EAAE,CAAC;IAChB,aAAa,EAAE,CAAC;IAChB,UAAU,EAAE,EAAE;IACd,WAAW,EAAE,WAAW;IACxB,WAAW,EAAE,CAAC;IACd,cAAc,EAAE;QACd;YACE,CAAC,EAAE,GAAG;YACN,CAAC,EAAE,CAAC;SACL;QACD;YACE,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,GAAG;SACP;QACD;YACE,CAAC,EAAE,GAAG;YACN,CAAC,EAAE,CAAC;SACL;QACD;YACE,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,GAAG;SACP;KACF;IACD,gBAAgB,EAAE,IAAI;IACtB,iBAAiB,EAAE,IAAI;IACvB,gBAAgB,EAAE,IAAI;IACtB,gBAAgB,EAAE,KAAK;IACvB,iBAAiB,EAAE,CAAC;IACpB,oBAAoB,EAAE,KAAK;IAC3B,GAAG,EAAE,EAAE;IACP,aAAa,EAAE,EAAE;IACjB,SAAS,EAAE,EAAE;IACb,eAAe,EAAC,CAAC,WAAW,CAAC;IAC7B,QAAQ,EAAE,IAAI;IACd,UAAU,EAAE,IAAI;IAChB,eAAe,EAAE,EAAE;IACnB,cAAc,EAAE,EAAE;IAClB,aAAa,EAAC,IAAI;IAClB,aAAa,EAAC,EAAE;CACjB,CAAC"}
|
package/src/pen/model.d.ts
CHANGED
|
@@ -222,10 +222,11 @@ export interface Pen extends Rect {
|
|
|
222
222
|
lineAnimateDash?: number[] | string;
|
|
223
223
|
lineAnimateDashOffset?: number;
|
|
224
224
|
lineAnimateElementCount?: number;
|
|
225
|
-
lineAnimateType?: LineAnimateType;
|
|
225
|
+
lineAnimateType?: LineAnimateType | LineAnimateType[];
|
|
226
226
|
lineAnimateTargetType?: lineAnimateTargetType;
|
|
227
227
|
lineAnimateElementWidth?: number;
|
|
228
228
|
lineAnimateElementHeight?: number;
|
|
229
|
+
lineAnimateLoopMode?: boolean;
|
|
229
230
|
animateName?: string;
|
|
230
231
|
frames?: Pen[];
|
|
231
232
|
animateList?: Pen[][];
|
|
@@ -321,6 +322,7 @@ export interface Pen extends Rect {
|
|
|
321
322
|
formType?: string;
|
|
322
323
|
className?: string;
|
|
323
324
|
styles?: any;
|
|
325
|
+
hoverCursor?: string;
|
|
324
326
|
roles?: string[];
|
|
325
327
|
calculative?: {
|
|
326
328
|
x?: number;
|
package/src/pen/model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../../packages/core/src/pen/model.ts"],"names":[],"mappings":"AAKA,MAAM,CAAN,IAAY,OAGX;AAHD,WAAY,OAAO;IACjB,qCAAI,CAAA;IACJ,qCAAI,CAAA;AACN,CAAC,EAHW,OAAO,KAAP,OAAO,QAGlB;AAED,MAAM,CAAN,IAAY,SAQX;AARD,WAAY,SAAS;IACnB,yCAAI,CAAA;IACJ,uDAAW,CAAA;IACX,uDAAW,CAAA;IACX,yDAAY,CAAA;IACZ,iEAAgB,CAAA;IAChB,iBAAiB;IACjB,gDAAY,CAAA;AACd,CAAC,EARW,SAAS,KAAT,SAAS,QAQpB;AAED,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,iDAAO,CAAA;IACP,uCAAE,CAAA;IACF,yCAAG,CAAA;AACL,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB;AAED,MAAM,CAAN,IAAY,QAIX;AAJD,WAAY,QAAQ;IAClB,uCAAI,CAAA;IACJ,2CAAM,CAAA;IACN,2CAAM,CAAA;AACR,CAAC,EAJW,QAAQ,KAAR,QAAQ,QAInB;AAED,oBAAoB;AACpB,MAAM,CAAN,IAAY,WAKX;AALD,WAAY,WAAW;IACrB,iEAAkB,CAAA;IAClB,uEAAiB,CAAA;IACjB,yDAAU,CAAA;IACV,2DAAW,CAAA,CAAC,OAAO;AACrB,CAAC,EALW,WAAW,KAAX,WAAW,QAKtB;AAED,qBAAqB;AACrB,gBAAgB;AAChB,wBAAwB;AACxB,sBAAsB;AACtB,iBAAiB;AACjB,IAAI;AAEJ,wBAAwB;AACxB,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,MAAM;IACN,WAAW;IACX,YAAY;IACZ,UAAU;IACV,SAAS;IACT,YAAY;IACZ,UAAU;IACV,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,WAAW;IACX,cAAc;IACd,YAAY;IACZ,UAAU;IACV,aAAa;IACb,eAAe;CAChB,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAE/E,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,YAAY;IACZ,cAAc;IACd,eAAe;IACf,aAAa;IACb,OAAO;IACP,OAAO;IACP,SAAS;IACT,WAAW;CACZ,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AAE3E,MAAM,CAAC,MAAM,4BAA4B,GAAI,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAC,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAoB5M,MAAM,CAAN,IAAY,eAOX;AAPD,WAAY,eAAe;IACzB,yDAAM,CAAA;IACN,uDAAK,CAAA;IACL,mDAAG,CAAA;IACH,uDAAK,CAAA;IACL,+DAAS,CAAA;IACT,yDAAM,CAAA,CAAC,QAAQ;AACjB,CAAC,EAPW,eAAe,KAAf,eAAe,QAO1B;AAED,MAAM,CAAN,IAAY,qBAKX;AALD,WAAY,qBAAqB;IAC/B,mEAAK,CAAA;IACL,iEAAI,CAAA;IACJ,+DAAG,CAAA;IACH,uEAAO,CAAA,CAAC,OAAO;AACjB,CAAC,EALW,qBAAqB,KAArB,qBAAqB,QAKhC;
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../../packages/core/src/pen/model.ts"],"names":[],"mappings":"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"}
|
package/src/pen/render.js
CHANGED
|
@@ -1783,8 +1783,18 @@ export function setCtxLineAnimate(ctx, pen, store) {
|
|
|
1783
1783
|
}
|
|
1784
1784
|
pen.calculative.animateLineWidth &&
|
|
1785
1785
|
(ctx.lineWidth = pen.calculative.animateLineWidth * store.data.scale);
|
|
1786
|
+
if (Array.isArray(pen.lineAnimateType)) {
|
|
1787
|
+
pen.lineAnimateType.forEach(type => {
|
|
1788
|
+
renderLineAnimate(pen, store, type, ctx);
|
|
1789
|
+
});
|
|
1790
|
+
}
|
|
1791
|
+
else {
|
|
1792
|
+
renderLineAnimate(pen, store, pen.lineAnimateType, ctx);
|
|
1793
|
+
}
|
|
1794
|
+
}
|
|
1795
|
+
function renderLineAnimate(pen, store, type, ctx) {
|
|
1786
1796
|
let len = 0;
|
|
1787
|
-
switch (
|
|
1797
|
+
switch (type) {
|
|
1788
1798
|
case LineAnimateType.Beads:
|
|
1789
1799
|
if (pen.animateReverse) {
|
|
1790
1800
|
ctx.lineDashOffset = pen.calculative.animatePos;
|
|
@@ -1969,24 +1979,111 @@ function lineAnimateIconRender(icon) {
|
|
|
1969
1979
|
};
|
|
1970
1980
|
}
|
|
1971
1981
|
function renderElementOnLine(ctx, line, draw) {
|
|
1972
|
-
const dash = Array.isArray(line.lineAnimateDash) ? line.lineAnimateDash : (line.lineAnimateDash?.split(',').map(i => Number(i)) || [10, 20]);
|
|
1973
1982
|
const scale = line.calculative.canvas.store.data.scale;
|
|
1974
1983
|
const len = getLineLength(line) / scale;
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
|
|
1981
|
-
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
1984
|
+
if (line.lineAnimateLoopMode) {
|
|
1985
|
+
renderLoopElementsOnLine(ctx, line, draw, len, scale);
|
|
1986
|
+
}
|
|
1987
|
+
else {
|
|
1988
|
+
// 原有的间隔重复模式
|
|
1989
|
+
const dash = Array.isArray(line.lineAnimateDash) ? line.lineAnimateDash : (line.lineAnimateDash?.split(',').map(i => Number(i)) || [10, 20]);
|
|
1990
|
+
const elesPos = computeLineDashSegments(len, dash, line.lineAnimateDashOffset, line.lineAnimateElementCount);
|
|
1991
|
+
elesPos.forEach((i, index) => {
|
|
1992
|
+
const pos = calculateLineFrameStates(line, i.start);
|
|
1993
|
+
if (!pos)
|
|
1994
|
+
return;
|
|
1995
|
+
try {
|
|
1996
|
+
ctx.save();
|
|
1997
|
+
draw(ctx, line, pos, index);
|
|
1998
|
+
ctx.restore();
|
|
1999
|
+
}
|
|
2000
|
+
catch (e) {
|
|
2001
|
+
ctx.restore();
|
|
2002
|
+
console.warn(e);
|
|
2003
|
+
}
|
|
2004
|
+
});
|
|
2005
|
+
}
|
|
2006
|
+
}
|
|
2007
|
+
/**
|
|
2008
|
+
* 水流模式:元素连续流动,循环往复
|
|
2009
|
+
*/
|
|
2010
|
+
function renderLoopElementsOnLine(ctx, line, draw, len, scale) {
|
|
2011
|
+
const dash = Array.isArray(line.lineAnimateDash) ? line.lineAnimateDash : (line.lineAnimateDash?.split(',').map(i => Number(i)) || [10, 20]);
|
|
2012
|
+
const spacing = (dash[0] || 30) * scale; // 缩放后的间距
|
|
2013
|
+
const animatePos = line.calculative.animatePos; // 这是路径长度单位
|
|
2014
|
+
const worldAnchors = line.calculative.worldAnchors;
|
|
2015
|
+
if (worldAnchors.length > 1) {
|
|
2016
|
+
let from;
|
|
2017
|
+
let lastLength = 0; // 累积的路径长度
|
|
2018
|
+
for (let i = 0; i < worldAnchors.length; i++) {
|
|
2019
|
+
let pt = worldAnchors[i];
|
|
2020
|
+
if (from) {
|
|
2021
|
+
// 计算线段的实际像素距离(世界坐标)
|
|
2022
|
+
const segmentPixelLength = line.length;
|
|
2023
|
+
// 计算当前线段上第一个元素的偏移
|
|
2024
|
+
let firstOffset = (animatePos - lastLength) % spacing;
|
|
2025
|
+
// 关键:从负一个间距开始,确保元素无缝进入
|
|
2026
|
+
let offsetInSegment = firstOffset - spacing;
|
|
2027
|
+
let elementIndex = 0;
|
|
2028
|
+
// 扩展绘制范围,从负位置到线段末尾
|
|
2029
|
+
while (offsetInSegment < segmentPixelLength) {
|
|
2030
|
+
// 只绘制在线段范围内的元素(>=0)
|
|
2031
|
+
if (offsetInSegment >= 0) {
|
|
2032
|
+
// 计算元素在整条路径上的位置
|
|
2033
|
+
const absolutePos = lastLength + offsetInSegment;
|
|
2034
|
+
const offsetInstance = (animatePos - absolutePos) / scale;
|
|
2035
|
+
try {
|
|
2036
|
+
ctx.save();
|
|
2037
|
+
const pos = calculateLineFrameStates(line, offsetInstance);
|
|
2038
|
+
if (pos) {
|
|
2039
|
+
draw(ctx, line, pos, elementIndex);
|
|
2040
|
+
}
|
|
2041
|
+
ctx.restore();
|
|
2042
|
+
}
|
|
2043
|
+
catch (e) {
|
|
2044
|
+
ctx.restore();
|
|
2045
|
+
console.warn(e);
|
|
2046
|
+
}
|
|
2047
|
+
}
|
|
2048
|
+
offsetInSegment += spacing;
|
|
2049
|
+
elementIndex++;
|
|
2050
|
+
}
|
|
2051
|
+
// lastLength 累积的是像素距离
|
|
2052
|
+
lastLength += segmentPixelLength;
|
|
2053
|
+
}
|
|
2054
|
+
from = pt;
|
|
2055
|
+
}
|
|
2056
|
+
// 处理闭合路径
|
|
2057
|
+
if (line.close) {
|
|
2058
|
+
let pt = worldAnchors[0];
|
|
2059
|
+
if (from) {
|
|
2060
|
+
const segmentPixelLength = Math.sqrt((pt.x - from.x) ** 2 + (pt.y - from.y) ** 2);
|
|
2061
|
+
let firstOffset = (animatePos - lastLength) % spacing;
|
|
2062
|
+
let offsetInSegment = firstOffset - spacing;
|
|
2063
|
+
let elementIndex = 0;
|
|
2064
|
+
while (offsetInSegment < segmentPixelLength) {
|
|
2065
|
+
if (offsetInSegment >= 0) {
|
|
2066
|
+
const absolutePos = lastLength + offsetInSegment;
|
|
2067
|
+
const offsetInstance = (animatePos - absolutePos) / scale;
|
|
2068
|
+
try {
|
|
2069
|
+
ctx.save();
|
|
2070
|
+
const pos = calculateLineFrameStates(line, offsetInstance);
|
|
2071
|
+
if (pos) {
|
|
2072
|
+
draw(ctx, line, pos, elementIndex);
|
|
2073
|
+
}
|
|
2074
|
+
ctx.restore();
|
|
2075
|
+
}
|
|
2076
|
+
catch (e) {
|
|
2077
|
+
ctx.restore();
|
|
2078
|
+
console.warn(e);
|
|
2079
|
+
}
|
|
2080
|
+
}
|
|
2081
|
+
offsetInSegment += spacing;
|
|
2082
|
+
elementIndex++;
|
|
2083
|
+
}
|
|
2084
|
+
}
|
|
1988
2085
|
}
|
|
1989
|
-
}
|
|
2086
|
+
}
|
|
1990
2087
|
}
|
|
1991
2088
|
/**
|
|
1992
2089
|
* 模拟 canvas lineDash 计算
|
|
@@ -3691,28 +3788,48 @@ function dealWithVisio(command, pen, startX, startY) {
|
|
|
3691
3788
|
case 'ArcTo':
|
|
3692
3789
|
let endX2 = (command.v.X * 100 * width) / originWidth + x;
|
|
3693
3790
|
let endY2 = (command.v.Y * 100 * height) / originHeight + y;
|
|
3694
|
-
let h = command.v.A * 100 *
|
|
3791
|
+
let h = command.v.A * 100 * pen.calculative.canvas.store.data.scale;
|
|
3695
3792
|
// 计算弦的中点
|
|
3696
3793
|
let xm = (startX + endX2) / 2;
|
|
3697
3794
|
let ym = (startY + endY2) / 2;
|
|
3698
3795
|
// 计算弦的长度
|
|
3699
3796
|
let d = Math.sqrt((endX2 - startX) ** 2 + (endY2 - startY) ** 2);
|
|
3797
|
+
// 特殊情况:如果弧高为0或弦长为0,直接画直线
|
|
3798
|
+
if (Math.abs(h) < 0.001 || d < 0.001) {
|
|
3799
|
+
return {
|
|
3800
|
+
c: 'lineTo',
|
|
3801
|
+
v: { x: endX2, y: endY2 }
|
|
3802
|
+
};
|
|
3803
|
+
}
|
|
3700
3804
|
// 计算圆弧的半径
|
|
3701
|
-
let R = d
|
|
3702
|
-
//
|
|
3805
|
+
let R = (d * d) / (8 * Math.abs(h)) + Math.abs(h) / 2;
|
|
3806
|
+
// 计算垂直于弦的单位向量(向左侧,逆时针旋转90度)
|
|
3703
3807
|
let ux = -(endY2 - startY) / d;
|
|
3704
3808
|
let uy = (endX2 - startX) / d;
|
|
3705
|
-
//
|
|
3706
|
-
let
|
|
3707
|
-
|
|
3708
|
-
|
|
3709
|
-
|
|
3710
|
-
|
|
3711
|
-
let
|
|
3712
|
-
|
|
3713
|
-
// 计算起点和终点到圆心的角度
|
|
3809
|
+
// 圆心到弦中点的距离
|
|
3810
|
+
let centerDist = R - Math.abs(h);
|
|
3811
|
+
// 根据A的符号选择圆心位置
|
|
3812
|
+
// A>0: 弧向左侧凸起,圆心在右侧
|
|
3813
|
+
// A<0: 弧向右侧凸起,圆心在左侧
|
|
3814
|
+
let xc = xm - Math.sign(h) * ux * centerDist;
|
|
3815
|
+
let yc = ym - Math.sign(h) * uy * centerDist;
|
|
3816
|
+
// 计算起点和终点相对于圆心的角度
|
|
3714
3817
|
let startAngle = Math.atan2(startY - yc, startX - xc);
|
|
3715
3818
|
let endAngle = Math.atan2(endY2 - yc, endX2 - xc);
|
|
3819
|
+
// 确定绘制方向
|
|
3820
|
+
// 计算角度差,归一化到[-π, π]
|
|
3821
|
+
let angleDiff = endAngle - startAngle;
|
|
3822
|
+
while (angleDiff > Math.PI)
|
|
3823
|
+
angleDiff -= 2 * Math.PI;
|
|
3824
|
+
while (angleDiff < -Math.PI)
|
|
3825
|
+
angleDiff += 2 * Math.PI;
|
|
3826
|
+
// A>0时,应该逆时针绘制较小的弧
|
|
3827
|
+
// A<0时,应该顺时针绘制较小的弧
|
|
3828
|
+
let anticlockwise = h > 0;
|
|
3829
|
+
if ((anticlockwise && angleDiff > 0) || (!anticlockwise && angleDiff < 0)) {
|
|
3830
|
+
[startAngle, endAngle] = [endAngle, startAngle];
|
|
3831
|
+
anticlockwise = !anticlockwise;
|
|
3832
|
+
}
|
|
3716
3833
|
return {
|
|
3717
3834
|
c: 'arc',
|
|
3718
3835
|
v: {
|
|
@@ -3721,8 +3838,10 @@ function dealWithVisio(command, pen, startX, startY) {
|
|
|
3721
3838
|
radius: R,
|
|
3722
3839
|
startAngle: startAngle,
|
|
3723
3840
|
endAngle: endAngle,
|
|
3724
|
-
|
|
3841
|
+
anticlockwise: anticlockwise,
|
|
3725
3842
|
},
|
|
3843
|
+
startX: endX2,
|
|
3844
|
+
startY: endY2,
|
|
3726
3845
|
};
|
|
3727
3846
|
default:
|
|
3728
3847
|
const cloneCommand = deepClone(command);
|