@design-core/core 0.0.6 → 0.0.7
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 +4 -0
- package/TODO.md +49 -6
- package/core/core/core.js +0 -3
- package/core/dimensions/alignedDimension.js +5 -4
- package/core/dimensions/angularDimension.js +6 -5
- package/core/dimensions/baseCircularDimension.js +3 -2
- package/core/dimensions/baseDimension.js +59 -93
- package/core/dimensions/baseLinearDimension.js +6 -5
- package/core/dimensions/diametricDimension.js +4 -3
- package/core/dimensions/dimension.js +21 -14
- package/core/dimensions/radialDimension.js +4 -3
- package/core/dimensions/rotatedDimension.js +12 -11
- package/core/entities/arc.js +112 -145
- package/core/entities/arctext.js +212 -174
- package/core/entities/basePolyline.js +30 -282
- package/core/entities/circle.js +77 -99
- package/core/entities/entity.js +114 -93
- package/core/entities/hatch.js +322 -249
- package/core/entities/insert.js +66 -81
- package/core/entities/line.js +21 -142
- package/core/entities/lwpolyline.js +16 -11
- package/core/entities/polyline.js +4 -4
- package/core/entities/rectangle.js +3 -1
- package/core/entities/solid.js +6 -15
- package/core/entities/text.js +188 -199
- package/core/lib/auxiliary/rubberBand.js +32 -0
- package/core/lib/auxiliary/selectionWindow.js +63 -0
- package/core/lib/auxiliary/snapPoint.js +113 -0
- package/core/lib/auxiliary/trackingLine.js +76 -0
- package/core/lib/canvas.js +228 -166
- package/core/lib/clipboard.js +7 -1
- package/core/lib/colour.js +16 -0
- package/core/lib/commandLine.js +1 -6
- package/core/lib/commandManager.js +18 -8
- package/core/lib/constants.js +28 -0
- package/core/lib/dxf/dxf.js +4 -3
- package/core/lib/entityManager.js +18 -11
- package/core/lib/inputManager.js +35 -11
- package/core/lib/intersect.js +25 -0
- package/core/lib/patterns.js +8 -1
- package/core/lib/plotOptions.js +67 -0
- package/core/lib/polylineUtils.js +75 -0
- package/core/lib/renderers/cairoRenderer.js +371 -0
- package/core/lib/renderers/canvasRenderer.js +315 -0
- package/core/lib/renderers/pdfRenderer.js +366 -0
- package/core/lib/renderers/rendererBase.js +284 -0
- package/core/lib/renderers/svgRenderer.js +343 -0
- package/core/lib/scene.js +27 -5
- package/core/lib/selectionManager.js +2 -2
- package/core/lib/settings.js +4 -2
- package/core/lib/snapping.js +4 -191
- package/core/lib/stateManager.js +30 -1
- package/core/lib/utils.js +21 -2
- package/core/properties/entityProperties.js +104 -0
- package/core/properties/property.js +106 -2
- package/core/properties/propertyManager.js +29 -13
- package/core/tables/block.js +4 -37
- package/core/tables/endblk.js +1 -1
- package/core/tables/layer.js +8 -0
- package/core/tables/styleManagerBase.js +3 -2
- package/core/tables/tableManagerBase.js +8 -3
- package/core/tools/chamfer.js +111 -137
- package/core/tools/chamferFilletBase.js +135 -34
- package/core/tools/copy.js +3 -3
- package/core/tools/explode.js +2 -2
- package/core/tools/extend.js +132 -19
- package/core/tools/fillet.js +86 -183
- package/core/tools/matchProp.js +2 -11
- package/core/tools/mirror.js +7 -6
- package/core/tools/move.js +3 -3
- package/core/tools/offset.js +3 -5
- package/core/tools/pasteclip.js +1 -1
- package/core/tools/rotate.js +6 -3
- package/core/tools/scale.js +1 -1
- package/core/tools/trim.js +265 -23
- package/core/tools/zoom.js +1 -1
- package/jest.config.js +6 -0
- package/package.json +5 -3
- package/test/dimensions/alignedDimension.test.js +14 -7
- package/test/dimensions/angularDimension.test.js +6 -6
- package/test/dimensions/baseDimension.test.js +69 -8
- package/test/dimensions/baseLinearDimension.test.js +62 -0
- package/test/dimensions/diametricDimension.test.js +6 -6
- package/test/dimensions/radialDimension.test.js +6 -6
- package/test/dimensions/rotatedDimension.test.js +14 -7
- package/test/entities/arc.test.js +80 -83
- package/test/entities/arctext.test.js +180 -53
- package/test/entities/basePolyline.test.js +68 -2
- package/test/entities/circle.test.js +57 -85
- package/test/entities/entity.test.js +42 -8
- package/test/entities/hatch.test.js +543 -70
- package/test/entities/insert.test.js +96 -1
- package/test/entities/line.test.js +15 -41
- package/test/entities/lwpolyline.test.js +104 -0
- package/test/entities/polyline.test.js +11 -0
- package/test/entities/rectangle.test.js +11 -0
- package/test/entities/solid.test.js +1 -1
- package/test/entities/text.test.js +294 -69
- package/test/integration/exportIntegration.reference.dxf +9 -9
- package/test/integration/exportIntegration.test.js +2 -2
- package/test/integration/intersectionIntegration.test.js +4 -5
- package/test/integration/pdfRendererIntegration.reference.pdf +17709 -0
- package/test/integration/pdfRendererIntegration.test.js +61 -0
- package/test/integration/svgRendererIntegration.reference.svg +3343 -0
- package/test/integration/svgRendererIntegration.test.js +61 -0
- package/test/integration/userInputIntegration.reference.dxf +1165 -105
- package/test/integration/userInputIntegration.test.js +239 -132
- package/test/lib/canvas.test.js +742 -123
- package/test/lib/constants.test.js +27 -0
- package/test/lib/entityManager.test.js +4 -4
- package/test/lib/inputManager.test.js +80 -19
- package/test/lib/intersect.test.js +83 -0
- package/test/lib/plotOptions.test.js +179 -0
- package/test/lib/rubberBand.test.js +84 -0
- package/test/lib/settings.test.js +5 -6
- package/test/lib/snapping.test.js +71 -129
- package/test/lib/stateManager.test.js +7 -7
- package/test/lib/utils.test.js +36 -2
- package/test/properties/entityProperties.test.js +132 -0
- package/test/properties/property.test.js +53 -0
- package/test/properties/propertyManager.test.js +3 -3
- package/test/renderers/canvasRenderer.test.js +317 -0
- package/test/renderers/pdfRenderer.test.js +271 -0
- package/test/renderers/rendererBase.test.js +213 -0
- package/test/renderers/svgRenderer.test.js +326 -0
- package/test/tables/block.test.js +31 -1
- package/test/tables/endblk.test.js +2 -2
- package/test/tables/layer.test.js +30 -0
- package/test/test-helpers/hatchGridRenderer.js +180 -0
- package/test/test-helpers/test-helpers.js +152 -0
- package/test/tools/chamfer.test.js +227 -5
- package/test/tools/chamferFilletBase.test.js +98 -9
- package/test/tools/copy.test.js +2 -2
- package/test/tools/explode.test.js +3 -3
- package/test/tools/extend.test.js +331 -0
- package/test/tools/fillet.test.js +181 -0
- package/test/tools/matchProp.test.js +5 -5
- package/test/tools/mirror.test.js +13 -13
- package/test/tools/offset.test.js +170 -3
- package/test/tools/pasteclip.test.js +5 -5
- package/test/tools/rotate.test.js +32 -2
- package/test/tools/scale.test.js +5 -5
- package/test/tools/trim.test.js +526 -0
- package/test/tools/zoom.test.js +7 -7
- package/core/lib/selectionWindow.js +0 -83
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { DesignCore } from '../../designCore.js';
|
|
2
|
+
import { Point } from '../../entities/point.js';
|
|
3
|
+
|
|
4
|
+
/** SnapPoint Class */
|
|
5
|
+
export class SnapPoint {
|
|
6
|
+
static Type = Object.freeze({
|
|
7
|
+
NONE: 'none',
|
|
8
|
+
END: 'end',
|
|
9
|
+
MID: 'mid',
|
|
10
|
+
CENTRE: 'centre',
|
|
11
|
+
QUADRANT: 'quadrant',
|
|
12
|
+
NEAREST: 'nearest',
|
|
13
|
+
TANGENT: 'tangent',
|
|
14
|
+
NODE: 'node',
|
|
15
|
+
PERPENDICULAR: 'perpendicular',
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Create SnapPoint
|
|
20
|
+
* @param {Point} snapPoint
|
|
21
|
+
* @param {string} type - snap type from SnapPoint.Type
|
|
22
|
+
*/
|
|
23
|
+
constructor(snapPoint, type = SnapPoint.Type.END) {
|
|
24
|
+
this.snapPoint = snapPoint;
|
|
25
|
+
this.type = type;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Draw the entity
|
|
30
|
+
* @param {Object} renderer
|
|
31
|
+
* @param {number} scale
|
|
32
|
+
*/
|
|
33
|
+
draw(renderer, scale) {
|
|
34
|
+
const snapColour = DesignCore.Settings.accentcolour;
|
|
35
|
+
const size = 6 / scale;
|
|
36
|
+
const x = this.snapPoint.x;
|
|
37
|
+
const y = this.snapPoint.y;
|
|
38
|
+
const lineWidth = 2.5 / scale;
|
|
39
|
+
|
|
40
|
+
renderer.setColour(snapColour);
|
|
41
|
+
renderer.setLineWidth(lineWidth);
|
|
42
|
+
renderer.setDash([], 0);
|
|
43
|
+
|
|
44
|
+
// Full circle encoded as two bulge semi-arcs (same encoding as Circle entity)
|
|
45
|
+
const circlePoints = (cx, cy, r) => [
|
|
46
|
+
new Point(cx + r, cy, 1),
|
|
47
|
+
new Point(cx - r, cy, 1),
|
|
48
|
+
new Point(cx + r, cy),
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
switch (this.type) {
|
|
52
|
+
case SnapPoint.Type.END: // square
|
|
53
|
+
renderer.drawShape([
|
|
54
|
+
new Point(x - size, y - size),
|
|
55
|
+
new Point(x + size, y - size),
|
|
56
|
+
new Point(x + size, y + size),
|
|
57
|
+
new Point(x - size, y + size),
|
|
58
|
+
], { closed: true });
|
|
59
|
+
break;
|
|
60
|
+
case SnapPoint.Type.MID: // triangle
|
|
61
|
+
renderer.drawShape([
|
|
62
|
+
new Point(x, y + size),
|
|
63
|
+
new Point(x - size, y - size),
|
|
64
|
+
new Point(x + size, y - size),
|
|
65
|
+
], { closed: true });
|
|
66
|
+
break;
|
|
67
|
+
case SnapPoint.Type.QUADRANT: // diamond
|
|
68
|
+
renderer.drawShape([
|
|
69
|
+
new Point(x, y - size),
|
|
70
|
+
new Point(x + size, y),
|
|
71
|
+
new Point(x, y + size),
|
|
72
|
+
new Point(x - size, y),
|
|
73
|
+
], { closed: true });
|
|
74
|
+
break;
|
|
75
|
+
case SnapPoint.Type.NEAREST: // hourglass
|
|
76
|
+
renderer.drawShape([
|
|
77
|
+
new Point(x - size, y - size),
|
|
78
|
+
new Point(x + size, y - size),
|
|
79
|
+
new Point(x - size, y + size),
|
|
80
|
+
new Point(x + size, y + size),
|
|
81
|
+
], { closed: true });
|
|
82
|
+
break;
|
|
83
|
+
case SnapPoint.Type.TANGENT: // circle + horizontal line above
|
|
84
|
+
renderer.drawShape(circlePoints(x, y, size));
|
|
85
|
+
renderer.drawShape([
|
|
86
|
+
new Point(x - size, y + size * 1.5),
|
|
87
|
+
new Point(x + size, y + size * 1.5),
|
|
88
|
+
]);
|
|
89
|
+
break;
|
|
90
|
+
case SnapPoint.Type.NODE: // circle + X inside
|
|
91
|
+
renderer.drawShape(circlePoints(x, y, size));
|
|
92
|
+
renderer.drawShape([
|
|
93
|
+
new Point(x - size * 0.7, y - size * 0.7),
|
|
94
|
+
new Point(x + size * 0.7, y + size * 0.7),
|
|
95
|
+
]);
|
|
96
|
+
renderer.drawShape([
|
|
97
|
+
new Point(x + size * 0.7, y - size * 0.7),
|
|
98
|
+
new Point(x - size * 0.7, y + size * 0.7),
|
|
99
|
+
]);
|
|
100
|
+
break;
|
|
101
|
+
case SnapPoint.Type.PERPENDICULAR: // L-shape corner
|
|
102
|
+
renderer.drawShape([
|
|
103
|
+
new Point(x - size, y + size),
|
|
104
|
+
new Point(x - size, y - size),
|
|
105
|
+
new Point(x + size, y - size),
|
|
106
|
+
]);
|
|
107
|
+
break;
|
|
108
|
+
default: // CENTRE - circle
|
|
109
|
+
renderer.drawShape(circlePoints(x, y, size));
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Point } from '../../entities/point.js';
|
|
2
|
+
|
|
3
|
+
import { DesignCore } from '../../designCore.js';
|
|
4
|
+
|
|
5
|
+
/** TrackingLine Class - dotted tracking line for polar/ortho snap */
|
|
6
|
+
export class TrackingLine {
|
|
7
|
+
/**
|
|
8
|
+
* Create TrackingLine
|
|
9
|
+
* @param {Point} inputPoint - the previous input point (defines direction)
|
|
10
|
+
* @param {Point} snapPoint - the current snapped mouse point (line starts here)
|
|
11
|
+
*/
|
|
12
|
+
constructor(inputPoint, snapPoint) {
|
|
13
|
+
this.inputPoint = inputPoint;
|
|
14
|
+
this.snapPoint = snapPoint;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Draw the tracking line, extended to the visible canvas edges
|
|
19
|
+
* @param {Object} renderer
|
|
20
|
+
* @param {number} scale
|
|
21
|
+
*/
|
|
22
|
+
draw(renderer, scale) {
|
|
23
|
+
const from = this.snapPoint;
|
|
24
|
+
const dir = this.snapPoint.subtract(this.inputPoint);
|
|
25
|
+
const lineWidth = 2 / scale;
|
|
26
|
+
|
|
27
|
+
if (dir.x === 0 && dir.y === 0) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Compute visible canvas bounds in scene space
|
|
32
|
+
const w = DesignCore.Canvas.width;
|
|
33
|
+
const h = DesignCore.Canvas.height;
|
|
34
|
+
const corner0 = DesignCore.Mouse.transformToScene(new Point(0, 0));
|
|
35
|
+
const corner1 = DesignCore.Mouse.transformToScene(new Point(w, h));
|
|
36
|
+
const boundsMin = corner0.min(corner1);
|
|
37
|
+
const boundsMax = corner0.max(corner1);
|
|
38
|
+
|
|
39
|
+
// Clip the ray (from snapPoint outward, away from inputPoint) to canvas bounds
|
|
40
|
+
let tMin = 0;
|
|
41
|
+
let tMax = Infinity;
|
|
42
|
+
|
|
43
|
+
if (dir.x !== 0) {
|
|
44
|
+
const tx1 = (boundsMin.x - from.x) / dir.x;
|
|
45
|
+
const tx2 = (boundsMax.x - from.x) / dir.x;
|
|
46
|
+
tMin = Math.max(tMin, Math.min(tx1, tx2));
|
|
47
|
+
tMax = Math.min(tMax, Math.max(tx1, tx2));
|
|
48
|
+
} else if (from.x < boundsMin.x || from.x > boundsMax.x) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (dir.y !== 0) {
|
|
53
|
+
const ty1 = (boundsMin.y - from.y) / dir.y;
|
|
54
|
+
const ty2 = (boundsMax.y - from.y) / dir.y;
|
|
55
|
+
tMin = Math.max(tMin, Math.min(ty1, ty2));
|
|
56
|
+
tMax = Math.min(tMax, Math.max(ty1, ty2));
|
|
57
|
+
} else if (from.y < boundsMin.y || from.y > boundsMax.y) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (tMax < tMin) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const start = from.add(dir.scale(tMin));
|
|
66
|
+
const end = from.add(dir.scale(tMax));
|
|
67
|
+
|
|
68
|
+
const lineColour = DesignCore.Settings.accentcolour;
|
|
69
|
+
const dashSize = 4 / scale;
|
|
70
|
+
|
|
71
|
+
renderer.setColour(lineColour);
|
|
72
|
+
renderer.setLineWidth(lineWidth);
|
|
73
|
+
renderer.setDash([dashSize, dashSize], 0);
|
|
74
|
+
renderer.drawShape([start, end]);
|
|
75
|
+
}
|
|
76
|
+
}
|