abstract-3d 2.6.19 → 2.7.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 (142) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/lib/abstract-3d.d.ts +13 -1
  3. package/lib/abstract-3d.d.ts.map +1 -1
  4. package/lib/abstract-3d.js +77 -0
  5. package/lib/abstract-3d.js.map +1 -1
  6. package/lib/renderers/dxf/dxf-encoding/dxf-color.d.ts +5 -0
  7. package/lib/renderers/dxf/dxf-encoding/dxf-color.d.ts.map +1 -0
  8. package/lib/renderers/dxf/{color.js → dxf-encoding/dxf-color.js} +24 -19
  9. package/lib/renderers/dxf/dxf-encoding/dxf-color.js.map +1 -0
  10. package/lib/renderers/dxf/dxf-encoding/dxf-common.d.ts +13 -0
  11. package/lib/renderers/dxf/dxf-encoding/dxf-common.d.ts.map +1 -0
  12. package/lib/renderers/dxf/dxf-encoding/dxf-common.js +23 -0
  13. package/lib/renderers/dxf/dxf-encoding/dxf-common.js.map +1 -0
  14. package/lib/renderers/dxf/dxf-encoding/dxf-dimension.d.ts +6 -0
  15. package/lib/renderers/dxf/dxf-encoding/dxf-dimension.d.ts.map +1 -0
  16. package/lib/renderers/dxf/dxf-encoding/dxf-dimension.js +50 -0
  17. package/lib/renderers/dxf/dxf-encoding/dxf-dimension.js.map +1 -0
  18. package/lib/renderers/dxf/dxf-encoding/dxf-footer.d.ts +2 -0
  19. package/lib/renderers/dxf/dxf-encoding/dxf-footer.d.ts.map +1 -0
  20. package/lib/renderers/dxf/{dxf-encoding.js → dxf-encoding/dxf-footer.js} +3 -1819
  21. package/lib/renderers/dxf/{dxf-encoding.js.map → dxf-encoding/dxf-footer.js.map} +1 -1
  22. package/lib/renderers/dxf/dxf-encoding/dxf-header.d.ts +3 -0
  23. package/lib/renderers/dxf/dxf-encoding/dxf-header.d.ts.map +1 -0
  24. package/lib/renderers/dxf/dxf-encoding/dxf-header.js +1653 -0
  25. package/lib/renderers/dxf/dxf-encoding/dxf-header.js.map +1 -0
  26. package/lib/renderers/dxf/dxf-encoding/dxf-line.d.ts +5 -0
  27. package/lib/renderers/dxf/dxf-encoding/dxf-line.d.ts.map +1 -0
  28. package/lib/renderers/dxf/dxf-encoding/dxf-line.js +29 -0
  29. package/lib/renderers/dxf/dxf-encoding/dxf-line.js.map +1 -0
  30. package/lib/renderers/dxf/dxf-encoding/dxf-polyline.d.ts +5 -0
  31. package/lib/renderers/dxf/dxf-encoding/dxf-polyline.d.ts.map +1 -0
  32. package/lib/renderers/dxf/dxf-encoding/dxf-polyline.js +73 -0
  33. package/lib/renderers/dxf/dxf-encoding/dxf-polyline.js.map +1 -0
  34. package/lib/renderers/dxf/dxf-encoding/dxf-quad.d.ts +5 -0
  35. package/lib/renderers/dxf/dxf-encoding/dxf-quad.d.ts.map +1 -0
  36. package/lib/renderers/dxf/dxf-encoding/dxf-quad.js +39 -0
  37. package/lib/renderers/dxf/dxf-encoding/dxf-quad.js.map +1 -0
  38. package/lib/renderers/dxf/dxf-encoding/dxf-text.d.ts +19 -0
  39. package/lib/renderers/dxf/dxf-encoding/dxf-text.d.ts.map +1 -0
  40. package/lib/renderers/dxf/dxf-encoding/dxf-text.js +70 -0
  41. package/lib/renderers/dxf/dxf-encoding/dxf-text.js.map +1 -0
  42. package/lib/renderers/dxf/dxf-encoding/dxf-triangle.d.ts +5 -0
  43. package/lib/renderers/dxf/dxf-encoding/dxf-triangle.d.ts.map +1 -0
  44. package/lib/renderers/dxf/dxf-encoding/dxf-triangle.js +3 -0
  45. package/lib/renderers/dxf/dxf-encoding/dxf-triangle.js.map +1 -0
  46. package/lib/renderers/dxf/dxf-geometries/dxf-box.d.ts +2 -2
  47. package/lib/renderers/dxf/dxf-geometries/dxf-box.d.ts.map +1 -1
  48. package/lib/renderers/dxf/dxf-geometries/dxf-box.js +8 -8
  49. package/lib/renderers/dxf/dxf-geometries/dxf-box.js.map +1 -1
  50. package/lib/renderers/dxf/dxf-geometries/dxf-cone.d.ts +2 -2
  51. package/lib/renderers/dxf/dxf-geometries/dxf-cone.d.ts.map +1 -1
  52. package/lib/renderers/dxf/dxf-geometries/dxf-cone.js +4 -4
  53. package/lib/renderers/dxf/dxf-geometries/dxf-cone.js.map +1 -1
  54. package/lib/renderers/dxf/dxf-geometries/dxf-cylinder.d.ts +2 -2
  55. package/lib/renderers/dxf/dxf-geometries/dxf-cylinder.d.ts.map +1 -1
  56. package/lib/renderers/dxf/dxf-geometries/dxf-cylinder.js +6 -5
  57. package/lib/renderers/dxf/dxf-geometries/dxf-cylinder.js.map +1 -1
  58. package/lib/renderers/dxf/dxf-geometries/dxf-dimension.d.ts +4 -0
  59. package/lib/renderers/dxf/dxf-geometries/dxf-dimension.d.ts.map +1 -0
  60. package/lib/renderers/dxf/dxf-geometries/dxf-dimension.js +13 -0
  61. package/lib/renderers/dxf/dxf-geometries/dxf-dimension.js.map +1 -0
  62. package/lib/renderers/dxf/dxf-geometries/dxf-image.d.ts +2 -2
  63. package/lib/renderers/dxf/dxf-geometries/dxf-image.d.ts.map +1 -1
  64. package/lib/renderers/dxf/dxf-geometries/dxf-image.js +8 -7
  65. package/lib/renderers/dxf/dxf-geometries/dxf-image.js.map +1 -1
  66. package/lib/renderers/dxf/dxf-geometries/dxf-plane.d.ts +2 -2
  67. package/lib/renderers/dxf/dxf-geometries/dxf-plane.d.ts.map +1 -1
  68. package/lib/renderers/dxf/dxf-geometries/dxf-plane.js +3 -3
  69. package/lib/renderers/dxf/dxf-geometries/dxf-plane.js.map +1 -1
  70. package/lib/renderers/dxf/dxf-geometries/dxf-polygon.d.ts +2 -2
  71. package/lib/renderers/dxf/dxf-geometries/dxf-polygon.d.ts.map +1 -1
  72. package/lib/renderers/dxf/dxf-geometries/dxf-polygon.js +7 -6
  73. package/lib/renderers/dxf/dxf-geometries/dxf-polygon.js.map +1 -1
  74. package/lib/renderers/dxf/dxf-geometries/dxf-shape.d.ts +2 -2
  75. package/lib/renderers/dxf/dxf-geometries/dxf-shape.d.ts.map +1 -1
  76. package/lib/renderers/dxf/dxf-geometries/dxf-shape.js +6 -5
  77. package/lib/renderers/dxf/dxf-geometries/dxf-shape.js.map +1 -1
  78. package/lib/renderers/dxf/dxf-geometries/dxf-text.d.ts +4 -0
  79. package/lib/renderers/dxf/dxf-geometries/dxf-text.d.ts.map +1 -0
  80. package/lib/renderers/dxf/dxf-geometries/dxf-text.js +8 -0
  81. package/lib/renderers/dxf/dxf-geometries/dxf-text.js.map +1 -0
  82. package/lib/renderers/dxf/dxf.d.ts +4 -3
  83. package/lib/renderers/dxf/dxf.d.ts.map +1 -1
  84. package/lib/renderers/dxf/dxf.js +36 -22
  85. package/lib/renderers/dxf/dxf.js.map +1 -1
  86. package/lib/renderers/dxf/index.d.ts +1 -1
  87. package/lib/renderers/dxf/index.d.ts.map +1 -1
  88. package/lib/renderers/react/react-dimension.d.ts +4 -3
  89. package/lib/renderers/react/react-dimension.d.ts.map +1 -1
  90. package/lib/renderers/react/react-dimension.js +4 -3
  91. package/lib/renderers/react/react-dimension.js.map +1 -1
  92. package/lib/renderers/step/step-encoding.d.ts +2 -0
  93. package/lib/renderers/step/step-encoding.d.ts.map +1 -1
  94. package/lib/renderers/step/step-encoding.js +16 -3
  95. package/lib/renderers/step/step-encoding.js.map +1 -1
  96. package/lib/renderers/step/step-geometries/step-box.d.ts.map +1 -1
  97. package/lib/renderers/step/step-geometries/step-box.js +3 -0
  98. package/lib/renderers/step/step-geometries/step-box.js.map +1 -1
  99. package/lib/renderers/step/step-geometries/step-cylinder.d.ts.map +1 -1
  100. package/lib/renderers/step/step-geometries/step-cylinder.js +67 -21
  101. package/lib/renderers/step/step-geometries/step-cylinder.js.map +1 -1
  102. package/lib/renderers/svg/svg.d.ts.map +1 -1
  103. package/lib/renderers/svg/svg.js +6 -27
  104. package/lib/renderers/svg/svg.js.map +1 -1
  105. package/lib/utils.d.ts +3 -0
  106. package/lib/utils.d.ts.map +1 -1
  107. package/lib/utils.js +30 -0
  108. package/lib/utils.js.map +1 -1
  109. package/package.json +2 -2
  110. package/src/abstract-3d.ts +127 -7
  111. package/src/renderers/dxf/{color.ts → dxf-encoding/dxf-color.ts} +27 -20
  112. package/src/renderers/dxf/dxf-encoding/dxf-common.ts +31 -0
  113. package/src/renderers/dxf/dxf-encoding/dxf-dimension.ts +60 -0
  114. package/src/renderers/dxf/{dxf-encoding.ts → dxf-encoding/dxf-footer.ts} +4 -1870
  115. package/src/renderers/dxf/dxf-encoding/dxf-header.ts +1657 -0
  116. package/src/renderers/dxf/dxf-encoding/dxf-line.ts +35 -0
  117. package/src/renderers/dxf/dxf-encoding/dxf-polyline.ts +83 -0
  118. package/src/renderers/dxf/dxf-encoding/dxf-quad.ts +47 -0
  119. package/src/renderers/dxf/dxf-encoding/dxf-text.ts +71 -0
  120. package/src/renderers/dxf/dxf-encoding/dxf-triangle.ts +12 -0
  121. package/src/renderers/dxf/dxf-geometries/dxf-box.ts +18 -8
  122. package/src/renderers/dxf/dxf-geometries/dxf-cone.ts +13 -4
  123. package/src/renderers/dxf/dxf-geometries/dxf-cylinder.ts +13 -11
  124. package/src/renderers/dxf/dxf-geometries/dxf-dimension.ts +14 -0
  125. package/src/renderers/dxf/dxf-geometries/dxf-image.ts +11 -9
  126. package/src/renderers/dxf/dxf-geometries/dxf-plane.ts +7 -6
  127. package/src/renderers/dxf/dxf-geometries/dxf-polygon.ts +8 -6
  128. package/src/renderers/dxf/dxf-geometries/dxf-shape.ts +8 -6
  129. package/src/renderers/dxf/dxf-geometries/dxf-text.ts +9 -0
  130. package/src/renderers/dxf/dxf.ts +57 -39
  131. package/src/renderers/dxf/index.ts +1 -1
  132. package/src/renderers/react/react-dimension.tsx +8 -4
  133. package/src/renderers/step/step-encoding.ts +24 -5
  134. package/src/renderers/step/step-geometries/step-box.ts +6 -0
  135. package/src/renderers/step/step-geometries/step-cylinder.ts +303 -101
  136. package/src/renderers/svg/svg.ts +6 -34
  137. package/src/utils.ts +39 -0
  138. package/lib/renderers/dxf/color.d.ts +0 -7
  139. package/lib/renderers/dxf/color.d.ts.map +0 -1
  140. package/lib/renderers/dxf/color.js.map +0 -1
  141. package/lib/renderers/dxf/dxf-encoding.d.ts +0 -17
  142. package/lib/renderers/dxf/dxf-encoding.d.ts.map +0 -1
@@ -1,37 +1,42 @@
1
1
  import {
2
- Scene,
3
- View,
4
- vec3RotCombine,
5
- vec3Zero,
6
- Group,
7
- Vec3,
8
- vec3TransRot,
9
- group,
10
- bounds3ToSize,
11
- vec3,
12
- rotationForCameraPos,
2
+ type Bounds3,
3
+ type Dimensions,
4
+ type Group,
5
+ type Scene,
6
+ type Vec3,
7
+ type View,
8
+ bounds3Center,
13
9
  bounds3FromPosAndSize,
14
- Bounds3,
15
10
  bounds3Merge,
16
- bounds3Center,
17
- vec3Add,
18
- sizeBoundsForCameraPos,
11
+ bounds3ToSize,
19
12
  boundsScene,
13
+ group,
14
+ rotationForCameraPos,
15
+ sizeBoundsForCameraPos,
16
+ vec3,
17
+ vec3Add,
18
+ vec3RotCombine,
20
19
  vec3Sub,
20
+ vec3TransRot,
21
+ vec3Zero
21
22
  } from "../../abstract-3d.js";
22
- import { DEFAULT_CIRCLE_SIDE_COUNT, dxf, dxfHandleCreate, DxfOrigin, Handle } from "./dxf-encoding.js";
23
+ import { DEFAULT_CIRCLE_SIDE_COUNT, type DxfOrigin, type Handle, dxfBuild, dxfHandleInit } from "./dxf-encoding/dxf-common.js";
24
+ import { type Optional, calculateVisibleViews } from "../../utils.js";
23
25
  import { dxfPlane } from "./dxf-geometries/dxf-plane.js";
24
26
  import { dxfBox } from "./dxf-geometries/dxf-box.js";
25
27
  import { dxfCylinder } from "./dxf-geometries/dxf-cylinder.js";
26
28
  import { dxfCone } from "./dxf-geometries/dxf-cone.js";
27
29
  import { dxfPolygon } from "./dxf-geometries/dxf-polygon.js";
28
- import { Optional } from "../../utils.js";
29
30
  import { dxfImage } from "./dxf-geometries/dxf-image.js";
31
+ import { dxfText } from "./dxf-geometries/dxf-text.js";
32
+ import { dxfEncLine } from "./dxf-encoding/dxf-line.js";
33
+ import { dxfDimension } from "./dxf-geometries/dxf-dimension.js";
30
34
 
31
35
  export type DxfOptions = {
32
36
  readonly view: View;
33
37
  readonly origin: DxfOrigin;
34
38
  readonly cylinderSideCount: number;
39
+ readonly showDimensions: boolean;
35
40
  };
36
41
 
37
42
  export type DxfScenesOptionsBase = Omit<DxfOptions, "origin"> & { readonly origin: Exclude<DxfOrigin, "SameAsScene"> };
@@ -44,28 +49,30 @@ export type DxfScene = {
44
49
 
45
50
  export function renderScenes(scenes: ReadonlyArray<DxfScene>, baseOptions?: Optional<DxfScenesOptionsBase>): string {
46
51
  let allGroups = "";
52
+ let allDimensions = "";
47
53
  const allBounds = Array<Bounds3>();
48
- const handle = dxfHandleCreate();
54
+ const handle = dxfHandleInit();
49
55
  const originOffset = originOffsetFromScenes(scenes, baseOptions?.origin ?? "Center");
50
56
  for (const view of scenes) {
51
- const { groups, size, center } = renderInternal(
57
+ const { groups, dimensions, size, center } = renderInternal(
52
58
  view.scene,
53
59
  optionsDef({ ...baseOptions, ...view.options, origin: "Center" }),
54
60
  vec3Add(view.pos, originOffset),
55
61
  handle
56
62
  );
57
63
  allGroups += groups;
64
+ allDimensions += dimensions;
58
65
  allBounds.push(bounds3FromPosAndSize(center, size));
59
66
  }
60
67
  const bounds = bounds3Merge(...allBounds);
61
- return dxf(allGroups, bounds, bounds3ToSize(bounds), bounds3Center(bounds));
68
+ return dxfBuild(allGroups, allDimensions, bounds, bounds3ToSize(bounds), bounds3Center(bounds));
62
69
  }
63
70
 
64
71
  export const render = (scene: Scene, options?: Optional<DxfOptions>): string => {
65
72
  const opts = optionsDef(options);
66
73
  const bounds = boundsScene(scene);
67
- const { groups, size, center } = renderInternal(scene, opts, vec3Zero, dxfHandleCreate());
68
- return dxf(groups, bounds, size, center);
74
+ const { groups, dimensions, size, center } = renderInternal(scene, opts, vec3Zero, dxfHandleInit());
75
+ return dxfBuild(groups, dimensions, bounds, size, center);
69
76
  };
70
77
 
71
78
  const renderInternal = (
@@ -73,7 +80,7 @@ const renderInternal = (
73
80
  options: DxfOptions,
74
81
  offset: Vec3,
75
82
  handleRef: Handle
76
- ): { readonly groups: string; readonly size: Vec3; readonly center: Vec3 } => {
83
+ ): { readonly groups: string; readonly dimensions: string; readonly size: Vec3; readonly center: Vec3 } => {
77
84
  const unitRot = vec3RotCombine(rotationForCameraPos(options.view), scene.rotation_deprecated ?? vec3Zero);
78
85
  const unitCenter = scene.center_deprecated ?? vec3Zero;
79
86
  const [size] = sizeBoundsForCameraPos(scene.size_deprecated, unitCenter, unitRot);
@@ -81,8 +88,11 @@ const renderInternal = (
81
88
  const dxfOriginOffset = originOffsetFromBounds(bounds, options.origin);
82
89
  const pos =
83
90
  options.origin === "SameAsScene" ? vec3Zero : vec3NegateY(vec3Add(unitCenter, vec3Add(offset, dxfOriginOffset)));
91
+ const visibleViews = calculateVisibleViews(options.view, scene.rotation_deprecated);
92
+
84
93
  return {
85
94
  groups: scene.groups.reduce((a, c) => a + dxfGroup(c, pos, unitRot, options, handleRef), ""),
95
+ dimensions: dxfDimensions(scene.dimensions_deprecated, vec3Zero, unitRot, visibleViews, options, handleRef),
86
96
  size,
87
97
  center: pos,
88
98
  };
@@ -148,6 +158,16 @@ function dxfGroup(g: Group, parentPos: Vec3, parentRot: Vec3, options: DxfOption
148
158
  dxf += dxfImage(mesh.geometry, pos, rot, handleRef);
149
159
  break;
150
160
  }
161
+ case "Line": {
162
+ //const start = vec3TransRot(mesh.geometry.start, pos, rot);
163
+ //const end = vec3TransRot(mesh.geometry.end, pos, rot);
164
+ //dxf += dxfEncLine(start, end, 7, handleRef);
165
+ break;
166
+ }
167
+ case "Text": {
168
+ //dxf += dxfText(mesh.geometry, mesh.material, pos, rot, handleRef);
169
+ break;
170
+ }
151
171
  default:
152
172
  break;
153
173
  }
@@ -160,11 +180,19 @@ function dxfGroup(g: Group, parentPos: Vec3, parentRot: Vec3, options: DxfOption
160
180
  return dxf;
161
181
  }
162
182
 
183
+ function dxfDimensions(d: Dimensions | undefined, parentPos: Vec3, parentRot: Vec3, _visibleViews: Record<string, boolean>, options: DxfOptions, handleRef: Handle): string {
184
+ if(!d || !options.showDimensions) {
185
+ return "";
186
+ }
187
+ return d.dimensions.map((d) => dxfDimension(d, parentPos, parentRot, handleRef)).join("");
188
+ }
189
+
163
190
  function optionsDef(options: Optional<DxfOptions> | undefined): DxfOptions {
164
191
  return {
165
192
  view: options?.view ?? "front",
166
193
  origin: options?.origin ?? "BottomLeftFront",
167
- cylinderSideCount: DEFAULT_CIRCLE_SIDE_COUNT,
194
+ cylinderSideCount: options?.cylinderSideCount ?? DEFAULT_CIRCLE_SIDE_COUNT,
195
+ showDimensions: options?.showDimensions ?? true,
168
196
  };
169
197
  }
170
198
 
@@ -178,22 +206,12 @@ export const renderOld = (scene: Scene, options?: Optional<DxfOptions>): string
178
206
  opts.origin === "Center" ? vec3Zero : vec3(Math.abs(bounds.min.x), Math.abs(bounds.min.y), -bounds.max.z),
179
207
  center
180
208
  );
181
-
182
- const newBounds: Bounds3 = {
183
- max: {
184
- x: bounds.max.x + offset.x,
185
- y: bounds.max.y + offset.y,
186
- z: bounds.max.z + offset.z,
187
- },
188
- min: {
189
- x: bounds.min.x + offset.x,
190
- y: bounds.min.y + offset.y,
191
- z: bounds.min.z + offset.z,
192
- },
193
- };
209
+ const dimensionsPos = vec3TransRot(center, offset, unitRot);
210
+ const visibleViews = calculateVisibleViews(opts.view, scene.rotation_deprecated);
194
211
 
195
212
  const bounds2 = bounds3FromPosAndSize(offset, scene.size_deprecated);
196
213
  const groupRoot = group([], offset, vec3Zero, scene.groups);
197
- const handleRef = dxfHandleCreate();
198
- return dxf(dxfGroup(groupRoot, center, unitRot, opts, handleRef), bounds2, scene.size_deprecated, center);
214
+ const handleRef = dxfHandleInit();
215
+ const dimensions = dxfDimensions(scene.dimensions_deprecated, dimensionsPos, unitRot, visibleViews, opts, handleRef);
216
+ return dxfBuild(dxfGroup(groupRoot, center, unitRot, opts, handleRef), dimensions, bounds2, scene.size_deprecated, center);
199
217
  };
@@ -1,2 +1,2 @@
1
1
  export * from "./dxf.js";
2
- export type { DxfOrigin } from "./dxf-encoding.js";
2
+ export type { DxfOrigin } from "./dxf-encoding/dxf-common.js";
@@ -1,7 +1,7 @@
1
1
  import { useFrame } from "@react-three/fiber";
2
2
  import React from "react";
3
3
  import type { Group } from "three";
4
- import { Dimensions, Vec3, Dimension, vec3TransRot, vec3Flip, Mesh } from "../../abstract-3d.js";
4
+ import { Dimensions, Vec3, Dimension, vec3TransRot, vec3Flip, Mesh, dimensionConvertToTypeMesh, vec3Zero, Material } from "../../abstract-3d.js";
5
5
  import { ReactMaterial } from "./react-material.js";
6
6
  import { ReactMesh } from "./react-mesh.js";
7
7
 
@@ -26,7 +26,8 @@ export const ReactDimensions = React.memo(
26
26
  {dimensions?.dimensions.map((dimension, i) => (
27
27
  <ReactDimension
28
28
  key={i}
29
- d={dimension}
29
+ dimension={dimension}
30
+ material={dimensions.material}
30
31
  visible={showDimensions}
31
32
  sceneRotation={sceneRotation}
32
33
  sceneCenter={sceneCenter}
@@ -40,18 +41,21 @@ export const ReactDimensions = React.memo(
40
41
  );
41
42
 
42
43
  export function ReactDimension({
43
- d,
44
+ dimension,
45
+ material,
44
46
  visible,
45
47
  children,
46
48
  sceneRotation,
47
49
  sceneCenter,
48
50
  }: {
49
- readonly d: Dimension;
51
+ readonly dimension: Dimension;
52
+ readonly material: Material;
50
53
  readonly visible: boolean;
51
54
  readonly children: React.JSX.Element;
52
55
  readonly sceneRotation: Vec3 | undefined;
53
56
  readonly sceneCenter: Vec3 | undefined;
54
57
  }): React.JSX.Element {
58
+ const d = dimensionConvertToTypeMesh(dimension, sceneRotation ?? vec3Zero, material);
55
59
  const ref = React.useRef<Group>(undefined!);
56
60
  useFrame(({ camera }) => {
57
61
  ref.current.visible =
@@ -2,6 +2,8 @@ import { Vec2, Vec3 } from "../../abstract-3d.js";
2
2
 
3
3
  export type MutableStep = { refs: Map<string, number>; step: string; geoContext3d: number; };
4
4
 
5
+ export const STEP_NUMBER_EPSILON: number = 1e-5;
6
+
5
7
  const mutate = (step: string, m: MutableStep): number => {
6
8
  const prevRef = m.refs.get(step);
7
9
  if (prevRef !== undefined) {
@@ -15,6 +17,20 @@ const mutate = (step: string, m: MutableStep): number => {
15
17
  }
16
18
  };
17
19
 
20
+ const stepNumber = (num: number): number => {
21
+ const absNum = Math.abs(num);
22
+ if(absNum < STEP_NUMBER_EPSILON) {
23
+ return 0.0;
24
+ }
25
+
26
+ const roundNum = Math.round(num);
27
+ if(Math.abs(absNum - Math.abs(roundNum)) < STEP_NUMBER_EPSILON) {
28
+ return roundNum;
29
+ }
30
+
31
+ return num;
32
+ }
33
+
18
34
  export const HEADER = (date: string): string =>
19
35
  `ISO-10303-21;
20
36
  HEADER;
@@ -32,16 +48,16 @@ END-ISO-10303-21;`;
32
48
 
33
49
  export const CARTESIAN_POINT = (p: Vec3 | Vec2, m: MutableStep): number =>
34
50
  mutate(
35
- `CARTESIAN_POINT('',(${p.x},${p.y}${
36
- (p as Vec3)?.z !== undefined ? `,${(p as Vec3).z}` : ""
51
+ `CARTESIAN_POINT('',(${stepNumber(p.x)},${stepNumber(p.y)}${
52
+ (p as Vec3)?.z !== undefined ? `,${stepNumber((p as Vec3).z)}` : ""
37
53
  }))`,
38
54
  m
39
55
  );
40
56
 
41
57
  export const DIRECTION = (d: Vec3 | Vec2, m: MutableStep): number =>
42
58
  mutate(
43
- `DIRECTION('',(${d.x},${d.y}${
44
- (d as Vec3)?.z !== undefined ? `,${(d as Vec3).z}` : ""
59
+ `DIRECTION('',(${stepNumber(d.x)},${stepNumber(d.y)}${
60
+ (d as Vec3)?.z !== undefined ? `,${stepNumber((d as Vec3).z)}` : ""
45
61
  }))`,
46
62
  m
47
63
  );
@@ -96,7 +112,10 @@ export const PCURVE = (
96
112
  ): number => mutate(`PCURVE('',#${CYLINDRICAL_SURFACE_or_PLANE},#${DEFINITIONAL_REPRESENTATION})`, m);
97
113
 
98
114
  export const CYLINDRICAL_SURFACE = (AXIS2_PLACEMENT_3D: number, radius: number, m: MutableStep): number =>
99
- mutate(`CYLINDRICAL_SURFACE('',#${AXIS2_PLACEMENT_3D},${radius})`, m);
115
+ mutate(`CYLINDRICAL_SURFACE('',#${AXIS2_PLACEMENT_3D},${stepNumber(radius)})`, m);
116
+
117
+ export const CONICAL_SURFACE = (AXIS2_PLACEMENT_3D: number, radius: number, semiAngle: number, m: MutableStep): number =>
118
+ mutate(`CONICAL_SURFACE('',#${AXIS2_PLACEMENT_3D},${stepNumber(radius)},${stepNumber(semiAngle)})`, m);
100
119
 
101
120
  export const DEFINITIONAL_REPRESENTATION = (LINEorCircle: number, m: MutableStep): number =>
102
121
  mutate(`DEFINITIONAL_REPRESENTATION('',(#${LINEorCircle}),#7)`, m);
@@ -11,6 +11,7 @@ import {
11
11
  vec3Sub,
12
12
  vec3Add,
13
13
  vec3Rot,
14
+ vec3Length,
14
15
  } from "../../../abstract-3d.js";
15
16
  import { parseRgb } from "../../../utils.js";
16
17
  import {
@@ -44,6 +45,7 @@ import {
44
45
  PRODUCT_DEFINITION_FORMATION,
45
46
  PRODUCT_DEFINITION_SHAPE,
46
47
  SHAPE_DEFINITION_REPRESENTATION,
48
+ STEP_NUMBER_EPSILON,
47
49
  STYLED_ITEM,
48
50
  SURFACE_SIDE_STYLE,
49
51
  SURFACE_STYLE_FILL_AREA,
@@ -60,6 +62,10 @@ export function stepBox(b: Box, mat: Material, parentPos: Vec3, parentRot: Vec3,
60
62
  const color = parseRgb(mat.normal);
61
63
  const rotate = (v: Vec3): Vec3 => vec3Rot(v, vec3Zero, rotation);
62
64
 
65
+ if(size.x === 0.0 || size.y === 0.0 || size.z === 0.0) {
66
+ return;
67
+ }
68
+
63
69
  const corners = [
64
70
  vec3(0, 0, 0),
65
71
  vec3(0, 0, size.z),