abstract-3d 0.4.21 → 0.5.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.
@@ -1,3 +1,4 @@
1
+ import { Euler, Matrix4, Vector3 } from "three";
1
2
  import {
2
3
  Plane,
3
4
  Material,
@@ -16,11 +17,16 @@ import {
16
17
  vec3NegY,
17
18
  vec3NegZ,
18
19
  vec3PosY,
20
+ vec3Normalize,
21
+ vec3Scale,
22
+ vec3Add,
19
23
  } from "../../../abstract-3d.js";
20
24
  import { parseRgb } from "../../shared.js";
21
25
  import {
22
26
  ADVANCED_BREP_SHAPE_REPRESENTATION,
23
27
  ADVANCED_FACE,
28
+ APPLICATION_CONTEXT,
29
+ APPLICATION_PROTOCOL_DEFINITION,
24
30
  AXIS2_PLACEMENT_3D,
25
31
  CARTESIAN_POINT,
26
32
  CIRCLE,
@@ -45,7 +51,14 @@ import {
45
51
  PCURVE,
46
52
  PLANE,
47
53
  PRESENTATION_STYLE_ASSIGNMENT,
54
+ PRODUCT,
55
+ PRODUCT_CONTEXT,
56
+ PRODUCT_DEFINITION,
57
+ PRODUCT_DEFINITION_CONTEXT,
58
+ PRODUCT_DEFINITION_FORMATION,
59
+ PRODUCT_DEFINITION_SHAPE,
48
60
  SEAM_CURVE,
61
+ SHAPE_DEFINITION_REPRESENTATION,
49
62
  SHELL_BASED_SURFACE_MODEL,
50
63
  STYLED_ITEM,
51
64
  SURFACE_CURVE,
@@ -57,129 +70,214 @@ import {
57
70
  } from "../step-encoding.js";
58
71
 
59
72
  export function stepCylinder(c: Cylinder, mat: Material, parentPos: Vec3, parentRot: Vec3, m: MutableStep): void {
73
+ const r = c.radius;
74
+ const h = c.length;
75
+ const rgb = parseRgb(mat.normal);
60
76
  const pos = vec3TransRot(c.pos, parentPos, parentRot);
61
- const rot = vec3RotCombine(parentRot, c.rot ?? vec3Zero);
62
- const cart3tr = (x: number, y: number): number => CARTESIAN_POINT(vec3TransRot(vec3(x, y, 0), pos, rot), m);
63
- const v0 = VECTOR(DIRECTION(vec3Zero, m), m);
64
- const c03 = CARTESIAN_POINT(vec3Zero, m);
65
- const c02 = CARTESIAN_POINT(vec2Zero, m);
66
- const [d1, d2] = [DIRECTION(vec3RotCombine(vec3PosX, rot), m), DIRECTION(vec3RotCombine(vec3PosY, rot), m)];
67
- const [d3, d4] = [DIRECTION(vec3RotCombine(vec3PosZ, rot), m), DIRECTION(vec3RotCombine(vec3NegX, rot), m)];
68
- const [d5, d6] = [DIRECTION(vec3RotCombine(vec3NegY, rot), m), DIRECTION(vec3RotCombine(vec3NegZ, rot), m)];
69
- const [down, up] = [AXIS2_PLACEMENT_3D(c03, d5, d4, m), AXIS2_PLACEMENT_3D(c03, d2, d1, m)];
70
- const [c1, c2] = [cart3tr(-c.radius, -c.length / 2), cart3tr(c.radius, -c.length / 2)];
71
- const [c3, c4] = [cart3tr(c.radius, c.length / 2), cart3tr(-c.radius, c.length / 2)];
72
- const [v1, v2, v3, v4] = [VERTEX_POINT(c1, m), VERTEX_POINT(c2, m), VERTEX_POINT(c3, m), VERTEX_POINT(c4, m)];
73
- const [l1, l2, l3, l4] = [LINE(c1, v0, m), LINE(c2, v0, m), LINE(c3, v0, m), LINE(c4, v0, m)];
74
-
75
- const [oe1, oe2, oe3, oe4] = [
76
- ORIENTED_EDGE(
77
- EDGE_CURVE(
78
- v1,
79
- v2,
80
- SEAM_CURVE(
81
- LINE(c2, v0, m),
82
- PCURVE(
83
- CYLINDRICAL_SURFACE(down, m),
84
- DEFINITIONAL_REPRESENTATION(LINE(c02, VECTOR(DIRECTION(vec2(-1, 0), m), m), m), m),
85
- m
86
- ),
87
- PCURVE(
88
- CYLINDRICAL_SURFACE(down, m),
89
- DEFINITIONAL_REPRESENTATION(LINE(c02, VECTOR(DIRECTION(vec2(-1, 0), m), m), m), m),
90
- m
91
- ),
92
- m
93
- ),
77
+ const rotation = vec3RotCombine(parentRot, c.rot ?? vec3Zero);
78
+
79
+ const rotationMatrix = new Matrix4();
80
+ const euler = new Euler();
81
+ euler.set(rotation.x, rotation.y, rotation.z);
82
+ rotationMatrix.makeRotationFromEuler(euler);
83
+
84
+ const upNormal = new Vector3();
85
+ const downNormal = new Vector3();
86
+ upNormal.set(0, 1, 0);
87
+ downNormal.set(0, -1, 0);
88
+
89
+ upNormal.applyMatrix4(rotationMatrix);
90
+ downNormal.applyMatrix4(rotationMatrix);
91
+
92
+ const circleTop = new Vector3();
93
+ circleTop.set(0, h / 2, 0);
94
+ circleTop.applyMatrix4(rotationMatrix);
95
+
96
+ const circleBot = new Vector3();
97
+ circleBot.set(0, -h / 2, 0);
98
+ circleBot.applyMatrix4(rotationMatrix);
99
+
100
+ const v1 = new Vector3();
101
+ const v2 = new Vector3();
102
+ v1.set(r, h / 2, 0);
103
+ v2.set(r, -h / 2, 0);
104
+ v1.applyMatrix4(rotationMatrix);
105
+ v2.applyMatrix4(rotationMatrix);
106
+
107
+ APPLICATION_PROTOCOL_DEFINITION(m);
108
+ const applicationContext = APPLICATION_CONTEXT(m);
109
+
110
+ const ecurve0 = EDGE_CURVE(
111
+ VERTEX_POINT(CARTESIAN_POINT(vec3Add(pos, v2), m), m),
112
+ VERTEX_POINT(CARTESIAN_POINT(vec3Add(pos, v1), m), m),
113
+ LINE(CARTESIAN_POINT(vec3Add(pos, v2), m), VECTOR(DIRECTION(upNormal, m), m), m),
114
+ m,
115
+ "T"
116
+ );
117
+
118
+ const ecurve1 = EDGE_CURVE(
119
+ VERTEX_POINT(CARTESIAN_POINT(vec3Add(pos, v2), m), m),
120
+ VERTEX_POINT(CARTESIAN_POINT(vec3Add(pos, v2), m), m),
121
+ CIRCLE(
122
+ AXIS2_PLACEMENT_3D(
123
+ CARTESIAN_POINT(vec3Add(pos, circleBot), m),
124
+ DIRECTION(upNormal, m),
125
+ DIRECTION(vec3(0, 1, 0), m),
126
+ m
127
+ ),
128
+ r,
129
+ m
130
+ ),
131
+ m,
132
+ "T"
133
+ );
134
+
135
+ const ecurve2 = EDGE_CURVE(
136
+ VERTEX_POINT(CARTESIAN_POINT(vec3Add(pos, v1), m), m),
137
+ VERTEX_POINT(CARTESIAN_POINT(vec3Add(pos, v1), m), m),
138
+ CIRCLE(
139
+ AXIS2_PLACEMENT_3D(
140
+ CARTESIAN_POINT(vec3Add(pos, circleTop), m),
141
+ DIRECTION(upNormal, m),
142
+ DIRECTION(vec3(0, 1, 0), m),
94
143
  m
95
144
  ),
145
+ r,
96
146
  m
97
147
  ),
98
- ORIENTED_EDGE(
99
- EDGE_CURVE(
100
- v1,
101
- v2,
102
- SEAM_CURVE(
103
- LINE(c2, v0, m),
104
- PCURVE(
105
- CYLINDRICAL_SURFACE(down, m),
106
- DEFINITIONAL_REPRESENTATION(LINE(c02, VECTOR(DIRECTION(vec2(-1, 0), m), m), m), m),
107
- m
108
- ),
109
- PCURVE(
110
- CYLINDRICAL_SURFACE(down, m),
111
- DEFINITIONAL_REPRESENTATION(LINE(c02, VECTOR(DIRECTION(vec2(-1, 0), m), m), m), m),
112
- m
113
- ),
148
+ m
149
+ );
150
+
151
+ const msb = MANIFOLD_SOLID_BREP(CLOSED_SHELL([
152
+
153
+ ADVANCED_FACE(
154
+ FACE_BOUND(
155
+ EDGE_LOOP(
156
+ [
157
+ ORIENTED_EDGE(
158
+ ecurve0,
159
+ m,
160
+ "T"
161
+ ),
162
+ ORIENTED_EDGE(
163
+ ecurve2,
164
+ m
165
+ ),
166
+ ORIENTED_EDGE(ecurve0, m, "F"),
167
+ ORIENTED_EDGE(
168
+ ecurve1,
169
+ m,
170
+ "F"
171
+ ),
172
+ ],
114
173
  m
115
174
  ),
175
+ "F",
176
+ m
177
+ ),
178
+ CYLINDRICAL_SURFACE(
179
+ AXIS2_PLACEMENT_3D(
180
+ CARTESIAN_POINT(vec3(pos.x + circleTop.x, pos.y + circleTop.y, pos.z + circleTop.z), m),
181
+ DIRECTION(downNormal, m),
182
+ DIRECTION(vec3(0, -1, 0), m),
183
+ m
184
+ ),
185
+ r,
116
186
  m
117
187
  ),
118
188
  m
119
189
  ),
120
- ORIENTED_EDGE(
121
- EDGE_CURVE(
122
- v2,
123
- v2,
124
- SURFACE_CURVE(
125
- CIRCLE(down, m),
126
- PCURVE(
127
- CYLINDRICAL_SURFACE(down, m),
128
- DEFINITIONAL_REPRESENTATION(LINE(c02, VECTOR(DIRECTION(vec2(-1, 0), m), m), m), m),
129
- m
130
- ),
131
- PCURVE(down, DEFINITIONAL_REPRESENTATION(CIRCLE(up, m), m), m),
190
+
191
+ ADVANCED_FACE(
192
+ FACE_BOUND(
193
+ EDGE_LOOP([
194
+ ORIENTED_EDGE(
195
+ ecurve1,
196
+ m,
197
+ "F"
198
+ ),
199
+ ],
132
200
  m
133
201
  ),
202
+ "T",
134
203
  m
135
204
  ),
136
- m
137
- ), // Bottom circle edge curve
138
- ORIENTED_EDGE(
139
- EDGE_CURVE(
140
- v3,
141
- v3,
142
- SURFACE_CURVE(
143
- CIRCLE(down, m),
144
- PCURVE(
145
- CYLINDRICAL_SURFACE(down, m),
146
- DEFINITIONAL_REPRESENTATION(LINE(c02, VECTOR(DIRECTION(vec2(-1, 0), m), m), m), m),
147
- m
148
- ),
149
- PCURVE(down, DEFINITIONAL_REPRESENTATION(CIRCLE(up, m), m), m),
205
+ PLANE(
206
+ AXIS2_PLACEMENT_3D(
207
+ CARTESIAN_POINT(vec3Add(pos, circleBot), m),
208
+ DIRECTION(upNormal, m),
209
+ DIRECTION(vec3(0, 1, 0), m),
150
210
  m
151
211
  ),
152
212
  m
153
213
  ),
154
- m
155
- ), // Top circle edge curve
156
- ];
214
+ m,
215
+ "F"
216
+ ),
157
217
 
158
- const color = COLOUR_RGB(parseRgb(mat.normal), m);
159
- const msb = MANIFOLD_SOLID_BREP(
160
- CLOSED_SHELL(
161
- [
162
- ADVANCED_FACE(
163
- FACE_BOUND(EDGE_LOOP([oe1, oe2, oe3, oe4], m), "F", m),
164
- PCURVE(
165
- CYLINDRICAL_SURFACE(down, m),
166
- DEFINITIONAL_REPRESENTATION(LINE(c02, VECTOR(DIRECTION(vec2(-1, 0), m), m), m), m),
167
- m
168
- ),
218
+ ADVANCED_FACE(
219
+ FACE_BOUND(
220
+ EDGE_LOOP(
221
+ [
222
+ ORIENTED_EDGE(
223
+ ecurve2,
224
+ m,
225
+ "F"
226
+ ),
227
+ ],
169
228
  m
170
229
  ),
171
- ADVANCED_FACE(FACE_BOUND(EDGE_LOOP([oe3], m), "T", m), PLANE(down, m), m), // Circle down
172
- ADVANCED_FACE(FACE_BOUND(EDGE_LOOP([oe4], m), "F", m), PLANE(up, m), m), // Circle up
173
- ],
230
+ "F",
231
+ m
232
+ ),
233
+ PLANE(
234
+ AXIS2_PLACEMENT_3D(
235
+ CARTESIAN_POINT(vec3Add(pos, circleTop), m),
236
+ DIRECTION(upNormal, m),
237
+ DIRECTION(vec3(0, 1, 0), m),
238
+ m
239
+ ),
240
+ m
241
+ ),
174
242
  m
175
243
  ),
244
+ ], m), m);
245
+
246
+ const absp = ADVANCED_BREP_SHAPE_REPRESENTATION(
247
+ AXIS2_PLACEMENT_3D(CARTESIAN_POINT(vec3Zero, m), DIRECTION(vec3(0, 0, 1), m), DIRECTION(vec3(1, 0, 0), m), m),
248
+ msb,
176
249
  m
177
250
  );
178
- ADVANCED_BREP_SHAPE_REPRESENTATION(
179
- AXIS2_PLACEMENT_3D(c03, DIRECTION(vec3PosZ, m), DIRECTION(vec3PosX, m), m),
180
- msb,
251
+
252
+ const prod = PRODUCT(
253
+ PRODUCT_CONTEXT(
254
+ applicationContext,
255
+ m
256
+ ),
257
+ "Cylinder",
181
258
  m
182
259
  );
260
+
261
+ SHAPE_DEFINITION_REPRESENTATION(
262
+ PRODUCT_DEFINITION_SHAPE(
263
+ PRODUCT_DEFINITION(
264
+ PRODUCT_DEFINITION_FORMATION(
265
+ prod,
266
+ m
267
+ ),
268
+ PRODUCT_DEFINITION_CONTEXT(
269
+ applicationContext,
270
+ m
271
+ ),
272
+ m
273
+ ),
274
+ m
275
+ ),
276
+ absp,
277
+ m
278
+ );
279
+
280
+ const color = COLOUR_RGB(parseRgb(mat.normal), m);
183
281
  MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION(
184
282
  STYLED_ITEM(
185
283
  PRESENTATION_STYLE_ASSIGNMENT(
@@ -192,4 +290,4 @@ export function stepCylinder(c: Cylinder, mat: Material, parentPos: Vec3, parent
192
290
  ),
193
291
  m
194
292
  );
195
- }
293
+ }
@@ -9,10 +9,15 @@ import {
9
9
  vec3,
10
10
  vec3PosX,
11
11
  vec3PosZ,
12
+ vec3PosY,
13
+ vec3RotNormal,
14
+ vec3NegZ,
12
15
  } from "../../../abstract-3d.js";
13
16
  import { parseRgb } from "../../shared.js";
14
17
  import {
15
18
  ADVANCED_FACE,
19
+ APPLICATION_CONTEXT,
20
+ APPLICATION_PROTOCOL_DEFINITION,
16
21
  AXIS2_PLACEMENT_3D,
17
22
  CARTESIAN_POINT,
18
23
  COLOUR_RGB,
@@ -31,6 +36,13 @@ import {
31
36
  ORIENTED_EDGE,
32
37
  PLANE,
33
38
  PRESENTATION_STYLE_ASSIGNMENT,
39
+ PRODUCT,
40
+ PRODUCT_CONTEXT,
41
+ PRODUCT_DEFINITION,
42
+ PRODUCT_DEFINITION_CONTEXT,
43
+ PRODUCT_DEFINITION_FORMATION,
44
+ PRODUCT_DEFINITION_SHAPE,
45
+ SHAPE_DEFINITION_REPRESENTATION,
34
46
  SHELL_BASED_SURFACE_MODEL,
35
47
  STYLED_ITEM,
36
48
  SURFACE_SIDE_STYLE,
@@ -45,7 +57,7 @@ export function stepPlane(p: Plane, mat: Material, parentPos: Vec3, parentRot: V
45
57
  const pos = vec3TransRot(p.pos, parentPos, parentRot);
46
58
  const rot = vec3RotCombine(parentRot, p.rot ?? vec3Zero);
47
59
  const cart3tr = (x: number, y: number): number => CARTESIAN_POINT(vec3TransRot(vec3(x, y, 0), pos, rot), m);
48
- const v0 = VECTOR(DIRECTION(vec3Zero, m), m);
60
+ const v0 = VECTOR(DIRECTION(vec3PosX, m), m);
49
61
  const c0 = CARTESIAN_POINT(vec3Zero, m);
50
62
  const [c1, c2] = [cart3tr(-half.x, -half.y), cart3tr(half.x, -half.y)];
51
63
  const [c3, c4] = [cart3tr(half.x, half.y), cart3tr(-half.x, half.y)];
@@ -58,14 +70,18 @@ export function stepPlane(p: Plane, mat: Material, parentPos: Vec3, parentRot: V
58
70
  ORIENTED_EDGE(EDGE_CURVE(v4, v1, l4, m), m),
59
71
  ];
60
72
 
61
- const [d1, d2] = [DIRECTION(vec3RotCombine(vec3PosX, rot), m), DIRECTION(vec3RotCombine(vec3PosZ, rot), m)];
73
+ APPLICATION_PROTOCOL_DEFINITION(m);
74
+ const applicationContext = APPLICATION_CONTEXT(m);
75
+
76
+ const normal = DIRECTION(vec3RotNormal(vec3PosZ, rot), m);
77
+ const up = DIRECTION(vec3PosZ, m);
62
78
 
63
79
  const color = COLOUR_RGB(parseRgb(mat.normal), m);
64
80
  const sbsm = SHELL_BASED_SURFACE_MODEL(
65
81
  OPEN_SHELL(
66
82
  ADVANCED_FACE(
67
83
  FACE_BOUND(EDGE_LOOP([oe1, oe2, oe3, oe4], m), "T", m),
68
- PLANE(AXIS2_PLACEMENT_3D(c0, d2, d1, m), m),
84
+ PLANE(AXIS2_PLACEMENT_3D(c0, normal, up, m), m),
69
85
  m
70
86
  ),
71
87
  m
@@ -73,7 +89,7 @@ export function stepPlane(p: Plane, mat: Material, parentPos: Vec3, parentRot: V
73
89
  m
74
90
  );
75
91
 
76
- MANIFOLD_SURFACE_SHAPE_REPRESENTATION(
92
+ const mssr = MANIFOLD_SURFACE_SHAPE_REPRESENTATION(
77
93
  AXIS2_PLACEMENT_3D(c0, DIRECTION(vec3PosZ, m), DIRECTION(vec3PosX, m), m),
78
94
  sbsm,
79
95
  m
@@ -91,4 +107,30 @@ export function stepPlane(p: Plane, mat: Material, parentPos: Vec3, parentRot: V
91
107
  ),
92
108
  m
93
109
  );
110
+
111
+ SHAPE_DEFINITION_REPRESENTATION(
112
+ PRODUCT_DEFINITION_SHAPE(
113
+ PRODUCT_DEFINITION(
114
+ PRODUCT_DEFINITION_FORMATION(
115
+ PRODUCT(
116
+ PRODUCT_CONTEXT(
117
+ applicationContext,
118
+ m
119
+ ),
120
+ "Plane",
121
+ m
122
+ ),
123
+ m
124
+ ),
125
+ PRODUCT_DEFINITION_CONTEXT(
126
+ applicationContext,
127
+ m
128
+ ),
129
+ m
130
+ ),
131
+ m
132
+ ),
133
+ mssr,
134
+ m
135
+ );
94
136
  }
@@ -1,4 +1,4 @@
1
- import { Scene, vec3Zero, Group, Vec3, vec3TransRot, vec3RotCombine } from "../../abstract-3d.js";
1
+ import { Scene, vec3Zero, Group, Vec3, vec3TransRot, vec3RotCombine, Cylinder, Material, Plane, Box } from "../../abstract-3d.js";
2
2
  import {
3
3
  MutableStep,
4
4
  GEOMETRIC_REPRESENTATION_CONTEXT_3D,
@@ -10,18 +10,11 @@ import {
10
10
  ENDSEC,
11
11
  } from "./step-encoding.js";
12
12
  import { stepBox } from "./step-geometries/step-box.js";
13
+ import { stepCylinder } from "./step-geometries/step-cylinder.js";
13
14
  import { stepPlane } from "./step-geometries/step-plane.js";
14
15
 
15
- // export const toStep2 = (scene: A3D.Scene): string => {
16
- // const start = performance.now();
17
- // for (let i = 0; i < 100; i++) {
18
- // toStep(scene);
19
- // }
20
- // console.log((performance.now() - start) / 100);
21
- // return "";
22
- // };
23
-
24
16
  export const toStep = (scene: Scene): string => {
17
+
25
18
  const m: MutableStep = { refs: new Map<string, number>([]), step: "" };
26
19
  GEOMETRIC_REPRESENTATION_CONTEXT_3D(
27
20
  // 1
@@ -36,11 +29,12 @@ export const toStep = (scene: Scene): string => {
36
29
  for (const g of scene.groups) {
37
30
  stepGroup(g, scene.center_deprecated ?? vec3Zero, scene.rotation_deprecated ?? vec3Zero, m);
38
31
  }
39
-
32
+
40
33
  return `${HEADER()}${m.step}${ENDSEC()}`;
41
34
  };
42
35
 
43
36
  function stepGroup(g: Group, parentPos: Vec3, parentRot: Vec3, m: MutableStep): void {
37
+
44
38
  const pos = vec3TransRot(g.pos, parentPos, parentRot);
45
39
  const rot = vec3RotCombine(parentRot, g.rot ?? vec3Zero);
46
40
  for (const mesh of g.meshes ?? []) {
@@ -51,6 +45,9 @@ function stepGroup(g: Group, parentPos: Vec3, parentRot: Vec3, m: MutableStep):
51
45
  case "Plane":
52
46
  stepPlane(mesh.geometry, mesh.material, pos, rot, m);
53
47
  break;
48
+ case "Cylinder":
49
+ stepCylinder(mesh.geometry, mesh.material, pos, rot, m);
50
+ break;
54
51
  default:
55
52
  break;
56
53
  }