@design-core/core 0.0.1 → 0.0.3
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/.eslintrc.json +14 -7
- package/.github/workflows/DesignCoreQA.yml +3 -1
- package/README.md +11 -4
- package/TODO.md +19 -0
- package/core/core/core.js +49 -42
- package/core/designCore.js +61 -2
- package/core/dimensions/alignedDimension.js +142 -0
- package/core/dimensions/angularDimension.js +550 -0
- package/core/dimensions/baseCircularDimension.js +244 -0
- package/core/dimensions/baseDimension.js +558 -0
- package/core/dimensions/baseLinearDimension.js +371 -0
- package/core/dimensions/diametricDimension.js +82 -0
- package/core/dimensions/dimension.js +298 -0
- package/core/dimensions/linearDimension.js +29 -0
- package/core/dimensions/radialDimension.js +78 -0
- package/core/dimensions/rotatedDimension.js +167 -0
- package/core/entities/arc.js +314 -60
- package/core/entities/arctext.js +642 -0
- package/core/entities/basePolyline.js +553 -94
- package/core/entities/circle.js +181 -54
- package/core/entities/entity.js +154 -74
- package/core/entities/hatch.js +807 -0
- package/core/entities/insert.js +200 -39
- package/core/entities/line.js +196 -134
- package/core/entities/lwpolyline.js +21 -44
- package/core/entities/point.js +194 -29
- package/core/entities/polyline.js +54 -7
- package/core/entities/rectangle.js +43 -13
- package/core/entities/solid.js +43 -6
- package/core/entities/text.js +324 -181
- package/core/lib/boundingBox.js +73 -13
- package/core/lib/canvas.js +256 -65
- package/core/lib/clipboard.js +198 -0
- package/core/lib/colour.js +144 -0
- package/core/lib/colours.js +367 -301
- package/core/lib/commandLine.js +16 -28
- package/core/lib/commandManager.js +115 -58
- package/core/lib/constants.js +23 -0
- package/core/lib/dxf/dxf.js +249 -34
- package/core/lib/dxf/dxfFile.js +23 -38
- package/core/lib/dxf/dxfIterator.js +17 -5
- package/core/lib/dxf/dxfRead.js +23 -7
- package/core/lib/dxf/dxfWrite.js +39 -129
- package/core/lib/dxf/handleManager.js +97 -0
- package/core/lib/dxf/sections/blocks.js +16 -2
- package/core/lib/dxf/sections/entities.js +17 -3
- package/core/lib/dxf/sections/header.js +10 -1
- package/core/lib/dxf/sections/objects.js +36 -0
- package/core/lib/dxf/sections/section.js +43 -5
- package/core/lib/dxf/sections/tables.js +17 -3
- package/core/lib/entityManager.js +178 -0
- package/core/lib/fileio.js +14 -4
- package/core/lib/headers.js +229 -0
- package/core/lib/input.js +46 -0
- package/core/lib/inputManager.js +199 -194
- package/core/lib/intersect.js +341 -468
- package/core/lib/logging.js +25 -1
- package/core/lib/matrix.js +6 -8
- package/core/lib/mouse.js +24 -79
- package/core/lib/patterns.js +690 -0
- package/core/lib/promptOptions.js +133 -0
- package/core/lib/scene.js +71 -174
- package/core/lib/selectionManager.js +74 -48
- package/core/lib/selectionWindow.js +24 -10
- package/core/lib/settings.js +18 -11
- package/core/lib/snapping.js +129 -21
- package/core/lib/stateManager.js +288 -0
- package/core/lib/strings.js +57 -5
- package/core/lib/utils.js +95 -11
- package/core/objects/dictionary.js +43 -0
- package/core/objects/dictionaryManager.js +80 -0
- package/core/properties/dimType.js +117 -0
- package/core/properties/flags.js +66 -0
- package/core/properties/property.js +26 -0
- package/core/properties/propertyManager.js +65 -19
- package/core/tables/appId.js +31 -0
- package/core/tables/appIdManager.js +44 -0
- package/core/tables/block.js +323 -0
- package/core/tables/blockManager.js +48 -0
- package/core/tables/blockRecord.js +29 -0
- package/core/tables/blockRecordManager.js +37 -0
- package/core/tables/dimStyle.js +627 -0
- package/core/tables/dimStyleManager.js +187 -0
- package/core/tables/endblk.js +28 -0
- package/core/tables/layer.js +219 -0
- package/core/tables/layerManager.js +47 -0
- package/core/tables/ltype.js +85 -0
- package/core/tables/ltypeManager.js +65 -0
- package/core/tables/style.js +145 -0
- package/core/tables/styleManager.js +55 -0
- package/core/tables/styleManagerBase.js +110 -0
- package/core/tables/tableManagerBase.js +354 -0
- package/core/tables/ucs.js +28 -0
- package/core/tables/ucsManager.js +44 -0
- package/core/tables/view.js +28 -0
- package/core/tables/viewManager.js +44 -0
- package/core/tables/vport.js +70 -0
- package/core/tables/vportManager.js +65 -0
- package/core/tools/chamfer.js +343 -0
- package/core/tools/chamferFilletBase.js +162 -0
- package/core/tools/copy.js +68 -40
- package/core/tools/copybase.js +65 -0
- package/core/tools/copyclip.js +59 -0
- package/core/tools/cornerEntity.js +138 -0
- package/core/tools/cutclip.js +72 -0
- package/core/tools/distance.js +37 -9
- package/core/tools/erase.js +43 -13
- package/core/tools/explode.js +117 -0
- package/core/tools/extend.js +71 -32
- package/core/tools/fillet.js +336 -0
- package/core/tools/identify.js +33 -6
- package/core/tools/matchProp.js +106 -0
- package/core/tools/mirror.js +141 -0
- package/core/tools/move.js +65 -32
- package/core/tools/offset.js +321 -0
- package/core/tools/pan.js +54 -0
- package/core/tools/pasteclip.js +93 -0
- package/core/tools/purge.js +90 -0
- package/core/tools/rotate.js +105 -70
- package/core/tools/scale.js +166 -0
- package/core/tools/tool.js +14 -4
- package/core/tools/trim.js +71 -32
- package/core/tools/zoom.js +152 -0
- package/package.json +3 -305
- package/test/dimensions/alignedDimension.test.js +211 -0
- package/test/dimensions/angularDimension.test.js +243 -0
- package/test/dimensions/baseDimension.test.js +239 -0
- package/test/dimensions/diametricDimension.test.js +203 -0
- package/test/dimensions/dimension.test.js +102 -0
- package/test/dimensions/radialDimension.test.js +203 -0
- package/test/dimensions/rotatedDimension.test.js +224 -0
- package/test/entities/arc.test.js +463 -41
- package/test/entities/arctext.test.js +329 -0
- package/test/entities/basePolyline.test.js +459 -10
- package/test/entities/circle.test.js +312 -7
- package/test/entities/entity.test.js +28 -9
- package/test/entities/hatch.test.js +606 -0
- package/test/entities/insert.test.js +90 -0
- package/test/entities/line.test.js +182 -6
- package/test/entities/point.test.js +375 -37
- package/test/entities/solid.test.js +156 -0
- package/test/entities/text.test.js +533 -7
- package/test/integration/exportIntegration.reference.dxf +1706 -0
- package/test/integration/exportIntegration.test.js +186 -0
- package/test/integration/importExportIntegration.test.js +126 -0
- package/test/integration/intersectionIntegration.test.js +880 -0
- package/test/integration/userInputIntegration.reference.dxf +1410 -0
- package/test/integration/userInputIntegration.test.js +269 -0
- package/test/lib/boundingBox.test.js +26 -2
- package/test/lib/canvas.test.js +613 -5
- package/test/lib/clipboard.test.js +70 -0
- package/test/lib/colour.test.js +114 -0
- package/test/lib/colours.test.js +63 -18
- package/test/lib/commandLine.test.js +159 -22
- package/test/lib/commandManager.test.js +4 -4
- package/test/lib/constants.test.js +9 -0
- package/test/lib/dxf/dxfFile.test.js +6 -2
- package/test/lib/dxf/dxfIterator.test.js +1 -1
- package/test/lib/dxf/dxfWrite.test.js +173 -0
- package/test/lib/dxf/handleManager.test.js +137 -0
- package/test/lib/dxf/sections/blocks.test.js +5 -5
- package/test/lib/dxf/sections/entities.test.js +4 -4
- package/test/lib/dxf/sections/header.test.js +18 -4
- package/test/lib/dxf/sections/objects.test.js +132 -0
- package/test/lib/dxf/sections/section.test.js +29 -29
- package/test/lib/dxf/sections/tables.test.js +3 -3
- package/test/lib/entityManager.test.js +163 -0
- package/test/lib/headers.test.js +233 -0
- package/test/lib/inputManager.test.js +1144 -5
- package/test/lib/intersect.test.js +454 -331
- package/test/lib/logging.test.js +1 -1
- package/test/lib/matrix.test.js +1 -1
- package/test/lib/mouse.test.js +327 -4
- package/test/lib/patterns.test.js +105 -0
- package/test/lib/promptOptions.test.js +179 -0
- package/test/lib/scene.test.js +16 -52
- package/test/lib/selectionManager.test.js +17 -5
- package/test/lib/settings.test.js +111 -5
- package/test/lib/snapping.test.js +142 -4
- package/test/lib/stateManager.test.js +155 -0
- package/test/lib/utils.test.js +81 -1
- package/test/objects/dictionary.test.js +81 -0
- package/test/objects/dictionaryManager.test.js +34 -0
- package/test/properties/dimType.test.js +62 -0
- package/test/properties/flags.test.js +164 -0
- package/test/properties/property.test.js +13 -0
- package/test/properties/propertyManager.test.js +10 -11
- package/test/tables/appId.test.js +46 -0
- package/test/tables/appIdManager.test.js +72 -0
- package/test/tables/block.test.js +157 -0
- package/test/tables/blockManager.test.js +52 -0
- package/test/tables/blockRecord.test.js +39 -0
- package/test/tables/blockRecordManager.test.js +60 -0
- package/test/tables/dimstyle.test.js +72 -0
- package/test/tables/endblk.test.js +30 -0
- package/test/tables/layer.test.js +95 -0
- package/test/tables/layerManager.test.js +172 -0
- package/test/{styles → tables}/ltype.test.js +7 -7
- package/test/{styles → tables}/ltypeManager.test.js +2 -2
- package/test/tables/style.test.js +44 -0
- package/test/tables/stylemanagerbase.test.js +220 -0
- package/test/tables/tableManagerBase.test.js +194 -0
- package/test/tables/ucs.test.js +37 -0
- package/test/tables/ucsManager.test.js +48 -0
- package/test/tables/view.test.js +37 -0
- package/test/tables/viewManager.test.js +48 -0
- package/test/tables/vport.test.js +117 -0
- package/test/tables/vportManager.test.js +54 -0
- package/test/test-helpers/test-helpers.js +66 -0
- package/test/tools/chamfer.test.js +970 -0
- package/test/tools/chamferFilletBase.test.js +446 -0
- package/test/tools/copy.test.js +22 -14
- package/test/tools/copybase.test.js +93 -0
- package/test/tools/copyclip.test.js +92 -0
- package/test/tools/cornerEntity.test.js +201 -0
- package/test/tools/cutclip.test.js +94 -0
- package/test/tools/distance.test.js +140 -18
- package/test/tools/erase.test.js +12 -12
- package/test/tools/explode.test.js +45 -0
- package/test/tools/extend.test.js +326 -44
- package/test/tools/fillet.test.js +831 -0
- package/test/tools/identify.test.js +115 -16
- package/test/tools/matchProp.test.js +84 -0
- package/test/tools/mirror.test.js +475 -0
- package/test/tools/move.test.js +75 -19
- package/test/tools/offset.test.js +748 -0
- package/test/tools/pan.test.js +72 -0
- package/test/tools/pasteclip.test.js +100 -0
- package/test/tools/purge.test.js +89 -0
- package/test/tools/rotate.test.js +89 -23
- package/test/tools/scale.test.js +529 -0
- package/test/tools/trim.test.js +419 -84
- package/test/tools/zoom.test.js +504 -0
- package/core/entities/alignedDimension.js +0 -279
- package/core/entities/angularDimension.js +0 -194
- package/core/entities/baseDimension.js +0 -227
- package/core/entities/block.js +0 -247
- package/core/entities/diametricDimension.js +0 -133
- package/core/entities/dimension.js +0 -202
- package/core/entities/radialDimension.js +0 -126
- package/core/styles/dimStyle.js +0 -719
- package/core/styles/dimStyleManager.js +0 -47
- package/core/styles/layer.js +0 -133
- package/core/styles/layerManager.js +0 -40
- package/core/styles/ltype.js +0 -86
- package/core/styles/ltypeManager.js +0 -50
- package/core/styles/style.js +0 -158
- package/core/styles/styleManager.js +0 -43
- package/core/styles/styleManagerBase.js +0 -299
- package/test/entities/block.test.js +0 -22
- package/test/styles/dimstyle.test.js +0 -19
- package/test/styles/layerManager.test.js +0 -150
- package/test/styles/style.test.js +0 -33
- package/test/styles/stylemanagerbase.test.js +0 -219
package/core/tools/distance.js
CHANGED
|
@@ -1,28 +1,47 @@
|
|
|
1
|
-
import {Strings} from '../lib/strings.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { Strings } from '../lib/strings.js';
|
|
2
|
+
import { Utils } from '../lib/utils.js';
|
|
3
|
+
import { Tool } from './tool.js';
|
|
4
|
+
import { Input, PromptOptions } from '../lib/inputManager.js';
|
|
5
|
+
import { Logging } from '../lib/logging.js';
|
|
5
6
|
|
|
6
|
-
import {DesignCore} from '../designCore.js';
|
|
7
|
+
import { DesignCore } from '../designCore.js';
|
|
7
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Distance Command Class
|
|
11
|
+
* @extends Tool
|
|
12
|
+
*/
|
|
8
13
|
export class Distance extends Tool {
|
|
14
|
+
/** Create a Distance command */
|
|
9
15
|
constructor() {
|
|
10
16
|
super();
|
|
11
17
|
}
|
|
12
18
|
|
|
19
|
+
/**
|
|
20
|
+
* Register the command
|
|
21
|
+
* @return {Object}
|
|
22
|
+
* command = name of the command
|
|
23
|
+
* shortcut = shortcut for the command
|
|
24
|
+
* type = type to group command in toolbars (omitted if not shown)
|
|
25
|
+
*/
|
|
13
26
|
static register() {
|
|
14
|
-
const command = {command: 'Distance', shortcut: 'DI'}; // , type: 'Tool'};
|
|
27
|
+
const command = { command: 'Distance', shortcut: 'DI' }; // , type: 'Tool'};
|
|
15
28
|
return command;
|
|
16
29
|
}
|
|
17
30
|
|
|
31
|
+
/**
|
|
32
|
+
* Execute method
|
|
33
|
+
* executes the workflow, requesting input required to perform the command
|
|
34
|
+
*/
|
|
18
35
|
async execute() {
|
|
19
36
|
try {
|
|
20
37
|
const op = new PromptOptions(Strings.Input.START, [Input.Type.POINT]);
|
|
21
38
|
const pt1 = await DesignCore.Scene.inputManager.requestInput(op);
|
|
39
|
+
if (pt1 === undefined) return;
|
|
22
40
|
this.points.push(pt1);
|
|
23
41
|
|
|
24
42
|
const op2 = new PromptOptions(Strings.Input.END, [Input.Type.POINT]);
|
|
25
43
|
const pt2 = await DesignCore.Scene.inputManager.requestInput(op2);
|
|
44
|
+
if (pt2 === undefined) return;
|
|
26
45
|
this.points.push(pt2);
|
|
27
46
|
|
|
28
47
|
DesignCore.Scene.inputManager.executeCommand();
|
|
@@ -31,15 +50,24 @@ export class Distance extends Tool {
|
|
|
31
50
|
}
|
|
32
51
|
}
|
|
33
52
|
|
|
53
|
+
/**
|
|
54
|
+
* Preview the command during execution
|
|
55
|
+
*/
|
|
34
56
|
preview() {
|
|
35
57
|
// TODO: Draw a preview of the measurement
|
|
36
58
|
}
|
|
37
59
|
|
|
60
|
+
/**
|
|
61
|
+
* Perform the command
|
|
62
|
+
*/
|
|
38
63
|
action() {
|
|
64
|
+
const dx = this.points[1].x - this.points[0].x;
|
|
65
|
+
const dy = this.points[1].y - this.points[0].y;
|
|
39
66
|
const length = this.points[0].distance(this.points[1]).toFixed(1);
|
|
40
|
-
const
|
|
41
|
-
const
|
|
42
|
-
const
|
|
67
|
+
const angle = Utils.radians2degrees(this.points[0].angle(this.points[1])).toFixed(1);
|
|
68
|
+
const x = dx.toFixed(1);
|
|
69
|
+
const y = dy.toFixed(1);
|
|
70
|
+
const di = (`${Strings.Strings.LENGTH}: ${length} Angle: ${angle}${Strings.Symbol.DEGREE} ${Strings.Symbol.DELTA}X: ${x} ${Strings.Symbol.DELTA}Y: ${y}`);
|
|
43
71
|
DesignCore.Core.notify(di);
|
|
44
72
|
}
|
|
45
73
|
}
|
package/core/tools/erase.js
CHANGED
|
@@ -1,44 +1,74 @@
|
|
|
1
|
-
import {Strings} from '../lib/strings.js';
|
|
2
|
-
import {Tool} from './tool.js';
|
|
3
|
-
import {Input, PromptOptions} from '../lib/inputManager.js';
|
|
4
|
-
import {Logging} from '../lib/logging.js';
|
|
1
|
+
import { Strings } from '../lib/strings.js';
|
|
2
|
+
import { Tool } from './tool.js';
|
|
3
|
+
import { Input, PromptOptions } from '../lib/inputManager.js';
|
|
4
|
+
import { Logging } from '../lib/logging.js';
|
|
5
|
+
import { RemoveState } from '../lib/stateManager.js';
|
|
5
6
|
|
|
6
|
-
import {DesignCore} from '../designCore.js';
|
|
7
|
+
import { DesignCore } from '../designCore.js';
|
|
7
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Erase Command Class
|
|
11
|
+
* @extends Tool
|
|
12
|
+
*/
|
|
8
13
|
export class Erase extends Tool {
|
|
14
|
+
/** Create an Erase command */
|
|
9
15
|
constructor() {
|
|
10
16
|
super();
|
|
11
17
|
}
|
|
12
18
|
|
|
19
|
+
/**
|
|
20
|
+
* Register the command
|
|
21
|
+
* @return {Object}
|
|
22
|
+
* command = name of the command
|
|
23
|
+
* shortcut = shortcut for the command
|
|
24
|
+
* type = type to group command in toolbars (omitted if not shown)
|
|
25
|
+
*/
|
|
13
26
|
static register() {
|
|
14
|
-
const command = {command: 'Erase', shortcut: 'E', type: 'Tool'};
|
|
27
|
+
const command = { command: 'Erase', shortcut: 'E', type: 'Tool' };
|
|
15
28
|
return command;
|
|
16
29
|
}
|
|
17
30
|
|
|
31
|
+
/**
|
|
32
|
+
* Execute method
|
|
33
|
+
* executes the workflow, requesting input required to perform the command
|
|
34
|
+
*/
|
|
18
35
|
async execute() {
|
|
19
36
|
try {
|
|
20
37
|
const op = new PromptOptions(Strings.Input.SELECTIONSET, [Input.Type.SELECTIONSET]);
|
|
21
38
|
|
|
22
39
|
if (!DesignCore.Scene.selectionManager.selectionSet.selectionSet.length) {
|
|
23
|
-
await DesignCore.Scene.inputManager.requestInput(op);
|
|
40
|
+
const result = await DesignCore.Scene.inputManager.requestInput(op);
|
|
41
|
+
if (result === undefined) return;
|
|
24
42
|
}
|
|
25
43
|
|
|
26
44
|
DesignCore.Scene.inputManager.executeCommand();
|
|
27
|
-
} catch (
|
|
45
|
+
} catch (err) {
|
|
28
46
|
Logging.instance.error(`${this.type} - ${err}`);
|
|
29
47
|
}
|
|
30
48
|
}
|
|
31
49
|
|
|
50
|
+
/**
|
|
51
|
+
* Preview the command during execution
|
|
52
|
+
*/
|
|
53
|
+
preview() {
|
|
54
|
+
// No Preview
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Perform the command
|
|
59
|
+
*/
|
|
32
60
|
action() {
|
|
33
61
|
// get a copy of the selection set
|
|
34
62
|
const selections = DesignCore.Scene.selectionManager.selectionSet.selectionSet.slice();
|
|
35
|
-
// sort the selection in descending order
|
|
36
|
-
selections.sort((a, b)=>b-a);
|
|
37
63
|
|
|
38
|
-
|
|
39
|
-
|
|
64
|
+
const stateChanges = [];
|
|
65
|
+
|
|
40
66
|
for (let i = 0; i < selections.length; i++) {
|
|
41
|
-
DesignCore.Scene.
|
|
67
|
+
const stateChange = new RemoveState(DesignCore.Scene.entities.get(selections[i]));
|
|
68
|
+
stateChanges.push(stateChange);
|
|
42
69
|
}
|
|
70
|
+
|
|
71
|
+
// delete each of the selections from the scene items
|
|
72
|
+
DesignCore.Scene.commit(stateChanges);
|
|
43
73
|
}
|
|
44
74
|
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { Utils } from '../lib/utils.js';
|
|
2
|
+
import { Strings } from '../lib/strings.js';
|
|
3
|
+
import { Tool } from './tool.js';
|
|
4
|
+
import { Input, PromptOptions } from '../lib/inputManager.js';
|
|
5
|
+
import { Logging } from '../lib/logging.js';
|
|
6
|
+
import { Insert } from '../entities/insert.js';
|
|
7
|
+
import { Point } from '../entities/point.js';
|
|
8
|
+
import { AddState, RemoveState } from '../lib/stateManager.js';
|
|
9
|
+
|
|
10
|
+
import { DesignCore } from '../designCore.js';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Explode Command Class
|
|
14
|
+
* @extends Tool
|
|
15
|
+
*/
|
|
16
|
+
export class Explode extends Tool {
|
|
17
|
+
/** Create an Explode command */
|
|
18
|
+
constructor() {
|
|
19
|
+
super();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Register the command
|
|
24
|
+
* @return {Object}
|
|
25
|
+
* command = name of the command
|
|
26
|
+
* shortcut = shortcut for the command
|
|
27
|
+
* type = type to group command in toolbars (omitted if not shown)
|
|
28
|
+
*/
|
|
29
|
+
static register() {
|
|
30
|
+
const command = { command: 'Explode', shortcut: 'X' };
|
|
31
|
+
return command;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Execute method
|
|
36
|
+
* executes the workflow, requesting input required to perform the command
|
|
37
|
+
*/
|
|
38
|
+
async execute() {
|
|
39
|
+
try {
|
|
40
|
+
const op = new PromptOptions(Strings.Input.SELECTIONSET, [Input.Type.SELECTIONSET]);
|
|
41
|
+
|
|
42
|
+
if (!DesignCore.Scene.selectionManager.selectionSet.selectionSet.length) {
|
|
43
|
+
const result = await DesignCore.Scene.inputManager.requestInput(op);
|
|
44
|
+
if (result === undefined) return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
DesignCore.Scene.inputManager.executeCommand();
|
|
48
|
+
} catch (err) {
|
|
49
|
+
Logging.instance.error(`${this.type} - ${err}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Preview the command during execution
|
|
55
|
+
*/
|
|
56
|
+
preview() {
|
|
57
|
+
// No Preview
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Perform the command
|
|
62
|
+
*/
|
|
63
|
+
action() {
|
|
64
|
+
// count how many items couldn't be exploded
|
|
65
|
+
let counter = 0;
|
|
66
|
+
// get a copy of the selection set
|
|
67
|
+
const selections = DesignCore.Scene.selectionManager.selectionSet.selectionSet.slice();
|
|
68
|
+
// sort the selection in descending order
|
|
69
|
+
selections.sort((a, b) => b - a);
|
|
70
|
+
|
|
71
|
+
const stateChanges = [];
|
|
72
|
+
|
|
73
|
+
for (let i = 0; i < selections.length; i++) {
|
|
74
|
+
const insert = DesignCore.Scene.entities.get(selections[i]);
|
|
75
|
+
|
|
76
|
+
// check the selected item in an insert
|
|
77
|
+
if (!(insert instanceof Insert)) {
|
|
78
|
+
counter++;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// check the insert has a block and
|
|
83
|
+
// check the block has items
|
|
84
|
+
if (insert.block === undefined || insert.block.items.length == 0) {
|
|
85
|
+
counter++;
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const insertPoint = insert.points[0];
|
|
90
|
+
const block = insert.block;
|
|
91
|
+
const blockItems = block.items;
|
|
92
|
+
|
|
93
|
+
const rotation = Utils.degrees2radians(insert.rotation);
|
|
94
|
+
const origin = new Point(0, 0);
|
|
95
|
+
|
|
96
|
+
blockItems.forEach((blockItem) => {
|
|
97
|
+
const copyofitem = Utils.cloneObject(blockItem);
|
|
98
|
+
const points = copyofitem.points.map((p) => new Point(p.x, p.y, p.bulge, p.sequence).rotate(origin, rotation).add(insertPoint));
|
|
99
|
+
copyofitem.setProperty('points', points);
|
|
100
|
+
const stateChange = new AddState(copyofitem);
|
|
101
|
+
stateChanges.push(stateChange);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
const stateChangeRemove = new RemoveState(insert);
|
|
105
|
+
stateChanges.push(stateChangeRemove);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
// add the exploded items to the scene
|
|
110
|
+
DesignCore.Scene.commit(stateChanges);
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
if (counter) {
|
|
114
|
+
DesignCore.Core.notify(`${this.type} - ${counter} ${Strings.Strings.ITEMS} ${Strings.Message.CANNOTBEACTIONED}`);
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
}
|
package/core/tools/extend.js
CHANGED
|
@@ -1,72 +1,111 @@
|
|
|
1
|
-
import {Intersection} from '../lib/intersect.js';
|
|
2
|
-
import {Strings} from '../lib/strings.js';
|
|
3
|
-
import {Tool} from './tool.js';
|
|
4
|
-
import {Input, PromptOptions} from '../lib/inputManager.js';
|
|
5
|
-
import {Logging} from '../lib/logging.js';
|
|
1
|
+
import { Intersection } from '../lib/intersect.js';
|
|
2
|
+
import { Strings } from '../lib/strings.js';
|
|
3
|
+
import { Tool } from './tool.js';
|
|
4
|
+
import { Input, PromptOptions } from '../lib/inputManager.js';
|
|
5
|
+
import { Logging } from '../lib/logging.js';
|
|
6
6
|
|
|
7
|
-
import {DesignCore} from '../designCore.js';
|
|
7
|
+
import { DesignCore } from '../designCore.js';
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Extend Command Class
|
|
11
|
+
* @extends Tool
|
|
12
|
+
*/
|
|
9
13
|
export class Extend extends Tool {
|
|
14
|
+
/** Create an Extend command */
|
|
10
15
|
constructor() {
|
|
11
16
|
super();
|
|
12
|
-
this.
|
|
17
|
+
this.selectedItem = null;
|
|
18
|
+
this.selectedBoundaryItems = [];
|
|
13
19
|
}
|
|
14
20
|
|
|
21
|
+
/**
|
|
22
|
+
* Register the command
|
|
23
|
+
* @return {Object}
|
|
24
|
+
* command = name of the command
|
|
25
|
+
* shortcut = shortcut for the command
|
|
26
|
+
* type = type to group command in toolbars (omitted if not shown)
|
|
27
|
+
*/
|
|
15
28
|
static register() {
|
|
16
|
-
const command = {command: 'Extend', shortcut: 'EX', type: 'Tool'};
|
|
29
|
+
const command = { command: 'Extend', shortcut: 'EX', type: 'Tool' };
|
|
17
30
|
return command;
|
|
18
31
|
}
|
|
19
32
|
|
|
33
|
+
/**
|
|
34
|
+
* Execute method
|
|
35
|
+
* executes the workflow, requesting input required to perform the command
|
|
36
|
+
*/
|
|
20
37
|
async execute() {
|
|
21
38
|
try {
|
|
22
39
|
const op = new PromptOptions(Strings.Input.BOUNDARY, [Input.Type.SELECTIONSET]);
|
|
23
40
|
|
|
24
41
|
if (!DesignCore.Scene.selectionManager.selectionSet.selectionSet.length) {
|
|
25
|
-
await DesignCore.Scene.inputManager.requestInput(op);
|
|
42
|
+
const boundary = await DesignCore.Scene.inputManager.requestInput(op);
|
|
43
|
+
if (boundary === undefined) return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// add all selected items to boundary items
|
|
47
|
+
for (let i = 0; i < DesignCore.Scene.selectionManager.selectionSet.selectionSet.length; i++) {
|
|
48
|
+
const boundaryItem = DesignCore.Scene.entities.get(DesignCore.Scene.selectionManager.selectionSet.selectionSet[i]);
|
|
49
|
+
this.selectedBoundaryItems.push(boundaryItem);
|
|
26
50
|
}
|
|
27
51
|
|
|
28
52
|
const op2 = new PromptOptions(Strings.Input.SELECT, [Input.Type.SINGLESELECTION]);
|
|
29
53
|
while (true) {
|
|
30
54
|
const selection = await DesignCore.Scene.inputManager.requestInput(op2);
|
|
31
|
-
|
|
55
|
+
if (selection === undefined) break;
|
|
56
|
+
this.selectedItem = DesignCore.Scene.entities.get(selection.selectedItemIndex);
|
|
57
|
+
DesignCore.Scene.selectionManager.removeLastSelection();
|
|
32
58
|
DesignCore.Scene.inputManager.actionCommand();
|
|
33
59
|
}
|
|
34
|
-
|
|
60
|
+
|
|
61
|
+
DesignCore.Scene.inputManager.executeCommand();
|
|
62
|
+
} catch (err) {
|
|
35
63
|
Logging.instance.error(`${this.type} - ${err}`);
|
|
36
64
|
}
|
|
37
65
|
}
|
|
38
66
|
|
|
39
|
-
|
|
40
|
-
|
|
67
|
+
/**
|
|
68
|
+
* Preview the command during execution
|
|
69
|
+
*/
|
|
70
|
+
preview() {
|
|
71
|
+
// No Preview
|
|
72
|
+
}
|
|
41
73
|
|
|
42
|
-
|
|
74
|
+
/**
|
|
75
|
+
* Perform the command
|
|
76
|
+
*/
|
|
77
|
+
action() {
|
|
78
|
+
if (this.selectedItem && this.selectedBoundaryItems.length) {
|
|
43
79
|
const intersectPoints = [];
|
|
44
|
-
let extendItem;
|
|
45
80
|
|
|
46
|
-
for (
|
|
47
|
-
if (
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
if (intersect.points.length) {
|
|
55
|
-
for (let point = 0; point < intersect.points.length; point++) {
|
|
56
|
-
intersectPoints.push(intersect.points[point]);
|
|
81
|
+
for (const boundaryItem of this.selectedBoundaryItems) {
|
|
82
|
+
if (boundaryItem !== this.selectedItem) {
|
|
83
|
+
try {
|
|
84
|
+
const intersect = Intersection.intersectPolylinePolyline(boundaryItem.toPolylinePoints(), this.selectedItem.toPolylinePoints(), true);
|
|
85
|
+
if (intersect.points.length) {
|
|
86
|
+
for (let point = 0; point < intersect.points.length; point++) {
|
|
87
|
+
intersectPoints.push(intersect.points[point]);
|
|
88
|
+
}
|
|
57
89
|
}
|
|
90
|
+
} catch {
|
|
91
|
+
Logging.instance.warn(`${this.constructor.name}: Error intersecting between ${boundaryItem.type} and ${this.selectedItem.type}`);
|
|
92
|
+
continue;
|
|
58
93
|
}
|
|
59
94
|
}
|
|
60
95
|
}
|
|
61
96
|
|
|
62
|
-
if (intersectPoints) {
|
|
63
|
-
|
|
97
|
+
if (intersectPoints.length) {
|
|
98
|
+
const stateChanges = this.selectedItem.extend(intersectPoints);
|
|
99
|
+
if (stateChanges?.length) {
|
|
100
|
+
DesignCore.Scene.commit(stateChanges);
|
|
101
|
+
}
|
|
102
|
+
} else {
|
|
103
|
+
DesignCore.Core.notify(`${this.type} - ${this.selectedItem.type} ${Strings.Message.NOEXTEND}`);
|
|
64
104
|
}
|
|
65
|
-
|
|
66
|
-
// remove item from selection set and reset the selectedIndex
|
|
67
|
-
DesignCore.Scene.selectionManager.removeFromSelectionSet(this.selectedIndex);
|
|
68
|
-
this.selectedIndex = undefined;
|
|
69
105
|
}
|
|
106
|
+
|
|
107
|
+
// reset selected item
|
|
108
|
+
this.selectedItem = null;
|
|
70
109
|
}
|
|
71
110
|
}
|
|
72
111
|
|