@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
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Pan } from '../../core/tools/pan.js';
|
|
2
|
+
import { DesignCore } from '../../core/designCore.js';
|
|
3
|
+
import { Core } from '../../core/core/core.js';
|
|
4
|
+
import { MouseDown, MouseUp } from '../../core/lib/input.js';
|
|
5
|
+
|
|
6
|
+
import { jest } from '@jest/globals';
|
|
7
|
+
|
|
8
|
+
// initialise core
|
|
9
|
+
new Core();
|
|
10
|
+
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
jest.restoreAllMocks();
|
|
13
|
+
DesignCore.Scene.inputManager.activeCommand = undefined;
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
test('Pan.execute toggles panning on mouse down then off on mouse up (single cycle)', async () => {
|
|
17
|
+
const pan = new Pan();
|
|
18
|
+
DesignCore.Scene.inputManager.activeCommand = pan;
|
|
19
|
+
|
|
20
|
+
const panSpy = jest.spyOn(DesignCore.Canvas, 'pan').mockImplementation(() => {});
|
|
21
|
+
|
|
22
|
+
let resolveMouseDown; let resolveMouseUp;
|
|
23
|
+
const mouseDownPromise = new Promise((r) => (resolveMouseDown = r));
|
|
24
|
+
const mouseUpPromise = new Promise((r) => (resolveMouseUp = r));
|
|
25
|
+
|
|
26
|
+
jest.spyOn(DesignCore.Scene.inputManager, 'requestInput')
|
|
27
|
+
.mockImplementationOnce(() => mouseDownPromise)
|
|
28
|
+
.mockImplementationOnce(() => mouseUpPromise);
|
|
29
|
+
|
|
30
|
+
const execPromise = pan.execute();
|
|
31
|
+
|
|
32
|
+
// Verify first requestInput was called with the pan prompt
|
|
33
|
+
expect(DesignCore.Scene.inputManager.requestInput.mock.calls[0][0].promptMessage)
|
|
34
|
+
.toBe('');
|
|
35
|
+
|
|
36
|
+
resolveMouseDown(new MouseDown());
|
|
37
|
+
await Promise.resolve();
|
|
38
|
+
expect(pan.panning).toBe(true);
|
|
39
|
+
|
|
40
|
+
pan.preview();
|
|
41
|
+
expect(panSpy).toHaveBeenCalledTimes(1);
|
|
42
|
+
|
|
43
|
+
DesignCore.Scene.inputManager.activeCommand = undefined;
|
|
44
|
+
resolveMouseUp(new MouseUp());
|
|
45
|
+
await execPromise;
|
|
46
|
+
expect(pan.panning).toBe(false);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
test('Test Pan.register', () => {
|
|
51
|
+
const command = Pan.register();
|
|
52
|
+
expect(command.command).toBe('Pan');
|
|
53
|
+
expect(command.shortcut).toBe('P');
|
|
54
|
+
expect(command.type).toBeUndefined();
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
test('Pan command should call DesignCore.Canvas.pan when panning is true', () => {
|
|
59
|
+
DesignCore.Canvas.pan = jest.fn();
|
|
60
|
+
const pan = new Pan();
|
|
61
|
+
pan.panning = true;
|
|
62
|
+
pan.preview();
|
|
63
|
+
expect(DesignCore.Canvas.pan).toHaveBeenCalled();
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test('Pan command should not call DesignCore.Canvas.pan when panning is false', () => {
|
|
67
|
+
DesignCore.Canvas.pan = jest.fn();
|
|
68
|
+
const pan = new Pan();
|
|
69
|
+
pan.panning = false;
|
|
70
|
+
pan.preview();
|
|
71
|
+
expect(DesignCore.Canvas.pan).not.toHaveBeenCalled();
|
|
72
|
+
});
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { Core } from '../../core/core/core.js';
|
|
2
|
+
import { Point } from '../../core/entities/point.js';
|
|
3
|
+
import { Pasteclip } from '../../core/tools/pasteclip.js';
|
|
4
|
+
import { Copyclip } from '../../core/tools/copyclip.js';
|
|
5
|
+
import { DesignCore } from '../../core/designCore.js';
|
|
6
|
+
import { expect, jest } from '@jest/globals';
|
|
7
|
+
|
|
8
|
+
// Init core context
|
|
9
|
+
new Core();
|
|
10
|
+
|
|
11
|
+
describe('Pasteclip Tool', () => {
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
DesignCore.Scene.entities.clear();
|
|
14
|
+
DesignCore.Scene.selectionManager.reset();
|
|
15
|
+
DesignCore.Scene.tempEntities.clear();
|
|
16
|
+
DesignCore.Clipboard.Entities = []; // also resets basePoint
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test('execute throws / resets when clipboard invalid', async () => {
|
|
20
|
+
const tool = new Pasteclip();
|
|
21
|
+
const resetSpy = jest.spyOn(DesignCore.Scene.inputManager, 'reset').mockImplementation(() => {});
|
|
22
|
+
const requestSpy = jest.spyOn(DesignCore.Scene.inputManager, 'requestInput').mockResolvedValue(new Point());
|
|
23
|
+
await tool.execute();
|
|
24
|
+
expect(resetSpy).toHaveBeenCalled();
|
|
25
|
+
expect(requestSpy).not.toHaveBeenCalled();
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test('execute requests base point and then calls executeCommand when clipboard valid', async () => {
|
|
29
|
+
// Prepare clipboard via copyclip to ensure validity
|
|
30
|
+
const line = DesignCore.CommandManager.createNew('Line', { layer: '0', points: [new Point(10, 10), new Point(20, 20)] });
|
|
31
|
+
DesignCore.Scene.entities.add(line);
|
|
32
|
+
DesignCore.Scene.selectionManager.addToSelectionSet(0);
|
|
33
|
+
new Copyclip().action();
|
|
34
|
+
expect(DesignCore.Clipboard.isValid).toBe(true);
|
|
35
|
+
|
|
36
|
+
const tool = new Pasteclip();
|
|
37
|
+
const pt = new Point(100, 100);
|
|
38
|
+
const requestSpy = jest.spyOn(DesignCore.Scene.inputManager, 'requestInput').mockResolvedValue(pt);
|
|
39
|
+
const execSpy = jest.spyOn(DesignCore.Scene.inputManager, 'executeCommand').mockImplementation(() => {});
|
|
40
|
+
await tool.execute();
|
|
41
|
+
expect(requestSpy).toHaveBeenCalledTimes(1);
|
|
42
|
+
expect(execSpy).toHaveBeenCalledTimes(1);
|
|
43
|
+
expect(tool.points[0]).toBe(pt);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test('preview creates temp entities offset from mouse', () => {
|
|
47
|
+
// Setup clipboard
|
|
48
|
+
const line = DesignCore.CommandManager.createNew('Line', { layer: '0', points: [new Point(0, 0), new Point(10, 0)] });
|
|
49
|
+
DesignCore.Scene.entities.add(line);
|
|
50
|
+
DesignCore.Scene.selectionManager.addToSelectionSet(0);
|
|
51
|
+
new Copyclip().action();
|
|
52
|
+
const basePoint = DesignCore.Clipboard.BasePoint; // bottom-left of line
|
|
53
|
+
|
|
54
|
+
// Mock mouse pointOnScene to return offset target
|
|
55
|
+
const targetPoint = new Point(50, 50);
|
|
56
|
+
DesignCore.Mouse.pointOnScene = () => targetPoint;
|
|
57
|
+
|
|
58
|
+
const tool = new Pasteclip();
|
|
59
|
+
tool.preview();
|
|
60
|
+
expect(DesignCore.Scene.tempEntities.count()).toBeGreaterThan(0);
|
|
61
|
+
const tempLine = DesignCore.Scene.tempEntities.get(0);
|
|
62
|
+
const deltaX = targetPoint.x - basePoint.x;
|
|
63
|
+
const deltaY = targetPoint.y - basePoint.y;
|
|
64
|
+
expect(tempLine.points[0].x).toBe(line.points[0].x + deltaX);
|
|
65
|
+
expect(tempLine.points[0].y).toBe(line.points[0].y + deltaY);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test('action pastes entities with correct offset', () => {
|
|
69
|
+
const line = DesignCore.CommandManager.createNew('Circle', { layer: '0', points: [new Point(), new Point(5, 0)] });
|
|
70
|
+
DesignCore.Scene.entities.add(line);
|
|
71
|
+
DesignCore.Scene.selectionManager.addToSelectionSet(0);
|
|
72
|
+
new Copyclip().action();
|
|
73
|
+
|
|
74
|
+
const basePoint = DesignCore.Clipboard.BasePoint;
|
|
75
|
+
expect(basePoint.x).toBe(-5);
|
|
76
|
+
expect(basePoint.y).toBe(-5);
|
|
77
|
+
|
|
78
|
+
const entityCount = DesignCore.Scene.entities.count();
|
|
79
|
+
const tool = new Pasteclip();
|
|
80
|
+
const insertion = new Point(10, 10);
|
|
81
|
+
tool.points.push(insertion); // simulate execute collected base point
|
|
82
|
+
tool.action();
|
|
83
|
+
|
|
84
|
+
expect(DesignCore.Scene.entities.count()).toBe(entityCount + 1);
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
const newEntity = DesignCore.Scene.entities.get(-1);
|
|
88
|
+
expect(newEntity.points[0].x).toBe(15);
|
|
89
|
+
expect(newEntity.points[0].y).toBe(15);
|
|
90
|
+
|
|
91
|
+
// Ensure the in clipboard was not mutated
|
|
92
|
+
const pasted = DesignCore.Clipboard.Entities[0];
|
|
93
|
+
expect(pasted.points[0].x).toBe(0);
|
|
94
|
+
expect(pasted.points[0].y).toBe(0);
|
|
95
|
+
|
|
96
|
+
// Verify pasted entity has a unique handle
|
|
97
|
+
expect(newEntity.handle).toBeDefined();
|
|
98
|
+
expect(newEntity.handle).not.toBe(line.handle);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { Core } from '../../core/core/core.js';
|
|
2
|
+
import { Point } from '../../core/entities/point.js';
|
|
3
|
+
import { Purge } from '../../core/tools/purge.js';
|
|
4
|
+
import { DesignCore } from '../../core/designCore.js';
|
|
5
|
+
|
|
6
|
+
new Core();
|
|
7
|
+
const purge = new Purge();
|
|
8
|
+
const layerManager = DesignCore.LayerManager;
|
|
9
|
+
const ltypeManager = DesignCore.LTypeManager;
|
|
10
|
+
const blockManager = DesignCore.Scene.blockManager;
|
|
11
|
+
const dimStyleManager = DesignCore.DimStyleManager;
|
|
12
|
+
|
|
13
|
+
// Runc this before each test
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
// insert needed for block?
|
|
16
|
+
blockManager.addItem({ name: 'blockWithoutItems' });
|
|
17
|
+
blockManager.addItem({ name: 'blockWithItems' });
|
|
18
|
+
|
|
19
|
+
layerManager.addItem({ 'name': 'layerWithoutItems' });
|
|
20
|
+
layerManager.addItem({ 'name': 'layerWithItems' });
|
|
21
|
+
|
|
22
|
+
ltypeManager.addItem({ 'name': 'ltypeWithoutItems' });
|
|
23
|
+
ltypeManager.addItem({ 'name': 'ltypeWithItems' });
|
|
24
|
+
|
|
25
|
+
dimStyleManager.addItem({ 'name': 'dimstyleWithItems' });
|
|
26
|
+
|
|
27
|
+
const point1 = new Point();
|
|
28
|
+
const point2 = new Point(0, 100);
|
|
29
|
+
|
|
30
|
+
const data = { points: [point1, point2], layer: 'layerWithItems', lineType: 'ltypeWithItems' };
|
|
31
|
+
|
|
32
|
+
DesignCore.Scene.addItem('Insert', { blockName: 'blockWithItems' });
|
|
33
|
+
DesignCore.Scene.addItem('Line', data);
|
|
34
|
+
DesignCore.Scene.addItem('Circle', data);
|
|
35
|
+
DesignCore.Scene.addItem('Text', data);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test('Test purge.action', () => {
|
|
39
|
+
expect(blockManager.itemCount()).toBe(4);
|
|
40
|
+
purge.option = 'Blocks';
|
|
41
|
+
purge.action();
|
|
42
|
+
expect(blockManager.itemCount()).toBe(3);
|
|
43
|
+
expect(blockManager.itemExists('blockWithoutItems')).toBe(false);
|
|
44
|
+
expect(blockManager.itemExists('blockWithItems')).toBe(true);
|
|
45
|
+
|
|
46
|
+
expect(dimStyleManager.itemCount()).toBe(4);
|
|
47
|
+
purge.option = 'Dimstyles';
|
|
48
|
+
purge.action();
|
|
49
|
+
expect(dimStyleManager.itemCount()).toBe(1);
|
|
50
|
+
|
|
51
|
+
expect(layerManager.itemCount()).toBe(4);
|
|
52
|
+
purge.option = 'Layers';
|
|
53
|
+
purge.action();
|
|
54
|
+
expect(layerManager.itemCount()).toBe(3);
|
|
55
|
+
expect(layerManager.itemExists('layerWithoutItems')).toBe(false);
|
|
56
|
+
expect(layerManager.itemExists('layerWithItems')).toBe(true);
|
|
57
|
+
|
|
58
|
+
expect(ltypeManager.itemCount()).toBe(5);
|
|
59
|
+
purge.option = 'LTypes';
|
|
60
|
+
purge.action();
|
|
61
|
+
expect(ltypeManager.itemCount()).toBe(4);
|
|
62
|
+
expect(ltypeManager.itemExists('ltypeWithOutItems')).toBe(false);
|
|
63
|
+
expect(ltypeManager.itemExists('ltypeWithItems')).toBe(true);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test('Test purge.action - All', () => {
|
|
67
|
+
expect(blockManager.itemCount()).toBe(4);
|
|
68
|
+
expect(layerManager.itemCount()).toBe(4);
|
|
69
|
+
expect(ltypeManager.itemCount()).toBe(5);
|
|
70
|
+
|
|
71
|
+
purge.option = 'All';
|
|
72
|
+
purge.action();
|
|
73
|
+
|
|
74
|
+
// Blocks
|
|
75
|
+
expect(blockManager.itemCount()).toBe(3);
|
|
76
|
+
expect(blockManager.itemExists('blockWithoutItems')).toBe(false);
|
|
77
|
+
expect(blockManager.itemExists('blockWithItems')).toBe(true);
|
|
78
|
+
|
|
79
|
+
// Layers
|
|
80
|
+
expect(layerManager.itemCount()).toBe(3);
|
|
81
|
+
expect(layerManager.itemExists('layerWithoutItems')).toBe(false);
|
|
82
|
+
expect(layerManager.itemExists('layerWithItems')).toBe(true);
|
|
83
|
+
|
|
84
|
+
// Ltypes
|
|
85
|
+
expect(ltypeManager.itemCount()).toBe(4);
|
|
86
|
+
expect(ltypeManager.itemExists('ltypeWithOutItems')).toBe(false);
|
|
87
|
+
expect(ltypeManager.itemExists('ltypeWithItems')).toBe(true);
|
|
88
|
+
});
|
|
89
|
+
|
|
@@ -1,20 +1,92 @@
|
|
|
1
|
-
import {Core} from '../../core/core/core.js';
|
|
2
|
-
import {Point} from '../../core/entities/point.js';
|
|
3
|
-
import {Rotate} from '../../core/tools/rotate.js';
|
|
1
|
+
import { Core } from '../../core/core/core.js';
|
|
2
|
+
import { Point } from '../../core/entities/point.js';
|
|
3
|
+
import { Rotate } from '../../core/tools/rotate.js';
|
|
4
4
|
|
|
5
5
|
const core = new Core();
|
|
6
6
|
|
|
7
|
+
const inputScenarios = [
|
|
8
|
+
{
|
|
9
|
+
desc: 'rotate by point',
|
|
10
|
+
inputs: [new Point(10, 0), new Point(30, 20)],
|
|
11
|
+
result: new Point(17.07106, 7.07106),
|
|
12
|
+
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
desc: 'rotate by angle',
|
|
16
|
+
inputs: [new Point(10, 0), 45],
|
|
17
|
+
result: new Point(17.07106, 7.07106),
|
|
18
|
+
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
desc: 'rotate by negative angle',
|
|
22
|
+
inputs: [new Point(10, 0), -45],
|
|
23
|
+
result: new Point(17.07106, -7.07106),
|
|
24
|
+
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
desc: 'rotate 90 by reference point',
|
|
28
|
+
inputs: [new Point(10, 0), 'r', new Point(), new Point(0, 20), new Point(-10, 0)],
|
|
29
|
+
result: new Point(10, 10),
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
test.each(inputScenarios)('Rotate.execute handles $desc', async (scenario) => {
|
|
34
|
+
const { inputs, result } = scenario;
|
|
35
|
+
const origInputManager = core.scene.inputManager;
|
|
36
|
+
let callCount = 0;
|
|
37
|
+
core.scene.inputManager = {
|
|
38
|
+
requestInput: async () => {
|
|
39
|
+
if (callCount < inputs.length) {
|
|
40
|
+
const input = inputs[callCount];
|
|
41
|
+
callCount++;
|
|
42
|
+
return input;
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// clear all scene entities
|
|
48
|
+
core.scene.clear();
|
|
49
|
+
// create line
|
|
50
|
+
const pointOne = new Point(10, 0);
|
|
51
|
+
const pointTwo = new Point(20, 0);
|
|
52
|
+
core.scene.addItem('Line', { points: [pointOne, pointTwo] });
|
|
53
|
+
|
|
54
|
+
// select line
|
|
55
|
+
core.scene.selectionManager.addToSelectionSet(0);
|
|
56
|
+
|
|
57
|
+
const rotate = new Rotate();
|
|
58
|
+
await rotate.execute();
|
|
59
|
+
|
|
60
|
+
expect(core.scene.tempEntities.count()).toBe(0); // no temp entities before preview
|
|
61
|
+
rotate.preview(); // to set up any preview state if needed
|
|
62
|
+
expect(core.scene.tempEntities.count()).toBe(1); // preview should create temp entity
|
|
63
|
+
|
|
64
|
+
rotate.action();
|
|
65
|
+
|
|
66
|
+
const line = core.scene.entities.get(0);
|
|
67
|
+
|
|
68
|
+
expect(line.points[0].x).toBe(pointOne.x);
|
|
69
|
+
expect(line.points[0].y).toBeCloseTo(pointOne.y);
|
|
70
|
+
|
|
71
|
+
expect(line.points[1].x).toBeCloseTo(result.x);
|
|
72
|
+
expect(line.points[1].y).toBeCloseTo(result.y);
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
// Restore original inputManager
|
|
76
|
+
core.scene.inputManager = origInputManager;
|
|
77
|
+
});
|
|
78
|
+
|
|
7
79
|
test('Test Rotate.action', () => {
|
|
8
80
|
// Add items to scene
|
|
9
|
-
core.scene.addItem('Line', {points: [new Point(10, 0), new Point(20, 0)]});
|
|
10
|
-
core.scene.addItem('Circle', {points: [new Point(10, 0), new Point(20, 0)]});
|
|
11
|
-
core.scene.addItem('Polyline', {points: [new Point(10, 0), new Point(20, 0)]});
|
|
12
|
-
core.scene.addItem('Arc', {points: [new Point(10, 0), new Point(10, 10), new Point(0, 10)]});
|
|
13
|
-
core.scene.addItem('Rectangle', {points: [new Point(10, 0), new Point(0, 10)]});
|
|
14
|
-
core.scene.addItem('Text', {points: [new Point(10, 0), new Point(0, 10)], height: 10, rotation: 0, string: 'text test'});
|
|
81
|
+
core.scene.addItem('Line', { points: [new Point(10, 0), new Point(20, 0)] });
|
|
82
|
+
core.scene.addItem('Circle', { points: [new Point(10, 0), new Point(20, 0)] });
|
|
83
|
+
core.scene.addItem('Polyline', { points: [new Point(10, 0), new Point(20, 0)] });
|
|
84
|
+
core.scene.addItem('Arc', { points: [new Point(10, 0), new Point(10, 10), new Point(0, 10)] });
|
|
85
|
+
core.scene.addItem('Rectangle', { points: [new Point(10, 0), new Point(0, 10)] });
|
|
86
|
+
core.scene.addItem('Text', { points: [new Point(10, 0), new Point(0, 10)], height: 10, rotation: 0, string: 'text test' });
|
|
15
87
|
|
|
16
88
|
// Add items to selection set
|
|
17
|
-
for (let i = 0; i < core.scene.
|
|
89
|
+
for (let i = 0; i < core.scene.entities.count(); i++) {
|
|
18
90
|
core.scene.selectionManager.addToSelectionSet(i);
|
|
19
91
|
}
|
|
20
92
|
|
|
@@ -27,18 +99,15 @@ test('Test Rotate.action', () => {
|
|
|
27
99
|
// set base point
|
|
28
100
|
rotate.points.push(new Point());
|
|
29
101
|
|
|
30
|
-
// set rotation reference point
|
|
31
|
-
rotate.points.push(new Point(10, 0));
|
|
32
|
-
|
|
33
102
|
// set rotation destination point
|
|
34
103
|
rotate.points.push(new Point(0, 10));
|
|
35
104
|
|
|
36
105
|
// Perform rotate
|
|
37
106
|
rotate.action();
|
|
38
107
|
|
|
39
|
-
for (let i = 0; i < core.scene.
|
|
40
|
-
expect(core.scene.
|
|
41
|
-
expect(core.scene.
|
|
108
|
+
for (let i = 0; i < core.scene.entities.count(); i++) {
|
|
109
|
+
expect(core.scene.entities.get(i).points[0].x).toBeCloseTo(0);
|
|
110
|
+
expect(core.scene.entities.get(i).points[0].y).toBeCloseTo(10);
|
|
42
111
|
}
|
|
43
112
|
|
|
44
113
|
/**
|
|
@@ -51,17 +120,14 @@ test('Test Rotate.action', () => {
|
|
|
51
120
|
// set base point
|
|
52
121
|
rotate.points.push(new Point());
|
|
53
122
|
|
|
54
|
-
// set rotation reference point
|
|
55
|
-
rotate.points.push(new Point(0, 10));
|
|
56
|
-
|
|
57
123
|
// set rotation destination point
|
|
58
|
-
rotate.points.push(new Point(
|
|
124
|
+
rotate.points.push(new Point(0, -10));
|
|
59
125
|
|
|
60
126
|
// Perform rotate
|
|
61
127
|
rotate.action();
|
|
62
128
|
|
|
63
|
-
for (let i = 0; i < core.scene.
|
|
64
|
-
expect(core.scene.
|
|
65
|
-
expect(core.scene.
|
|
129
|
+
for (let i = 0; i < core.scene.entities.count(); i++) {
|
|
130
|
+
expect(core.scene.entities.get(i).points[0].x).toBeCloseTo(10);
|
|
131
|
+
expect(core.scene.entities.get(i).points[0].y).toBeCloseTo(0);
|
|
66
132
|
}
|
|
67
133
|
});
|