@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.
Files changed (145) hide show
  1. package/.eslintrc.json +4 -0
  2. package/TODO.md +49 -6
  3. package/core/core/core.js +0 -3
  4. package/core/dimensions/alignedDimension.js +5 -4
  5. package/core/dimensions/angularDimension.js +6 -5
  6. package/core/dimensions/baseCircularDimension.js +3 -2
  7. package/core/dimensions/baseDimension.js +59 -93
  8. package/core/dimensions/baseLinearDimension.js +6 -5
  9. package/core/dimensions/diametricDimension.js +4 -3
  10. package/core/dimensions/dimension.js +21 -14
  11. package/core/dimensions/radialDimension.js +4 -3
  12. package/core/dimensions/rotatedDimension.js +12 -11
  13. package/core/entities/arc.js +112 -145
  14. package/core/entities/arctext.js +212 -174
  15. package/core/entities/basePolyline.js +30 -282
  16. package/core/entities/circle.js +77 -99
  17. package/core/entities/entity.js +114 -93
  18. package/core/entities/hatch.js +322 -249
  19. package/core/entities/insert.js +66 -81
  20. package/core/entities/line.js +21 -142
  21. package/core/entities/lwpolyline.js +16 -11
  22. package/core/entities/polyline.js +4 -4
  23. package/core/entities/rectangle.js +3 -1
  24. package/core/entities/solid.js +6 -15
  25. package/core/entities/text.js +188 -199
  26. package/core/lib/auxiliary/rubberBand.js +32 -0
  27. package/core/lib/auxiliary/selectionWindow.js +63 -0
  28. package/core/lib/auxiliary/snapPoint.js +113 -0
  29. package/core/lib/auxiliary/trackingLine.js +76 -0
  30. package/core/lib/canvas.js +228 -166
  31. package/core/lib/clipboard.js +7 -1
  32. package/core/lib/colour.js +16 -0
  33. package/core/lib/commandLine.js +1 -6
  34. package/core/lib/commandManager.js +18 -8
  35. package/core/lib/constants.js +28 -0
  36. package/core/lib/dxf/dxf.js +4 -3
  37. package/core/lib/entityManager.js +18 -11
  38. package/core/lib/inputManager.js +35 -11
  39. package/core/lib/intersect.js +25 -0
  40. package/core/lib/patterns.js +8 -1
  41. package/core/lib/plotOptions.js +67 -0
  42. package/core/lib/polylineUtils.js +75 -0
  43. package/core/lib/renderers/cairoRenderer.js +371 -0
  44. package/core/lib/renderers/canvasRenderer.js +315 -0
  45. package/core/lib/renderers/pdfRenderer.js +366 -0
  46. package/core/lib/renderers/rendererBase.js +284 -0
  47. package/core/lib/renderers/svgRenderer.js +343 -0
  48. package/core/lib/scene.js +27 -5
  49. package/core/lib/selectionManager.js +2 -2
  50. package/core/lib/settings.js +4 -2
  51. package/core/lib/snapping.js +4 -191
  52. package/core/lib/stateManager.js +30 -1
  53. package/core/lib/utils.js +21 -2
  54. package/core/properties/entityProperties.js +104 -0
  55. package/core/properties/property.js +106 -2
  56. package/core/properties/propertyManager.js +29 -13
  57. package/core/tables/block.js +4 -37
  58. package/core/tables/endblk.js +1 -1
  59. package/core/tables/layer.js +8 -0
  60. package/core/tables/styleManagerBase.js +3 -2
  61. package/core/tables/tableManagerBase.js +8 -3
  62. package/core/tools/chamfer.js +111 -137
  63. package/core/tools/chamferFilletBase.js +135 -34
  64. package/core/tools/copy.js +3 -3
  65. package/core/tools/explode.js +2 -2
  66. package/core/tools/extend.js +132 -19
  67. package/core/tools/fillet.js +86 -183
  68. package/core/tools/matchProp.js +2 -11
  69. package/core/tools/mirror.js +7 -6
  70. package/core/tools/move.js +3 -3
  71. package/core/tools/offset.js +3 -5
  72. package/core/tools/pasteclip.js +1 -1
  73. package/core/tools/rotate.js +6 -3
  74. package/core/tools/scale.js +1 -1
  75. package/core/tools/trim.js +265 -23
  76. package/core/tools/zoom.js +1 -1
  77. package/jest.config.js +6 -0
  78. package/package.json +5 -3
  79. package/test/dimensions/alignedDimension.test.js +14 -7
  80. package/test/dimensions/angularDimension.test.js +6 -6
  81. package/test/dimensions/baseDimension.test.js +69 -8
  82. package/test/dimensions/baseLinearDimension.test.js +62 -0
  83. package/test/dimensions/diametricDimension.test.js +6 -6
  84. package/test/dimensions/radialDimension.test.js +6 -6
  85. package/test/dimensions/rotatedDimension.test.js +14 -7
  86. package/test/entities/arc.test.js +80 -83
  87. package/test/entities/arctext.test.js +180 -53
  88. package/test/entities/basePolyline.test.js +68 -2
  89. package/test/entities/circle.test.js +57 -85
  90. package/test/entities/entity.test.js +42 -8
  91. package/test/entities/hatch.test.js +543 -70
  92. package/test/entities/insert.test.js +96 -1
  93. package/test/entities/line.test.js +15 -41
  94. package/test/entities/lwpolyline.test.js +104 -0
  95. package/test/entities/polyline.test.js +11 -0
  96. package/test/entities/rectangle.test.js +11 -0
  97. package/test/entities/solid.test.js +1 -1
  98. package/test/entities/text.test.js +294 -69
  99. package/test/integration/exportIntegration.reference.dxf +9 -9
  100. package/test/integration/exportIntegration.test.js +2 -2
  101. package/test/integration/intersectionIntegration.test.js +4 -5
  102. package/test/integration/pdfRendererIntegration.reference.pdf +17709 -0
  103. package/test/integration/pdfRendererIntegration.test.js +61 -0
  104. package/test/integration/svgRendererIntegration.reference.svg +3343 -0
  105. package/test/integration/svgRendererIntegration.test.js +61 -0
  106. package/test/integration/userInputIntegration.reference.dxf +1165 -105
  107. package/test/integration/userInputIntegration.test.js +239 -132
  108. package/test/lib/canvas.test.js +742 -123
  109. package/test/lib/constants.test.js +27 -0
  110. package/test/lib/entityManager.test.js +4 -4
  111. package/test/lib/inputManager.test.js +80 -19
  112. package/test/lib/intersect.test.js +83 -0
  113. package/test/lib/plotOptions.test.js +179 -0
  114. package/test/lib/rubberBand.test.js +84 -0
  115. package/test/lib/settings.test.js +5 -6
  116. package/test/lib/snapping.test.js +71 -129
  117. package/test/lib/stateManager.test.js +7 -7
  118. package/test/lib/utils.test.js +36 -2
  119. package/test/properties/entityProperties.test.js +132 -0
  120. package/test/properties/property.test.js +53 -0
  121. package/test/properties/propertyManager.test.js +3 -3
  122. package/test/renderers/canvasRenderer.test.js +317 -0
  123. package/test/renderers/pdfRenderer.test.js +271 -0
  124. package/test/renderers/rendererBase.test.js +213 -0
  125. package/test/renderers/svgRenderer.test.js +326 -0
  126. package/test/tables/block.test.js +31 -1
  127. package/test/tables/endblk.test.js +2 -2
  128. package/test/tables/layer.test.js +30 -0
  129. package/test/test-helpers/hatchGridRenderer.js +180 -0
  130. package/test/test-helpers/test-helpers.js +152 -0
  131. package/test/tools/chamfer.test.js +227 -5
  132. package/test/tools/chamferFilletBase.test.js +98 -9
  133. package/test/tools/copy.test.js +2 -2
  134. package/test/tools/explode.test.js +3 -3
  135. package/test/tools/extend.test.js +331 -0
  136. package/test/tools/fillet.test.js +181 -0
  137. package/test/tools/matchProp.test.js +5 -5
  138. package/test/tools/mirror.test.js +13 -13
  139. package/test/tools/offset.test.js +170 -3
  140. package/test/tools/pasteclip.test.js +5 -5
  141. package/test/tools/rotate.test.js +32 -2
  142. package/test/tools/scale.test.js +5 -5
  143. package/test/tools/trim.test.js +526 -0
  144. package/test/tools/zoom.test.js +7 -7
  145. 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
+ }