@meta2d/core 1.0.99 → 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 +64 -29
- package/src/canvas/canvas.js.map +1 -1
- package/src/core.js +17 -2
- 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 +2 -0
- package/src/pen/model.js.map +1 -1
- package/src/pen/render.js +137 -28
- 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
|
@@ -226,6 +226,7 @@ export interface Pen extends Rect {
|
|
|
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
|
@@ -1979,24 +1979,111 @@ function lineAnimateIconRender(icon) {
|
|
|
1979
1979
|
};
|
|
1980
1980
|
}
|
|
1981
1981
|
function renderElementOnLine(ctx, line, draw) {
|
|
1982
|
-
const dash = Array.isArray(line.lineAnimateDash) ? line.lineAnimateDash : (line.lineAnimateDash?.split(',').map(i => Number(i)) || [10, 20]);
|
|
1983
1982
|
const scale = line.calculative.canvas.store.data.scale;
|
|
1984
1983
|
const len = getLineLength(line) / scale;
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
|
|
1997
|
-
|
|
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
|
+
}
|
|
1998
2085
|
}
|
|
1999
|
-
}
|
|
2086
|
+
}
|
|
2000
2087
|
}
|
|
2001
2088
|
/**
|
|
2002
2089
|
* 模拟 canvas lineDash 计算
|
|
@@ -3701,28 +3788,48 @@ function dealWithVisio(command, pen, startX, startY) {
|
|
|
3701
3788
|
case 'ArcTo':
|
|
3702
3789
|
let endX2 = (command.v.X * 100 * width) / originWidth + x;
|
|
3703
3790
|
let endY2 = (command.v.Y * 100 * height) / originHeight + y;
|
|
3704
|
-
let h = command.v.A * 100 *
|
|
3791
|
+
let h = command.v.A * 100 * pen.calculative.canvas.store.data.scale;
|
|
3705
3792
|
// 计算弦的中点
|
|
3706
3793
|
let xm = (startX + endX2) / 2;
|
|
3707
3794
|
let ym = (startY + endY2) / 2;
|
|
3708
3795
|
// 计算弦的长度
|
|
3709
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
|
+
}
|
|
3710
3804
|
// 计算圆弧的半径
|
|
3711
|
-
let R = d
|
|
3712
|
-
//
|
|
3805
|
+
let R = (d * d) / (8 * Math.abs(h)) + Math.abs(h) / 2;
|
|
3806
|
+
// 计算垂直于弦的单位向量(向左侧,逆时针旋转90度)
|
|
3713
3807
|
let ux = -(endY2 - startY) / d;
|
|
3714
3808
|
let uy = (endX2 - startX) / d;
|
|
3715
|
-
//
|
|
3716
|
-
let
|
|
3717
|
-
|
|
3718
|
-
|
|
3719
|
-
|
|
3720
|
-
|
|
3721
|
-
let
|
|
3722
|
-
|
|
3723
|
-
// 计算起点和终点到圆心的角度
|
|
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
|
+
// 计算起点和终点相对于圆心的角度
|
|
3724
3817
|
let startAngle = Math.atan2(startY - yc, startX - xc);
|
|
3725
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
|
+
}
|
|
3726
3833
|
return {
|
|
3727
3834
|
c: 'arc',
|
|
3728
3835
|
v: {
|
|
@@ -3731,8 +3838,10 @@ function dealWithVisio(command, pen, startX, startY) {
|
|
|
3731
3838
|
radius: R,
|
|
3732
3839
|
startAngle: startAngle,
|
|
3733
3840
|
endAngle: endAngle,
|
|
3734
|
-
|
|
3841
|
+
anticlockwise: anticlockwise,
|
|
3735
3842
|
},
|
|
3843
|
+
startX: endX2,
|
|
3844
|
+
startY: endY2,
|
|
3736
3845
|
};
|
|
3737
3846
|
default:
|
|
3738
3847
|
const cloneCommand = deepClone(command);
|