@soonspacejs/plugin-drawing-shape 2.13.7 → 2.13.8

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/README.md CHANGED
@@ -1,5 +1,5 @@
1
- # @soonspacejs/plugin-drawing-shape
2
-
3
- > Drawing-shape plugin for SoonSpace.js
4
-
5
- Document: [http://www.xwbuilders.com:8800/plugin/drawing-shape.html](http://www.xwbuilders.com:8800/plugin/drawing-shape.html)
1
+ # @soonspacejs/plugin-drawing-shape
2
+
3
+ > Drawing-shape plugin for SoonSpace.js
4
+
5
+ Document: [http://www.xwbuilders.com:8800/plugin/drawing-shape.html](http://www.xwbuilders.com:8800/plugin/drawing-shape.html)
@@ -0,0 +1,50 @@
1
+ import SoonSpace from 'soonspacejs';
2
+ import type { SetOptionsPointInfo, SetOptionsLineInfo, SetOptionsPolygonInfo, SetOptionsCircleInfo } from 'soonspacejs';
3
+ import type { Vector3, Object3D } from 'three';
4
+ export type DrawingPointInfo = SetOptionsPointInfo;
5
+ export interface DrawingPointEvents {
6
+ onCancel?: () => void;
7
+ }
8
+ export type DrawingLineInfo = Omit<SetOptionsLineInfo, 'points'> & {
9
+ offsetY?: number;
10
+ };
11
+ export interface DrawingLineEvents {
12
+ onCancel?: () => void;
13
+ onCancelPrev?: () => void;
14
+ }
15
+ export type DrawingPolygonInfo = Omit<SetOptionsPolygonInfo, 'points' | 'yHeight'> & {
16
+ width?: number | undefined;
17
+ offsetY?: number;
18
+ };
19
+ export interface DrawingPolygonEvents {
20
+ onCancel?: () => void;
21
+ onCancelPrev?: () => void;
22
+ }
23
+ export type DrawingCircleInfo = Omit<SetOptionsCircleInfo, 'radius'> & {
24
+ offsetY?: number;
25
+ };
26
+ export interface DrawingCircleEvents {
27
+ onCancel?: () => void;
28
+ }
29
+ export default class DrawIngShapePlugin {
30
+ readonly ssp: SoonSpace;
31
+ blankIntersect: boolean;
32
+ readonly viewport: SoonSpace['viewport'];
33
+ constructor(ssp: SoonSpace);
34
+ getFirstIntersect(event: MouseEvent, drawingObj?: (Object3D | null)[] | Object3D | null): import("three").Intersection<Object3D<import("three").Object3DEventMap>>;
35
+ /**
36
+ * 绘图时使用的临时 layer
37
+ */
38
+ drawingLayer: number;
39
+ configLayer(drawingObj: Object3D[] | Object3D): void;
40
+ recoverLayer(drawingObj: Object3D[] | Object3D): void;
41
+ drawingPoint(options: DrawingPointInfo, events?: DrawingPointEvents): Promise<SetOptionsPointInfo & {
42
+ position: Vector3;
43
+ }>;
44
+ drawingLine(options: DrawingLineInfo, events?: DrawingLineEvents): Promise<SetOptionsLineInfo>;
45
+ drawingPolygon(options: DrawingPolygonInfo, events?: DrawingPolygonEvents): Promise<SetOptionsPolygonInfo>;
46
+ drawingCircle(options: DrawingCircleInfo, events?: DrawingCircleEvents): Promise<SetOptionsCircleInfo & {
47
+ position: Vector3;
48
+ }>;
49
+ clearDrawingCanvas3D(): void;
50
+ }
package/dist/index.esm.js CHANGED
@@ -1,394 +1 @@
1
- import SoonSpace from 'soonspacejs';
2
-
3
- const { utils, } = SoonSpace;
4
- const DrawingIds = {
5
- canvas: 'drawingCanvas' + utils.randomString(),
6
- point: 'drawingPoint' + utils.randomString(),
7
- line: 'drawingLine' + utils.randomString(),
8
- polygon: 'drawingPolygon' + utils.randomString(),
9
- circle: 'drawingCircle' + utils.randomString(),
10
- };
11
- class DrawIngShapePlugin {
12
- constructor(ssp) {
13
- this.ssp = ssp;
14
- // 是否允许点击空白处绘制
15
- this.blankIntersect = true;
16
- /**
17
- * 绘图时使用的临时 layer
18
- */
19
- this.drawingLayer = 21;
20
- this.viewport = ssp.viewport;
21
- }
22
- getFirstIntersect(event, drawingObj) {
23
- const drawingObjs = Array.isArray(drawingObj) ?
24
- drawingObj :
25
- drawingObj ?
26
- [drawingObj] :
27
- [];
28
- const objArr = drawingObjs.filter((obj) => obj);
29
- this.configLayer(objArr);
30
- const intersects = this.ssp.viewport.getIntersects(event);
31
- this.recoverLayer(objArr);
32
- return intersects[0];
33
- }
34
- configLayer(drawingObj) {
35
- var _a;
36
- const drawingLayer = (_a = this.drawingLayer) !== null && _a !== void 0 ? _a : 21;
37
- const camera = this.ssp.viewport.camera;
38
- camera.oriMask = camera.layers.mask;
39
- camera.layers.enable(drawingLayer);
40
- const drawingObjs = Array.isArray(drawingObj) ? drawingObj : [drawingObj];
41
- for (const obj of drawingObjs) {
42
- obj.oriMask = obj.layers.mask;
43
- obj.layers.set(drawingLayer);
44
- }
45
- }
46
- recoverLayer(drawingObj) {
47
- const camera = this.ssp.viewport.camera;
48
- const cameraMask = camera.oriMask;
49
- if (cameraMask) {
50
- camera.layers.mask = camera.oriMask;
51
- camera.oriMask = undefined;
52
- }
53
- const drawingObjs = Array.isArray(drawingObj) ? drawingObj : [drawingObj];
54
- for (const obj of drawingObjs) {
55
- const mask = obj.oriMask;
56
- if (mask) {
57
- obj.layers.mask = mask;
58
- obj.oriMask = undefined;
59
- }
60
- }
61
- }
62
- drawingPoint(options, events) {
63
- return new Promise((resolve, reject) => {
64
- this.clearDrawingCanvas3D();
65
- const canvas = this.ssp.createCanvas3D({
66
- id: DrawingIds.canvas,
67
- points: [
68
- Object.assign(Object.assign({}, options), { id: DrawingIds.point })
69
- ],
70
- });
71
- this.ssp.addObject(canvas);
72
- const point = canvas.getPoint(DrawingIds.point);
73
- if (!point)
74
- return reject();
75
- const onMouseMove = (event) => {
76
- if (!point)
77
- return;
78
- const intersect = this.getFirstIntersect(event, point);
79
- const position = intersect ?
80
- intersect.point.clone() :
81
- this.blankIntersect && this.ssp.getPositionByOffset(event);
82
- if (!position)
83
- return;
84
- point.position.copy(position);
85
- this.ssp.render();
86
- };
87
- const onClick = (event) => {
88
- removeSignals();
89
- if (!point)
90
- return;
91
- const intersect = this.getFirstIntersect(event, point);
92
- const position = intersect ?
93
- intersect.point.clone() :
94
- this.blankIntersect && this.ssp.getPositionByOffset(event);
95
- if (!position)
96
- return;
97
- point.position.copy(position);
98
- this.ssp.render();
99
- resolve(Object.assign(Object.assign({}, options), { position: position.clone() }));
100
- };
101
- const onRightClick = () => {
102
- var _a;
103
- this.clearDrawingCanvas3D();
104
- removeSignals();
105
- (_a = events === null || events === void 0 ? void 0 : events.onCancel) === null || _a === void 0 ? void 0 : _a.call(events);
106
- };
107
- const onKeyUp = (event) => {
108
- switch (event.code) {
109
- case 'Escape':
110
- onRightClick();
111
- break;
112
- }
113
- };
114
- const removeSignals = () => {
115
- this.ssp.signals.mouseMove.remove(onMouseMove);
116
- this.ssp.signals.click.remove(onClick);
117
- this.ssp.signals.rightClick.remove(onRightClick);
118
- this.ssp.signals.keyUp.remove(onKeyUp);
119
- };
120
- this.ssp.signals.mouseMove.add(onMouseMove);
121
- this.ssp.signals.click.add(onClick);
122
- this.ssp.signals.rightClick.add(onRightClick);
123
- this.ssp.signals.keyUp.add(onKeyUp);
124
- });
125
- }
126
- drawingLine(options, events) {
127
- const { offsetY = 0.01, } = options;
128
- return new Promise((resolve) => {
129
- this.clearDrawingCanvas3D();
130
- const canvas = this.ssp.createCanvas3D({
131
- id: DrawingIds.canvas,
132
- lines: [
133
- Object.assign(Object.assign({}, options), { points: [], id: DrawingIds.line })
134
- ],
135
- });
136
- this.ssp.addObject(canvas);
137
- const line = canvas.getLine(DrawingIds.line);
138
- const linePoints = [];
139
- const onMouseMove = (event) => {
140
- const intersects = this.getFirstIntersect(event, line);
141
- const position = intersects ?
142
- intersects.point.clone() :
143
- this.blankIntersect && this.ssp.getPositionByOffset(event);
144
- if (!position)
145
- return;
146
- if (!line)
147
- return;
148
- line.setOptions(Object.assign(Object.assign({}, options), { points: [...linePoints, position.clone().setY(position.y + offsetY)] }));
149
- this.ssp.render();
150
- };
151
- const onClick = (event) => {
152
- const intersects = this.getFirstIntersect(event, line);
153
- const position = intersects ?
154
- intersects.point.clone() :
155
- this.blankIntersect && this.ssp.getPositionByOffset(event);
156
- if (!position)
157
- return;
158
- linePoints.push(position.clone().setY(position.y + offsetY));
159
- if (!line)
160
- return;
161
- line.setOptions(Object.assign(Object.assign({}, options), { points: linePoints }));
162
- };
163
- const onRightClick = () => {
164
- var _a;
165
- linePoints.pop();
166
- if (!line)
167
- return;
168
- line.setOptions(Object.assign(Object.assign({}, options), { points: linePoints }));
169
- (_a = events === null || events === void 0 ? void 0 : events.onCancelPrev) === null || _a === void 0 ? void 0 : _a.call(events);
170
- };
171
- const onDblClick = (event) => {
172
- const intersects = this.getFirstIntersect(event, line);
173
- const position = intersects ?
174
- intersects.point.clone() :
175
- this.blankIntersect && this.ssp.getPositionByOffset(event);
176
- if (!position)
177
- return;
178
- linePoints.push(position.clone().setY(position.y + offsetY));
179
- removeSignals();
180
- resolve(Object.assign(Object.assign({}, options), { points: linePoints }));
181
- };
182
- const onKeyUp = (event) => {
183
- var _a;
184
- switch (event.code) {
185
- case 'Backspace':
186
- onRightClick();
187
- break;
188
- case 'Escape':
189
- this.clearDrawingCanvas3D();
190
- removeSignals();
191
- (_a = events === null || events === void 0 ? void 0 : events.onCancel) === null || _a === void 0 ? void 0 : _a.call(events);
192
- break;
193
- }
194
- };
195
- const removeSignals = () => {
196
- this.ssp.signals.mouseMove.remove(onMouseMove);
197
- this.ssp.signals.click.remove(onClick);
198
- this.ssp.signals.rightClick.remove(onRightClick);
199
- this.ssp.signals.dblClick.remove(onDblClick);
200
- this.ssp.signals.keyUp.remove(onKeyUp);
201
- };
202
- this.ssp.signals.mouseMove.add(onMouseMove);
203
- this.ssp.signals.click.add(onClick);
204
- this.ssp.signals.rightClick.add(onRightClick);
205
- this.ssp.signals.dblClick.add(onDblClick);
206
- this.ssp.signals.keyUp.add(onKeyUp);
207
- });
208
- }
209
- drawingPolygon(options, events) {
210
- const { offsetY = 0.01, } = options;
211
- return new Promise((resolve) => {
212
- this.clearDrawingCanvas3D();
213
- const canvas = this.ssp.createCanvas3D({
214
- id: DrawingIds.canvas,
215
- polygons: [
216
- Object.assign(Object.assign({ points: [], yHeight: 0 }, options), { id: DrawingIds.polygon })
217
- ],
218
- lines: [
219
- Object.assign(Object.assign({ points: [], width: 2 }, options), { id: DrawingIds.line })
220
- ],
221
- });
222
- this.ssp.addObject(canvas);
223
- const polygon = canvas.getPolygon(DrawingIds.polygon);
224
- const line = canvas.getLine(DrawingIds.line);
225
- const polygonPoints = [];
226
- const omMouseMove = (event) => {
227
- var _a;
228
- const intersects = this.getFirstIntersect(event, [line, polygon]);
229
- const position = intersects ?
230
- intersects.point.clone() :
231
- this.blankIntersect && this.ssp.getPositionByOffset(event);
232
- if (!position)
233
- return;
234
- if (!polygon)
235
- return;
236
- const movingPolygonPoints = [...polygonPoints, position];
237
- if (movingPolygonPoints.length > 2) {
238
- canvas.removeLine(DrawingIds.line);
239
- }
240
- else {
241
- line === null || line === void 0 ? void 0 : line.setOptions({
242
- points: movingPolygonPoints,
243
- });
244
- }
245
- polygon.setOptions({
246
- yHeight: (((_a = polygonPoints[0]) === null || _a === void 0 ? void 0 : _a.y) || position.y) + offsetY,
247
- points: movingPolygonPoints,
248
- });
249
- };
250
- const onClick = (event) => {
251
- var _a;
252
- const intersects = this.getFirstIntersect(event, [line, polygon]);
253
- const position = intersects ?
254
- intersects.point.clone() :
255
- this.blankIntersect && this.ssp.getPositionByOffset(event);
256
- if (!position)
257
- return;
258
- polygonPoints.push(position.clone().setY(position.y + offsetY));
259
- if (!polygon)
260
- return;
261
- polygon.setOptions(Object.assign(Object.assign({}, options), { yHeight: (((_a = polygonPoints[0]) === null || _a === void 0 ? void 0 : _a.y) || 0) + offsetY, points: polygonPoints }));
262
- };
263
- const onRightClick = () => {
264
- var _a, _b;
265
- polygonPoints.pop();
266
- if (!polygon)
267
- return;
268
- polygon.setOptions(Object.assign(Object.assign({}, options), { yHeight: (((_a = polygonPoints[0]) === null || _a === void 0 ? void 0 : _a.y) || 0) + offsetY, points: polygonPoints }));
269
- (_b = events === null || events === void 0 ? void 0 : events.onCancelPrev) === null || _b === void 0 ? void 0 : _b.call(events);
270
- };
271
- const onDblClick = (event) => {
272
- var _a;
273
- const intersects = this.getFirstIntersect(event, [line, polygon]);
274
- const position = intersects ?
275
- intersects.point.clone() :
276
- this.blankIntersect && this.ssp.getPositionByOffset(event);
277
- if (!position)
278
- return;
279
- polygonPoints.push(position.clone().setY(position.y + offsetY));
280
- removeSignals();
281
- resolve(Object.assign(Object.assign({}, options), { yHeight: (((_a = polygonPoints[0]) === null || _a === void 0 ? void 0 : _a.y) || 0) + offsetY, points: polygonPoints }));
282
- };
283
- const onKeyUp = (event) => {
284
- var _a;
285
- switch (event.code) {
286
- case 'Backspace':
287
- onRightClick();
288
- break;
289
- case 'Escape':
290
- this.clearDrawingCanvas3D();
291
- removeSignals();
292
- (_a = events === null || events === void 0 ? void 0 : events.onCancel) === null || _a === void 0 ? void 0 : _a.call(events);
293
- break;
294
- }
295
- };
296
- const removeSignals = () => {
297
- this.ssp.signals.mouseMove.remove(omMouseMove);
298
- this.ssp.signals.click.remove(onClick);
299
- this.ssp.signals.rightClick.remove(onRightClick);
300
- this.ssp.signals.dblClick.remove(onDblClick);
301
- this.ssp.signals.keyUp.remove(onKeyUp);
302
- };
303
- this.ssp.signals.mouseMove.add(omMouseMove);
304
- this.ssp.signals.click.add(onClick);
305
- this.ssp.signals.rightClick.add(onRightClick);
306
- this.ssp.signals.dblClick.add(onDblClick);
307
- this.ssp.signals.keyUp.add(onKeyUp);
308
- });
309
- }
310
- drawingCircle(options, events) {
311
- const { offsetY = 0.01, } = options;
312
- return new Promise((resolve) => {
313
- this.clearDrawingCanvas3D();
314
- const canvas = this.ssp.createCanvas3D({
315
- id: DrawingIds.canvas,
316
- circles: [
317
- Object.assign(Object.assign({}, options), { id: DrawingIds.circle })
318
- ],
319
- });
320
- this.ssp.addObject(canvas);
321
- const circle = canvas.getCircle(DrawingIds.circle);
322
- let position;
323
- let radius = 100;
324
- const onMouseMove = (event) => {
325
- if (!circle || !position)
326
- return;
327
- const intersects = this.getFirstIntersect(event, circle);
328
- const mouseMovePosition = intersects ?
329
- intersects.point.clone() :
330
- this.blankIntersect && this.ssp.getPositionByOffset(event);
331
- if (!mouseMovePosition)
332
- return;
333
- radius = mouseMovePosition.distanceTo(position);
334
- circle.setOptions({
335
- radius,
336
- });
337
- circle.position.copy(position);
338
- };
339
- const onClick = (event) => {
340
- if (!circle)
341
- return;
342
- const intersects = this.getFirstIntersect(event, circle);
343
- const mouseMovePosition = intersects ?
344
- intersects.point.clone() :
345
- this.blankIntersect && this.ssp.getPositionByOffset(event);
346
- if (!mouseMovePosition)
347
- return;
348
- if (!position)
349
- position = mouseMovePosition
350
- .clone()
351
- .setY(mouseMovePosition.y + offsetY);
352
- else {
353
- removeSignals();
354
- radius = mouseMovePosition.distanceTo(this.ssp.utils.IVector3ToVector3(position));
355
- circle.setOptions({
356
- radius,
357
- });
358
- circle.position.copy(position);
359
- resolve(Object.assign(Object.assign({}, options), { position,
360
- radius }));
361
- }
362
- };
363
- const onRightClick = () => {
364
- var _a;
365
- this.clearDrawingCanvas3D();
366
- removeSignals();
367
- (_a = events === null || events === void 0 ? void 0 : events.onCancel) === null || _a === void 0 ? void 0 : _a.call(events);
368
- };
369
- const onKeyUp = (event) => {
370
- switch (event.code) {
371
- case 'Escape':
372
- onRightClick();
373
- break;
374
- }
375
- };
376
- const removeSignals = () => {
377
- this.ssp.signals.mouseMove.remove(onMouseMove);
378
- this.ssp.signals.click.remove(onClick);
379
- this.ssp.signals.rightClick.remove(onRightClick);
380
- this.ssp.signals.keyUp.remove(onKeyUp);
381
- };
382
- this.ssp.signals.mouseMove.add(onMouseMove);
383
- this.ssp.signals.click.add(onClick);
384
- this.ssp.signals.rightClick.add(onRightClick);
385
- this.ssp.signals.keyUp.add(onKeyUp);
386
- });
387
- }
388
- clearDrawingCanvas3D() {
389
- this.ssp.removeObjectById(DrawingIds.canvas);
390
- }
391
- }
392
-
393
- export { DrawIngShapePlugin as default };
394
- //# sourceMappingURL=index.esm.js.map
1
+ import s from"soonspacejs";const{utils:i}=s,t={canvas:"drawingCanvas"+i.randomString(),point:"drawingPoint"+i.randomString(),line:"drawingLine"+i.randomString(),polygon:"drawingPolygon"+i.randomString(),circle:"drawingCircle"+i.randomString()};class e{constructor(s){this.ssp=s,this.blankIntersect=!0,this.drawingLayer=21,this.viewport=s.viewport}getFirstIntersect(s,i){const t=(Array.isArray(i)?i:i?[i]:[]).filter((s=>s));this.configLayer(t);const e=this.ssp.viewport.getIntersects(s);return this.recoverLayer(t),e[0]}configLayer(s){var i;const t=null!==(i=this.drawingLayer)&&void 0!==i?i:21,e=this.ssp.viewport.camera;e.oriMask=e.layers.mask,e.layers.enable(t);const n=Array.isArray(s)?s:[s];for(const s of n)s.oriMask=s.layers.mask,s.layers.set(t)}recoverLayer(s){const i=this.ssp.viewport.camera;i.oriMask&&(i.layers.mask=i.oriMask,i.oriMask=void 0);const t=Array.isArray(s)?s:[s];for(const s of t){const i=s.oriMask;i&&(s.layers.mask=i,s.oriMask=void 0)}}drawingPoint(s,i){return new Promise(((e,n)=>{this.clearDrawingCanvas3D();const a=this.ssp.createCanvas3D({id:t.canvas,points:[Object.assign(Object.assign({},s),{id:t.point})]});this.ssp.addObject(a);const o=a.getPoint(t.point);if(!o)return n();const r=s=>{if(!o)return;const i=this.getFirstIntersect(s,o),t=i?i.point.clone():this.blankIntersect&&this.ssp.getPositionByOffset(s);t&&(o.position.copy(t),this.ssp.render())},c=i=>{if(g(),!o)return;const t=this.getFirstIntersect(i,o),n=t?t.point.clone():this.blankIntersect&&this.ssp.getPositionByOffset(i);n&&(o.position.copy(n),this.ssp.render(),e(Object.assign(Object.assign({},s),{position:n.clone()})))},l=()=>{var s;this.clearDrawingCanvas3D(),g(),null===(s=null==i?void 0:i.onCancel)||void 0===s||s.call(i)},p=s=>{if("Escape"===s.code)l()},g=()=>{this.ssp.signals.mouseMove.remove(r),this.ssp.signals.click.remove(c),this.ssp.signals.rightClick.remove(l),this.ssp.signals.keyUp.remove(p)};this.ssp.signals.mouseMove.add(r),this.ssp.signals.click.add(c),this.ssp.signals.rightClick.add(l),this.ssp.signals.keyUp.add(p)}))}drawingLine(s,i){const{offsetY:e=.01}=s;return new Promise((n=>{this.clearDrawingCanvas3D();const a=this.ssp.createCanvas3D({id:t.canvas,lines:[Object.assign(Object.assign({},s),{points:[],id:t.line})]});this.ssp.addObject(a);const o=a.getLine(t.line),r=[],c=i=>{const t=this.getFirstIntersect(i,o),n=t?t.point.clone():this.blankIntersect&&this.ssp.getPositionByOffset(i);n&&o&&(o.setOptions(Object.assign(Object.assign({},s),{points:[...r,n.clone().setY(n.y+e)]})),this.ssp.render())},l=i=>{const t=this.getFirstIntersect(i,o),n=t?t.point.clone():this.blankIntersect&&this.ssp.getPositionByOffset(i);n&&(r.push(n.clone().setY(n.y+e)),o&&o.setOptions(Object.assign(Object.assign({},s),{points:r})))},p=()=>{var t;r.pop(),o&&(o.setOptions(Object.assign(Object.assign({},s),{points:r})),null===(t=null==i?void 0:i.onCancelPrev)||void 0===t||t.call(i))},g=i=>{const t=this.getFirstIntersect(i,o),a=t?t.point.clone():this.blankIntersect&&this.ssp.getPositionByOffset(i);a&&(r.push(a.clone().setY(a.y+e)),d(),n(Object.assign(Object.assign({},s),{points:r})))},h=s=>{var t;switch(s.code){case"Backspace":p();break;case"Escape":this.clearDrawingCanvas3D(),d(),null===(t=null==i?void 0:i.onCancel)||void 0===t||t.call(i)}},d=()=>{this.ssp.signals.mouseMove.remove(c),this.ssp.signals.click.remove(l),this.ssp.signals.rightClick.remove(p),this.ssp.signals.dblClick.remove(g),this.ssp.signals.keyUp.remove(h)};this.ssp.signals.mouseMove.add(c),this.ssp.signals.click.add(l),this.ssp.signals.rightClick.add(p),this.ssp.signals.dblClick.add(g),this.ssp.signals.keyUp.add(h)}))}drawingPolygon(s,i){const{offsetY:e=.01}=s;return new Promise((n=>{this.clearDrawingCanvas3D();const a=this.ssp.createCanvas3D({id:t.canvas,polygons:[Object.assign(Object.assign({points:[],yHeight:0},s),{id:t.polygon})],lines:[Object.assign(Object.assign({points:[],width:2},s),{id:t.line})]});this.ssp.addObject(a);const o=a.getPolygon(t.polygon),r=a.getLine(t.line),c=[],l=s=>{var i;const n=this.getFirstIntersect(s,[r,o]),l=n?n.point.clone():this.blankIntersect&&this.ssp.getPositionByOffset(s);if(!l)return;if(!o)return;const p=[...c,l];p.length>2?a.removeLine(t.line):null==r||r.setOptions({points:p}),o.setOptions({yHeight:((null===(i=c[0])||void 0===i?void 0:i.y)||l.y)+e,points:p})},p=i=>{var t;const n=this.getFirstIntersect(i,[r,o]),a=n?n.point.clone():this.blankIntersect&&this.ssp.getPositionByOffset(i);a&&(c.push(a.clone().setY(a.y+e)),o&&o.setOptions(Object.assign(Object.assign({},s),{yHeight:((null===(t=c[0])||void 0===t?void 0:t.y)||0)+e,points:c})))},g=()=>{var t,n;c.pop(),o&&(o.setOptions(Object.assign(Object.assign({},s),{yHeight:((null===(t=c[0])||void 0===t?void 0:t.y)||0)+e,points:c})),null===(n=null==i?void 0:i.onCancelPrev)||void 0===n||n.call(i))},h=i=>{var t;const a=this.getFirstIntersect(i,[r,o]),l=a?a.point.clone():this.blankIntersect&&this.ssp.getPositionByOffset(i);l&&(c.push(l.clone().setY(l.y+e)),v(),n(Object.assign(Object.assign({},s),{yHeight:((null===(t=c[0])||void 0===t?void 0:t.y)||0)+e,points:c})))},d=s=>{var t;switch(s.code){case"Backspace":g();break;case"Escape":this.clearDrawingCanvas3D(),v(),null===(t=null==i?void 0:i.onCancel)||void 0===t||t.call(i)}},v=()=>{this.ssp.signals.mouseMove.remove(l),this.ssp.signals.click.remove(p),this.ssp.signals.rightClick.remove(g),this.ssp.signals.dblClick.remove(h),this.ssp.signals.keyUp.remove(d)};this.ssp.signals.mouseMove.add(l),this.ssp.signals.click.add(p),this.ssp.signals.rightClick.add(g),this.ssp.signals.dblClick.add(h),this.ssp.signals.keyUp.add(d)}))}drawingCircle(s,i){const{offsetY:e=.01}=s;return new Promise((n=>{this.clearDrawingCanvas3D();const a=this.ssp.createCanvas3D({id:t.canvas,circles:[Object.assign(Object.assign({},s),{id:t.circle})]});this.ssp.addObject(a);const o=a.getCircle(t.circle);let r,c=100;const l=s=>{if(!o||!r)return;const i=this.getFirstIntersect(s,o),t=i?i.point.clone():this.blankIntersect&&this.ssp.getPositionByOffset(s);t&&(c=t.distanceTo(r),o.setOptions({radius:c}),o.position.copy(r))},p=i=>{if(!o)return;const t=this.getFirstIntersect(i,o),a=t?t.point.clone():this.blankIntersect&&this.ssp.getPositionByOffset(i);a&&(r?(d(),c=a.distanceTo(this.ssp.utils.IVector3ToVector3(r)),o.setOptions({radius:c}),o.position.copy(r),n(Object.assign(Object.assign({},s),{position:r,radius:c}))):r=a.clone().setY(a.y+e))},g=()=>{var s;this.clearDrawingCanvas3D(),d(),null===(s=null==i?void 0:i.onCancel)||void 0===s||s.call(i)},h=s=>{if("Escape"===s.code)g()},d=()=>{this.ssp.signals.mouseMove.remove(l),this.ssp.signals.click.remove(p),this.ssp.signals.rightClick.remove(g),this.ssp.signals.keyUp.remove(h)};this.ssp.signals.mouseMove.add(l),this.ssp.signals.click.add(p),this.ssp.signals.rightClick.add(g),this.ssp.signals.keyUp.add(h)}))}clearDrawingCanvas3D(){this.ssp.removeObjectById(t.canvas)}}export{e as default};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@soonspacejs/plugin-drawing-shape",
3
3
  "pluginName": "DrawingShapePlugin",
4
- "version": "2.13.7",
4
+ "version": "2.13.8",
5
5
  "description": "DrawingShapePlugin plugin for SoonSpace.js",
6
6
  "main": "dist/index.esm.js",
7
7
  "module": "dist/index.esm.js",
@@ -13,8 +13,8 @@
13
13
  ],
14
14
  "author": "xunwei",
15
15
  "license": "UNLICENSED",
16
- "gitHead": "550040550bf20ec0015982ff1159d0cfe9b35ed3",
16
+ "gitHead": "d6b6f55e087ba0621e8bb404fc63c99fd4389660",
17
17
  "peerDependencies": {
18
- "soonspacejs": "2.13.7"
18
+ "soonspacejs": "2.13.8"
19
19
  }
20
20
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/index.ts"],"sourcesContent":["import SoonSpace, { Position, } from 'soonspacejs'\r\nimport type {\r\n SetOptionsPointInfo,\r\n SetOptionsLineInfo,\r\n SetOptionsPolygonInfo,\r\n SetOptionsCircleInfo,\r\n} from 'soonspacejs'\r\nimport type { Vector3, Object3D, } from 'three'\r\n\r\nexport type DrawingPointInfo = SetOptionsPointInfo\r\nexport interface DrawingPointEvents {\r\n onCancel?: () => void;\r\n}\r\n\r\nexport type DrawingLineInfo = Omit<SetOptionsLineInfo, 'points'> & {\r\n offsetY?: number;\r\n}\r\nexport interface DrawingLineEvents {\r\n onCancel?: () => void;\r\n onCancelPrev?: () => void;\r\n}\r\n\r\nexport type DrawingPolygonInfo = Omit<\r\n SetOptionsPolygonInfo,\r\n 'points' | 'yHeight'\r\n> & { width?: number | undefined; offsetY?: number }\r\nexport interface DrawingPolygonEvents {\r\n onCancel?: () => void;\r\n onCancelPrev?: () => void;\r\n}\r\n\r\nexport type DrawingCircleInfo = Omit<SetOptionsCircleInfo, 'radius'> & {\r\n offsetY?: number;\r\n}\r\nexport interface DrawingCircleEvents {\r\n onCancel?: () => void;\r\n}\r\n\r\nconst { utils, } = SoonSpace\r\n\r\nconst DrawingIds = {\r\n canvas: 'drawingCanvas' + utils.randomString(),\r\n point: 'drawingPoint' + utils.randomString(),\r\n line: 'drawingLine' + utils.randomString(),\r\n polygon: 'drawingPolygon' + utils.randomString(),\r\n circle: 'drawingCircle' + utils.randomString(),\r\n}\r\n\r\nexport default class DrawIngShapePlugin {\r\n\r\n // 是否允许点击空白处绘制\r\n blankIntersect = true\r\n\r\n readonly viewport: SoonSpace['viewport']\r\n\r\n constructor ( readonly ssp: SoonSpace ) {\r\n\r\n this.viewport = ssp.viewport\r\n \r\n }\r\n\r\n getFirstIntersect (\r\n event: MouseEvent,\r\n drawingObj?: ( Object3D | null )[] | Object3D | null\r\n ) {\r\n\r\n const drawingObjs = Array.isArray( drawingObj ) ?\r\n drawingObj :\r\n drawingObj ?\r\n [ drawingObj ] :\r\n []\r\n\r\n const objArr = drawingObjs.filter( ( obj ) => obj ) as Object3D[]\r\n\r\n this.configLayer( objArr )\r\n const intersects = this.ssp.viewport.getIntersects( event )\r\n\r\n this.recoverLayer( objArr )\r\n return intersects[ 0 ]\r\n \r\n }\r\n\r\n /**\r\n * 绘图时使用的临时 layer\r\n */\r\n drawingLayer = 21\r\n\r\n configLayer ( drawingObj: Object3D[] | Object3D ) {\r\n\r\n const drawingLayer = this.drawingLayer ?? 21\r\n\r\n const camera = this.ssp.viewport.camera;\r\n\r\n ( camera as any ).oriMask = camera.layers.mask\r\n camera.layers.enable( drawingLayer )\r\n\r\n const drawingObjs = Array.isArray( drawingObj ) ? drawingObj : [ drawingObj ]\r\n\r\n for ( const obj of drawingObjs ) {\r\n\r\n ( obj as any ).oriMask = obj.layers.mask\r\n obj.layers.set( drawingLayer )\r\n \r\n }\r\n \r\n }\r\n\r\n recoverLayer ( drawingObj: Object3D[] | Object3D ) {\r\n\r\n const camera = this.ssp.viewport.camera\r\n\r\n const cameraMask = ( camera as any ).oriMask\r\n\r\n if ( cameraMask ) {\r\n\r\n camera.layers.mask = ( camera as any ).oriMask;\r\n ( camera as any ).oriMask = undefined\r\n \r\n }\r\n\r\n const drawingObjs = Array.isArray( drawingObj ) ? drawingObj : [ drawingObj ]\r\n\r\n for ( const obj of drawingObjs ) {\r\n\r\n const mask = ( obj as any ).oriMask\r\n\r\n if ( mask ) {\r\n\r\n obj.layers.mask = mask;\r\n ( obj as any ).oriMask = undefined\r\n \r\n }\r\n \r\n }\r\n \r\n }\r\n\r\n drawingPoint (\r\n options: DrawingPointInfo,\r\n events?: DrawingPointEvents\r\n ): Promise<SetOptionsPointInfo & {position: Vector3}> {\r\n\r\n return new Promise( ( resolve, reject ) => {\r\n\r\n this.clearDrawingCanvas3D()\r\n\r\n const canvas = this.ssp.createCanvas3D( {\r\n id: DrawingIds.canvas,\r\n points: [\r\n {\r\n ...options,\r\n id: DrawingIds.point,\r\n }\r\n ],\r\n } )\r\n\r\n this.ssp.addObject( canvas )\r\n\r\n const point = canvas.getPoint( DrawingIds.point )\r\n\r\n if ( !point ) return reject()\r\n\r\n const onMouseMove = ( event: MouseEvent ) => {\r\n\r\n if ( !point ) return\r\n\r\n const intersect = this.getFirstIntersect( event, point )\r\n const position = intersect ?\r\n intersect.point.clone() :\r\n this.blankIntersect && this.ssp.getPositionByOffset( event )\r\n\r\n if ( !position ) return \r\n\r\n point.position.copy( position )\r\n this.ssp.render()\r\n \r\n }\r\n\r\n const onClick = ( event: MouseEvent ) => {\r\n\r\n removeSignals()\r\n\r\n if ( !point ) return\r\n\r\n const intersect = this.getFirstIntersect( event, point )\r\n const position = intersect ?\r\n intersect.point.clone() :\r\n this.blankIntersect && this.ssp.getPositionByOffset( event )\r\n\r\n if ( !position ) return \r\n\r\n point.position.copy( position )\r\n this.ssp.render()\r\n\r\n resolve( {\r\n ...options,\r\n position: position.clone(),\r\n } )\r\n \r\n }\r\n\r\n const onRightClick = () => {\r\n\r\n this.clearDrawingCanvas3D()\r\n removeSignals()\r\n\r\n events?.onCancel?.()\r\n \r\n }\r\n\r\n const onKeyUp = ( event: KeyboardEvent ) => {\r\n\r\n switch ( event.code ) {\r\n\r\n case 'Escape':\r\n onRightClick()\r\n break\r\n \r\n }\r\n \r\n }\r\n\r\n const removeSignals = () => {\r\n\r\n this.ssp.signals.mouseMove.remove( onMouseMove )\r\n this.ssp.signals.click.remove( onClick )\r\n this.ssp.signals.rightClick.remove( onRightClick )\r\n this.ssp.signals.keyUp.remove( onKeyUp )\r\n \r\n }\r\n\r\n this.ssp.signals.mouseMove.add( onMouseMove )\r\n this.ssp.signals.click.add( onClick )\r\n this.ssp.signals.rightClick.add( onRightClick )\r\n this.ssp.signals.keyUp.add( onKeyUp )\r\n \r\n } )\r\n \r\n }\r\n\r\n drawingLine (\r\n options: DrawingLineInfo,\r\n events?: DrawingLineEvents\r\n ): Promise<SetOptionsLineInfo> {\r\n\r\n const { offsetY = 0.01, } = options\r\n\r\n return new Promise( ( resolve ) => {\r\n\r\n this.clearDrawingCanvas3D()\r\n\r\n const canvas = this.ssp.createCanvas3D( {\r\n id: DrawingIds.canvas,\r\n lines: [\r\n {\r\n ...options,\r\n points: [],\r\n id: DrawingIds.line,\r\n }\r\n ],\r\n } )\r\n\r\n this.ssp.addObject( canvas )\r\n\r\n const line = canvas.getLine( DrawingIds.line )\r\n const linePoints: Position[] = []\r\n\r\n const onMouseMove = ( event: MouseEvent ) => {\r\n\r\n const intersects = this.getFirstIntersect( event, line )\r\n const position = intersects ?\r\n intersects.point.clone() :\r\n this.blankIntersect && this.ssp.getPositionByOffset( event )\r\n\r\n if ( !position ) return \r\n\r\n if ( !line ) return\r\n\r\n line.setOptions( {\r\n ...options,\r\n points: [ ...linePoints, position.clone().setY( position.y + offsetY ) ],\r\n } )\r\n this.ssp.render()\r\n \r\n }\r\n\r\n const onClick = ( event: MouseEvent ) => {\r\n\r\n const intersects = this.getFirstIntersect( event, line )\r\n const position = intersects ?\r\n intersects.point.clone() :\r\n this.blankIntersect && this.ssp.getPositionByOffset( event )\r\n\r\n if ( !position ) return \r\n\r\n linePoints.push( position.clone().setY( position.y + offsetY ) )\r\n\r\n if ( !line ) return\r\n\r\n line.setOptions( {\r\n ...options,\r\n points: linePoints,\r\n } )\r\n \r\n }\r\n\r\n const onRightClick = () => {\r\n\r\n linePoints.pop()\r\n\r\n if ( !line ) return\r\n\r\n line.setOptions( {\r\n ...options,\r\n points: linePoints,\r\n } )\r\n\r\n events?.onCancelPrev?.()\r\n \r\n }\r\n\r\n const onDblClick = ( event: MouseEvent ) => {\r\n\r\n const intersects = this.getFirstIntersect( event, line )\r\n const position = intersects ?\r\n intersects.point.clone() :\r\n this.blankIntersect && this.ssp.getPositionByOffset( event )\r\n\r\n if ( !position ) return \r\n\r\n linePoints.push( position.clone().setY( position.y + offsetY ) )\r\n\r\n removeSignals()\r\n\r\n resolve( {\r\n ...options,\r\n points: linePoints,\r\n } )\r\n \r\n }\r\n\r\n const onKeyUp = ( event: KeyboardEvent ) => {\r\n\r\n switch ( event.code ) {\r\n\r\n case 'Backspace':\r\n onRightClick()\r\n break\r\n case 'Escape':\r\n this.clearDrawingCanvas3D()\r\n removeSignals()\r\n\r\n events?.onCancel?.()\r\n break\r\n \r\n }\r\n \r\n }\r\n\r\n const removeSignals = () => {\r\n\r\n this.ssp.signals.mouseMove.remove( onMouseMove )\r\n this.ssp.signals.click.remove( onClick )\r\n this.ssp.signals.rightClick.remove( onRightClick )\r\n this.ssp.signals.dblClick.remove( onDblClick )\r\n this.ssp.signals.keyUp.remove( onKeyUp )\r\n \r\n }\r\n\r\n this.ssp.signals.mouseMove.add( onMouseMove )\r\n this.ssp.signals.click.add( onClick )\r\n this.ssp.signals.rightClick.add( onRightClick )\r\n this.ssp.signals.dblClick.add( onDblClick )\r\n this.ssp.signals.keyUp.add( onKeyUp )\r\n \r\n } )\r\n \r\n }\r\n\r\n drawingPolygon (\r\n options: DrawingPolygonInfo,\r\n events?: DrawingPolygonEvents\r\n ): Promise<SetOptionsPolygonInfo> {\r\n\r\n const { offsetY = 0.01, } = options\r\n\r\n return new Promise( ( resolve ) => {\r\n\r\n this.clearDrawingCanvas3D()\r\n\r\n const canvas = this.ssp.createCanvas3D( {\r\n id: DrawingIds.canvas,\r\n polygons: [\r\n {\r\n points: [],\r\n yHeight: 0,\r\n ...options,\r\n id: DrawingIds.polygon,\r\n }\r\n ],\r\n lines: [\r\n {\r\n points: [],\r\n width: 2,\r\n ...options,\r\n id: DrawingIds.line,\r\n }\r\n ],\r\n } )\r\n\r\n this.ssp.addObject( canvas )\r\n\r\n const polygon = canvas.getPolygon( DrawingIds.polygon )\r\n const line = canvas.getLine( DrawingIds.line )\r\n const polygonPoints: Position[] = []\r\n\r\n const omMouseMove = ( event: MouseEvent ) => {\r\n\r\n const intersects = this.getFirstIntersect( event, [ line, polygon ] )\r\n const position = intersects ?\r\n intersects.point.clone() :\r\n this.blankIntersect && this.ssp.getPositionByOffset( event )\r\n\r\n if ( !position ) return \r\n\r\n if ( !polygon ) return\r\n\r\n const movingPolygonPoints = [ ...polygonPoints, position ]\r\n\r\n if ( movingPolygonPoints.length > 2 ) {\r\n\r\n canvas.removeLine( DrawingIds.line )\r\n \r\n } else {\r\n\r\n line?.setOptions( {\r\n points: movingPolygonPoints,\r\n } )\r\n \r\n }\r\n\r\n polygon.setOptions( {\r\n yHeight: ( polygonPoints[ 0 ]?.y || position.y ) + offsetY,\r\n points: movingPolygonPoints,\r\n } )\r\n \r\n }\r\n\r\n const onClick = ( event: MouseEvent ) => {\r\n\r\n const intersects = this.getFirstIntersect( event, [ line, polygon ] )\r\n const position = intersects ?\r\n intersects.point.clone() :\r\n this.blankIntersect && this.ssp.getPositionByOffset( event )\r\n\r\n if ( !position ) return \r\n\r\n polygonPoints.push( position.clone().setY( position.y + offsetY ) )\r\n\r\n if ( !polygon ) return\r\n\r\n polygon.setOptions( {\r\n ...options,\r\n yHeight: ( polygonPoints[ 0 ]?.y || 0 ) + offsetY,\r\n points: polygonPoints,\r\n } )\r\n \r\n }\r\n\r\n const onRightClick = () => {\r\n\r\n polygonPoints.pop()\r\n\r\n if ( !polygon ) return\r\n\r\n polygon.setOptions( {\r\n ...options,\r\n yHeight: ( polygonPoints[ 0 ]?.y || 0 ) + offsetY,\r\n points: polygonPoints,\r\n } )\r\n\r\n events?.onCancelPrev?.()\r\n \r\n }\r\n\r\n const onDblClick = ( event: MouseEvent ) => {\r\n\r\n const intersects = this.getFirstIntersect( event, [ line, polygon ] )\r\n const position = intersects ?\r\n intersects.point.clone() :\r\n this.blankIntersect && this.ssp.getPositionByOffset( event )\r\n\r\n if ( !position ) return \r\n\r\n polygonPoints.push( position.clone().setY( position.y + offsetY ) )\r\n\r\n removeSignals()\r\n\r\n resolve( {\r\n ...options,\r\n yHeight: ( polygonPoints[ 0 ]?.y || 0 ) + offsetY,\r\n points: polygonPoints,\r\n } )\r\n \r\n }\r\n\r\n const onKeyUp = ( event: KeyboardEvent ) => {\r\n\r\n switch ( event.code ) {\r\n\r\n case 'Backspace':\r\n onRightClick()\r\n break\r\n case 'Escape':\r\n this.clearDrawingCanvas3D()\r\n removeSignals()\r\n\r\n events?.onCancel?.()\r\n break\r\n \r\n }\r\n \r\n }\r\n\r\n const removeSignals = () => {\r\n\r\n this.ssp.signals.mouseMove.remove( omMouseMove )\r\n this.ssp.signals.click.remove( onClick )\r\n this.ssp.signals.rightClick.remove( onRightClick )\r\n this.ssp.signals.dblClick.remove( onDblClick )\r\n this.ssp.signals.keyUp.remove( onKeyUp )\r\n \r\n }\r\n\r\n this.ssp.signals.mouseMove.add( omMouseMove )\r\n this.ssp.signals.click.add( onClick )\r\n this.ssp.signals.rightClick.add( onRightClick )\r\n this.ssp.signals.dblClick.add( onDblClick )\r\n this.ssp.signals.keyUp.add( onKeyUp )\r\n \r\n } )\r\n \r\n }\r\n\r\n drawingCircle (\r\n options: DrawingCircleInfo,\r\n events?: DrawingCircleEvents\r\n ): Promise<SetOptionsCircleInfo & {position: Vector3}> {\r\n\r\n const { offsetY = 0.01, } = options\r\n\r\n return new Promise( ( resolve ) => {\r\n\r\n this.clearDrawingCanvas3D()\r\n\r\n const canvas = this.ssp.createCanvas3D( {\r\n id: DrawingIds.canvas,\r\n circles: [\r\n {\r\n ...options,\r\n id: DrawingIds.circle,\r\n }\r\n ],\r\n } )\r\n\r\n this.ssp.addObject( canvas )\r\n\r\n const circle = canvas.getCircle( DrawingIds.circle )\r\n\r\n let position: Vector3 | null\r\n let radius = 100\r\n\r\n const onMouseMove = ( event: MouseEvent ) => {\r\n\r\n if ( !circle || !position ) return\r\n\r\n const intersects = this.getFirstIntersect( event, circle )\r\n const mouseMovePosition = intersects ?\r\n intersects.point.clone() :\r\n this.blankIntersect && this.ssp.getPositionByOffset( event )\r\n\r\n if ( !mouseMovePosition ) return \r\n\r\n radius = mouseMovePosition.distanceTo( position )\r\n\r\n circle.setOptions( {\r\n radius,\r\n } )\r\n circle.position.copy( position )\r\n \r\n }\r\n\r\n const onClick = ( event: MouseEvent ) => {\r\n\r\n if ( !circle ) return\r\n\r\n const intersects = this.getFirstIntersect( event, circle )\r\n const mouseMovePosition = intersects ?\r\n intersects.point.clone() :\r\n this.blankIntersect && this.ssp.getPositionByOffset( event )\r\n \r\n if ( !mouseMovePosition ) return\r\n\r\n if ( !position ) position = mouseMovePosition\r\n .clone()\r\n .setY( mouseMovePosition.y + offsetY )\r\n else {\r\n\r\n removeSignals()\r\n\r\n radius = mouseMovePosition.distanceTo(\r\n this.ssp.utils.IVector3ToVector3( position )\r\n )\r\n\r\n circle.setOptions( {\r\n radius,\r\n } )\r\n circle.position.copy( position )\r\n\r\n resolve( {\r\n ...options,\r\n position,\r\n radius,\r\n } )\r\n \r\n }\r\n \r\n }\r\n\r\n const onRightClick = () => {\r\n\r\n this.clearDrawingCanvas3D()\r\n removeSignals()\r\n\r\n events?.onCancel?.()\r\n \r\n }\r\n\r\n const onKeyUp = ( event: KeyboardEvent ) => {\r\n\r\n switch ( event.code ) {\r\n\r\n case 'Escape':\r\n onRightClick()\r\n break\r\n \r\n }\r\n \r\n }\r\n\r\n const removeSignals = () => {\r\n\r\n this.ssp.signals.mouseMove.remove( onMouseMove )\r\n this.ssp.signals.click.remove( onClick )\r\n this.ssp.signals.rightClick.remove( onRightClick )\r\n this.ssp.signals.keyUp.remove( onKeyUp )\r\n \r\n }\r\n\r\n this.ssp.signals.mouseMove.add( onMouseMove )\r\n this.ssp.signals.click.add( onClick )\r\n this.ssp.signals.rightClick.add( onRightClick )\r\n this.ssp.signals.keyUp.add( onKeyUp )\r\n \r\n } )\r\n \r\n }\r\n\r\n clearDrawingCanvas3D (): void {\r\n\r\n this.ssp.removeObjectById( DrawingIds.canvas )\r\n \r\n }\r\n\r\n}\r\n"],"names":[],"mappings":"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"}