abstract-3d 2.7.32 → 2.8.0

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 (209) hide show
  1. package/README.md +1 -1
  2. package/lib/abstract-3d.d.ts +1 -1
  3. package/lib/abstract-3d.d.ts.map +1 -1
  4. package/lib/abstract-3d.js +46 -29
  5. package/lib/abstract-3d.js.map +1 -1
  6. package/lib/renderers/dxf/dxf-encoding/dxf-build.d.ts +4 -0
  7. package/lib/renderers/dxf/dxf-encoding/dxf-build.d.ts.map +1 -0
  8. package/lib/renderers/dxf/dxf-encoding/dxf-build.js +8 -0
  9. package/lib/renderers/dxf/dxf-encoding/dxf-build.js.map +1 -0
  10. package/lib/renderers/dxf/dxf-encoding/dxf-color.js +3 -2
  11. package/lib/renderers/dxf/dxf-encoding/dxf-color.js.map +1 -1
  12. package/lib/renderers/dxf/dxf-encoding/dxf-common.d.ts +1 -3
  13. package/lib/renderers/dxf/dxf-encoding/dxf-common.d.ts.map +1 -1
  14. package/lib/renderers/dxf/dxf-encoding/dxf-common.js +3 -10
  15. package/lib/renderers/dxf/dxf-encoding/dxf-common.js.map +1 -1
  16. package/lib/renderers/dxf/dxf-encoding/dxf-dimension.d.ts.map +1 -1
  17. package/lib/renderers/dxf/dxf-encoding/dxf-dimension.js +1 -1
  18. package/lib/renderers/dxf/dxf-encoding/dxf-dimension.js.map +1 -1
  19. package/lib/renderers/dxf/dxf-encoding/dxf-footer.js +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 +1 -1
  22. package/lib/renderers/dxf/dxf-encoding/dxf-header.js.map +1 -1
  23. package/lib/renderers/dxf/dxf-encoding/dxf-line.d.ts.map +1 -1
  24. package/lib/renderers/dxf/dxf-encoding/dxf-line.js.map +1 -1
  25. package/lib/renderers/dxf/dxf-encoding/dxf-lwpolyline.d.ts.map +1 -1
  26. package/lib/renderers/dxf/dxf-encoding/dxf-lwpolyline.js +1 -3
  27. package/lib/renderers/dxf/dxf-encoding/dxf-lwpolyline.js.map +1 -1
  28. package/lib/renderers/dxf/dxf-encoding/dxf-mtext.d.ts.map +1 -1
  29. package/lib/renderers/dxf/dxf-encoding/dxf-mtext.js +0 -1
  30. package/lib/renderers/dxf/dxf-encoding/dxf-mtext.js.map +1 -1
  31. package/lib/renderers/dxf/dxf-encoding/dxf-polyline.d.ts.map +1 -1
  32. package/lib/renderers/dxf/dxf-encoding/dxf-polyline.js.map +1 -1
  33. package/lib/renderers/dxf/dxf-encoding/dxf-solid.d.ts.map +1 -1
  34. package/lib/renderers/dxf/dxf-encoding/dxf-solid.js.map +1 -1
  35. package/lib/renderers/dxf/dxf-encoding/dxf-triangle.d.ts.map +1 -1
  36. package/lib/renderers/dxf/dxf-encoding/dxf-triangle.js.map +1 -1
  37. package/lib/renderers/dxf/dxf-geometries/dxf-box.d.ts.map +1 -1
  38. package/lib/renderers/dxf/dxf-geometries/dxf-box.js +1 -1
  39. package/lib/renderers/dxf/dxf-geometries/dxf-box.js.map +1 -1
  40. package/lib/renderers/dxf/dxf-geometries/dxf-cone.d.ts.map +1 -1
  41. package/lib/renderers/dxf/dxf-geometries/dxf-cone.js +2 -3
  42. package/lib/renderers/dxf/dxf-geometries/dxf-cone.js.map +1 -1
  43. package/lib/renderers/dxf/dxf-geometries/dxf-cylinder.d.ts.map +1 -1
  44. package/lib/renderers/dxf/dxf-geometries/dxf-cylinder.js +2 -3
  45. package/lib/renderers/dxf/dxf-geometries/dxf-cylinder.js.map +1 -1
  46. package/lib/renderers/dxf/dxf-geometries/dxf-dimension.d.ts.map +1 -1
  47. package/lib/renderers/dxf/dxf-geometries/dxf-dimension.js.map +1 -1
  48. package/lib/renderers/dxf/dxf-geometries/dxf-image.d.ts +1 -1
  49. package/lib/renderers/dxf/dxf-geometries/dxf-image.d.ts.map +1 -1
  50. package/lib/renderers/dxf/dxf-geometries/dxf-image.js +4 -9
  51. package/lib/renderers/dxf/dxf-geometries/dxf-image.js.map +1 -1
  52. package/lib/renderers/dxf/dxf-geometries/dxf-plane.d.ts.map +1 -1
  53. package/lib/renderers/dxf/dxf-geometries/dxf-plane.js +1 -1
  54. package/lib/renderers/dxf/dxf-geometries/dxf-plane.js.map +1 -1
  55. package/lib/renderers/dxf/dxf-geometries/dxf-polygon.d.ts.map +1 -1
  56. package/lib/renderers/dxf/dxf-geometries/dxf-polygon.js +1 -1
  57. package/lib/renderers/dxf/dxf-geometries/dxf-polygon.js.map +1 -1
  58. package/lib/renderers/dxf/dxf-geometries/dxf-shape.d.ts.map +1 -1
  59. package/lib/renderers/dxf/dxf-geometries/dxf-shape.js.map +1 -1
  60. package/lib/renderers/dxf/dxf.d.ts +1 -1
  61. package/lib/renderers/dxf/dxf.d.ts.map +1 -1
  62. package/lib/renderers/dxf/dxf.js +6 -5
  63. package/lib/renderers/dxf/dxf.js.map +1 -1
  64. package/lib/renderers/react/react-camera.d.ts +1 -1
  65. package/lib/renderers/react/react-camera.d.ts.map +1 -1
  66. package/lib/renderers/react/react-camera.js +13 -18
  67. package/lib/renderers/react/react-camera.js.map +1 -1
  68. package/lib/renderers/react/react-dimension.js +1 -1
  69. package/lib/renderers/react/react-dimension.js.map +1 -1
  70. package/lib/renderers/react/react-group.d.ts +1 -1
  71. package/lib/renderers/react/react-group.d.ts.map +1 -1
  72. package/lib/renderers/react/react-group.js +4 -3
  73. package/lib/renderers/react/react-group.js.map +1 -1
  74. package/lib/renderers/react/react-hotspot.d.ts +1 -1
  75. package/lib/renderers/react/react-hotspot.d.ts.map +1 -1
  76. package/lib/renderers/react/react-hotspot.js +2 -2
  77. package/lib/renderers/react/react-hotspot.js.map +1 -1
  78. package/lib/renderers/react/react-image-material.d.ts.map +1 -1
  79. package/lib/renderers/react/react-image-material.js +5 -6
  80. package/lib/renderers/react/react-image-material.js.map +1 -1
  81. package/lib/renderers/react/react-material.d.ts.map +1 -1
  82. package/lib/renderers/react/react-material.js +3 -15
  83. package/lib/renderers/react/react-material.js.map +1 -1
  84. package/lib/renderers/react/react-mesh.d.ts +1 -1
  85. package/lib/renderers/react/react-mesh.d.ts.map +1 -1
  86. package/lib/renderers/react/react-mesh.js +10 -9
  87. package/lib/renderers/react/react-mesh.js.map +1 -1
  88. package/lib/renderers/react/react-scene.d.ts +1 -1
  89. package/lib/renderers/react/react-scene.d.ts.map +1 -1
  90. package/lib/renderers/react/react-scene.js +3 -11
  91. package/lib/renderers/react/react-scene.js.map +1 -1
  92. package/lib/renderers/react/react.d.ts +2 -2
  93. package/lib/renderers/react/react.d.ts.map +1 -1
  94. package/lib/renderers/react/react.js +4 -4
  95. package/lib/renderers/react/react.js.map +1 -1
  96. package/lib/renderers/step/step-encoding.d.ts.map +1 -1
  97. package/lib/renderers/step/step-encoding.js.map +1 -1
  98. package/lib/renderers/step/step-geometries/step-box.d.ts.map +1 -1
  99. package/lib/renderers/step/step-geometries/step-box.js +1 -1
  100. package/lib/renderers/step/step-geometries/step-box.js.map +1 -1
  101. package/lib/renderers/step/step-geometries/step-cylinder.d.ts.map +1 -1
  102. package/lib/renderers/step/step-geometries/step-cylinder.js.map +1 -1
  103. package/lib/renderers/stl/stl-geometries/stl-cone.d.ts.map +1 -1
  104. package/lib/renderers/stl/stl-geometries/stl-cone.js +1 -2
  105. package/lib/renderers/stl/stl-geometries/stl-cone.js.map +1 -1
  106. package/lib/renderers/stl/stl-geometries/stl-cylinder.d.ts.map +1 -1
  107. package/lib/renderers/stl/stl-geometries/stl-cylinder.js +1 -2
  108. package/lib/renderers/stl/stl-geometries/stl-cylinder.js.map +1 -1
  109. package/lib/renderers/stl/stl-geometries/stl-plane.d.ts.map +1 -1
  110. package/lib/renderers/stl/stl-geometries/stl-plane.js +1 -6
  111. package/lib/renderers/stl/stl-geometries/stl-plane.js.map +1 -1
  112. package/lib/renderers/stl/stl.d.ts.map +1 -1
  113. package/lib/renderers/stl/stl.js +3 -4
  114. package/lib/renderers/stl/stl.js.map +1 -1
  115. package/lib/renderers/svg/svg-encoding.d.ts.map +1 -1
  116. package/lib/renderers/svg/svg-encoding.js +3 -3
  117. package/lib/renderers/svg/svg-encoding.js.map +1 -1
  118. package/lib/renderers/svg/svg-geometries/shared.d.ts.map +1 -1
  119. package/lib/renderers/svg/svg-geometries/shared.js.map +1 -1
  120. package/lib/renderers/svg/svg-geometries/svg-box.d.ts.map +1 -1
  121. package/lib/renderers/svg/svg-geometries/svg-box.js +2 -2
  122. package/lib/renderers/svg/svg-geometries/svg-box.js.map +1 -1
  123. package/lib/renderers/svg/svg-geometries/svg-cone.d.ts.map +1 -1
  124. package/lib/renderers/svg/svg-geometries/svg-cone.js +4 -9
  125. package/lib/renderers/svg/svg-geometries/svg-cone.js.map +1 -1
  126. package/lib/renderers/svg/svg-geometries/svg-cylinder.d.ts.map +1 -1
  127. package/lib/renderers/svg/svg-geometries/svg-cylinder.js +4 -9
  128. package/lib/renderers/svg/svg-geometries/svg-cylinder.js.map +1 -1
  129. package/lib/renderers/svg/svg-geometries/svg-image.d.ts.map +1 -1
  130. package/lib/renderers/svg/svg-geometries/svg-image.js +2 -2
  131. package/lib/renderers/svg/svg-geometries/svg-image.js.map +1 -1
  132. package/lib/renderers/svg/svg-geometries/svg-line.d.ts.map +1 -1
  133. package/lib/renderers/svg/svg-geometries/svg-line.js +3 -5
  134. package/lib/renderers/svg/svg-geometries/svg-line.js.map +1 -1
  135. package/lib/renderers/svg/svg-geometries/svg-plane.d.ts.map +1 -1
  136. package/lib/renderers/svg/svg-geometries/svg-plane.js +3 -5
  137. package/lib/renderers/svg/svg-geometries/svg-plane.js.map +1 -1
  138. package/lib/renderers/svg/svg-geometries/svg-polygon.d.ts.map +1 -1
  139. package/lib/renderers/svg/svg-geometries/svg-polygon.js +3 -5
  140. package/lib/renderers/svg/svg-geometries/svg-polygon.js.map +1 -1
  141. package/lib/renderers/svg/svg-geometries/svg-shape.d.ts.map +1 -1
  142. package/lib/renderers/svg/svg-geometries/svg-shape.js +2 -2
  143. package/lib/renderers/svg/svg-geometries/svg-shape.js.map +1 -1
  144. package/lib/renderers/svg/svg-geometries/svg-text.d.ts.map +1 -1
  145. package/lib/renderers/svg/svg-geometries/svg-text.js +1 -1
  146. package/lib/renderers/svg/svg-geometries/svg-text.js.map +1 -1
  147. package/lib/renderers/svg/svg.d.ts +1 -1
  148. package/lib/renderers/svg/svg.d.ts.map +1 -1
  149. package/lib/renderers/svg/svg.js +5 -5
  150. package/lib/renderers/svg/svg.js.map +1 -1
  151. package/lib/utils.d.ts +3 -5
  152. package/lib/utils.d.ts.map +1 -1
  153. package/lib/utils.js +12 -20
  154. package/lib/utils.js.map +1 -1
  155. package/package.json +17 -17
  156. package/src/abstract-3d.ts +70 -151
  157. package/src/custom_typings/react-three-fiber.d.ts +1 -1
  158. package/src/renderers/dxf/dxf-encoding/dxf-3dface.ts +1 -1
  159. package/src/renderers/dxf/dxf-encoding/dxf-build.ts +10 -0
  160. package/src/renderers/dxf/dxf-encoding/dxf-color.ts +27 -26
  161. package/src/renderers/dxf/dxf-encoding/dxf-common.ts +9 -17
  162. package/src/renderers/dxf/dxf-encoding/dxf-dimension.ts +3 -26
  163. package/src/renderers/dxf/dxf-encoding/dxf-footer.ts +2 -2
  164. package/src/renderers/dxf/dxf-encoding/dxf-header.ts +14 -4
  165. package/src/renderers/dxf/dxf-encoding/dxf-line.ts +2 -8
  166. package/src/renderers/dxf/dxf-encoding/dxf-lwpolyline.ts +21 -17
  167. package/src/renderers/dxf/dxf-encoding/dxf-mtext.ts +12 -3
  168. package/src/renderers/dxf/dxf-encoding/dxf-polyline.ts +3 -10
  169. package/src/renderers/dxf/dxf-encoding/dxf-solid.ts +2 -10
  170. package/src/renderers/dxf/dxf-encoding/dxf-triangle.ts +4 -16
  171. package/src/renderers/dxf/dxf-geometries/dxf-box.ts +2 -11
  172. package/src/renderers/dxf/dxf-geometries/dxf-cone.ts +3 -19
  173. package/src/renderers/dxf/dxf-geometries/dxf-cylinder.ts +4 -22
  174. package/src/renderers/dxf/dxf-geometries/dxf-dimension.ts +10 -3
  175. package/src/renderers/dxf/dxf-geometries/dxf-image.ts +11 -33
  176. package/src/renderers/dxf/dxf-geometries/dxf-plane.ts +3 -19
  177. package/src/renderers/dxf/dxf-geometries/dxf-polygon.ts +9 -28
  178. package/src/renderers/dxf/dxf-geometries/dxf-shape.ts +5 -5
  179. package/src/renderers/dxf/dxf.ts +10 -25
  180. package/src/renderers/react/react-camera.tsx +27 -26
  181. package/src/renderers/react/react-dimension.tsx +1 -7
  182. package/src/renderers/react/react-group.tsx +6 -16
  183. package/src/renderers/react/react-hotspot.tsx +4 -10
  184. package/src/renderers/react/react-image-material.tsx +7 -8
  185. package/src/renderers/react/react-material.tsx +4 -21
  186. package/src/renderers/react/react-mesh.tsx +15 -69
  187. package/src/renderers/react/react-scene.tsx +7 -21
  188. package/src/renderers/react/react.tsx +4 -4
  189. package/src/renderers/step/step-encoding.ts +36 -100
  190. package/src/renderers/step/step-geometries/step-box.ts +2 -17
  191. package/src/renderers/step/step-geometries/step-cylinder.ts +6 -36
  192. package/src/renderers/stl/stl-geometries/stl-cone.ts +1 -2
  193. package/src/renderers/stl/stl-geometries/stl-cylinder.ts +1 -2
  194. package/src/renderers/stl/stl-geometries/stl-plane.ts +1 -6
  195. package/src/renderers/stl/stl.ts +3 -7
  196. package/src/renderers/svg/svg-encoding.ts +12 -44
  197. package/src/renderers/svg/svg-geometries/shared.ts +1 -4
  198. package/src/renderers/svg/svg-geometries/svg-box.ts +2 -2
  199. package/src/renderers/svg/svg-geometries/svg-cone.ts +6 -15
  200. package/src/renderers/svg/svg-geometries/svg-cylinder.ts +6 -18
  201. package/src/renderers/svg/svg-geometries/svg-image.ts +7 -17
  202. package/src/renderers/svg/svg-geometries/svg-line.ts +3 -8
  203. package/src/renderers/svg/svg-geometries/svg-plane.ts +3 -8
  204. package/src/renderers/svg/svg-geometries/svg-polygon.ts +3 -8
  205. package/src/renderers/svg/svg-geometries/svg-shape.ts +2 -2
  206. package/src/renderers/svg/svg-geometries/svg-text.ts +1 -1
  207. package/src/renderers/svg/svg.ts +8 -18
  208. package/src/utils.ts +13 -18
  209. package/CHANGELOG.md +0 -92
@@ -1,27 +1,11 @@
1
- import {
2
- type Plane,
3
- type Material,
4
- type Vec3,
5
- vec2Scale,
6
- vec3,
7
- vec3TransRot,
8
- vec3RotCombine,
9
- vec3Zero,
10
- } from "../../../abstract-3d.js";
11
- import type { Handle } from "../dxf-encoding/dxf-common.js";
1
+ import { type Plane, type Material, type Vec3, vec2Scale, vec3, vec3TransRot, vec3RotCombine, vec3Zero } from "../../../abstract-3d.js";
12
2
  import { dxfEnc3DFace } from "../dxf-encoding/dxf-3dface.js";
3
+ import type { Handle } from "../dxf-encoding/dxf-common.js";
13
4
 
14
5
  export function dxfPlane(p: Plane, m: Material, parentPos: Vec3, parentRot: Vec3, handleRef: Handle): string {
15
6
  const half = vec2Scale(p.size, 0.5);
16
7
  const pos = vec3TransRot(p.pos, parentPos, parentRot);
17
8
  const rot = vec3RotCombine(parentRot, p.rot ?? vec3Zero);
18
9
  const vec3tr = (x: number, y: number): Vec3 => vec3TransRot(vec3(x, y, 0), pos, rot);
19
- return dxfEnc3DFace(
20
- vec3tr(-half.x, -half.y),
21
- vec3tr(half.x, -half.y),
22
- vec3tr(half.x, half.y),
23
- vec3tr(-half.x, half.y),
24
- m.normal,
25
- handleRef
26
- );
10
+ return dxfEnc3DFace(vec3tr(-half.x, -half.y), vec3tr(half.x, -half.y), vec3tr(half.x, half.y), vec3tr(-half.x, half.y), m.normal, handleRef);
27
11
  }
@@ -1,6 +1,6 @@
1
1
  import { type Polygon, type Material, type Vec3, vec3RotCombine, vec3TransRot, vec3Zero } from "../../../abstract-3d.js";
2
- import type { Handle } from "../dxf-encoding/dxf-common.js";
3
2
  import { dxfEnc3DFace } from "../dxf-encoding/dxf-3dface.js";
3
+ import type { Handle } from "../dxf-encoding/dxf-common.js";
4
4
  import { dxfEnc3DFaceTriangle } from "../dxf-encoding/dxf-triangle.js";
5
5
 
6
6
  const QUAD_STRIDE = 4;
@@ -13,20 +13,13 @@ export function dxfPolygon(p: Polygon, m: Material, parentPos: Vec3, parentRot:
13
13
  const rot = vec3RotCombine(parentRot, p.rot ?? vec3Zero);
14
14
  const points = p.points.map((p) => vec3TransRot(p, pos, rot));
15
15
  let i = 0;
16
- while((points.length - i) >= QUAD_STRIDE) {
16
+ while (points.length - i >= QUAD_STRIDE) {
17
17
  const vec1 = points[i];
18
18
  const vec2 = points[i + 1];
19
19
  const vec3 = points[i + 2];
20
20
  const vec4 = points[i + 3];
21
- if(vec1 && vec2 && vec3 && vec4) {
22
- polygonString += dxfEnc3DFace(
23
- vec1,
24
- vec2,
25
- vec3,
26
- vec4,
27
- col,
28
- handleRef
29
- );
21
+ if (vec1 && vec2 && vec3 && vec4) {
22
+ polygonString += dxfEnc3DFace(vec1, vec2, vec3, vec4, col, handleRef);
30
23
  }
31
24
  i += QUAD_STRIDE;
32
25
  }
@@ -38,7 +31,7 @@ export function dxfPolygon(p: Polygon, m: Material, parentPos: Vec3, parentRot:
38
31
  const vec1 = points[i];
39
32
  const vec2 = points[i - 1];
40
33
  const vec3 = points[i - 2];
41
- if(vec1 && vec2 && vec3) {
34
+ if (vec1 && vec2 && vec3) {
42
35
  polygonString += dxfEnc3DFaceTriangle(vec3, vec2, vec1, col, handleRef);
43
36
  }
44
37
  break;
@@ -47,14 +40,8 @@ export function dxfPolygon(p: Polygon, m: Material, parentPos: Vec3, parentRot:
47
40
  const vec1 = points[i];
48
41
  const vec2 = points[i - 1];
49
42
  const vec3 = points[i + 1];
50
- if(vec1 && vec2 && vec3) {
51
- polygonString += dxfEnc3DFaceTriangle(
52
- vec2,
53
- vec1,
54
- vec3,
55
- col,
56
- handleRef
57
- );
43
+ if (vec1 && vec2 && vec3) {
44
+ polygonString += dxfEnc3DFaceTriangle(vec2, vec1, vec3, col, handleRef);
58
45
  }
59
46
  break;
60
47
  }
@@ -62,14 +49,8 @@ export function dxfPolygon(p: Polygon, m: Material, parentPos: Vec3, parentRot:
62
49
  const vec1 = points[i];
63
50
  const vec2 = points[i + 1];
64
51
  const vec3 = points[i + 2];
65
- if(vec1 && vec2 && vec3) {
66
- polygonString += dxfEnc3DFaceTriangle(
67
- vec1,
68
- vec2,
69
- vec3,
70
- col,
71
- handleRef
72
- );
52
+ if (vec1 && vec2 && vec3) {
53
+ polygonString += dxfEnc3DFaceTriangle(vec1, vec2, vec3, col, handleRef);
73
54
  }
74
55
  break;
75
56
  }
@@ -1,6 +1,6 @@
1
1
  import { type Shape, type Material, type Vec3, vec3TransRot, vec3RotCombine, vec3Zero, vec3 } from "../../../abstract-3d.js";
2
- import type { Handle } from "../dxf-encoding/dxf-common.js";
3
2
  import { dxfEnc3DFace } from "../dxf-encoding/dxf-3dface.js";
3
+ import type { Handle } from "../dxf-encoding/dxf-common.js";
4
4
  import { dxfEnc3DFaceTriangle } from "../dxf-encoding/dxf-triangle.js";
5
5
 
6
6
  const QUAD_STRIDE = 4;
@@ -18,7 +18,7 @@ export function dxfPolygon(s: Shape, m: Material, parentPos: Vec3, parentRot: Ve
18
18
  const p2 = points[i + 1];
19
19
  const p3 = points[i + 2];
20
20
  const p4 = points[i + 3];
21
- if(p1 && p2 && p3 && p4) {
21
+ if (p1 && p2 && p3 && p4) {
22
22
  polygonString += dxfEnc3DFace(p1, p2, p3, p4, m.normal, handleRef);
23
23
  }
24
24
  }
@@ -31,7 +31,7 @@ export function dxfPolygon(s: Shape, m: Material, parentPos: Vec3, parentRot: Ve
31
31
  const p1 = points[i - 2];
32
32
  const p2 = points[i - 1];
33
33
  const p3 = points[i];
34
- if(p1 && p2 && p3) {
34
+ if (p1 && p2 && p3) {
35
35
  polygonString += dxfEnc3DFaceTriangle(p1, p2, p3, m.normal, handleRef);
36
36
  }
37
37
  break;
@@ -40,7 +40,7 @@ export function dxfPolygon(s: Shape, m: Material, parentPos: Vec3, parentRot: Ve
40
40
  const p1 = points[i - 1];
41
41
  const p2 = points[i];
42
42
  const p3 = points[i + 1];
43
- if(p1 && p2 && p3) {
43
+ if (p1 && p2 && p3) {
44
44
  polygonString += dxfEnc3DFaceTriangle(p1, p2, p3, m.normal, handleRef);
45
45
  }
46
46
  break;
@@ -49,7 +49,7 @@ export function dxfPolygon(s: Shape, m: Material, parentPos: Vec3, parentRot: Ve
49
49
  const p1 = points[i];
50
50
  const p2 = points[i + 1];
51
51
  const p3 = points[i + 2];
52
- if(p1 && p2 && p3) {
52
+ if (p1 && p2 && p3) {
53
53
  polygonString += dxfEnc3DFaceTriangle(p1, p2, p3, m.normal, handleRef);
54
54
  }
55
55
  break;
@@ -20,22 +20,17 @@ import {
20
20
  vec3TransRot,
21
21
  vec3Zero,
22
22
  } from "../../abstract-3d.js";
23
- import {
24
- DEFAULT_CIRCLE_SIDE_COUNT,
25
- type DxfOrigin,
26
- type Handle,
27
- dxfBuild,
28
- dxfHandleInit,
29
- } from "./dxf-encoding/dxf-common.js";
30
23
  import { type Optional, calculateVisibleViews } from "../../utils.js";
31
- import { dxfPlane } from "./dxf-geometries/dxf-plane.js";
24
+ import { dxfBuild } from "./dxf-encoding/dxf-build.js";
25
+ import { DEFAULT_CIRCLE_SIDE_COUNT, type DxfOrigin, type Handle, dxfHandleInit } from "./dxf-encoding/dxf-common.js";
26
+ import type { DxfDimensionDefinition } from "./dxf-encoding/dxf-dimension.js";
32
27
  import { dxfBox } from "./dxf-geometries/dxf-box.js";
33
- import { dxfCylinder } from "./dxf-geometries/dxf-cylinder.js";
34
28
  import { dxfCone } from "./dxf-geometries/dxf-cone.js";
35
- import { dxfPolygon } from "./dxf-geometries/dxf-polygon.js";
36
- import { dxfImage } from "./dxf-geometries/dxf-image.js";
29
+ import { dxfCylinder } from "./dxf-geometries/dxf-cylinder.js";
37
30
  import { dxfDimension } from "./dxf-geometries/dxf-dimension.js";
38
- import type { DxfDimensionDefinition } from "./dxf-encoding/dxf-dimension.js";
31
+ import { dxfImage } from "./dxf-geometries/dxf-image.js";
32
+ import { dxfPlane } from "./dxf-geometries/dxf-plane.js";
33
+ import { dxfPolygon } from "./dxf-geometries/dxf-polygon.js";
39
34
 
40
35
  export type DxfOptions = {
41
36
  readonly view: View;
@@ -106,8 +101,7 @@ const renderInternal = (
106
101
  const [size] = sizeBoundsForCameraPos(scene.size_deprecated, unitCenter, unitRot);
107
102
  const bounds = bounds3FromPosAndSize(unitCenter, size);
108
103
  const dxfOriginOffset = originOffsetFromBounds(bounds, options.origin);
109
- const pos =
110
- options.origin === "SameAsScene" ? vec3Zero : vec3NegateY(vec3Add(unitCenter, vec3Add(offset, dxfOriginOffset)));
104
+ const pos = options.origin === "SameAsScene" ? vec3Zero : vec3NegateY(vec3Add(unitCenter, vec3Add(offset, dxfOriginOffset)));
111
105
  const visibleViews = calculateVisibleViews(options.view, scene.rotation_deprecated);
112
106
  return {
113
107
  groups: scene.groups.reduce((a, c) => a + dxfGroup(c, pos, unitRot, options, handleRef), ""),
@@ -244,10 +238,7 @@ export const renderOld = (scene: Scene, options?: Optional<DxfOptions>): string
244
238
  const viewRotation = rotationForCameraPos(opts.view);
245
239
  const unitRot = vec3RotCombine(viewRotation, scene.rotation_deprecated ?? vec3Zero);
246
240
  const bounds = bounds3FromPosAndSize(center, scene.size_deprecated);
247
- const offset = vec3Sub(
248
- opts.origin === "Center" ? vec3Zero : vec3(Math.abs(bounds.min.x), Math.abs(bounds.min.y), -bounds.max.z),
249
- center
250
- );
241
+ const offset = vec3Sub(opts.origin === "Center" ? vec3Zero : vec3(Math.abs(bounds.min.x), Math.abs(bounds.min.y), -bounds.max.z), center);
251
242
  const dimensionsPos = vec3TransRot(center, offset, unitRot);
252
243
  const visibleViews = calculateVisibleViews(opts.view, scene.rotation_deprecated);
253
244
 
@@ -264,11 +255,5 @@ export const renderOld = (scene: Scene, options?: Optional<DxfOptions>): string
264
255
  opts,
265
256
  handleRef
266
257
  );
267
- return dxfBuild(
268
- dxfGroup(groupRoot, center, unitRot, opts, handleRef),
269
- dimensions,
270
- bounds2,
271
- scene.size_deprecated,
272
- center
273
- );
258
+ return dxfBuild(dxfGroup(groupRoot, center, unitRot, opts, handleRef), dimensions, bounds2, scene.size_deprecated, center);
274
259
  };
@@ -1,4 +1,3 @@
1
- import React, { useLayoutEffect, useRef, useState } from "react";
2
1
  import {
3
2
  type GizmoHelperProps,
4
3
  PerspectiveCamera,
@@ -10,8 +9,10 @@ import {
10
9
  GizmoViewport,
11
10
  } from "@react-three/drei";
12
11
  import { type ThreeEvent, useThree } from "@react-three/fiber";
13
- import { exhaustiveCheck } from "ts-exhaustive-check";
12
+ import React, { useLayoutEffect, useRef, useState } from "react";
13
+ import type { OrthographicCamera as ThreeOrthographicCamera, PerspectiveCamera as ThreePerspectiveCamera } from "three";
14
14
  import { Vector3 } from "three";
15
+ import { exhaustiveCheck } from "ts-exhaustive-check";
15
16
  import type { View, Scene, Vec3 } from "../../abstract-3d.js";
16
17
  import { vec3 } from "../../abstract-3d.js";
17
18
 
@@ -44,6 +45,9 @@ export type ControlsHelper = (Viewcube | Viewport) & {
44
45
  type Viewcube = { readonly type: "Viewcube"; readonly viewcubeProps: GenericProps };
45
46
  type Viewport = { readonly type: "Viewport"; readonly viewportProps: GizmoViewportProps };
46
47
 
48
+ type RefInstance<C> = C extends React.ForwardRefExoticComponent<infer P> ? (P extends React.RefAttributes<infer R> ? R : never) : never;
49
+ type OrbitControlsInstance = RefInstance<typeof OrbitControls>;
50
+
47
51
  export function ReactCamera({
48
52
  useAnimations: _useAnimations,
49
53
  camera,
@@ -63,9 +67,10 @@ export function ReactCamera({
63
67
  readonly bufferZones?: BufferZones;
64
68
  readonly fitPadding?: number;
65
69
  }): React.JSX.Element {
66
- const [controls, setControls] = useState<any | null>(null);
67
- const perspectiveRef = useRef<any | undefined>(undefined);
68
- const orthographicRef = useRef<any | undefined>(undefined);
70
+ // oxlint-disable-next-line typescript/no-redundant-type-constituents -- oxlint's type-aware checker resolves OrbitControlsInstance (a conditional type over a forward-ref component) as `any`; tsc resolves it correctly and the `| null` is not actually redundant
71
+ const [controls, setControls] = useState<OrbitControlsInstance | null>(null);
72
+ const perspectiveRef = useRef<ThreePerspectiveCamera | undefined>(undefined);
73
+ const orthographicRef = useRef<ThreeOrthographicCamera | undefined>(undefined);
69
74
 
70
75
  const initialDistRef = useRef<number | null>(null);
71
76
  const initialTargetRef = useRef(new Vector3());
@@ -76,18 +81,18 @@ export function ReactCamera({
76
81
  const invalidate = useThree(({ invalidate }) => invalidate);
77
82
 
78
83
  const resetZoomOnGizmoClick = (): void => {
79
- if (!controls || initialDistRef.current == null || (!perspectiveRef.current && !orthographicRef.current)) {
84
+ if (!controls || initialDistRef.current === null || (!perspectiveRef.current && !orthographicRef.current)) {
80
85
  return;
81
86
  }
82
87
 
83
- const newCamera = camera.type === "Perspective" ? perspectiveRef.current : orthographicRef.current;
88
+ const newCamera = (camera.type === "Perspective" ? perspectiveRef.current : orthographicRef.current)!;
84
89
  const target = initialTargetRef.current.clone();
85
90
 
86
91
  controls.target.copy(target);
87
92
 
88
93
  const dist = initialDistRef.current;
89
94
  const dir = newCamera.position.clone().sub(target).normalize();
90
- newCamera.fov = initialFovRef.current;
95
+ (newCamera as ThreePerspectiveCamera).fov = initialFovRef.current!;
91
96
  newCamera.zoom = 1;
92
97
  newCamera.position.copy(target.clone().add(dir.multiplyScalar(dist)));
93
98
 
@@ -115,7 +120,7 @@ export function ReactCamera({
115
120
  const screenW = size.x;
116
121
  const screenH = size.y;
117
122
 
118
- const fov = camera.type === "Perspective" ? camera.fov ?? 45 : 45;
123
+ const fov = camera.type === "Perspective" ? (camera.fov ?? 45) : 45;
119
124
 
120
125
  // Buffer zones in CSS pixels
121
126
  const bufLeft = bufferZones.left ?? 0;
@@ -128,7 +133,9 @@ export function ReactCamera({
128
133
  const canvasW = canvasSize.width;
129
134
  const canvasH = canvasSize.height;
130
135
 
131
- if (canvasW === 0 || canvasH === 0) return;
136
+ if (canvasW === 0 || canvasH === 0) {
137
+ return;
138
+ }
132
139
 
133
140
  // Usable area in CSS pixels
134
141
  const usableW = Math.max(1, canvasW - bufLeft - bufRight);
@@ -145,19 +152,13 @@ export function ReactCamera({
145
152
  initialDistRef.current = dist;
146
153
 
147
154
  // Fit scene into the usable area
148
- let sceneHalfW: number;
149
- let sceneHalfH: number;
150
-
151
155
  const padFactor = 1 + fitPadding;
152
- if (sceneAspect > usableAspect) {
153
- // Scene wider than usable area — constrain by width
154
- sceneHalfW = (screenW / 2) * padFactor;
155
- sceneHalfH = (screenW / 2 / usableAspect) * padFactor;
156
- } else {
157
- // Scene taller — constrain by height
158
- sceneHalfH = (screenH / 2) * padFactor;
159
- sceneHalfW = ((usableAspect * screenH) / 2) * padFactor;
160
- }
156
+ const { sceneHalfW, sceneHalfH } =
157
+ sceneAspect > usableAspect
158
+ ? // Scene wider than usable area — constrain by width
159
+ { sceneHalfW: (screenW / 2) * padFactor, sceneHalfH: (screenW / 2 / usableAspect) * padFactor }
160
+ : // Scene taller — constrain by height
161
+ { sceneHalfH: (screenH / 2) * padFactor, sceneHalfW: ((usableAspect * screenH) / 2) * padFactor };
161
162
 
162
163
  // World units per CSS pixel in the usable area
163
164
  const wpp = (sceneHalfW * 2) / usableW;
@@ -207,7 +208,7 @@ export function ReactCamera({
207
208
  return (
208
209
  <>
209
210
  <PerspectiveCamera
210
- ref={perspectiveRef}
211
+ ref={perspectiveRef as unknown as React.RefObject<ThreePerspectiveCamera | null>}
211
212
  near={camera.near}
212
213
  far={camera.far}
213
214
  fov={camera.type === "Perspective" ? camera.fov : 75}
@@ -216,7 +217,7 @@ export function ReactCamera({
216
217
  makeDefault={camera.type === "Perspective"}
217
218
  />
218
219
  <OrthographicCamera
219
- ref={orthographicRef}
220
+ ref={orthographicRef as unknown as React.RefObject<ThreeOrthographicCamera | null>}
220
221
  up={[0, 1, 0]}
221
222
  near={camera.near}
222
223
  far={camera.far}
@@ -274,10 +275,10 @@ export function ReactCamera({
274
275
 
275
276
  const ControlsWrapper = (
276
277
  props: OrbitControlsProps & {
277
- setControls: (controls: any) => void;
278
+ setControls: (controls: OrbitControlsInstance) => void;
278
279
  }
279
280
  ): React.JSX.Element => {
280
- const ref = useRef<any>(null);
281
+ const ref = useRef<OrbitControlsInstance>(null);
281
282
 
282
283
  useLayoutEffect(() => {
283
284
  if (!ref.current) {
@@ -64,13 +64,7 @@ export function ReactDimension({
64
64
  }
65
65
 
66
66
  const DimensionMeshes = React.memo(
67
- ({
68
- meshes,
69
- children,
70
- }: {
71
- readonly meshes: ReadonlyArray<Mesh>;
72
- readonly children: React.JSX.Element;
73
- }): React.JSX.Element => (
67
+ ({ meshes, children }: { readonly meshes: ReadonlyArray<Mesh>; readonly children: React.JSX.Element }): React.JSX.Element => (
74
68
  <>
75
69
  {meshes.map((m, i) => (
76
70
  <ReactMesh key={i} mesh={m}>
@@ -1,13 +1,13 @@
1
- import React from "react";
1
+ import { Html } from "@react-three/drei";
2
2
  import type { ThreeEvent } from "@react-three/fiber";
3
3
  import { useFrame } from "@react-three/fiber";
4
+ import React from "react";
4
5
  import type { Group } from "three";
5
6
  import type { Group as Group_1 } from "../../abstract-3d.js";
7
+ import { ImageMaterial } from "./react-image-material.js";
6
8
  import type { MaterialState } from "./react-material.js";
7
9
  import { ReactMaterial } from "./react-material.js";
8
10
  import { ReactMesh } from "./react-mesh.js";
9
- import { ImageMaterial } from "./react-image-material.js";
10
- import { Html } from "@react-three/drei";
11
11
  import type { ReactPopover } from "./react-types.js";
12
12
 
13
13
  export function ReactGroup({
@@ -58,12 +58,7 @@ export function ReactGroup({
58
58
  e: ThreeEvent<MouseEvent>
59
59
  ) => void;
60
60
  readonly getTooltips?: (id: string) => ReadonlyArray<ReactPopover>;
61
- readonly createGroupKey?: (
62
- g: Group_1,
63
- idx: number,
64
- rootData: Record<string, string> | undefined,
65
- id: string
66
- ) => string;
61
+ readonly createGroupKey?: (g: Group_1, idx: number, rootData: Record<string, string> | undefined, id: string) => string;
67
62
  }): React.JSX.Element {
68
63
  const ref = React.useRef<Group>(undefined!);
69
64
  useFrame(({ invalidate }, delta) => {
@@ -82,6 +77,7 @@ export function ReactGroup({
82
77
  }
83
78
  });
84
79
  const [hovered, setHovered] = React.useState<boolean>(false);
80
+ // oxlint-disable-next-line typescript/prefer-nullish-coalescing -- `id && ...includes(id)` can legitimately be `false`, which must fall through to hoveredParent
85
81
  const hoveredFinal = hovered || (id && hoveredIdsExternal?.includes(id)) || !!hoveredParent;
86
82
  const selected = selectedIds?.[id ?? ""];
87
83
 
@@ -174,13 +170,7 @@ export function ReactGroup({
174
170
  id &&
175
171
  getTooltips &&
176
172
  getTooltips(id).map((p) => (
177
- <Html
178
- key={p.id}
179
- position={[p.pos.x, p.pos.y, p.pos.z]}
180
- center
181
- pointerEvents="none"
182
- style={{ pointerEvents: "none" }}
183
- >
173
+ <Html key={p.id} position={[p.pos.x, p.pos.y, p.pos.z]} center pointerEvents="none" style={{ pointerEvents: "none" }}>
184
174
  {p.content}
185
175
  </Html>
186
176
  ))}
@@ -1,10 +1,10 @@
1
- import React from "react";
2
1
  import { Html } from "@react-three/drei";
2
+ import type { ThreeEvent } from "@react-three/fiber";
3
+ import React from "react";
3
4
  import type { Box, HotSpot } from "../../abstract-3d.js";
4
5
  import { vec3Scale, vec3Zero } from "../../abstract-3d.js";
5
- import { ReactMesh } from "./react-mesh.js";
6
6
  import { ReactMaterial } from "./react-material.js";
7
- import type { ThreeEvent } from "@react-three/fiber";
7
+ import { ReactMesh } from "./react-mesh.js";
8
8
 
9
9
  export interface HotSpotInfo {
10
10
  readonly replaceId: string;
@@ -97,13 +97,7 @@ export function ReactHotSpot({
97
97
  <ReactMaterial isText={false} isHotSpot={true} material={h.mesh.material} hovered={hovered} />
98
98
  </ReactMesh>
99
99
  <ReactMesh mesh={{ ...h.mesh, geometry: { ...geo, size: vec3Scale(geo.size, 1.0125) } }}>
100
- <ReactMaterial
101
- isText={false}
102
- isHotSpot={true}
103
- drawBackOnly={true}
104
- material={{ normal: "rgb(0, 0, 0)", opacity: 1.0 }}
105
- hovered={hovered}
106
- />
100
+ <ReactMaterial isText={false} isHotSpot={true} drawBackOnly={true} material={{ normal: "rgb(0, 0, 0)", opacity: 1.0 }} hovered={hovered} />
107
101
  </ReactMesh>
108
102
  </group>
109
103
  {hotSpotTexts && text && (
@@ -1,6 +1,6 @@
1
+ import { createSVG } from "abstract-image";
1
2
  import React from "react";
2
3
  import { suspend } from "suspend-react";
3
- import { createSVG } from "abstract-image";
4
4
  import { CanvasTexture, DoubleSide, PlaneGeometry, SRGBColorSpace, type Texture, TextureLoader } from "three";
5
5
  import type { Material, Image as A3dImage } from "../../abstract-3d.js";
6
6
  import type { MaterialState } from "./react-material.js";
@@ -48,15 +48,15 @@ export function ImageMaterial({
48
48
  materialState === "Error" && materialStateImages?.[ERROR_IMG_KEY]
49
49
  ? materialStateImages[ERROR_IMG_KEY]
50
50
  : image.type === "AbstractImage"
51
- ? `data:image/svg+xml,${createSVG(image.image)}`
52
- : image.url;
51
+ ? `data:image/svg+xml,${createSVG(image.image)}`
52
+ : image.url;
53
53
  const texture = suspend(urlIsSvg(url) ? loadSvg(url, filter) : loadNormal(url, filter), [url]) as Texture | null;
54
54
 
55
55
  return (
56
56
  <meshBasicMaterial
57
57
  color={getColor(selected, hovered, material, selectMat)}
58
58
  side={DoubleSide}
59
- alphaTest={useAlphaTest ?? true ? 0.8 : undefined}
59
+ alphaTest={(useAlphaTest ?? true) ? 0.8 : undefined}
60
60
  map={texture}
61
61
  {...(material.opacity !== undefined && material.opacity < 1 ? { opacity: material.opacity } : materialDefaults)}
62
62
  transparent
@@ -77,8 +77,7 @@ function loadSvg(url: string, filter: TextureFilter): Promise<Texture | null> {
77
77
  const maxSize = 512;
78
78
  const img = new Image();
79
79
 
80
- // eslint-disable-next-line consistent-return
81
- img.onload = (): void => {
80
+ img.addEventListener("load", (): void => {
82
81
  const canvas = document.createElement("canvas");
83
82
  const imgW = img.naturalWidth;
84
83
  const imgH = img.naturalHeight;
@@ -108,9 +107,9 @@ function loadSvg(url: string, filter: TextureFilter): Promise<Texture | null> {
108
107
 
109
108
  res(texture);
110
109
  textureCache.set(url, texture);
111
- };
110
+ });
112
111
 
113
- img.onerror = () => res(null);
112
+ img.addEventListener("error", () => res(null));
114
113
  img.src = url;
115
114
  });
116
115
  }
@@ -27,15 +27,9 @@ export function ReactMaterial({
27
27
  readonly isHotSpot?: boolean;
28
28
  readonly drawBackOnly?: boolean;
29
29
  }): React.JSX.Element {
30
- const mat = !materialState
31
- ? material
32
- : materialState === "Accept"
33
- ? acceptMat
34
- : materialState === "Error"
35
- ? errorMar
36
- : warningMat;
30
+ const mat = !materialState ? material : materialState === "Accept" ? acceptMat : materialState === "Error" ? errorMar : warningMat;
37
31
 
38
- const opacity = material.opacity !== undefined ? material.opacity : materialDefaults.opacity!;
32
+ const opacity = material.opacity ?? materialDefaults.opacity!;
39
33
  if (isText) {
40
34
  return (
41
35
  <meshBasicMaterial
@@ -92,17 +86,6 @@ const textSelectMat: Material = { normal: "rgb(0, 26, 65)", opacity: 1.0, metaln
92
86
  const errorMar: Material = { normal: "#b82f3a", opacity: 1.0, metalness: 0.5, roughness: 0.5 };
93
87
  const warningMat: Material = { normal: "rgb(240, 197, 48)", opacity: 1.0, metalness: 0.5, roughness: 0.5 };
94
88
 
95
- export function getColor(
96
- selected: boolean | undefined,
97
- hovered: boolean | undefined,
98
- mat: Material,
99
- selectedMat: Material
100
- ): string | undefined {
101
- return selected
102
- ? hovered
103
- ? shade(-0.4, selectedMat.normal)
104
- : selectedMat.normal
105
- : hovered
106
- ? shade(-0.4, mat.normal)
107
- : mat.normal;
89
+ export function getColor(selected: boolean | undefined, hovered: boolean | undefined, mat: Material, selectedMat: Material): string | undefined {
90
+ return selected ? (hovered ? shade(-0.4, selectedMat.normal) : selectedMat.normal) : hovered ? shade(-0.4, mat.normal) : mat.normal;
108
91
  }