@plait/core 0.1.0 → 0.1.2

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.
Files changed (47) hide show
  1. package/board/board.component.d.ts +4 -17
  2. package/board/board.component.interface.d.ts +0 -2
  3. package/constants/selection.d.ts +1 -0
  4. package/esm2020/board/board.component.interface.mjs +1 -1
  5. package/esm2020/board/board.component.mjs +49 -248
  6. package/esm2020/constants/selection.mjs +2 -0
  7. package/esm2020/core/element/element.component.mjs +2 -2
  8. package/esm2020/interfaces/board.mjs +11 -2
  9. package/esm2020/interfaces/viewport.mjs +1 -1
  10. package/esm2020/plugins/create-board.mjs +2 -1
  11. package/esm2020/plugins/with-hand.mjs +9 -6
  12. package/esm2020/plugins/with-moving.mjs +91 -0
  13. package/esm2020/plugins/with-selection.mjs +54 -13
  14. package/esm2020/plugins/with-viewport.mjs +11 -0
  15. package/esm2020/public-api.mjs +3 -1
  16. package/esm2020/transforms/selection.mjs +10 -2
  17. package/esm2020/utils/board.mjs +7 -3
  18. package/esm2020/utils/common.mjs +15 -0
  19. package/esm2020/utils/element.mjs +3 -3
  20. package/esm2020/utils/helper.mjs +14 -1
  21. package/esm2020/utils/index.mjs +4 -2
  22. package/esm2020/utils/moving-element.mjs +15 -0
  23. package/esm2020/utils/selected-element.mjs +14 -1
  24. package/esm2020/utils/viewport.mjs +170 -0
  25. package/esm2020/utils/weak-maps.mjs +5 -1
  26. package/fesm2015/plait-core.mjs +567 -562
  27. package/fesm2015/plait-core.mjs.map +1 -1
  28. package/fesm2020/plait-core.mjs +567 -559
  29. package/fesm2020/plait-core.mjs.map +1 -1
  30. package/interfaces/board.d.ts +4 -10
  31. package/interfaces/viewport.d.ts +2 -2
  32. package/package.json +1 -1
  33. package/plugins/with-moving.d.ts +2 -0
  34. package/plugins/with-selection.d.ts +6 -1
  35. package/plugins/with-viewport.d.ts +2 -0
  36. package/public-api.d.ts +2 -0
  37. package/transforms/selection.d.ts +3 -0
  38. package/utils/board.d.ts +1 -1
  39. package/utils/common.d.ts +1 -0
  40. package/utils/helper.d.ts +9 -0
  41. package/utils/index.d.ts +3 -1
  42. package/utils/moving-element.d.ts +5 -0
  43. package/utils/selected-element.d.ts +2 -0
  44. package/utils/viewport.d.ts +29 -0
  45. package/utils/weak-maps.d.ts +3 -0
  46. package/esm2020/utils/matrix.mjs +0 -170
  47. package/utils/matrix.d.ts +0 -82
@@ -37,6 +37,7 @@ export interface PlaitBoard {
37
37
  redrawElement: (context: PlaitPluginElementContext, previousContext?: PlaitPluginElementContext) => SVGGElement[] | void;
38
38
  destroyElement: (context: PlaitPluginElementContext) => void;
39
39
  isIntersectionSelection: (element: PlaitElement, range: Range) => boolean;
40
+ isMovable: (element: PlaitElement) => boolean;
40
41
  getRectangle: (element: PlaitElement) => RectangleClient | null;
41
42
  isWithinSelection: (element: PlaitElement) => boolean;
42
43
  }
@@ -54,16 +55,6 @@ export interface PlaitBoardMove {
54
55
  x: number;
55
56
  y: number;
56
57
  }
57
- export interface PlaitBoardViewport {
58
- zoom: number;
59
- autoFitPadding: number;
60
- focusPoint?: number[];
61
- viewBox?: number[];
62
- viewportWidth?: number;
63
- viewportHeight?: number;
64
- scrollLeft?: number;
65
- scrollTop?: number;
66
- }
67
58
  export declare const PlaitBoard: {
68
59
  getHost(board: PlaitBoard): SVGSVGElement;
69
60
  getElementHost(board: PlaitBoard): SVGGElement;
@@ -72,4 +63,7 @@ export declare const PlaitBoard: {
72
63
  getBoardNativeElement(board: PlaitBoard): HTMLElement;
73
64
  getRectangle(board: PlaitBoard): RectangleClient;
74
65
  getViewportContainer(board: PlaitBoard): HTMLElement;
66
+ isFocus(board: PlaitBoard): boolean;
67
+ isReadonly(board: PlaitBoard): boolean;
68
+ hasBeenTextEditing(board: PlaitBoard): boolean;
75
69
  };
@@ -1,9 +1,9 @@
1
1
  import { ExtendedType } from './custom-types';
2
2
  export interface BaseViewport {
3
3
  [key: string]: any;
4
- zoom: number;
5
4
  viewBackgroundColor: string;
6
- originationCoord?: number[];
5
+ zoom: number;
6
+ origination?: number[];
7
7
  }
8
8
  export declare type Viewport = ExtendedType<'Viewport', BaseViewport>;
9
9
  export interface ViewportInterface {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plait/core",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^12.2.0",
6
6
  "@angular/core": "^12.2.0"
@@ -0,0 +1,2 @@
1
+ import { PlaitBoard } from '../interfaces/board';
2
+ export declare function withMoving(board: PlaitBoard): PlaitBoard;
@@ -1,2 +1,7 @@
1
1
  import { PlaitBoard } from '../interfaces/board';
2
- export declare function withSelection<T extends PlaitBoard>(board: T): T;
2
+ export declare function withSelection(board: PlaitBoard): PlaitBoard;
3
+ export declare function getTemporaryElements(board: PlaitBoard): import("../interfaces").PlaitElement[] | undefined;
4
+ export declare function deleteTemporaryElements(board: PlaitBoard): void;
5
+ export declare function isSelectionMoving(board: PlaitBoard): boolean;
6
+ export declare function setSelectionMoving(board: PlaitBoard): void;
7
+ export declare function clearSelectionMoving(board: PlaitBoard): void;
@@ -0,0 +1,2 @@
1
+ import { PlaitBoard } from '../interfaces/board';
2
+ export declare function withViewport(board: PlaitBoard): PlaitBoard;
package/public-api.d.ts CHANGED
@@ -9,3 +9,5 @@ export * from './interfaces';
9
9
  export * from './plait.module';
10
10
  export * from './transforms';
11
11
  export * from './utils';
12
+ export * from './plugins/with-selection';
13
+ export * from './plugins/with-moving';
@@ -1,7 +1,10 @@
1
1
  import { PlaitBoard } from '../interfaces/board';
2
2
  import { Selection } from '../interfaces/selection';
3
+ import { PlaitElement } from '../interfaces/element';
3
4
  export declare function setSelection(board: PlaitBoard, selection: Selection | null): void;
4
5
  export interface SelectionTransforms {
5
6
  setSelection: (board: PlaitBoard, selection: Selection | null) => void;
7
+ setSelectionWithTemporaryElements: (board: PlaitBoard, elements: PlaitElement[]) => void;
6
8
  }
7
9
  export declare const SelectionTransforms: SelectionTransforms;
10
+ export declare function setSelectionWithTemporaryElements(board: PlaitBoard, elements: PlaitElement[]): void;
package/utils/board.d.ts CHANGED
@@ -10,4 +10,4 @@ export declare type ViewBox = {
10
10
  };
11
11
  export declare function transformPoints(board: PlaitBoard, points: Point[]): Point[];
12
12
  export declare function transformPoint(board: PlaitBoard, point: Point): Point;
13
- export declare function isNoSelectionElement(e: Event): Element | null;
13
+ export declare function isInPlaitBoard(board: PlaitBoard, x: number, y: number): boolean;
@@ -0,0 +1 @@
1
+ export declare const throttleRAF: (fn: () => void) => void;
package/utils/helper.d.ts CHANGED
@@ -1 +1,10 @@
1
1
  export declare function isNullOrUndefined(value: any): boolean;
2
+ /**
3
+ * 规范 point
4
+ * @param point
5
+ * @returns point
6
+ */
7
+ export declare function normalizePoint(point: number[]): {
8
+ x: number;
9
+ y: number;
10
+ };
package/utils/index.d.ts CHANGED
@@ -6,10 +6,12 @@ export * from './history';
6
6
  export * from './hotkeys';
7
7
  export * from './id-creator';
8
8
  export * from './math';
9
- export * from './matrix';
10
9
  export * from './weak-maps';
11
10
  export * from './selected-element';
12
11
  export * from './draw/rectangle';
13
12
  export * from './draw/arrow';
14
13
  export * from './tree';
15
14
  export * from './element';
15
+ export * from './viewport';
16
+ export * from './common';
17
+ export * from './moving-element';
@@ -0,0 +1,5 @@
1
+ import { PlaitBoard, PlaitElement } from '../interfaces';
2
+ export declare const getMovingElements: (board: PlaitBoard) => PlaitElement[];
3
+ export declare const addMovingElements: (board: PlaitBoard, elements: PlaitElement[]) => void;
4
+ export declare const removeMovingElements: (board: PlaitBoard) => void;
5
+ export declare const cacheMovingElements: (board: PlaitBoard, elements: PlaitElement[]) => void;
@@ -1,6 +1,8 @@
1
1
  import { PlaitBoard } from '../interfaces/board';
2
2
  import { PlaitElement } from '../interfaces/element';
3
+ import { Range } from '../interfaces/selection';
3
4
  export declare const calcElementIntersectionSelection: (board: PlaitBoard) => PlaitElement[];
5
+ export declare const isIntersectionElements: (board: PlaitBoard, elements: PlaitElement[], ranges: Range[]) => boolean;
4
6
  export declare const cacheSelectedElements: (board: PlaitBoard, selectedElements: PlaitElement[]) => void;
5
7
  export declare const getSelectedElements: (board: PlaitBoard) => PlaitElement[];
6
8
  export declare const addSelectedElement: (board: PlaitBoard, element: PlaitElement) => void;
@@ -0,0 +1,29 @@
1
+ import { PlaitBoard, RectangleClient } from '../interfaces';
2
+ export declare function getViewportContainerRect(board: PlaitBoard): {
3
+ width: number;
4
+ height: number;
5
+ };
6
+ export declare function getElementHostBBox(board: PlaitBoard, zoom: number): {
7
+ left: number;
8
+ right: number;
9
+ top: number;
10
+ bottom: number;
11
+ };
12
+ /**
13
+ * 验证缩放比是否符合限制,如果超出限制,则返回合适的缩放比
14
+ * @param zoom 缩放比
15
+ * @param minZoom 最小缩放比
16
+ * @param maxZoom 最大缩放比
17
+ * @returns 正确的缩放比
18
+ */
19
+ export declare function clampZoomLevel(zoom: number, minZoom?: number, maxZoom?: number): number;
20
+ export declare function getViewBox(board: PlaitBoard, zoom: number): number[];
21
+ export declare function setSVGViewBox(board: PlaitBoard, viewBox: number[]): void;
22
+ export declare function updateViewportContainerOffset(board: PlaitBoard, origination?: number[]): void;
23
+ export declare function setViewportContainerScroll(board: PlaitBoard, left: number, top: number): void;
24
+ export declare function initializeViewport(board: PlaitBoard): void;
25
+ export declare function initializeViewportContainerOffset(board: PlaitBoard): void;
26
+ export declare function setViewport(board: PlaitBoard, origination: number[], zoom?: number): void;
27
+ export declare function changeZoom(board: PlaitBoard, newZoom: number, isCenter?: boolean): void;
28
+ export declare function fitViewport(board: PlaitBoard): void;
29
+ export declare function scrollToRectangle(board: PlaitBoard, client: RectangleClient): void;
@@ -12,3 +12,6 @@ export declare const BOARD_TO_HOST: WeakMap<PlaitBoard, SVGSVGElement>;
12
12
  export declare const BOARD_TO_ELEMENT_HOST: WeakMap<PlaitBoard, SVGGElement>;
13
13
  export declare const BOARD_TO_SELECTED_ELEMENT: WeakMap<PlaitBoard, PlaitElement[]>;
14
14
  export declare const BOARD_TO_MOVING_POINT: WeakMap<PlaitBoard, Point>;
15
+ export declare const BOARD_TO_IS_SELECTION_MOVING: WeakMap<PlaitBoard, boolean>;
16
+ export declare const BOARD_TO_TEMPORARY_ELEMENTS: WeakMap<PlaitBoard, PlaitElement[]>;
17
+ export declare const BOARD_TO_MOVING_ELEMENT: WeakMap<PlaitBoard, PlaitElement[]>;
@@ -1,170 +0,0 @@
1
- import { SCROLL_BAR_WIDTH } from '../constants';
2
- import { PlaitBoard } from '../interfaces';
3
- /**
4
- * 逆矩阵
5
- * [a c e]
6
- * [b d f]
7
- * [0 0 1]
8
- * @param newMatrix 输出返回矩阵
9
- * @param matrix 新矩阵
10
- * @returns 逆矩阵
11
- */
12
- export function invertMatrix(newMatrix, matrix) {
13
- const [n, r, a, i, o, c, l, s, u] = matrix;
14
- const determinant = u * o - c * s;
15
- const h = -u * i + c * l;
16
- const f = s * i - o * l;
17
- const product = n * determinant + r * h + a * f;
18
- if (!product) {
19
- return null;
20
- }
21
- const reciprocal = 1 / product;
22
- newMatrix[0] = determinant * reciprocal;
23
- newMatrix[1] = (-u * r + a * s) * reciprocal;
24
- newMatrix[2] = (c * r - a * o) * reciprocal;
25
- newMatrix[3] = h * reciprocal;
26
- newMatrix[4] = (u * n - a * l) * reciprocal;
27
- newMatrix[5] = (-c * n + a * i) * reciprocal;
28
- newMatrix[6] = f * reciprocal;
29
- newMatrix[7] = (-s * n + r * l) * reciprocal;
30
- newMatrix[8] = (o * n - r * i) * reciprocal;
31
- return newMatrix;
32
- }
33
- /**
34
- * 将视图坐标与反转矩阵相乘,以得到原始坐标
35
- * 使用给定的矩阵进行转换
36
- * 矩阵与向量乘法,3 维向量与3x3矩阵的乘积
37
- * [m11 m12 m13][v1]
38
- * [m21 m22 m23][v2]
39
- * [m31 m32 m33][v3]
40
- * @param out 输出结果向量
41
- * @param t 要转换的向量
42
- * @param n 矩阵转换
43
- * @returns [v1 * m11 + v2 * m12 + v3 * m13, v1 * m21 + v2 * m22 + v3 * m23, v1 * m31 + v2 * m32 + v3 * m33];
44
- */
45
- export function transformMat3(out, vector, matrix) {
46
- out = [
47
- vector[0] * matrix[0] + vector[1] * matrix[3] + vector[2] * matrix[6],
48
- vector[0] * matrix[1] + vector[1] * matrix[4] + vector[2] * matrix[7],
49
- vector[0] * matrix[2] + vector[1] * matrix[5] + vector[2] * matrix[8]
50
- ];
51
- return out;
52
- }
53
- /**
54
- * 规范 point
55
- * @param point
56
- * @returns point
57
- */
58
- export function normalizePoint(point) {
59
- return Array.isArray(point)
60
- ? {
61
- x: point[0],
62
- y: point[1]
63
- }
64
- : point;
65
- }
66
- /**
67
- * 将一个点坐标反转回它的原始坐标
68
- * @param point 表示要反转的点的视图坐标,它是一个长度为 2 的数组,存储点的 x 和 y 坐标
69
- * @param matrix 表示视图矩阵,是在视图中对图形进行缩放和平移时使用的矩阵
70
- * @returns 最终结果是一个长度为 3 的数组,存储点的 x,y 和 w 坐标(w 坐标是点的齐次坐标)
71
- */
72
- export function invertViewportCoordinates(point, matrix) {
73
- const { x, y } = normalizePoint(point);
74
- const invertedMatrix = invertMatrix([], matrix);
75
- return transformMat3([], [x, y, 1], invertedMatrix);
76
- }
77
- export function convertToViewportCoordinates(point, matrix) {
78
- const { x, y } = normalizePoint(point);
79
- return transformMat3([], [x, y, 1], matrix);
80
- }
81
- /**
82
- * 获取 contentContainer 的 clientBox
83
- * @param board
84
- * @returns
85
- */
86
- export function getViewportContainerBox(board) {
87
- const { hideScrollbar } = board.options;
88
- const scrollBarWidth = hideScrollbar ? SCROLL_BAR_WIDTH : 0;
89
- const container = PlaitBoard.getViewportContainer(board);
90
- const containerRect = container.getBoundingClientRect();
91
- const x = containerRect.x || containerRect.left;
92
- const y = containerRect.y || containerRect.top;
93
- const width = containerRect.width - scrollBarWidth;
94
- const height = containerRect.height - scrollBarWidth;
95
- return {
96
- minX: x,
97
- minY: y,
98
- maxX: x + width,
99
- maxY: y + height,
100
- x,
101
- y,
102
- width,
103
- height
104
- };
105
- }
106
- /**
107
- * 获取 board.plait-board 的 clientBox
108
- * @param board
109
- * @returns
110
- */
111
- export function getBoardClientBox(board) {
112
- const { hideScrollbar } = board.options;
113
- const scrollBarWidth = hideScrollbar ? SCROLL_BAR_WIDTH : 0;
114
- const viewportRect = PlaitBoard.getViewportContainer(board).getBoundingClientRect();
115
- return {
116
- width: viewportRect.width + scrollBarWidth,
117
- height: viewportRect.height + scrollBarWidth
118
- };
119
- }
120
- /**
121
- * 获取 rootGroup 相对于当前 svg 空间的最小矩阵坐标
122
- */
123
- export function getRootGroupBBox(board, zoom) {
124
- const elementHost = PlaitBoard.getElementHost(board);
125
- const rootGroupBox = elementHost.getBBox();
126
- const viewportContainerBox = getViewportContainerBox(board);
127
- const containerWidth = viewportContainerBox.width / zoom;
128
- const containerHeight = viewportContainerBox.height / zoom;
129
- let left;
130
- let right;
131
- let top;
132
- let bottom;
133
- if (rootGroupBox.width < containerWidth) {
134
- const offsetX = rootGroupBox.x + rootGroupBox.width / 2;
135
- const containerX = containerWidth / 2;
136
- left = offsetX - containerX;
137
- right = offsetX + containerX;
138
- }
139
- else {
140
- left = rootGroupBox.x;
141
- right = rootGroupBox.x + rootGroupBox.width;
142
- }
143
- if (rootGroupBox.height < containerHeight) {
144
- const offsetY = rootGroupBox.y + rootGroupBox.height / 2;
145
- const containerY = containerHeight / 2;
146
- top = offsetY - containerY;
147
- bottom = offsetY + containerY;
148
- }
149
- else {
150
- top = rootGroupBox.y;
151
- bottom = rootGroupBox.y + rootGroupBox.height;
152
- }
153
- return {
154
- left,
155
- right,
156
- top,
157
- bottom
158
- };
159
- }
160
- /**
161
- * 验证缩放比是否符合限制,如果超出限制,则返回合适的缩放比
162
- * @param zoom 缩放比
163
- * @param minZoom 最小缩放比
164
- * @param maxZoom 最大缩放比
165
- * @returns 正确的缩放比
166
- */
167
- export function clampZoomLevel(zoom, minZoom = 0.2, maxZoom = 4) {
168
- return zoom < minZoom ? minZoom : zoom > maxZoom ? maxZoom : zoom;
169
- }
170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0cml4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvcGxhaXQvc3JjL3V0aWxzL21hdHJpeC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsU0FBbUIsRUFBRSxNQUFnQjtJQUM5RCxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7SUFDM0MsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QixNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsV0FBVyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUVoRCxJQUFJLENBQUMsT0FBTyxFQUFFO1FBQ1YsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUVELE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUM7SUFDL0IsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsR0FBRyxVQUFVLENBQUM7SUFDeEMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxVQUFVLENB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Q0FBQyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUM7S0FDL0M7SUFDRCxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsZUFBZSxFQUFFO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDekQsTUFBTSxVQUFVLEdBQUcsZUFBZSxHQUFHLENBQUMsQ0FBQztRQUN2QyxHQUFHLEdBQUcsT0FBTyxHQUFHLFVBQVUsQ0FBQztRQUMzQixNQUFNLEdBQUcsT0FBTyxHQUFHLFVBQVUsQ0FBQztLQUNqQztTQUFNO1FBQ0gsR0FBRyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDckIsTUFBTSxHQUFHLFlBQVksQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztLQUNqRDtJQUNELE9BQU87UUFDSCxJQUFJO1FBQ0osS0FBSztRQUNMLEdBQUc7UUFDSCxNQUFNO0tBQ1QsQ0FBQztBQUNOLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLElBQVksRUFBRSxPQUFPLEdBQUcsR0FBRyxFQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ25FLE9BQU8sSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUN0RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU0NST0xMX0JBUl9XSURUSCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBQbGFpdEJvYXJkIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5cbi8qKlxuICog6YCG55+p6Zi1XG4gKiBbYSBjIGVdXG4gKiBbYiBkIGZdXG4gKiBbMCAwIDFdXG4gKiBAcGFyYW0gbmV3TWF0cml4IOi+k+WHuui/lOWbnuefqemYtVxuICogQHBhcmFtIG1hdHJpeCDmlrDnn6npmLVcbiAqIEByZXR1cm5zIOmAhuefqemYtVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0TWF0cml4KG5ld01hdHJpeDogbnVtYmVyW10sIG1hdHJpeDogbnVtYmVyW10pIHtcbiAgICBjb25zdCBbbiwgciwgYSwgaSwgbywgYywgbCwgcywgdV0gPSBtYXRyaXg7XG4gICAgY29uc3QgZGV0ZXJtaW5hbnQgPSB1ICogbyAtIGMgKiBzO1xuICAgIGNvbnN0IGggPSAtdSAqIGkgKyBjICogbDtcbiAgICBjb25zdCBmID0gcyAqIGkgLSBvICogbDtcbiAgICBjb25zdCBwcm9kdWN0ID0gbiAqIGRldGVybWluYW50ICsgciAqIGggKyBhICogZjtcblxuICAgIGlmICghcHJvZHVjdCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByZWNpcHJvY2FsID0gMSAvIHByb2R1Y3Q7XG4gICAgbmV3TWF0cml4WzBdID0gZGV0ZXJtaW5hbnQgKiByZWNpcHJvY2FsO1xuICAgIG5ld01hdHJpeFsxXSA9ICgtdSAqIHIgKyBhICogcykgKiByZWNpcHJvY2FsO1xuICAgIG5ld01hdHJpeFsyXSA9IChjICogciAtIGEgKiBvKSAqIHJlY2lwcm9jYWw7XG4gICAgbmV3TWF0cml4WzNdID0gaCAqIHJlY2lwcm9jYWw7XG4gICAgbmV3TWF0cml4WzRdID0gKHUgKiBuIC0gYSAqIGwpICogcmVjaXByb2NhbDtcbiAgICBuZXdNYXRyaXhbNV0gPSAoLWMgKiBuICsgYSAqIGkpICogcmVjaXByb2NhbDtcbiAgICBuZXdNYXRyaXhbNl0gPSBmICogcmVjaXByb2NhbDtcbiAgICBuZXdNYXRyaXhbN10gPSAoLXMgKiBuICsgciAqIGwpICogcmVjaXByb2NhbDtcbiAgICBuZXdNYXRyaXhbOF0gPSAobyAqIG4gLSByICogaSkgKiByZWNpcHJvY2FsO1xuXG4gICAgcmV0dXJuIG5ld01hdHJpeDtcbn1cblxuLyoqXG4gKiDlsIbop4blm77lnZDmoIfkuI7lj43ovaznn6npmLXnm7jkuZjvvIzku6XlvpfliLDljp/lp4vlnZDmoIdcbiAqIOS9v+eUqOe7meWumueahOefqemYtei/m+ihjOi9rOaNolxuICog55+p6Zi15LiO5ZCR6YeP5LmY5rOV77yMMyDnu7TlkJHph4/kuI4zeDPnn6npmLXnmoTkuZjnp69cbiAqIFttMTEgbTEyIG0xM11bdjFdXG4gKiBbbTIxIG0yMiBtMjNdW3YyXVxuICogW20zMSBtMzIgbTMzXVt2M11cbiAqIEBwYXJhbSBvdXQg6L6T5Ye657uT5p6c5ZCR6YePXG4gKiBAcGFyYW0gdCDopoHovazmjaLnmoTlkJHph49cbiAqIEBwYXJhbSBuIOefqemYtei9rOaNolxuICogQHJldHVybnMgW3YxICogbTExICsgdjIgKiBtMTIgKyB2MyAqIG0xMywgdjEgKiBtMjEgKyB2MiAqIG0yMiArIHYzICogbTIzLCB2MSAqIG0zMSArIHYyICogbTMyICsgdjMgKiBtMzNdO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0MyhvdXQ6IG51bWJlcltdLCB2ZWN0b3I6IG51bWJlcltdLCBtYXRyaXg6IG51bWJlcltdKSB7XG4gICAgb3V0ID0gW1xuICAgICAgICB2ZWN0b3JbMF0gKiBtYXRyaXhbMF0gKyB2ZWN0b3JbMV0gKiBtYXRyaXhbM10gKyB2ZWN0b3JbMl0gKiBtYXRyaXhbNl0sXG4gICAgICAgIHZlY3RvclswXSAqIG1hdHJpeFsxXSArIHZlY3RvclsxXSAqIG1hdHJpeFs0XSArIHZlY3RvclsyXSAqIG1hdHJpeFs3XSxcbiAgICAgICAgdmVjdG9yWzBdICogbWF0cml4WzJdICsgdmVjdG9yWzFdICogbWF0cml4WzVdICsgdmVjdG9yWzJdICogbWF0cml4WzhdXG4gICAgXTtcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIOinhOiMgyBwb2ludFxuICogQHBhcmFtIHBvaW50XG4gKiBAcmV0dXJucyBwb2ludFxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUG9pbnQocG9pbnQ6IG51bWJlcltdKSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocG9pbnQpXG4gICAgICAgID8ge1xuICAgICAgICAgICAgICB4OiBwb2ludFswXSxcbiAgICAgICAgICAgICAgeTogcG9pbnRbMV1cbiAgICAgICAgICB9XG4gICAgICAgIDogcG9pbnQ7XG59XG5cbi8qKlxuICog5bCG5LiA5Liq54K55Z2Q5qCH5Y+N6L2s5Zue5a6D55qE5Y6f5aeL5Z2Q5qCHXG4gKiBAcGFyYW0gcG9pbnQg6KGo56S66KaB5Y+N6L2s55qE54K555qE6KeG5Zu+5Z2Q5qCH77yM5a6D5piv5LiA5Liq6ZW/5bqm5Li6IDIg55qE5pWw57uE77yM5a2Y5YKo54K555qEIHgg5ZKMIHkg5Z2Q5qCHXG4gKiBAcGFyYW0gbWF0cml4IOihqOekuuinhuWbvuefqemYte+8jOaYr+WcqOinhuWbvuS4reWvueWbvuW9oui/m+ihjOe8qeaUvuWSjOW5s+enu+aXtuS9v+eUqOeahOefqemYtVxuICogQHJldHVybnMg5pyA57uI57uT5p6c5piv5LiA5Liq6ZW/5bqm5Li6IDMg55qE5pWw57uE77yM5a2Y5YKo54K555qEIHjvvIx5IOWSjCB3IOWdkOagh++8iHcg5Z2Q5qCH5piv54K555qE6b2Q5qyh5Z2Q5qCHKVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0Vmlld3BvcnRDb29yZGluYXRlcyhwb2ludDogbnVtYmVyW10sIG1hdHJpeDogbnVtYmVyW10pIHtcbiAgICBjb25zdCB7IHgsIHkgfSA9IG5vcm1hbGl6ZVBvaW50KHBvaW50KTtcbiAgICBjb25zdCBpbnZlcnRlZE1hdHJpeCA9IGludmVydE1hdHJpeChbXSwgbWF0cml4KTtcbiAgICByZXR1cm4gdHJhbnNmb3JtTWF0MyhbXSwgW3gsIHksIDFdLCBpbnZlcnRlZE1hdHJpeCBhcyBbXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9WaWV3cG9ydENvb3JkaW5hdGVzKHBvaW50OiBudW1iZXJbXSwgbWF0cml4OiBudW1iZXJbXSkge1xuICAgIGNvbnN0IHsgeCwgeSB9ID0gbm9ybWFsaXplUG9pbnQocG9pbnQpO1xuICAgIHJldHVybiB0cmFuc2Zvcm1NYXQzKFtdLCBbeCwgeSwgMV0sIG1hdHJpeCk7XG59XG5cbi8qKlxuICog6I635Y+WIGNvbnRlbnRDb250YWluZXIg55qEIGNsaWVudEJveFxuICogQHBhcmFtIGJvYXJkXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vmlld3BvcnRDb250YWluZXJCb3goYm9hcmQ6IFBsYWl0Qm9hcmQpIHtcbiAgICBjb25zdCB7IGhpZGVTY3JvbGxiYXIgfSA9IGJvYXJkLm9wdGlvbnM7XG4gICAgY29uc3Qgc2Nyb2xsQmFyV2lkdGggPSBoaWRlU2Nyb2xsYmFyID8gU0NST0xMX0JBUl9XSURUSCA6IDA7XG4gICAgY29uc3QgY29udGFpbmVyID0gUGxhaXRCb2FyZC5nZXRWaWV3cG9ydENvbnRhaW5lcihib2FyZCk7XG4gICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB4ID0gY29udGFpbmVyUmVjdC54IHx8IGNvbnRhaW5lclJlY3QubGVmdDtcbiAgICBjb25zdCB5ID0gY29udGFpbmVyUmVjdC55IHx8IGNvbnRhaW5lclJlY3QudG9wO1xuICAgIGNvbnN0IHdpZHRoID0gY29udGFpbmVyUmVjdC53aWR0aCAtIHNjcm9sbEJhcldpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IGNvbnRhaW5lclJlY3QuaGVpZ2h0IC0gc2Nyb2xsQmFyV2lkdGg7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBtaW5YOiB4LFxuICAgICAgICBtaW5ZOiB5LFxuICAgICAgICBtYXhYOiB4ICsgd2lkdGgsXG4gICAgICAgIG1heFk6IHkgKyBoZWlnaHQsXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHRcbiAgICB9O1xufVxuXG4vKipcbiAqIOiOt+WPliBib2FyZC5wbGFpdC1ib2FyZCDnmoQgY2xpZW50Qm94XG4gKiBAcGFyYW0gYm9hcmRcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCb2FyZENsaWVudEJveChib2FyZDogUGxhaXRCb2FyZCkge1xuICAgIGNvbnN0IHsgaGlkZVNjcm9sbGJhciB9ID0gYm9hcmQub3B0aW9ucztcbiAgICBjb25zdCBzY3JvbGxCYXJXaWR0aCA9IGhpZGVTY3JvbGxiYXIgPyBTQ1JPTExfQkFSX1dJRFRIIDogMDtcbiAgICBjb25zdCB2aWV3cG9ydFJlY3QgPSBQbGFpdEJvYXJkLmdldFZpZXdwb3J0Q29udGFpbmVyKGJvYXJkKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aDogdmlld3BvcnRSZWN0LndpZHRoICsgc2Nyb2xsQmFyV2lkdGgsXG4gICAgICAgIGhlaWdodDogdmlld3BvcnRSZWN0LmhlaWdodCArIHNjcm9sbEJhcldpZHRoXG4gICAgfTtcbn1cblxuLyoqXG4gKiDojrflj5Ygcm9vdEdyb3VwIOebuOWvueS6juW9k+WJjSBzdmcg56m66Ze055qE5pyA5bCP55+p6Zi15Z2Q5qCHXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb290R3JvdXBCQm94KGJvYXJkOiBQbGFpdEJvYXJkLCB6b29tOiBudW1iZXIpIHtcbiAgICBjb25zdCBlbGVtZW50SG9zdCA9IFBsYWl0Qm9hcmQuZ2V0RWxlbWVudEhvc3QoYm9hcmQpO1xuICAgIGNvbnN0IHJvb3RHcm91cEJveCA9IGVsZW1lbnRIb3N0LmdldEJCb3goKTtcbiAgICBjb25zdCB2aWV3cG9ydENvbnRhaW5lckJveCA9IGdldFZpZXdwb3J0Q29udGFpbmVyQm94KGJvYXJkKTtcbiAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHZpZXdwb3J0Q29udGFpbmVyQm94LndpZHRoIC8gem9vbTtcbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSB2aWV3cG9ydENvbnRhaW5lckJveC5oZWlnaHQgLyB6b29tO1xuICAgIGxldCBsZWZ0OiBudW1iZXI7XG4gICAgbGV0IHJpZ2h0OiBudW1iZXI7XG4gICAgbGV0IHRvcDogbnVtYmVyO1xuICAgIGxldCBib3R0b206IG51bWJlcjtcblxuICAgIGlmIChyb290R3JvdXBCb3gud2lkdGggPCBjb250YWluZXJXaWR0aCkge1xuICAgICAgICBjb25zdCBvZmZzZXRYID0gcm9vdEdyb3VwQm94LnggKyByb290R3JvdXBCb3gud2lkdGggLyAyO1xuICAgICAgICBjb25zdCBjb250YWluZXJYID0gY29udGFpbmVyV2lkdGggLyAyO1xuICAgICAgICBsZWZ0ID0gb2Zmc2V0WCAtIGNvbnRhaW5lclg7XG4gICAgICAgIHJpZ2h0ID0gb2Zmc2V0WCArIGNvbnRhaW5lclg7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGVmdCA9IHJvb3RHcm91cEJveC54O1xuICAgICAgICByaWdodCA9IHJvb3RHcm91cEJveC54ICsgcm9vdEdyb3VwQm94LndpZHRoO1xuICAgIH1cbiAgICBpZiAocm9vdEdyb3VwQm94LmhlaWdodCA8IGNvbnRhaW5lckhlaWdodCkge1xuICAgICAgICBjb25zdCBvZmZzZXRZID0gcm9vdEdyb3VwQm94LnkgKyByb290R3JvdXBCb3guaGVpZ2h0IC8gMjtcbiAgICAgICAgY29uc3QgY29udGFpbmVyWSA9IGNvbnRhaW5lckhlaWdodCAvIDI7XG4gICAgICAgIHRvcCA9IG9mZnNldFkgLSBjb250YWluZXJZO1xuICAgICAgICBib3R0b20gPSBvZmZzZXRZICsgY29udGFpbmVyWTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0b3AgPSByb290R3JvdXBCb3gueTtcbiAgICAgICAgYm90dG9tID0gcm9vdEdyb3VwQm94LnkgKyByb290R3JvdXBCb3guaGVpZ2h0O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0LFxuICAgICAgICByaWdodCxcbiAgICAgICAgdG9wLFxuICAgICAgICBib3R0b21cbiAgICB9O1xufVxuXG4vKipcbiAqIOmqjOivgee8qeaUvuavlOaYr+WQpuespuWQiOmZkOWItu+8jOWmguaenOi2heWHuumZkOWItu+8jOWImei/lOWbnuWQiOmAgueahOe8qeaUvuavlFxuICogQHBhcmFtIHpvb20g57yp5pS+5q+UXG4gKiBAcGFyYW0gbWluWm9vbSDmnIDlsI/nvKnmlL7mr5RcbiAqIEBwYXJhbSBtYXhab29tIOacgOWkp+e8qeaUvuavlFxuICogQHJldHVybnMg5q2j56Gu55qE57yp5pS+5q+UXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcFpvb21MZXZlbCh6b29tOiBudW1iZXIsIG1pblpvb20gPSAwLjIsIG1heFpvb20gPSA0KSB7XG4gICAgcmV0dXJuIHpvb20gPCBtaW5ab29tID8gbWluWm9vbSA6IHpvb20gPiBtYXhab29tID8gbWF4Wm9vbSA6IHpvb207XG59XG4iXX0=
package/utils/matrix.d.ts DELETED
@@ -1,82 +0,0 @@
1
- import { PlaitBoard } from '../interfaces';
2
- /**
3
- * 逆矩阵
4
- * [a c e]
5
- * [b d f]
6
- * [0 0 1]
7
- * @param newMatrix 输出返回矩阵
8
- * @param matrix 新矩阵
9
- * @returns 逆矩阵
10
- */
11
- export declare function invertMatrix(newMatrix: number[], matrix: number[]): number[] | null;
12
- /**
13
- * 将视图坐标与反转矩阵相乘,以得到原始坐标
14
- * 使用给定的矩阵进行转换
15
- * 矩阵与向量乘法,3 维向量与3x3矩阵的乘积
16
- * [m11 m12 m13][v1]
17
- * [m21 m22 m23][v2]
18
- * [m31 m32 m33][v3]
19
- * @param out 输出结果向量
20
- * @param t 要转换的向量
21
- * @param n 矩阵转换
22
- * @returns [v1 * m11 + v2 * m12 + v3 * m13, v1 * m21 + v2 * m22 + v3 * m23, v1 * m31 + v2 * m32 + v3 * m33];
23
- */
24
- export declare function transformMat3(out: number[], vector: number[], matrix: number[]): number[];
25
- /**
26
- * 规范 point
27
- * @param point
28
- * @returns point
29
- */
30
- export declare function normalizePoint(point: number[]): {
31
- x: number;
32
- y: number;
33
- };
34
- /**
35
- * 将一个点坐标反转回它的原始坐标
36
- * @param point 表示要反转的点的视图坐标,它是一个长度为 2 的数组,存储点的 x 和 y 坐标
37
- * @param matrix 表示视图矩阵,是在视图中对图形进行缩放和平移时使用的矩阵
38
- * @returns 最终结果是一个长度为 3 的数组,存储点的 x,y 和 w 坐标(w 坐标是点的齐次坐标)
39
- */
40
- export declare function invertViewportCoordinates(point: number[], matrix: number[]): number[];
41
- export declare function convertToViewportCoordinates(point: number[], matrix: number[]): number[];
42
- /**
43
- * 获取 contentContainer 的 clientBox
44
- * @param board
45
- * @returns
46
- */
47
- export declare function getViewportContainerBox(board: PlaitBoard): {
48
- minX: number;
49
- minY: number;
50
- maxX: number;
51
- maxY: number;
52
- x: number;
53
- y: number;
54
- width: number;
55
- height: number;
56
- };
57
- /**
58
- * 获取 board.plait-board 的 clientBox
59
- * @param board
60
- * @returns
61
- */
62
- export declare function getBoardClientBox(board: PlaitBoard): {
63
- width: number;
64
- height: number;
65
- };
66
- /**
67
- * 获取 rootGroup 相对于当前 svg 空间的最小矩阵坐标
68
- */
69
- export declare function getRootGroupBBox(board: PlaitBoard, zoom: number): {
70
- left: number;
71
- right: number;
72
- top: number;
73
- bottom: number;
74
- };
75
- /**
76
- * 验证缩放比是否符合限制,如果超出限制,则返回合适的缩放比
77
- * @param zoom 缩放比
78
- * @param minZoom 最小缩放比
79
- * @param maxZoom 最大缩放比
80
- * @returns 正确的缩放比
81
- */
82
- export declare function clampZoomLevel(zoom: number, minZoom?: number, maxZoom?: number): number;