Skip to content

Commit 2aadac0

Browse files
authored
Step cylinder (#148)
* cylinder...? * step cylinder * Normal fix for planes? * Fixed the boxes.
1 parent 2b3d937 commit 2aadac0

File tree

7 files changed

+461
-278
lines changed

7 files changed

+461
-278
lines changed

packages/abstract-3d/src/abstract-3d.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Euler, Quaternion, Vector3 } from "three";
1+
import { Euler, Matrix4, Quaternion, Vector3 } from "three";
22

33
export type Scene = {
44
readonly size_deprecated: Vec3; // Move size calculation to every renderer??
@@ -406,6 +406,19 @@ export function vec3RotCombine(outer: Vec3, inner: Vec3): Vec3 {
406406
return vec3(euler1.x, euler1.y, euler1.z);
407407
}
408408

409+
export function vec3RotNormal(referenceNormal: Vec3, eulerRot: Vec3): Vec3 {
410+
const rotationMatrix = new Matrix4();
411+
const euler = new Euler();
412+
euler.set(eulerRot.x, eulerRot.y, eulerRot.z);
413+
rotationMatrix.makeRotationFromEuler(euler);
414+
415+
const normal = new Vector3();
416+
normal.set(referenceNormal.x, referenceNormal.y, referenceNormal.z);
417+
normal.applyMatrix4(rotationMatrix);
418+
const normalized = normal.normalize();
419+
return vec3(normalized.x, normalized.y, normalized.z);
420+
}
421+
409422
export function vec3Rot(point: Vec3, origin: Vec3, rotation: Vec3): Vec3 {
410423
euler1.set(rotation.x, rotation.y, rotation.z);
411424
quaternion1.setFromEuler(euler1);

packages/abstract-3d/src/renderers/step/step-encoding.ts

Lines changed: 59 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const mutate = (step: string, m: MutableStep): number => {
1616
};
1717

1818
export const HEADER = (): string =>
19-
`ISO-10303-21
19+
`ISO-10303-21;
2020
HEADER;
2121
FILE_DESCRIPTION(('FreeCAD Model'),'2;1');
2222
FILE_NAME('Open CASCADE Shape Model','2024-09-10T08:42:01',('Author'),(
@@ -52,16 +52,16 @@ export const VERTEX_POINT = (CARTESIAN_POINT: number, m: MutableStep): number =>
5252
export const LINE = (CARTESIAN_POINT: number, VECTOR: number, m: MutableStep): number =>
5353
mutate(`LINE('',#${CARTESIAN_POINT},#${VECTOR})`, m);
5454

55-
export const CIRCLE = (AXIS2_PLACEMENT_3D: number, m: MutableStep): number =>
56-
mutate(`CIRCLE('',#${AXIS2_PLACEMENT_3D},2.)`, m);
55+
export const CIRCLE = (AXIS2_PLACEMENT_3D: number, radius: number, m: MutableStep): number =>
56+
mutate(`CIRCLE('',#${AXIS2_PLACEMENT_3D},${radius})`, m);
5757

5858
export const VECTOR = (DIRECTION: number, m: MutableStep): number => mutate(`VECTOR('',#${DIRECTION},1.)`, m);
5959

60-
export const EDGE_CURVE = (VERTEX_POINT_FROM: number, VERTEX_POINT_TO: number, LINE: number, m: MutableStep): number =>
61-
mutate(`EDGE_CURVE('',#${VERTEX_POINT_TO},#${VERTEX_POINT_FROM},#${LINE},.T.)`, m);
60+
export const EDGE_CURVE = (VERTEX_POINT_FROM: number, VERTEX_POINT_TO: number, LINE: number, m: MutableStep, type: "T" | "F" = "F"): number =>
61+
mutate(`EDGE_CURVE('',#${VERTEX_POINT_TO},#${VERTEX_POINT_FROM},#${LINE},.${type}.)`, m);
6262

63-
export const ORIENTED_EDGE = (EDGE_CURVE: number, m: MutableStep): number =>
64-
mutate(`ORIENTED_EDGE('',*,*,#${EDGE_CURVE},.F.)`, m);
63+
export const ORIENTED_EDGE = (EDGE_CURVE: number, m: MutableStep, type: "T" | "F" = "F"): number =>
64+
mutate(`ORIENTED_EDGE('',*,*,#${EDGE_CURVE},.${type}.)`, m);
6565

6666
export const SURFACE_CURVE = (CIRCLE: number, PCURVE1: number, PCURVE2: number, m: MutableStep): number =>
6767
mutate(`SURFACE_CURVE('',#${CIRCLE},(#${PCURVE1},#${PCURVE2}),.PCURVE_S1.)`, m);
@@ -94,8 +94,8 @@ export const PCURVE = (
9494
m: MutableStep
9595
): number => mutate(`PCURVE('',#${CYLINDRICAL_SURFACE_or_PLANE},#${DEFINITIONAL_REPRESENTATION})`, m);
9696

97-
export const CYLINDRICAL_SURFACE = (AXIS2_PLACEMENT_3D: number, m: MutableStep): number =>
98-
mutate(`CYLINDRICAL_SURFACE('',#${AXIS2_PLACEMENT_3D},2.)`, m);
97+
export const CYLINDRICAL_SURFACE = (AXIS2_PLACEMENT_3D: number, radius: number, m: MutableStep): number =>
98+
mutate(`CYLINDRICAL_SURFACE('',#${AXIS2_PLACEMENT_3D},${radius})`, m);
9999

100100
export const DEFINITIONAL_REPRESENTATION = (LINEorCircle: number, m: MutableStep): number =>
101101
mutate(`DEFINITIONAL_REPRESENTATION('',(#${LINEorCircle}),#7)`, m);
@@ -206,3 +206,53 @@ export const UNCERTAINTY_MEASURE_WITH_UNIT = (LENGTH_UNIT: number, m: MutableSte
206206
'distance_accuracy_value','confusion accuracy')`,
207207
m
208208
);
209+
210+
export const APPLICATION_PROTOCOL_DEFINITION = (m: MutableStep): number =>
211+
mutate(`APPLICATION_PROTOCOL_DEFINITION('international standard','automotive_design',2000,#q2);`, m);
212+
213+
export const APPLICATION_CONTEXT = (m: MutableStep): number =>
214+
mutate(`APPLICATION_CONTEXT('core data for automotive mechanical design processes');`, m);
215+
216+
217+
export const SHAPE_DEFINITION_REPRESENTATION = (productDefinitionShape: number, manifoldSurfaceShapeRepr: number, m: MutableStep): number =>
218+
mutate(
219+
`SHAPE_DEFINITION_REPRESENTATION(#${productDefinitionShape}, #${manifoldSurfaceShapeRepr})`,
220+
m
221+
);
222+
223+
export const PRODUCT_DEFINITION_SHAPE = (productDefinition: number, m: MutableStep): number =>
224+
mutate(
225+
`PRODUCT_DEFINITION_SHAPE('','',#${productDefinition})`,
226+
m
227+
)
228+
229+
export const PRODUCT_DEFINITION = (productDefinitionFormation: number, productDefinitionContext: number, m: MutableStep): number =>
230+
mutate(
231+
`PRODUCT_DEFINITION('design', #${productDefinitionFormation},#${productDefinitionContext})`,
232+
m
233+
)
234+
235+
export const PRODUCT_DEFINITION_FORMATION = (product: number, m: MutableStep): number =>
236+
mutate(
237+
`PRODUCT_DEFINITION_FORMATION('','',#${product})`,
238+
m
239+
)
240+
241+
export const PRODUCT = (productContext: number, name: string, m: MutableStep): number =>
242+
mutate(
243+
`PRODUCT('${name}','${name}','',(#${productContext}))`,
244+
m
245+
)
246+
247+
export const PRODUCT_CONTEXT = (applicationContext: number, m: MutableStep): number =>
248+
mutate(
249+
`PRODUCT_CONTEXT('',#${applicationContext}, 'mechanical')`,
250+
m
251+
)
252+
253+
export const PRODUCT_DEFINITION_CONTEXT = (applicationContext: number, m: MutableStep): number =>
254+
mutate(
255+
`PRODUCT_DEFINITION_CONTEXT('part definition',#${applicationContext},'design')`,
256+
m
257+
)
258+

packages/abstract-3d/src/renderers/step/step-geometries/step-box.ts

Lines changed: 53 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { Euler, Matrix4, Vector3 } from "three";
12
import {
23
Box,
34
Material,
@@ -13,11 +14,14 @@ import {
1314
vec3NegX,
1415
vec3NegY,
1516
vec3NegZ,
17+
vec3RotNormal,
1618
} from "../../../abstract-3d.js";
1719
import { parseRgb } from "../../shared.js";
1820
import {
1921
ADVANCED_BREP_SHAPE_REPRESENTATION,
2022
ADVANCED_FACE,
23+
APPLICATION_CONTEXT,
24+
APPLICATION_PROTOCOL_DEFINITION,
2125
AXIS2_PLACEMENT_3D,
2226
CARTESIAN_POINT,
2327
CLOSED_SHELL,
@@ -36,6 +40,13 @@ import {
3640
ORIENTED_EDGE,
3741
PLANE,
3842
PRESENTATION_STYLE_ASSIGNMENT,
43+
PRODUCT,
44+
PRODUCT_CONTEXT,
45+
PRODUCT_DEFINITION,
46+
PRODUCT_DEFINITION_CONTEXT,
47+
PRODUCT_DEFINITION_FORMATION,
48+
PRODUCT_DEFINITION_SHAPE,
49+
SHAPE_DEFINITION_REPRESENTATION,
3950
STYLED_ITEM,
4051
SURFACE_SIDE_STYLE,
4152
SURFACE_STYLE_FILL_AREA,
@@ -50,7 +61,9 @@ export function stepBox(b: Box, mat: Material, parentPos: Vec3, parentRot: Vec3,
5061
const rot = vec3RotCombine(parentRot, b.rot ?? vec3Zero);
5162
const cart3tr = (x: number, y: number, z: number): number =>
5263
CARTESIAN_POINT(vec3TransRot(vec3(x, y, z), pos, rot), m);
53-
const v0 = VECTOR(DIRECTION(vec3Zero, m), m);
64+
const v0 = VECTOR(DIRECTION(vec3PosX, m), m);
65+
const negNormal = DIRECTION(vec3NegZ, m);
66+
const posNormal = DIRECTION(vec3PosZ, m);
5467
const c0 = CARTESIAN_POINT(vec3Zero, m);
5568
const [c1, c2] = [cart3tr(-half.x, -half.y, -half.z), cart3tr(half.x, -half.y, -half.z)];
5669
const [c3, c4] = [cart3tr(half.x, half.y, -half.z), cart3tr(-half.x, half.y, -half.z)];
@@ -60,11 +73,14 @@ export function stepBox(b: Box, mat: Material, parentPos: Vec3, parentRot: Vec3,
6073
const [v5, v6, v7, v8] = [VERTEX_POINT(c5, m), VERTEX_POINT(c6, m), VERTEX_POINT(c7, m), VERTEX_POINT(c8, m)];
6174
const [l1, l2, l3, l4] = [LINE(c1, v0, m), LINE(c2, v0, m), LINE(c3, v0, m), LINE(c4, v0, m)];
6275
const [l5, l6, l7, l8] = [LINE(c5, v0, m), LINE(c6, v0, m), LINE(c7, v0, m), LINE(c8, v0, m)];
63-
const [d1, d2] = [DIRECTION(vec3RotCombine(vec3PosX, rot), m), DIRECTION(vec3RotCombine(vec3PosY, rot), m)];
64-
const [d3, d4] = [DIRECTION(vec3RotCombine(vec3PosZ, rot), m), DIRECTION(vec3RotCombine(vec3NegX, rot), m)];
65-
const [d5, d6] = [DIRECTION(vec3RotCombine(vec3NegY, rot), m), DIRECTION(vec3RotCombine(vec3NegZ, rot), m)];
76+
const [d1, d2] = [DIRECTION(vec3RotNormal(vec3NegX, rot), m), DIRECTION(vec3RotNormal(vec3NegY, rot), m)];
77+
const [d3, d4] = [DIRECTION(vec3RotNormal(vec3NegZ, rot), m), DIRECTION(vec3RotNormal(vec3PosX, rot), m)];
78+
const [d5, d6] = [DIRECTION(vec3RotNormal(vec3PosY, rot), m), DIRECTION(vec3RotNormal(vec3PosZ, rot), m)];
6679
const color = COLOUR_RGB(parseRgb(mat.normal), m);
6780

81+
APPLICATION_PROTOCOL_DEFINITION(m);
82+
const applicationContext = APPLICATION_CONTEXT(m);
83+
6884
const msb = MANIFOLD_SOLID_BREP(
6985
CLOSED_SHELL(
7086
[
@@ -83,7 +99,7 @@ export function stepBox(b: Box, mat: Material, parentPos: Vec3, parentRot: Vec3,
8399
"T",
84100
m
85101
),
86-
PLANE(AXIS2_PLACEMENT_3D(c0, d3, d1, m), m),
102+
PLANE(AXIS2_PLACEMENT_3D(c0, d3, posNormal, m), m),
87103
m
88104
),
89105
// Back
@@ -101,7 +117,7 @@ export function stepBox(b: Box, mat: Material, parentPos: Vec3, parentRot: Vec3,
101117
"T",
102118
m
103119
),
104-
PLANE(AXIS2_PLACEMENT_3D(c0, d6, d4, m), m),
120+
PLANE(AXIS2_PLACEMENT_3D(c0, d6, negNormal, m), m),
105121
m
106122
),
107123
// Left
@@ -119,10 +135,10 @@ export function stepBox(b: Box, mat: Material, parentPos: Vec3, parentRot: Vec3,
119135
"T",
120136
m
121137
),
122-
PLANE(AXIS2_PLACEMENT_3D(c0, d4, d3, m), m),
138+
PLANE(AXIS2_PLACEMENT_3D(c0, d4, negNormal, m), m),
123139
m
124140
),
125-
// Right
141+
// Right ??? <<-----
126142
ADVANCED_FACE(
127143
FACE_BOUND(
128144
EDGE_LOOP(
@@ -137,7 +153,7 @@ export function stepBox(b: Box, mat: Material, parentPos: Vec3, parentRot: Vec3,
137153
"T",
138154
m
139155
),
140-
PLANE(AXIS2_PLACEMENT_3D(c0, d1, d6, m), m),
156+
PLANE(AXIS2_PLACEMENT_3D(c0, d1, posNormal, m), m),
141157
m
142158
),
143159
// Top
@@ -155,7 +171,7 @@ export function stepBox(b: Box, mat: Material, parentPos: Vec3, parentRot: Vec3,
155171
"T",
156172
m
157173
),
158-
PLANE(AXIS2_PLACEMENT_3D(c0, d2, d1, m), m),
174+
PLANE(AXIS2_PLACEMENT_3D(c0, d2, posNormal, m), m),
159175
m
160176
),
161177
// Bottom
@@ -173,15 +189,15 @@ export function stepBox(b: Box, mat: Material, parentPos: Vec3, parentRot: Vec3,
173189
"T",
174190
m
175191
),
176-
PLANE(AXIS2_PLACEMENT_3D(c0, d5, d4, m), m),
192+
PLANE(AXIS2_PLACEMENT_3D(c0, d5, negNormal, m), m),
177193
m
178194
),
179195
],
180196
m
181197
),
182198
m
183199
);
184-
ADVANCED_BREP_SHAPE_REPRESENTATION(AXIS2_PLACEMENT_3D(c0, DIRECTION(vec3PosZ, m), DIRECTION(vec3PosX, m), m), msb, m);
200+
const absp = ADVANCED_BREP_SHAPE_REPRESENTATION(AXIS2_PLACEMENT_3D(c0, DIRECTION(vec3PosZ, m), DIRECTION(vec3PosX, m), m), msb, m);
185201
MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION(
186202
STYLED_ITEM(
187203
PRESENTATION_STYLE_ASSIGNMENT(
@@ -194,4 +210,29 @@ export function stepBox(b: Box, mat: Material, parentPos: Vec3, parentRot: Vec3,
194210
),
195211
m
196212
);
213+
SHAPE_DEFINITION_REPRESENTATION(
214+
PRODUCT_DEFINITION_SHAPE(
215+
PRODUCT_DEFINITION(
216+
PRODUCT_DEFINITION_FORMATION(
217+
PRODUCT(
218+
PRODUCT_CONTEXT(
219+
applicationContext,
220+
m
221+
),
222+
"Cube",
223+
m
224+
),
225+
m
226+
),
227+
PRODUCT_DEFINITION_CONTEXT(
228+
applicationContext,
229+
m
230+
),
231+
m
232+
),
233+
m
234+
),
235+
absp,
236+
m
237+
);
197238
}

0 commit comments

Comments
 (0)