abstract-3d 2.7.30 → 2.7.33

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 (239) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +1 -1
  3. package/lib/abstract-3d.d.ts +2 -2
  4. package/lib/abstract-3d.d.ts.map +1 -1
  5. package/lib/abstract-3d.js +21 -13
  6. package/lib/abstract-3d.js.map +1 -1
  7. package/lib/renderers/dxf/dxf-encoding/dxf-3dface.d.ts.map +1 -1
  8. package/lib/renderers/dxf/dxf-encoding/dxf-color.js +2 -2
  9. package/lib/renderers/dxf/dxf-encoding/dxf-color.js.map +1 -1
  10. package/lib/renderers/dxf/dxf-encoding/dxf-common.d.ts.map +1 -1
  11. package/lib/renderers/dxf/dxf-encoding/dxf-common.js +9 -4
  12. package/lib/renderers/dxf/dxf-encoding/dxf-common.js.map +1 -1
  13. package/lib/renderers/dxf/dxf-encoding/dxf-dimension.d.ts +1 -1
  14. package/lib/renderers/dxf/dxf-encoding/dxf-dimension.d.ts.map +1 -1
  15. package/lib/renderers/dxf/dxf-encoding/dxf-dimension.js +3 -3
  16. package/lib/renderers/dxf/dxf-encoding/dxf-dimension.js.map +1 -1
  17. package/lib/renderers/dxf/dxf-encoding/dxf-footer.d.ts.map +1 -1
  18. package/lib/renderers/dxf/dxf-encoding/dxf-footer.js +2 -1
  19. package/lib/renderers/dxf/dxf-encoding/dxf-footer.js.map +1 -1
  20. package/lib/renderers/dxf/dxf-encoding/dxf-header.d.ts.map +1 -1
  21. package/lib/renderers/dxf/dxf-encoding/dxf-header.js +2 -1
  22. package/lib/renderers/dxf/dxf-encoding/dxf-header.js.map +1 -1
  23. package/lib/renderers/dxf/dxf-encoding/dxf-lwpolyline.d.ts.map +1 -1
  24. package/lib/renderers/dxf/dxf-encoding/dxf-lwpolyline.js +1 -3
  25. package/lib/renderers/dxf/dxf-encoding/dxf-lwpolyline.js.map +1 -1
  26. package/lib/renderers/dxf/dxf-encoding/dxf-mtext.d.ts.map +1 -1
  27. package/lib/renderers/dxf/dxf-encoding/dxf-mtext.js +0 -1
  28. package/lib/renderers/dxf/dxf-encoding/dxf-mtext.js.map +1 -1
  29. package/lib/renderers/dxf/dxf-encoding/dxf-polyline.d.ts.map +1 -1
  30. package/lib/renderers/dxf/dxf-encoding/dxf-polyline.js.map +1 -1
  31. package/lib/renderers/dxf/dxf-encoding/dxf-solid.d.ts.map +1 -1
  32. package/lib/renderers/dxf/dxf-encoding/dxf-triangle.d.ts.map +1 -1
  33. package/lib/renderers/dxf/dxf-geometries/dxf-dimension.d.ts.map +1 -1
  34. package/lib/renderers/dxf/dxf-geometries/dxf-dimension.js +1 -1
  35. package/lib/renderers/dxf/dxf-geometries/dxf-dimension.js.map +1 -1
  36. package/lib/renderers/dxf/dxf-geometries/dxf-image.js +3 -8
  37. package/lib/renderers/dxf/dxf-geometries/dxf-image.js.map +1 -1
  38. package/lib/renderers/dxf/dxf-geometries/dxf-polygon.d.ts.map +1 -1
  39. package/lib/renderers/dxf/dxf-geometries/dxf-polygon.js +2 -2
  40. package/lib/renderers/dxf/dxf-geometries/dxf-polygon.js.map +1 -1
  41. package/lib/renderers/dxf/dxf-geometries/dxf-shape.d.ts.map +1 -1
  42. package/lib/renderers/dxf/dxf-geometries/dxf-shape.js +1 -1
  43. package/lib/renderers/dxf/dxf-geometries/dxf-shape.js.map +1 -1
  44. package/lib/renderers/dxf/dxf.d.ts.map +1 -1
  45. package/lib/renderers/dxf/dxf.js +9 -5
  46. package/lib/renderers/dxf/dxf.js.map +1 -1
  47. package/lib/renderers/react/react-camera.d.ts +2 -2
  48. package/lib/renderers/react/react-camera.d.ts.map +1 -1
  49. package/lib/renderers/react/react-camera.js +4 -6
  50. package/lib/renderers/react/react-camera.js.map +1 -1
  51. package/lib/renderers/react/react-dimension.d.ts +2 -2
  52. package/lib/renderers/react/react-dimension.d.ts.map +1 -1
  53. package/lib/renderers/react/react-dimension.js +3 -3
  54. package/lib/renderers/react/react-dimension.js.map +1 -1
  55. package/lib/renderers/react/react-group.d.ts +4 -4
  56. package/lib/renderers/react/react-group.d.ts.map +1 -1
  57. package/lib/renderers/react/react-group.js.map +1 -1
  58. package/lib/renderers/react/react-hotspot.d.ts +2 -2
  59. package/lib/renderers/react/react-hotspot.d.ts.map +1 -1
  60. package/lib/renderers/react/react-hotspot.js +1 -1
  61. package/lib/renderers/react/react-hotspot.js.map +1 -1
  62. package/lib/renderers/react/react-image-material.d.ts +2 -2
  63. package/lib/renderers/react/react-image-material.d.ts.map +1 -1
  64. package/lib/renderers/react/react-image-material.js +5 -5
  65. package/lib/renderers/react/react-image-material.js.map +1 -1
  66. package/lib/renderers/react/react-material.d.ts +1 -1
  67. package/lib/renderers/react/react-material.d.ts.map +1 -1
  68. package/lib/renderers/react/react-material.js +1 -0
  69. package/lib/renderers/react/react-material.js.map +1 -1
  70. package/lib/renderers/react/react-mesh.d.ts +1 -1
  71. package/lib/renderers/react/react-mesh.d.ts.map +1 -1
  72. package/lib/renderers/react/react-mesh.js +5 -13
  73. package/lib/renderers/react/react-mesh.js.map +1 -1
  74. package/lib/renderers/react/react-scene.d.ts +5 -5
  75. package/lib/renderers/react/react-scene.d.ts.map +1 -1
  76. package/lib/renderers/react/react-scene.js +1 -0
  77. package/lib/renderers/react/react-scene.js.map +1 -1
  78. package/lib/renderers/react/react-types.d.ts +1 -1
  79. package/lib/renderers/react/react-types.d.ts.map +1 -1
  80. package/lib/renderers/react/react.d.ts +5 -5
  81. package/lib/renderers/react/react.d.ts.map +1 -1
  82. package/lib/renderers/react/react.js +2 -2
  83. package/lib/renderers/react/react.js.map +1 -1
  84. package/lib/renderers/step/step-encoding.d.ts +1 -1
  85. package/lib/renderers/step/step-encoding.d.ts.map +1 -1
  86. package/lib/renderers/step/step-encoding.js.map +1 -1
  87. package/lib/renderers/step/step-geometries/step-box.d.ts +2 -2
  88. package/lib/renderers/step/step-geometries/step-box.d.ts.map +1 -1
  89. package/lib/renderers/step/step-geometries/step-box.js.map +1 -1
  90. package/lib/renderers/step/step-geometries/step-cone.d.ts +2 -2
  91. package/lib/renderers/step/step-geometries/step-cone.d.ts.map +1 -1
  92. package/lib/renderers/step/step-geometries/step-cone.js +0 -1
  93. package/lib/renderers/step/step-geometries/step-cone.js.map +1 -1
  94. package/lib/renderers/step/step-geometries/step-cylinder.d.ts +2 -2
  95. package/lib/renderers/step/step-geometries/step-cylinder.d.ts.map +1 -1
  96. package/lib/renderers/step/step-geometries/step-cylinder.js +8 -23
  97. package/lib/renderers/step/step-geometries/step-cylinder.js.map +1 -1
  98. package/lib/renderers/step/step-geometries/step-plane.d.ts +2 -2
  99. package/lib/renderers/step/step-geometries/step-plane.d.ts.map +1 -1
  100. package/lib/renderers/step/step-geometries/step-plane.js +1 -1
  101. package/lib/renderers/step/step-geometries/step-plane.js.map +1 -1
  102. package/lib/renderers/step/step.d.ts +1 -1
  103. package/lib/renderers/step/step.d.ts.map +1 -1
  104. package/lib/renderers/step/step.js +1 -1
  105. package/lib/renderers/step/step.js.map +1 -1
  106. package/lib/renderers/stl/stl-encoding.d.ts +1 -1
  107. package/lib/renderers/stl/stl-encoding.d.ts.map +1 -1
  108. package/lib/renderers/stl/stl-encoding.js.map +1 -1
  109. package/lib/renderers/stl/stl-geometries/stl-box.d.ts +1 -1
  110. package/lib/renderers/stl/stl-geometries/stl-box.d.ts.map +1 -1
  111. package/lib/renderers/stl/stl-geometries/stl-box.js.map +1 -1
  112. package/lib/renderers/stl/stl-geometries/stl-cone.d.ts +1 -1
  113. package/lib/renderers/stl/stl-geometries/stl-cone.d.ts.map +1 -1
  114. package/lib/renderers/stl/stl-geometries/stl-cone.js.map +1 -1
  115. package/lib/renderers/stl/stl-geometries/stl-cylinder.d.ts +1 -1
  116. package/lib/renderers/stl/stl-geometries/stl-cylinder.d.ts.map +1 -1
  117. package/lib/renderers/stl/stl-geometries/stl-cylinder.js +1 -1
  118. package/lib/renderers/stl/stl-geometries/stl-cylinder.js.map +1 -1
  119. package/lib/renderers/stl/stl-geometries/stl-plane.d.ts +1 -1
  120. package/lib/renderers/stl/stl-geometries/stl-plane.d.ts.map +1 -1
  121. package/lib/renderers/stl/stl-geometries/stl-plane.js +1 -1
  122. package/lib/renderers/stl/stl-geometries/stl-plane.js.map +1 -1
  123. package/lib/renderers/stl/stl-geometries/stl-polygon.d.ts +1 -1
  124. package/lib/renderers/stl/stl-geometries/stl-polygon.d.ts.map +1 -1
  125. package/lib/renderers/stl/stl-geometries/stl-polygon.js.map +1 -1
  126. package/lib/renderers/stl/stl-geometries/stl-shape.d.ts +1 -1
  127. package/lib/renderers/stl/stl-geometries/stl-shape.d.ts.map +1 -1
  128. package/lib/renderers/stl/stl-geometries/stl-shape.js.map +1 -1
  129. package/lib/renderers/stl/stl.d.ts +1 -1
  130. package/lib/renderers/stl/stl.d.ts.map +1 -1
  131. package/lib/renderers/stl/stl.js.map +1 -1
  132. package/lib/renderers/svg/index.js +1 -0
  133. package/lib/renderers/svg/index.js.map +1 -1
  134. package/lib/renderers/svg/svg-encoding.d.ts +3 -3
  135. package/lib/renderers/svg/svg-encoding.d.ts.map +1 -1
  136. package/lib/renderers/svg/svg-encoding.js +6 -15
  137. package/lib/renderers/svg/svg-encoding.js.map +1 -1
  138. package/lib/renderers/svg/svg-geometries/shared.d.ts +1 -1
  139. package/lib/renderers/svg/svg-geometries/shared.d.ts.map +1 -1
  140. package/lib/renderers/svg/svg-geometries/shared.js.map +1 -1
  141. package/lib/renderers/svg/svg-geometries/svg-box.d.ts +2 -2
  142. package/lib/renderers/svg/svg-geometries/svg-box.d.ts.map +1 -1
  143. package/lib/renderers/svg/svg-geometries/svg-box.js +1 -1
  144. package/lib/renderers/svg/svg-geometries/svg-box.js.map +1 -1
  145. package/lib/renderers/svg/svg-geometries/svg-cone.d.ts +2 -2
  146. package/lib/renderers/svg/svg-geometries/svg-cone.d.ts.map +1 -1
  147. package/lib/renderers/svg/svg-geometries/svg-cone.js +2 -2
  148. package/lib/renderers/svg/svg-geometries/svg-cone.js.map +1 -1
  149. package/lib/renderers/svg/svg-geometries/svg-cylinder.d.ts +2 -2
  150. package/lib/renderers/svg/svg-geometries/svg-cylinder.d.ts.map +1 -1
  151. package/lib/renderers/svg/svg-geometries/svg-cylinder.js +2 -2
  152. package/lib/renderers/svg/svg-geometries/svg-cylinder.js.map +1 -1
  153. package/lib/renderers/svg/svg-geometries/svg-image.d.ts +2 -2
  154. package/lib/renderers/svg/svg-geometries/svg-image.d.ts.map +1 -1
  155. package/lib/renderers/svg/svg-geometries/svg-image.js +1 -1
  156. package/lib/renderers/svg/svg-geometries/svg-image.js.map +1 -1
  157. package/lib/renderers/svg/svg-geometries/svg-line.d.ts +2 -2
  158. package/lib/renderers/svg/svg-geometries/svg-line.d.ts.map +1 -1
  159. package/lib/renderers/svg/svg-geometries/svg-line.js.map +1 -1
  160. package/lib/renderers/svg/svg-geometries/svg-plane.d.ts +2 -2
  161. package/lib/renderers/svg/svg-geometries/svg-plane.d.ts.map +1 -1
  162. package/lib/renderers/svg/svg-geometries/svg-plane.js +1 -1
  163. package/lib/renderers/svg/svg-geometries/svg-plane.js.map +1 -1
  164. package/lib/renderers/svg/svg-geometries/svg-polygon.d.ts +2 -2
  165. package/lib/renderers/svg/svg-geometries/svg-polygon.d.ts.map +1 -1
  166. package/lib/renderers/svg/svg-geometries/svg-polygon.js +1 -1
  167. package/lib/renderers/svg/svg-geometries/svg-polygon.js.map +1 -1
  168. package/lib/renderers/svg/svg-geometries/svg-shape.d.ts +2 -2
  169. package/lib/renderers/svg/svg-geometries/svg-shape.d.ts.map +1 -1
  170. package/lib/renderers/svg/svg-geometries/svg-shape.js +1 -1
  171. package/lib/renderers/svg/svg-geometries/svg-shape.js.map +1 -1
  172. package/lib/renderers/svg/svg-geometries/svg-text.d.ts +2 -2
  173. package/lib/renderers/svg/svg-geometries/svg-text.d.ts.map +1 -1
  174. package/lib/renderers/svg/svg-geometries/svg-text.js.map +1 -1
  175. package/lib/renderers/svg/svg.d.ts +3 -3
  176. package/lib/renderers/svg/svg.d.ts.map +1 -1
  177. package/lib/renderers/svg/svg.js.map +1 -1
  178. package/lib/utils.d.ts +1 -1
  179. package/lib/utils.d.ts.map +1 -1
  180. package/lib/utils.js +0 -1
  181. package/lib/utils.js.map +1 -1
  182. package/package.json +3 -3
  183. package/src/abstract-3d.ts +93 -93
  184. package/src/custom_typings/react-three-fiber.d.ts +1 -1
  185. package/src/renderers/dxf/dxf-encoding/dxf-3dface.ts +1 -1
  186. package/src/renderers/dxf/dxf-encoding/dxf-color.ts +26 -26
  187. package/src/renderers/dxf/dxf-encoding/dxf-common.ts +23 -9
  188. package/src/renderers/dxf/dxf-encoding/dxf-dimension.ts +57 -13
  189. package/src/renderers/dxf/dxf-encoding/dxf-footer.ts +3 -2
  190. package/src/renderers/dxf/dxf-encoding/dxf-header.ts +15 -4
  191. package/src/renderers/dxf/dxf-encoding/dxf-line.ts +1 -1
  192. package/src/renderers/dxf/dxf-encoding/dxf-lwpolyline.ts +21 -17
  193. package/src/renderers/dxf/dxf-encoding/dxf-mtext.ts +12 -3
  194. package/src/renderers/dxf/dxf-encoding/dxf-polyline.ts +2 -3
  195. package/src/renderers/dxf/dxf-encoding/dxf-solid.ts +1 -1
  196. package/src/renderers/dxf/dxf-encoding/dxf-triangle.ts +1 -1
  197. package/src/renderers/dxf/dxf-geometries/dxf-box.ts +1 -1
  198. package/src/renderers/dxf/dxf-geometries/dxf-dimension.ts +18 -4
  199. package/src/renderers/dxf/dxf-geometries/dxf-image.ts +8 -20
  200. package/src/renderers/dxf/dxf-geometries/dxf-polygon.ts +16 -28
  201. package/src/renderers/dxf/dxf-geometries/dxf-shape.ts +13 -5
  202. package/src/renderers/dxf/dxf.ts +67 -16
  203. package/src/renderers/react/react-camera.tsx +7 -8
  204. package/src/renderers/react/react-dimension.tsx +5 -5
  205. package/src/renderers/react/react-group.tsx +6 -4
  206. package/src/renderers/react/react-hotspot.tsx +3 -2
  207. package/src/renderers/react/react-image-material.tsx +9 -9
  208. package/src/renderers/react/react-material.tsx +7 -7
  209. package/src/renderers/react/react-mesh.tsx +29 -40
  210. package/src/renderers/react/react-scene.tsx +6 -5
  211. package/src/renderers/react/react-types.ts +1 -1
  212. package/src/renderers/react/react.tsx +8 -7
  213. package/src/renderers/step/step-encoding.ts +43 -44
  214. package/src/renderers/step/step-geometries/step-box.ts +3 -8
  215. package/src/renderers/step/step-geometries/step-cone.ts +3 -14
  216. package/src/renderers/step/step-geometries/step-cylinder.ts +49 -251
  217. package/src/renderers/step/step-geometries/step-plane.ts +4 -11
  218. package/src/renderers/step/step.ts +3 -19
  219. package/src/renderers/stl/stl-encoding.ts +2 -1
  220. package/src/renderers/stl/stl-geometries/stl-box.ts +2 -1
  221. package/src/renderers/stl/stl-geometries/stl-cone.ts +2 -1
  222. package/src/renderers/stl/stl-geometries/stl-cylinder.ts +3 -2
  223. package/src/renderers/stl/stl-geometries/stl-plane.ts +2 -10
  224. package/src/renderers/stl/stl-geometries/stl-polygon.ts +2 -1
  225. package/src/renderers/stl/stl-geometries/stl-shape.ts +2 -1
  226. package/src/renderers/stl/stl.ts +2 -1
  227. package/src/renderers/svg/svg-encoding.ts +7 -31
  228. package/src/renderers/svg/svg-geometries/shared.ts +2 -1
  229. package/src/renderers/svg/svg-geometries/svg-box.ts +4 -13
  230. package/src/renderers/svg/svg-geometries/svg-cone.ts +5 -14
  231. package/src/renderers/svg/svg-geometries/svg-cylinder.ts +5 -14
  232. package/src/renderers/svg/svg-geometries/svg-image.ts +8 -14
  233. package/src/renderers/svg/svg-geometries/svg-line.ts +4 -2
  234. package/src/renderers/svg/svg-geometries/svg-plane.ts +4 -14
  235. package/src/renderers/svg/svg-geometries/svg-polygon.ts +4 -11
  236. package/src/renderers/svg/svg-geometries/svg-shape.ts +4 -12
  237. package/src/renderers/svg/svg-geometries/svg-text.ts +6 -8
  238. package/src/renderers/svg/svg.ts +13 -17
  239. package/src/utils.ts +26 -31
@@ -1,7 +1,5 @@
1
+ import type { Box, Material, Vec3 } from "../../../abstract-3d.js";
1
2
  import {
2
- Box,
3
- Material,
4
- Vec3,
5
3
  vec3Scale,
6
4
  vec3TransRot,
7
5
  vec3RotCombine,
@@ -11,14 +9,13 @@ import {
11
9
  vec3Sub,
12
10
  vec3Add,
13
11
  vec3Rot,
14
- vec3Length,
15
12
  } from "../../../abstract-3d.js";
16
13
  import { parseRgb } from "../../../utils.js";
14
+ import type { MutableStep } from "../step-encoding.js";
17
15
  import {
18
16
  ADVANCED_BREP_SHAPE_REPRESENTATION,
19
17
  ADVANCED_FACE,
20
18
  APPLICATION_CONTEXT,
21
- APPLICATION_PROTOCOL_DEFINITION,
22
19
  AXIS2_PLACEMENT_3D,
23
20
  CARTESIAN_POINT,
24
21
  CLOSED_SHELL,
@@ -34,7 +31,6 @@ import {
34
31
  LINE,
35
32
  MANIFOLD_SOLID_BREP,
36
33
  MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION,
37
- MutableStep,
38
34
  ORIENTED_EDGE,
39
35
  PLANE,
40
36
  PRESENTATION_STYLE_ASSIGNMENT,
@@ -45,7 +41,6 @@ import {
45
41
  PRODUCT_DEFINITION_FORMATION,
46
42
  PRODUCT_DEFINITION_SHAPE,
47
43
  SHAPE_DEFINITION_REPRESENTATION,
48
- STEP_NUMBER_EPSILON,
49
44
  STYLED_ITEM,
50
45
  SURFACE_SIDE_STYLE,
51
46
  SURFACE_STYLE_FILL_AREA,
@@ -62,7 +57,7 @@ export function stepBox(b: Box, mat: Material, parentPos: Vec3, parentRot: Vec3,
62
57
  const color = parseRgb(mat.normal);
63
58
  const rotate = (v: Vec3): Vec3 => vec3Rot(v, vec3Zero, rotation);
64
59
 
65
- if(size.x === 0.0 || size.y === 0.0 || size.z === 0.0) {
60
+ if (size.x === 0.0 || size.y === 0.0 || size.z === 0.0) {
66
61
  return;
67
62
  }
68
63
 
@@ -1,18 +1,7 @@
1
- import {
2
- Material,
3
- Vec3,
4
- vec3,
5
- Cone,
6
- Cylinder,
7
- } from "../../../abstract-3d.js";
8
- import {
9
- MutableStep,
10
- } from "../step-encoding.js";
11
- import { stepBox } from "./step-box.js";
1
+ import type { Material, Vec3, Cone, Cylinder } from "../../../abstract-3d.js";
2
+ import type { MutableStep } from "../step-encoding.js";
12
3
  import { stepCylinder } from "./step-cylinder.js";
13
4
 
14
- const PLANE_THICKNESS = 1e-4;
15
-
16
5
  export function stepCone(c: Cone, mat: Material, parentPos: Vec3, parentRot: Vec3, m: MutableStep): void {
17
6
  //convert it into a box
18
7
  const cylinder: Cylinder = {
@@ -23,4 +12,4 @@ export function stepCone(c: Cone, mat: Material, parentPos: Vec3, parentRot: Vec
23
12
  radius: c.radius,
24
13
  };
25
14
  stepCylinder(cylinder, mat, parentPos, parentRot, m, 0.0);
26
- }
15
+ }
@@ -1,15 +1,7 @@
1
- import {
2
- Material,
3
- Vec3,
4
- vec3TransRot,
5
- vec3RotCombine,
6
- vec3Zero,
7
- vec3,
8
- Cylinder,
9
- vec3Add,
10
- vec3Rot,
11
- } from "../../../abstract-3d.js";
1
+ import type { Material, Vec3, Cylinder } from "../../../abstract-3d.js";
2
+ import { vec3TransRot, vec3RotCombine, vec3Zero, vec3, vec3Add, vec3Rot } from "../../../abstract-3d.js";
12
3
  import { parseRgb } from "../../../utils.js";
4
+ import type { MutableStep } from "../step-encoding.js";
13
5
  import {
14
6
  ADVANCED_BREP_SHAPE_REPRESENTATION,
15
7
  ADVANCED_FACE,
@@ -32,7 +24,6 @@ import {
32
24
  LINE,
33
25
  MANIFOLD_SOLID_BREP,
34
26
  MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION,
35
- MutableStep,
36
27
  ORIENTED_EDGE,
37
28
  PLANE,
38
29
  PRESENTATION_STYLE_ASSIGNMENT,
@@ -69,53 +60,29 @@ export function stepCylinder(
69
60
  }
70
61
 
71
62
  const bottomRadius = Math.max(c.radius, SMALLEST_RADIUS);
72
- const requestedTopRadius = Math.max(
73
- rSmall ?? c.radius,
74
- SMALLEST_RADIUS
75
- );
63
+ const requestedTopRadius = Math.max(rSmall ?? c.radius, SMALLEST_RADIUS);
76
64
 
77
- const radiusTolerance =
78
- GEOMETRY_EPSILON *
79
- Math.max(1, bottomRadius, requestedTopRadius);
65
+ const radiusTolerance = GEOMETRY_EPSILON * Math.max(1, bottomRadius, requestedTopRadius);
80
66
 
81
- const isCylinder =
82
- Math.abs(requestedTopRadius - bottomRadius) <= radiusTolerance;
67
+ const isCylinder = Math.abs(requestedTopRadius - bottomRadius) <= radiusTolerance;
83
68
 
84
- const topRadius = isCylinder
85
- ? bottomRadius
86
- : requestedTopRadius;
69
+ const topRadius = isCylinder ? bottomRadius : requestedTopRadius;
87
70
 
88
71
  const pos = vec3TransRot(c.pos, parentPos, parentRot);
89
- const rotation = vec3RotCombine(
90
- parentRot,
91
- c.rot ?? vec3Zero
92
- );
72
+ const rotation = vec3RotCombine(parentRot, c.rot ?? vec3Zero);
93
73
 
94
- const rot = (v: Vec3): Vec3 =>
95
- vec3Rot(v, vec3Zero, rotation);
74
+ const rot = (v: Vec3): Vec3 => vec3Rot(v, vec3Zero, rotation);
96
75
 
97
76
  const axis = rot(vec3(0, 1, 0));
98
77
  const radial = rot(vec3(1, 0, 0));
99
78
 
100
- const bottomCenter = vec3Add(
101
- pos,
102
- rot(vec3(0, -h / 2, 0))
103
- );
79
+ const bottomCenter = vec3Add(pos, rot(vec3(0, -h / 2, 0)));
104
80
 
105
- const topCenter = vec3Add(
106
- pos,
107
- rot(vec3(0, h / 2, 0))
108
- );
81
+ const topCenter = vec3Add(pos, rot(vec3(0, h / 2, 0)));
109
82
 
110
- const bottomSeamPoint = vec3Add(
111
- pos,
112
- rot(vec3(bottomRadius, -h / 2, 0))
113
- );
83
+ const bottomSeamPoint = vec3Add(pos, rot(vec3(bottomRadius, -h / 2, 0)));
114
84
 
115
- const topSeamPoint = vec3Add(
116
- pos,
117
- rot(vec3(topRadius, h / 2, 0))
118
- );
85
+ const topSeamPoint = vec3Add(pos, rot(vec3(topRadius, h / 2, 0)));
119
86
 
120
87
  const seamDelta = vec3(
121
88
  topSeamPoint.x - bottomSeamPoint.x,
@@ -123,154 +90,63 @@ export function stepCylinder(
123
90
  topSeamPoint.z - bottomSeamPoint.z
124
91
  );
125
92
 
126
- const seamLength = Math.hypot(
127
- seamDelta.x,
128
- seamDelta.y,
129
- seamDelta.z
130
- );
93
+ const seamLength = Math.hypot(seamDelta.x, seamDelta.y, seamDelta.z);
131
94
 
132
95
  if (seamLength <= GEOMETRY_EPSILON) {
133
96
  return;
134
97
  }
135
98
 
136
- const seamDirection = vec3(
137
- seamDelta.x / seamLength,
138
- seamDelta.y / seamLength,
139
- seamDelta.z / seamLength
140
- );
99
+ const seamDirection = vec3(seamDelta.x / seamLength, seamDelta.y / seamLength, seamDelta.z / seamLength);
141
100
 
142
101
  const applicationContext = APPLICATION_CONTEXT(m);
143
- APPLICATION_PROTOCOL_DEFINITION(
144
- applicationContext,
145
- m
146
- );
102
+ APPLICATION_PROTOCOL_DEFINITION(applicationContext, m);
147
103
 
148
104
  const axisDirection = DIRECTION(axis, m);
149
105
  const radialDirection = DIRECTION(radial, m);
150
106
 
151
- const bottomCenterPoint = CARTESIAN_POINT(
152
- bottomCenter,
153
- m
154
- );
107
+ const bottomCenterPoint = CARTESIAN_POINT(bottomCenter, m);
155
108
 
156
- const topCenterPoint = CARTESIAN_POINT(
157
- topCenter,
158
- m
159
- );
109
+ const topCenterPoint = CARTESIAN_POINT(topCenter, m);
160
110
 
161
- const bottomSeamCartesianPoint = CARTESIAN_POINT(
162
- bottomSeamPoint,
163
- m
164
- );
111
+ const bottomSeamCartesianPoint = CARTESIAN_POINT(bottomSeamPoint, m);
165
112
 
166
- const topSeamCartesianPoint = CARTESIAN_POINT(
167
- topSeamPoint,
168
- m
169
- );
113
+ const topSeamCartesianPoint = CARTESIAN_POINT(topSeamPoint, m);
170
114
 
171
- const bottomVertex = VERTEX_POINT(
172
- bottomSeamCartesianPoint,
173
- m
174
- );
115
+ const bottomVertex = VERTEX_POINT(bottomSeamCartesianPoint, m);
175
116
 
176
- const topVertex = VERTEX_POINT(
177
- topSeamCartesianPoint,
178
- m
179
- );
117
+ const topVertex = VERTEX_POINT(topSeamCartesianPoint, m);
180
118
 
181
- const bottomPlacement = AXIS2_PLACEMENT_3D(
182
- bottomCenterPoint,
183
- axisDirection,
184
- radialDirection,
185
- m
186
- );
119
+ const bottomPlacement = AXIS2_PLACEMENT_3D(bottomCenterPoint, axisDirection, radialDirection, m);
187
120
 
188
- const topPlacement = AXIS2_PLACEMENT_3D(
189
- topCenterPoint,
190
- axisDirection,
191
- radialDirection,
192
- m
193
- );
121
+ const topPlacement = AXIS2_PLACEMENT_3D(topCenterPoint, axisDirection, radialDirection, m);
194
122
 
195
123
  const seamEdge = EDGE_CURVE(
196
124
  bottomVertex,
197
125
  topVertex,
198
- LINE(
199
- bottomSeamCartesianPoint,
200
- VECTOR(
201
- DIRECTION(seamDirection, m),
202
- m
203
- ),
204
- m
205
- ),
126
+ LINE(bottomSeamCartesianPoint, VECTOR(DIRECTION(seamDirection, m), m), m),
206
127
  m,
207
128
  "T"
208
129
  );
209
130
 
210
- const bottomCircleEdge = EDGE_CURVE(
211
- bottomVertex,
212
- bottomVertex,
213
- CIRCLE(
214
- bottomPlacement,
215
- bottomRadius,
216
- m
217
- ),
218
- m,
219
- "T"
220
- );
131
+ const bottomCircleEdge = EDGE_CURVE(bottomVertex, bottomVertex, CIRCLE(bottomPlacement, bottomRadius, m), m, "T");
221
132
 
222
- const topCircleEdge = EDGE_CURVE(
223
- topVertex,
224
- topVertex,
225
- CIRCLE(
226
- topPlacement,
227
- topRadius,
228
- m
229
- ),
230
- m,
231
- "T"
232
- );
133
+ const topCircleEdge = EDGE_CURVE(topVertex, topVertex, CIRCLE(topPlacement, topRadius, m), m, "T");
233
134
 
234
- const growsTowardTop =
235
- topRadius >= bottomRadius;
135
+ const growsTowardTop = topRadius >= bottomRadius;
236
136
 
237
- const coneAxis = growsTowardTop
238
- ? axis
239
- : vec3(-axis.x, -axis.y, -axis.z);
137
+ const coneAxis = growsTowardTop ? axis : vec3(-axis.x, -axis.y, -axis.z);
240
138
 
241
- const coneLocation = growsTowardTop
242
- ? bottomCenterPoint
243
- : topCenterPoint;
139
+ const coneLocation = growsTowardTop ? bottomCenterPoint : topCenterPoint;
244
140
 
245
- const coneStartRadius = Math.min(
246
- bottomRadius,
247
- topRadius
248
- );
141
+ const coneStartRadius = Math.min(bottomRadius, topRadius);
249
142
 
250
- const semiAngle = Math.atan2(
251
- Math.abs(topRadius - bottomRadius),
252
- h
253
- );
143
+ const semiAngle = Math.atan2(Math.abs(topRadius - bottomRadius), h);
254
144
 
255
- const conePlacement = AXIS2_PLACEMENT_3D(
256
- coneLocation,
257
- DIRECTION(coneAxis, m),
258
- radialDirection,
259
- m
260
- );
145
+ const conePlacement = AXIS2_PLACEMENT_3D(coneLocation, DIRECTION(coneAxis, m), radialDirection, m);
261
146
 
262
147
  const sideSurface = isCylinder
263
- ? CYLINDRICAL_SURFACE(
264
- bottomPlacement,
265
- bottomRadius,
266
- m
267
- )
268
- : CONICAL_SURFACE(
269
- conePlacement,
270
- coneStartRadius,
271
- semiAngle,
272
- m
273
- );
148
+ ? CYLINDRICAL_SURFACE(bottomPlacement, bottomRadius, m)
149
+ : CONICAL_SURFACE(conePlacement, coneStartRadius, semiAngle, m);
274
150
 
275
151
  const sideFace = ADVANCED_FACE(
276
152
  FACE_BOUND(
@@ -292,124 +168,46 @@ export function stepCylinder(
292
168
  );
293
169
 
294
170
  const bottomFace = ADVANCED_FACE(
295
- FACE_BOUND(
296
- EDGE_LOOP(
297
- [
298
- ORIENTED_EDGE(
299
- bottomCircleEdge,
300
- m,
301
- "F"
302
- ),
303
- ],
304
- m
305
- ),
306
- "T",
307
- m
308
- ),
171
+ FACE_BOUND(EDGE_LOOP([ORIENTED_EDGE(bottomCircleEdge, m, "F")], m), "T", m),
309
172
  PLANE(bottomPlacement, m),
310
173
  m,
311
174
  "F"
312
175
  );
313
176
 
314
177
  const topFace = ADVANCED_FACE(
315
- FACE_BOUND(
316
- EDGE_LOOP(
317
- [
318
- ORIENTED_EDGE(
319
- topCircleEdge,
320
- m,
321
- "F"
322
- ),
323
- ],
324
- m
325
- ),
326
- "F",
327
- m
328
- ),
178
+ FACE_BOUND(EDGE_LOOP([ORIENTED_EDGE(topCircleEdge, m, "F")], m), "F", m),
329
179
  PLANE(topPlacement, m),
330
180
  m,
331
181
  "T"
332
182
  );
333
183
 
334
- const msb = MANIFOLD_SOLID_BREP(
335
- CLOSED_SHELL(
336
- [
337
- sideFace,
338
- bottomFace,
339
- topFace,
340
- ],
341
- m
342
- ),
343
- m
344
- );
345
-
346
- const absp =
347
- ADVANCED_BREP_SHAPE_REPRESENTATION(
348
- AXIS2_PLACEMENT_3D(
349
- CARTESIAN_POINT(vec3Zero, m),
350
- DIRECTION(vec3(0, 0, 1), m),
351
- DIRECTION(vec3(1, 0, 0), m),
352
- m
353
- ),
354
- msb,
355
- m.geoContext3d,
356
- m
357
- );
184
+ const msb = MANIFOLD_SOLID_BREP(CLOSED_SHELL([sideFace, bottomFace, topFace], m), m);
358
185
 
359
- const prod = PRODUCT(
360
- PRODUCT_CONTEXT(applicationContext, m),
361
- isCylinder ? "Cylinder" : "Cone",
186
+ const absp = ADVANCED_BREP_SHAPE_REPRESENTATION(
187
+ AXIS2_PLACEMENT_3D(CARTESIAN_POINT(vec3Zero, m), DIRECTION(vec3(0, 0, 1), m), DIRECTION(vec3(1, 0, 0), m), m),
188
+ msb,
189
+ m.geoContext3d,
362
190
  m
363
191
  );
364
192
 
193
+ const prod = PRODUCT(PRODUCT_CONTEXT(applicationContext, m), isCylinder ? "Cylinder" : "Cone", m);
194
+
365
195
  SHAPE_DEFINITION_REPRESENTATION(
366
196
  PRODUCT_DEFINITION_SHAPE(
367
- PRODUCT_DEFINITION(
368
- PRODUCT_DEFINITION_FORMATION(
369
- prod,
370
- m
371
- ),
372
- PRODUCT_DEFINITION_CONTEXT(
373
- applicationContext,
374
- m
375
- ),
376
- m
377
- ),
197
+ PRODUCT_DEFINITION(PRODUCT_DEFINITION_FORMATION(prod, m), PRODUCT_DEFINITION_CONTEXT(applicationContext, m), m),
378
198
  m
379
199
  ),
380
200
  absp,
381
201
  m
382
202
  );
383
203
 
384
- const color = COLOUR_RGB(
385
- parseRgb(mat.normal),
386
- m
387
- );
204
+ const color = COLOUR_RGB(parseRgb(mat.normal), m);
388
205
 
389
206
  MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION(
390
207
  STYLED_ITEM(
391
208
  PRESENTATION_STYLE_ASSIGNMENT(
392
- SURFACE_STYLE_USAGE(
393
- SURFACE_SIDE_STYLE(
394
- SURFACE_STYLE_FILL_AREA(
395
- FILL_AREA_STYLE_COLOUR(
396
- color,
397
- m
398
- ),
399
- m
400
- ),
401
- m
402
- ),
403
- m
404
- ),
405
- CURVE_STYLE(
406
- DRAUGHTING_PRE_DEFINED_CURVE_FONT(
407
- "continuous",
408
- m
409
- ),
410
- color,
411
- m
412
- ),
209
+ SURFACE_STYLE_USAGE(SURFACE_SIDE_STYLE(SURFACE_STYLE_FILL_AREA(FILL_AREA_STYLE_COLOUR(color, m), m), m), m),
210
+ CURVE_STYLE(DRAUGHTING_PRE_DEFINED_CURVE_FONT("continuous", m), color, m),
413
211
  m
414
212
  ),
415
213
  msb,
@@ -418,4 +216,4 @@ export function stepCylinder(
418
216
  m.geoContext3d,
419
217
  m
420
218
  );
421
- }
219
+ }
@@ -1,13 +1,6 @@
1
- import {
2
- Plane,
3
- Material,
4
- Vec3,
5
- vec3,
6
- Box,
7
- } from "../../../abstract-3d.js";
8
- import {
9
- MutableStep,
10
- } from "../step-encoding.js";
1
+ import type { Plane, Material, Vec3, Box } from "../../../abstract-3d.js";
2
+ import { vec3 } from "../../../abstract-3d.js";
3
+ import type { MutableStep } from "../step-encoding.js";
11
4
  import { stepBox } from "./step-box.js";
12
5
 
13
6
  const PLANE_THICKNESS = 1e-4;
@@ -22,4 +15,4 @@ export function stepPlane(p: Plane, mat: Material, parentPos: Vec3, parentRot: V
22
15
  size: vec3(p.size.x, p.size.y, PLANE_THICKNESS),
23
16
  };
24
17
  stepBox(box, mat, parentPos, parentRot, m);
25
- }
18
+ }
@@ -1,23 +1,7 @@
1
+ import type { Scene, Group, Vec3 } from "../../abstract-3d.js";
2
+ import { vec3Zero, vec3TransRot, vec3RotCombine } from "../../abstract-3d.js";
3
+ import type { MutableStep } from "./step-encoding.js";
1
4
  import {
2
- Scene,
3
- vec3Zero,
4
- Group,
5
- Vec3,
6
- vec3TransRot,
7
- vec3RotCombine,
8
- Cylinder,
9
- Material,
10
- Plane,
11
- Box,
12
- Vec2,
13
- vec3,
14
- vec3Scale,
15
- vec3Add,
16
- vec3Sub,
17
- vec3Rot,
18
- } from "../../abstract-3d.js";
19
- import {
20
- MutableStep,
21
5
  GEOMETRIC_REPRESENTATION_CONTEXT_3D,
22
6
  LENGTH_UNIT,
23
7
  NAMED_UNIT,
@@ -1,4 +1,5 @@
1
- import { Vec3, vec3Sub } from "../../abstract-3d.js";
1
+ import type { Vec3 } from "../../abstract-3d.js";
2
+ import { vec3Sub } from "../../abstract-3d.js";
2
3
 
3
4
  export const stlTriangle = (vec1: Vec3, vec2: Vec3, vec3: Vec3): string => {
4
5
  const v = vec3Sub(vec2, vec1);
@@ -1,4 +1,5 @@
1
- import { Box, Material, Vec3, vec3Scale, vec3TransRot, vec3RotCombine, vec3Zero, vec3 } from "../../../abstract-3d.js";
1
+ import type { Box, Material, Vec3 } from "../../../abstract-3d.js";
2
+ import { vec3Scale, vec3TransRot, vec3RotCombine, vec3Zero, vec3 } from "../../../abstract-3d.js";
2
3
  import { stlTriangle } from "../stl-encoding.js";
3
4
 
4
5
  export function stlBox(b: Box, _m: Material, parentPos: Vec3, parentRot: Vec3): string {
@@ -1,4 +1,5 @@
1
- import { Cone, Material, Vec3, vec3TransRot, vec3RotCombine, vec3Zero, vec3 } from "../../../abstract-3d.js";
1
+ import type { Cone, Material, Vec3 } from "../../../abstract-3d.js";
2
+ import { vec3TransRot, vec3RotCombine, vec3Zero, vec3 } from "../../../abstract-3d.js";
2
3
  import { stlPlaneOfVertices } from "../stl-encoding.js";
3
4
 
4
5
  export function stlCone(c: Cone, _m: Material, sides: number, parentPos: Vec3, parentRot: Vec3): string {
@@ -1,4 +1,5 @@
1
- import { Cylinder, Material, Vec3, vec3TransRot, vec3RotCombine, vec3Zero, vec3, equals, vec3Scale } from "../../../abstract-3d.js";
1
+ import type { Cylinder, Material, Vec3 } from "../../../abstract-3d.js";
2
+ import { vec3TransRot, vec3RotCombine, vec3Zero, vec3, equals, vec3Scale } from "../../../abstract-3d.js";
2
3
  import { stlPlaneOfVertices } from "../stl-encoding.js";
3
4
  import { stlPlane } from "./stl-plane.js";
4
5
 
@@ -9,7 +10,7 @@ export function stlCylinder(c: Cylinder, m: Material, sides: number, parentPos:
9
10
  const vec3tr = (x: number, y: number, z: number): Vec3 => vec3TransRot(vec3(x, y, z), pos, rot);
10
11
 
11
12
  const angleStart = c.angleStart ?? 0.0;
12
- const angleLength = c.angleLength ?? (Math.PI * 2);
13
+ const angleLength = c.angleLength ?? Math.PI * 2;
13
14
  const angleEnd = angleStart + angleLength;
14
15
  const angleStep = angleLength / sides;
15
16
  let currentAngle = angleStart;
@@ -1,13 +1,5 @@
1
- import {
2
- Plane,
3
- Material,
4
- Vec3,
5
- vec2Scale,
6
- vec3TransRot,
7
- vec3RotCombine,
8
- vec3Zero,
9
- vec3,
10
- } from "../../../abstract-3d.js";
1
+ import type { Plane, Material, Vec3 } from "../../../abstract-3d.js";
2
+ import { vec2Scale, vec3TransRot, vec3RotCombine, vec3Zero, vec3 } from "../../../abstract-3d.js";
11
3
  import { stlTriangle } from "../stl-encoding.js";
12
4
 
13
5
  export function stlPlane(p: Plane, _m: Material, parentPos: Vec3, parentRot: Vec3): string {
@@ -1,4 +1,5 @@
1
- import { Polygon, Material, Vec3, vec3TransRot, vec3RotCombine, vec3Zero } from "../../../abstract-3d.js";
1
+ import type { Polygon, Material, Vec3 } from "../../../abstract-3d.js";
2
+ import { vec3TransRot, vec3RotCombine, vec3Zero } from "../../../abstract-3d.js";
2
3
  import { stlTriangle } from "../stl-encoding.js";
3
4
 
4
5
  const chunkSize = 3;
@@ -1,4 +1,5 @@
1
- import { Shape, Material, Vec3, vec3TransRot, vec3RotCombine, vec3Zero, vec3 } from "../../../abstract-3d.js";
1
+ import type { Shape, Material, Vec3 } from "../../../abstract-3d.js";
2
+ import { vec3TransRot, vec3RotCombine, vec3Zero, vec3 } from "../../../abstract-3d.js";
2
3
  import { stlTriangle } from "../stl-encoding.js";
3
4
 
4
5
  const chunkSize = 3;
@@ -1,4 +1,5 @@
1
- import { Scene, vec3Zero, Group, Vec3, vec3TransRot, vec3RotCombine } from "../../abstract-3d.js";
1
+ import type { Scene, Group, Vec3 } from "../../abstract-3d.js";
2
+ import { vec3Zero, vec3TransRot, vec3RotCombine } from "../../abstract-3d.js";
2
3
  import { stlPlane } from "./stl-geometries/stl-plane.js";
3
4
  import { stlBox } from "./stl-geometries/stl-box.js";
4
5
  import { stlCylinder } from "./stl-geometries/stl-cylinder.js";
@@ -1,16 +1,5 @@
1
- import {
2
- bounds2FromVec2Array,
3
- Hole,
4
- vec2,
5
- Vec2,
6
- vec2Add,
7
- vec2Scale,
8
- vec2Sub,
9
- vec3,
10
- Vec3,
11
- vec3Rot,
12
- vec3Zero,
13
- } from "../../abstract-3d.js";
1
+ import type { Hole, Vec2, Vec3 } from "../../abstract-3d.js";
2
+ import { bounds2FromVec2Array, vec2, vec2Add, vec2Scale, vec2Sub, vec3, vec3Rot, vec3Zero } from "../../abstract-3d.js";
14
3
  import { svgTrsMatrix } from "./svg-geometries/shared.js";
15
4
 
16
5
  export const svg = (min: Vec2, size: Vec2, children: string): string => {
@@ -31,7 +20,7 @@ export function svgPolygon(
31
20
  stroke: string,
32
21
  strokeWidth: number,
33
22
  holes?: ReadonlyArray<Hole>,
34
- parentPos?: Vec3,
23
+ _parentPos?: Vec3
35
24
  ): string {
36
25
  const bounds = bounds2FromVec2Array(points);
37
26
  const size = vec2Sub(bounds.max, bounds.min);
@@ -42,11 +31,7 @@ export function svgPolygon(
42
31
  .slice(0, -1)}" fill="${fill}" fill-opacity="${opacity.toFixed(
43
32
  1
44
33
  )}" stroke="${stroke}" stroke-width="${strokeWidth}" ${maskAttribute}/>`;
45
- return (
46
- mask +
47
- pol +
48
- svgStrokedHoles(pos, rot, holes ?? [], stroke, strokeWidth)
49
- );
34
+ return mask + pol + svgStrokedHoles(pos, rot, holes ?? [], stroke, strokeWidth);
50
35
  }
51
36
 
52
37
  export function svgCircle(
@@ -66,11 +51,7 @@ export function svgCircle(
66
51
  )}" fill="${fill}" fill-opacity="${opacity.toFixed(
67
52
  1
68
53
  )}" stroke="${stroke}" stroke-width="${strokeWidth}" ${maskAttribute}/>`;
69
- return (
70
- mask +
71
- cir +
72
- svgStrokedHoles(pos, rot, holes ?? [], stroke, strokeWidth)
73
- );
54
+ return mask + cir + svgStrokedHoles(pos, rot, holes ?? [], stroke, strokeWidth);
74
55
  }
75
56
 
76
57
  function svgStrokedHoles(
@@ -104,12 +85,7 @@ function svgStrokedHoles(
104
85
 
105
86
  case "SquareHole": {
106
87
  const half = vec2Scale(hole.size, 0.5);
107
- const points = [
108
- vec2(-half.x, -half.y),
109
- vec2(half.x, -half.y),
110
- vec2(half.x, half.y),
111
- vec2(-half.x, half.y),
112
- ]
88
+ const points = [vec2(-half.x, -half.y), vec2(half.x, -half.y), vec2(half.x, half.y), vec2(-half.x, half.y)]
113
89
  .map((p) => `${p.x.toFixed(0)},${p.y.toFixed(0)}`)
114
90
  .join(" ");
115
91
 
@@ -135,7 +111,7 @@ export const svgCircle2 = (
135
111
  fill: string,
136
112
  stroke: string,
137
113
  strokeWidth: number,
138
- holes?: ReadonlyArray<Hole>
114
+ _holes?: ReadonlyArray<Hole>
139
115
  ): string =>
140
116
  `<circle r="${radius.toFixed(0)}" cx="${pos.x.toFixed(0)}" cy="${pos.y.toFixed(
141
117
  0