abstract-3d 2.12.1 → 2.12.2

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.
@@ -4,8 +4,12 @@ export type Triangulation = {
4
4
  readonly points: ReadonlyArray<string>;
5
5
  readonly triangles: ReadonlyArray<readonly [number, number, number]>;
6
6
  };
7
+ /** Encoded IFC coordinates of a line's start and end */
8
+ export type Polyline = readonly [string, string];
7
9
  /** Abstract 3D is Y-up like three.js, IFC is Z-up */
8
10
  export declare const toIfc: (v: Vec3) => Vec3;
11
+ /** The line's start and end in the coordinate system where its parent group is at parentPos/parentRot, undefined for geometries that aren't lines */
12
+ export declare function polyline(geometry: Mesh["geometry"], parentPos?: Vec3, parentRot?: Vec3): Polyline | undefined;
9
13
  /**
10
14
  * Triangulates the mesh in the coordinate system where its parent group is at parentPos/parentRot, undefined for geometries without a solid surface
11
15
  * (lines, text, images)
@@ -1 +1 @@
1
- {"version":3,"file":"ifc-geometry.d.ts","sourceRoot":"","sources":["../../../src/renderers/ifc/ifc-geometry.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAQ,IAAI,EAAQ,IAAI,EAAE,MAAM,sBAAsB,CAAC;AASnE,wGAAwG;AACxG,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACtE,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,KAAK,MAAO,IAAI,KAAG,IAA4B,CAAC;AAE7D;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,SAAS,OAAW,EAAE,SAAS,OAAW,GAAG,aAAa,GAAG,SAAS,CAyB7H"}
1
+ {"version":3,"file":"ifc-geometry.d.ts","sourceRoot":"","sources":["../../../src/renderers/ifc/ifc-geometry.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAQ,IAAI,EAAQ,IAAI,EAAE,MAAM,sBAAsB,CAAC;AASnE,wGAAwG;AACxG,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACtE,CAAC;AAEF,wDAAwD;AACxD,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEjD,qDAAqD;AACrD,eAAO,MAAM,KAAK,MAAO,IAAI,KAAG,IAA4B,CAAC;AAE7D,qJAAqJ;AACrJ,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,SAAS,OAAW,EAAE,SAAS,OAAW,GAAG,QAAQ,GAAG,SAAS,CAMrH;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,SAAS,OAAW,EAAE,SAAS,OAAW,GAAG,aAAa,GAAG,SAAS,CAyB7H"}
@@ -8,6 +8,14 @@ const SPHERE_SEGMENTS = [24, 16];
8
8
  const TUBE_SEGMENTS = [32, 12];
9
9
  /** Abstract 3D is Y-up like three.js, IFC is Z-up */
10
10
  export const toIfc = (v) => vec3(v.x, -v.z, v.y);
11
+ /** The line's start and end in the coordinate system where its parent group is at parentPos/parentRot, undefined for geometries that aren't lines */
12
+ export function polyline(geometry, parentPos = vec3Zero, parentRot = vec3Zero) {
13
+ if (geometry.type !== "Line" && geometry.type !== "CulledLine") {
14
+ return undefined;
15
+ }
16
+ const ifcPoint = (p) => point(toIfc(vec3TransRot(p, parentPos, parentRot)));
17
+ return [ifcPoint(geometry.start), ifcPoint(geometry.end)];
18
+ }
11
19
  /**
12
20
  * Triangulates the mesh in the coordinate system where its parent group is at parentPos/parentRot, undefined for geometries without a solid surface
13
21
  * (lines, text, images)
@@ -1 +1 @@
1
- {"version":3,"file":"ifc-geometry.js","sourceRoot":"","sources":["../../../src/renderers/ifc/ifc-geometry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ifc-geometry.js","sourceRoot":"","sources":["../../../src/renderers/ifc/ifc-geometry.ts"],"names":[],"mappings":"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"}
@@ -35,10 +35,10 @@ export type IfcOptions = {
35
35
  readonly layer?: (path: ReadonlyArray<Record<string, string>>) => string | undefined;
36
36
  };
37
37
  /**
38
- * IFC4 (Reference View) with every mesh as an IfcTriangulatedFaceSet, in millimetres. Every top-level group and every group with a `data.id` or
39
- * `data.name` becomes an IfcBuildingElementProxy placed relative to its parent element and aggregated into it. Other groups are only transforms or
40
- * metadata, so their meshes are merged into the parent element. With `layer`, the face sets are assigned to an IfcPresentationLayerAssignment per
41
- * layer, the presentation layer of the Reference View
38
+ * IFC4 (Reference View) with every mesh as an IfcTriangulatedFaceSet and every line as an IfcPolyline without thickness, in millimetres. Every
39
+ * top-level group and every group with a `data.id` or `data.name` becomes an IfcBuildingElementProxy placed relative to its parent element and
40
+ * aggregated into it. Other groups are only transforms or metadata, so their meshes are merged into the parent element. With `layer`, the face sets
41
+ * and polylines are assigned to an IfcPresentationLayerAssignment per layer, the presentation layer of the Reference View
42
42
  */
43
43
  export declare function render(scene: Scene, options?: IfcOptions): string;
44
44
  //# sourceMappingURL=ifc.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ifc.d.ts","sourceRoot":"","sources":["../../../src/renderers/ifc/ifc.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAyB,MAAM,sBAAsB,CAAC;AAOzE,+GAA+G;AAC/G,MAAM,MAAM,gBAAgB,GAAG,yBAAyB,GAAG,qBAAqB,CAAC;AAEjF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,uGAAuG;IACvG,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,yDAAyD;IACzD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,yGAAyG;IACzG,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,wDAAwD;IACxD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,iIAAiI;IACjI,QAAQ,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IAC1C;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,GAAG;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5D;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC;CACtF,CAAC;AAkCF;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,GAAE,UAAe,GAAG,MAAM,CAgDrE"}
1
+ {"version":3,"file":"ifc.d.ts","sourceRoot":"","sources":["../../../src/renderers/ifc/ifc.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAyB,MAAM,sBAAsB,CAAC;AAOzE,+GAA+G;AAC/G,MAAM,MAAM,gBAAgB,GAAG,yBAAyB,GAAG,qBAAqB,CAAC;AAEjF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,uGAAuG;IACvG,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,yDAAyD;IACzD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,yGAAyG;IACzG,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,wDAAwD;IACxD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,iIAAiI;IACjI,QAAQ,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IAC1C;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,GAAG;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5D;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC;CACtF,CAAC;AAwCF;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,GAAE,UAAe,GAAG,MAAM,CAgDrE"}
@@ -1,13 +1,14 @@
1
1
  import { Color, SRGBColorSpace } from "three";
2
2
  import { vec3Zero, vec3PosX, vec3PosY, vec3Rot, vec3TransRot, vec3RotCombine } from "../../abstract-3d.js";
3
3
  import { add, guid, ifcFile, point, real, ref, refs, serialize, str } from "./ifc-encoding.js";
4
- import { toIfc, triangulate } from "./ifc-geometry.js";
4
+ import { polyline, toIfc, triangulate } from "./ifc-geometry.js";
5
+ const representationTypes = ["Tessellation", "Curve3D"];
5
6
  const proxyClass = { entity: "IfcBuildingElementProxy" };
6
7
  /**
7
- * IFC4 (Reference View) with every mesh as an IfcTriangulatedFaceSet, in millimetres. Every top-level group and every group with a `data.id` or
8
- * `data.name` becomes an IfcBuildingElementProxy placed relative to its parent element and aggregated into it. Other groups are only transforms or
9
- * metadata, so their meshes are merged into the parent element. With `layer`, the face sets are assigned to an IfcPresentationLayerAssignment per
10
- * layer, the presentation layer of the Reference View
8
+ * IFC4 (Reference View) with every mesh as an IfcTriangulatedFaceSet and every line as an IfcPolyline without thickness, in millimetres. Every
9
+ * top-level group and every group with a `data.id` or `data.name` becomes an IfcBuildingElementProxy placed relative to its parent element and
10
+ * aggregated into it. Other groups are only transforms or metadata, so their meshes are merged into the parent element. With `layer`, the face sets
11
+ * and polylines are assigned to an IfcPresentationLayerAssignment per layer, the presentation layer of the Reference View
11
12
  */
12
13
  export function render(scene, options = {}) {
13
14
  const name = options.name ?? "Abstract 3D";
@@ -74,8 +75,15 @@ function elementNode(group, pos, rot, layering, elementClass = proxyClass) {
74
75
  */
75
76
  function elementContent(group, pos, rot, layering) {
76
77
  const meshes = (group.meshes ?? []).flatMap((mesh) => {
78
+ const { material } = mesh;
79
+ const { layer } = layering;
77
80
  const triangulation = triangulate(mesh.geometry, pos, rot);
78
- return triangulation ? [{ material: mesh.material, triangulation, layer: layering.layer }] : [];
81
+ const line = polyline(mesh.geometry, pos, rot);
82
+ return triangulation
83
+ ? [{ type: "Tessellation", material, layer, triangulation }]
84
+ : line
85
+ ? [{ type: "Curve3D", material, layer, polyline: line }]
86
+ : [];
79
87
  });
80
88
  const nested = (group.groups ?? []).map((child) => {
81
89
  const childPos = vec3TransRot(child.pos, pos, rot);
@@ -100,10 +108,11 @@ function groupLayering(group, parent) {
100
108
  /** `path` is the element's position in the tree (e.g. "2.1"), named after it when the group has no `data.name` or `data.id` since IFC requires a name */
101
109
  function element(m, node, path, parentPlacement, c) {
102
110
  const placement = add(m, `IFCLOCALPLACEMENT(${ref(parentPlacement)},${ref(axisPlacement(m, node.pos, node.rot))})`);
103
- const items = node.meshes.map((mesh) => faceSet(m, mesh, c));
104
- const shape = items.length > 0
105
- ? ref(add(m, `IFCPRODUCTDEFINITIONSHAPE($,$,(${ref(add(m, `IFCSHAPEREPRESENTATION(${ref(c.body)},'Body','Tessellation',${refs(items)})`))}))`))
106
- : "$";
111
+ const representations = representationTypes.flatMap((type) => {
112
+ const items = node.meshes.filter((mesh) => mesh.type === type).map((mesh) => representationItem(m, mesh, c));
113
+ return items.length > 0 ? [add(m, `IFCSHAPEREPRESENTATION(${ref(c.body)},'Body',${str(type)},${refs(items)})`)] : [];
114
+ });
115
+ const shape = representations.length > 0 ? ref(add(m, `IFCPRODUCTDEFINITIONSHAPE($,$,${refs(representations)})`)) : "$";
107
116
  const id = node.group.data?.["id"];
108
117
  const name = node.group.data?.["name"] ?? id ?? `Element ${path}`;
109
118
  const { entity, predefinedType = "NOTDEFINED" } = node.elementClass;
@@ -111,37 +120,50 @@ function element(m, node, path, parentPlacement, c) {
111
120
  aggregate(m, c, ifcElement, node.children.map((child, i) => element(m, child, `${path}.${i + 1}`, placement, c)));
112
121
  return ifcElement;
113
122
  }
114
- /** One face set per mesh, so meshes on different layers are never in the same item */
115
- function faceSet(m, { material, triangulation: { points, triangles }, layer }, c) {
116
- const pointList = add(m, `IFCCARTESIANPOINTLIST3D((${points.join(",")}))`);
117
- const faces = add(m, `IFCTRIANGULATEDFACESET(${ref(pointList)},$,.F.,(${triangles.map((t) => `(${t.join(",")})`).join(",")}),$)`);
118
- add(m, `IFCSTYLEDITEM(${ref(faces)},(${ref(surfaceStyle(m, material, c))}),$)`);
119
- if (layer !== undefined) {
120
- const items = c.layers.get(layer);
123
+ /** One face set or polyline per mesh, so meshes on different layers are never in the same item */
124
+ function representationItem(m, mesh, c) {
125
+ const [item, style] = mesh.type === "Tessellation"
126
+ ? [faceSet(m, mesh.triangulation), surfaceStyle(m, mesh.material, c)]
127
+ : [add(m, `IFCPOLYLINE(${refs(mesh.polyline.map((p) => add(m, `IFCCARTESIANPOINT(${p})`)))})`), curveStyle(m, mesh.material, c)];
128
+ add(m, `IFCSTYLEDITEM(${ref(item)},(${ref(style)}),$)`);
129
+ if (mesh.layer !== undefined) {
130
+ const items = c.layers.get(mesh.layer);
121
131
  if (items) {
122
- items.push(faces);
132
+ items.push(item);
123
133
  }
124
134
  else {
125
- c.layers.set(layer, [faces]);
135
+ c.layers.set(mesh.layer, [item]);
126
136
  }
127
137
  }
128
- return faces;
138
+ return item;
139
+ }
140
+ function faceSet(m, { points, triangles }) {
141
+ const pointList = add(m, `IFCCARTESIANPOINTLIST3D((${points.join(",")}))`);
142
+ return add(m, `IFCTRIANGULATEDFACESET(${ref(pointList)},$,.F.,(${triangles.map((t) => `(${t.join(",")})`).join(",")}),$)`);
129
143
  }
130
144
  function surfaceStyle(m, material, c) {
131
145
  const opacity = material.opacity ?? 1;
132
- const key = `${material.normal}_${opacity}`;
146
+ return cachedStyle(c, `surface_${material.normal}_${opacity}`, () => {
147
+ // Rendering rather than its supertype shading, since many viewers only read the transparency from rendering
148
+ const rendering = add(m, `IFCSURFACESTYLERENDERING(${ref(colour(m, material))},${real(1 - opacity)},$,$,$,$,$,$,.NOTDEFINED.)`);
149
+ return add(m, `IFCSURFACESTYLE(${str(material.normal)},.BOTH.,(${ref(rendering)}))`);
150
+ });
151
+ }
152
+ /** Only the colour, IFC has no line width that viewers reliably show */
153
+ const curveStyle = (m, material, c) => cachedStyle(c, `curve_${material.normal}`, () => add(m, `IFCCURVESTYLE($,$,$,${ref(colour(m, material))},.T.)`));
154
+ function cachedStyle(c, key, create) {
133
155
  const cached = c.styles.get(key);
134
156
  if (cached !== undefined) {
135
157
  return cached;
136
158
  }
137
- const { r, g, b } = new Color(material.normal).getRGB({ r: 0, g: 0, b: 0 }, SRGBColorSpace);
138
- const colour = add(m, `IFCCOLOURRGB($,${real(r)},${real(g)},${real(b)})`);
139
- // Rendering rather than its supertype shading, since many viewers only read the transparency from rendering
140
- const rendering = add(m, `IFCSURFACESTYLERENDERING(${ref(colour)},${real(1 - opacity)},$,$,$,$,$,$,.NOTDEFINED.)`);
141
- const style = add(m, `IFCSURFACESTYLE(${str(material.normal)},.BOTH.,(${ref(rendering)}))`);
159
+ const style = create();
142
160
  c.styles.set(key, style);
143
161
  return style;
144
162
  }
163
+ function colour(m, material) {
164
+ const { r, g, b } = new Color(material.normal).getRGB({ r: 0, g: 0, b: 0 }, SRGBColorSpace);
165
+ return add(m, `IFCCOLOURRGB($,${real(r)},${real(g)},${real(b)})`);
166
+ }
145
167
  /** The group's local axes, converted to IFC's Z-up where three.js' up (Y) becomes the placement's Axis (Z) */
146
168
  function axisPlacement(m, pos, rot) {
147
169
  const location = add(m, `IFCCARTESIANPOINT(${point(toIfc(pos))})`);
@@ -1 +1 @@
1
- {"version":3,"file":"ifc.js","sourceRoot":"","sources":["../../../src/renderers/ifc/ifc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3G,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAE/F,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA0DvD,MAAM,UAAU,GAAoB,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;AAa1E;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAC,KAAY,EAAE,OAAO,GAAe,EAAE;IAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,aAAa,CAAC;IAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC;IACrC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,SAAS,CAAC;IACvD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IACnE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IAEpB,MAAM,YAAY,GAAG,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,EAAE,wDAAwD,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChG,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,+DAA+D,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrH,MAAM,CAAC,GAAe,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IAChI,MAAM,KAAK,GAAG;QACZ,GAAG,CAAC,CAAC,EAAE,2CAA2C,CAAC;QACnD,GAAG,CAAC,CAAC,EAAE,0CAA0C,CAAC;QAClD,GAAG,CAAC,CAAC,EAAE,2CAA2C,CAAC;QACnD,GAAG,CAAC,CAAC,EAAE,0CAA0C,CAAC;KACnD,CAAC;IACF,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,qBAAqB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAE9I,MAAM,aAAa,GAAG,GAAG,CAAC,CAAC,EAAE,uBAAuB,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,KAAK,EAAE,eAAe,GAAG,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC;IACtG,MAAM,iBAAiB,GAAG,GAAG,CAAC,CAAC,EAAE,qBAAqB,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3F,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,KAAK,EAAE,mBAAmB,GAAG,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;IAClH,MAAM,eAAe,GAAG,GAAG,CAAC,CAAC,EAAE,qBAAqB,GAAG,CAAC,iBAAiB,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7F,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC,KAAK,EAAE,iBAAiB,GAAG,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC;IAC/G,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACjC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEpC,MAAM,MAAM,GAAG,KAAK,CAAC,iBAAiB,IAAI,QAAQ,CAAC;IACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,mBAAmB,IAAI,QAAQ,CAAC;IACvD,MAAM,GAAG,GAAa,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC7E,MAAM,SAAS,GAAsB,OAAO,CAAC,IAAI,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;IAC7I,MAAM,KAAK,GAAG,SAAS;QACrB,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACzF,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACrB,WAAW,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,IAAI,QAAQ,CAAC,EAAE,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAC1H,CAAC;IACN,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,CAAC;IACxH,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,GAAG,CAAC,CAAC,EAAE,qCAAqC,CAAC,CAAC,KAAK,EAAE,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjG,CAAC;IACD,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,kCAAkC,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAE/G,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,qBAAqB,CAAC;IACtE,OAAO,SAAS,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,IAAI,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;AACpH,CAAC;AAED,kIAAkI;AAClI,SAAS,kBAAkB,CAAC,CAAa,EAAE,MAAc,EAAE,YAAoB,EAAE,WAA+B,EAAE,GAAS;IACzH,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACjE,MAAM,kBAAkB,GAAG,GAAG,CAAC,CAAC,EAAE,qBAAqB,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACnF,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,EAAE,EAAE,SAAS,GAAG,UAAU,EAAE,GAAG,WAAW,CAAC;IACnE,MAAM,qBAAqB,GAAG,SAAS,KAAK,YAAY,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,qBAAqB,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACrI,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,4BAA4B,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC7F,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,kBAAkB,GAAG,CAAC,qBAAqB,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9G,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACnD,OAAO,GAAG,CAAC,CAAC,EAAE,mBAAmB,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,cAAc,SAAS,QAAQ,SAAS,GAAG,CAAC,CAAC;AACrG,CAAC;AAED,yDAAyD;AACzD,SAAS,WAAW,CAAC,KAAY,EAAE,GAAS,EAAE,GAAS,EAAE,QAAkB,EAAE,YAAY,GAAG,UAAU;IACpG,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACjF,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACpH,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,KAAY,EAAE,GAAS,EAAE,GAAS,EAAE,QAAkB;IAC5E,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACnD,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC3D,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClG,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAChD,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC;QAC5D,MAAM,aAAa,GAAG,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACrD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,SAAS;YAC3E,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE;YACjH,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;AAClH,CAAC;AAED,qIAAqI;AACrI,SAAS,aAAa,CAAC,KAAY,EAAE,MAAgB;IACnD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;AAChG,CAAC;AAED,yJAAyJ;AACzJ,SAAS,OAAO,CAAC,CAAa,EAAE,IAAiB,EAAE,IAAY,EAAE,eAAuB,EAAE,CAAa;IACrG,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,EAAE,qBAAqB,GAAG,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACpH,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,MAAM,KAAK,GACT,KAAK,CAAC,MAAM,GAAG,CAAC;QACd,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,kCAAkC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,0BAA0B,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QAC/I,CAAC,CAAC,GAAG,CAAC;IACV,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,WAAW,IAAI,EAAE,CAAC;IAClE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,YAAY,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC;IACpE,MAAM,UAAU,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC,EAAE,CAAC,KAAK,cAAc,IAAI,CAAC,CAAC;IAChJ,SAAS,CACP,CAAC,EACD,CAAC,EACD,UAAU,EACV,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CACrF,CAAC;IACF,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,sFAAsF;AACtF,SAAS,OAAO,CAAC,CAAa,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,EAAY,EAAE,CAAa;IAChH,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,EAAE,4BAA4B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,EAAE,0BAA0B,GAAG,CAAC,SAAS,CAAC,WAAW,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClI,GAAG,CAAC,CAAC,EAAE,iBAAiB,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAChF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,CAAa,EAAE,QAAkB,EAAE,CAAa;IACpE,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC;IAC5C,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;IAC5F,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,kBAAkB,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1E,4GAA4G;IAC5G,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,EAAE,4BAA4B,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;IACnH,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,EAAE,mBAAmB,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5F,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8GAA8G;AAC9G,SAAS,aAAa,CAAC,CAAa,EAAE,GAAS,EAAE,GAAS;IACxD,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,EAAE,qBAAqB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,gBAAgB,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACvF,MAAM,YAAY,GAAG,GAAG,CAAC,CAAC,EAAE,gBAAgB,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/F,OAAO,GAAG,CAAC,CAAC,EAAE,uBAAuB,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3F,CAAC;AAED,SAAS,SAAS,CAAC,CAAa,EAAE,CAAa,EAAE,MAAc,EAAE,QAA+B;IAC9F,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,GAAG,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAChF,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"ifc.js","sourceRoot":"","sources":["../../../src/renderers/ifc/ifc.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "abstract-3d",
3
- "version": "2.12.1",
4
- "gitHead": "60357004c7a11aa81f9e9ae780aad3ce2b295cc2",
3
+ "version": "2.12.2",
4
+ "gitHead": "a3fb140d99d3dbbff9f312445b2ae8dcbf8c88e0",
5
5
  "description": "Abstract 3D",
6
6
  "license": "MIT",
7
7
  "author": "Divid AB <info@divid.se>",
@@ -29,9 +29,21 @@ export type Triangulation = {
29
29
  readonly triangles: ReadonlyArray<readonly [number, number, number]>;
30
30
  };
31
31
 
32
+ /** Encoded IFC coordinates of a line's start and end */
33
+ export type Polyline = readonly [string, string];
34
+
32
35
  /** Abstract 3D is Y-up like three.js, IFC is Z-up */
33
36
  export const toIfc = (v: Vec3): Vec3 => vec3(v.x, -v.z, v.y);
34
37
 
38
+ /** The line's start and end in the coordinate system where its parent group is at parentPos/parentRot, undefined for geometries that aren't lines */
39
+ export function polyline(geometry: Mesh["geometry"], parentPos = vec3Zero, parentRot = vec3Zero): Polyline | undefined {
40
+ if (geometry.type !== "Line" && geometry.type !== "CulledLine") {
41
+ return undefined;
42
+ }
43
+ const ifcPoint = (p: Vec3): string => point(toIfc(vec3TransRot(p, parentPos, parentRot)));
44
+ return [ifcPoint(geometry.start), ifcPoint(geometry.end)];
45
+ }
46
+
35
47
  /**
36
48
  * Triangulates the mesh in the coordinate system where its parent group is at parentPos/parentRot, undefined for geometries without a solid surface
37
49
  * (lines, text, images)
@@ -1,8 +1,8 @@
1
1
  import { describe, expect, it, vi } from "vitest";
2
2
  import type { Scene } from "../../abstract-3d.js";
3
- import { box, cylinder, group, line, roundHole, sphere, vec2, vec3, vec3Zero } from "../../abstract-3d.js";
3
+ import { box, culledLine, cylinder, group, line, roundHole, sphere, vec2, vec3, vec3Zero } from "../../abstract-3d.js";
4
4
  import { guid, ifcFile, real, str } from "./ifc-encoding.js";
5
- import { triangulate } from "./ifc-geometry.js";
5
+ import { polyline, triangulate } from "./ifc-geometry.js";
6
6
  import { render } from "./ifc.js";
7
7
 
8
8
  const red = { normal: "rgb(255, 0, 0)", opacity: 0.5 };
@@ -12,17 +12,19 @@ const ids = (s: string): ReadonlyArray<string> => Array.from(s.matchAll(/#(\d+)/
12
12
  /** Random GlobalIds replaced, to compare files */
13
13
  const normalize = (ifc: string): string => ifc.replaceAll(/'[0-9A-Za-z_$]{22}'/g, "'guid'");
14
14
 
15
- /** The layer of every face set of the element named `name`, in order */
15
+ const entities = (ifc: string): ReadonlyMap<string, string> => new Map(Array.from(ifc.matchAll(/^#(\d+)=(.*);$/gm), (match) => [match[1], match[2]]));
16
+
17
+ /** The layer of every face set and polyline of the element named `name`, in order */
16
18
  function elementLayers(ifc: string, name: string): ReadonlyArray<string | undefined> {
17
- const entities = new Map(Array.from(ifc.matchAll(/^#(\d+)=(.*);$/gm), (match) => [match[1], match[2]]));
19
+ const byId = entities(ifc);
18
20
  const layers = new Map(
19
21
  Array.from(ifc.matchAll(/[=]IFCPRESENTATIONLAYERASSIGNMENT\('([^']*)',\$,\(([^)]*)\),\$\);/g)).flatMap(([, layer, items]) =>
20
22
  ids(items).map((item) => [item, layer] as const)
21
23
  )
22
24
  );
23
- // The element's owner history, placement and shape, the shape's representation and its context and items
24
- const [, , shape] = ids(Array.from(entities.values()).find((e) => e.includes(`,'${name}',$,$,#`))!);
25
- const [, ...items] = ids(entities.get(ids(entities.get(shape)!)[0])!);
25
+ // The element's owner history, placement and shape, the shape's representations and their context and items
26
+ const [, , shape] = ids(Array.from(byId.values()).find((e) => e.includes(`,'${name}',$,$,#`))!);
27
+ const items = ids(byId.get(shape)!).flatMap((representation) => ids(byId.get(representation)!).slice(1));
26
28
  return items.map((item) => layers.get(item));
27
29
  }
28
30
 
@@ -76,6 +78,12 @@ describe("ifc triangulation", () => {
76
78
  expect(triangulate(cylinder(vec3Zero, 1, 2, red, vec3Zero, false, [], 0, Math.PI).geometry)!.triangles.length).toBeGreaterThan(0);
77
79
  expect(triangulate(line(vec3Zero, vec3(1, 1, 1), 1, red).geometry)).toBeUndefined();
78
80
  });
81
+
82
+ it("converts the end points of lines like the triangle points and nothing else", () => {
83
+ expect(polyline(line(vec3(1, 2, 3), vec3(4, 5, 6), 1, red).geometry, vec3(0, 10, 0))).toEqual(["(1.,-3.,12.)", "(4.,-6.,15.)"]);
84
+ expect(polyline(culledLine(vec3Zero, vec3(1, 0, 0), vec3(0, 0, 1), 1, red).geometry)).toEqual(["(0.,0.,0.)", "(1.,0.,0.)"]);
85
+ expect(polyline(box(vec3(1, 1, 1), red).geometry)).toBeUndefined();
86
+ });
79
87
  });
80
88
 
81
89
  describe("ifc render", () => {
@@ -100,8 +108,8 @@ describe("ifc render", () => {
100
108
  expect(ifc).toMatch(/^ISO-10303-21;/);
101
109
  expect(ifc).toContain("FILE_SCHEMA(('IFC4'));");
102
110
  expect(ifc.trimEnd()).toMatch(/END-ISO-10303-21;$/);
103
- // The line-only and the empty group are left out, the group without data is merged into its parent
104
- expect(count(ifc, "IFCBUILDINGELEMENTPROXY")).toBe(3);
111
+ // The empty group is left out, the group without data is merged into its parent
112
+ expect(count(ifc, "IFCBUILDINGELEMENTPROXY")).toBe(4);
105
113
  expect(count(ifc, "IFCTRIANGULATEDFACESET")).toBe(4);
106
114
  expect(count(ifc, "IFCRELAGGREGATES")).toBe(4);
107
115
  expect(count(ifc, "IFCRELCONTAINEDINSPATIALSTRUCTURE")).toBe(1);
@@ -129,6 +137,49 @@ describe("ifc render", () => {
129
137
  expect(count(ifc, "IFCSURFACESTYLE")).toBe(2);
130
138
  });
131
139
 
140
+ it("writes a line as a polyline in a Curve3D representation next to the face sets, styled with its colour and on its group's layer", () => {
141
+ const green = { normal: "rgb(0, 255, 0)" };
142
+ const ifc = render(
143
+ scene([
144
+ group([box(vec3(1, 1, 1), red)], vec3Zero, vec3Zero, [group([line(vec3(1, 2, 3), vec3(4, 5, 6), 2, green)], vec3(0, 100, 0))], {
145
+ layer: "A",
146
+ }),
147
+ ]),
148
+ { layer: (path) => path.at(-1)?.layer }
149
+ );
150
+ const byId = entities(ifc);
151
+ expect(count(ifc, "IFCPOLYLINE")).toBe(1);
152
+ const [, polylineId, start, end] = /^#(\d+)=IFCPOLYLINE\(\(#(\d+),#(\d+)\)\);$/m.exec(ifc)!;
153
+ // The line keeps its group's offset, Y-up 100 becomes Z
154
+ expect([byId.get(start), byId.get(end)]).toEqual(["IFCCARTESIANPOINT((1.,-3.,102.))", "IFCCARTESIANPOINT((4.,-6.,105.))"]);
155
+ const [tessellation, curve] = ids(Array.from(byId.values()).find((e) => e.startsWith("IFCPRODUCTDEFINITIONSHAPE("))!);
156
+ expect(byId.get(tessellation)).toMatch(/^IFCSHAPEREPRESENTATION\(#\d+,'Body','Tessellation',\(#\d+\)\)$/);
157
+ expect(byId.get(curve)).toMatch(new RegExp(`^IFCSHAPEREPRESENTATION\\(#\\d+,'Body','Curve3D',\\(#${polylineId}\\)\\)$`));
158
+ const [, style] = ids(Array.from(byId.values()).find((e) => e.startsWith(`IFCSTYLEDITEM(#${polylineId},`))!);
159
+ const [colour] = ids(byId.get(style)!);
160
+ expect(byId.get(style)).toBe(`IFCCURVESTYLE($,$,$,#${colour},.T.)`);
161
+ expect(byId.get(colour)).toBe("IFCCOLOURRGB($,0.,1.,0.)");
162
+ expect(elementLayers(ifc, "Element 1")).toEqual(["A", "A"]);
163
+ });
164
+
165
+ it("writes an element with only lines, styling each colour once", () => {
166
+ const green = { normal: "rgb(0, 255, 0)" };
167
+ const ifc = render(
168
+ scene([
169
+ group([line(vec3Zero, vec3(1, 0, 0), 1, green), culledLine(vec3Zero, vec3(0, 1, 0), vec3(0, 0, 1), 1, green)], vec3Zero, vec3Zero, [], {
170
+ name: "Lines only",
171
+ }),
172
+ ])
173
+ );
174
+ expect(count(ifc, "IFCBUILDINGELEMENTPROXY")).toBe(1);
175
+ expect(ifc).toContain(",'Lines only',$,$,#");
176
+ expect(count(ifc, "IFCPOLYLINE")).toBe(2);
177
+ expect(count(ifc, "IFCCURVESTYLE")).toBe(1);
178
+ expect(count(ifc, "IFCTRIANGULATEDFACESET")).toBe(0);
179
+ expect(count(ifc, "IFCSHAPEREPRESENTATION")).toBe(1);
180
+ expect(ifc).toMatch(/[=]IFCSHAPEREPRESENTATION\(#\d+,'Body','Curve3D',\(#\d+,#\d+\)\);/);
181
+ });
182
+
132
183
  it("wraps the scene in one root element", () => {
133
184
  const ifc = render(
134
185
  scene([
@@ -262,7 +313,9 @@ describe("ifc render", () => {
262
313
  });
263
314
 
264
315
  it("only references entities that exist", () => {
265
- const ifc = render(scene([group([box(vec3(1, 1, 1), red)], vec3(1, 2, 3), vec3(0.1, 0.2, 0.3), [group([sphere(1, red)])])]));
316
+ const ifc = render(
317
+ scene([group([box(vec3(1, 1, 1), red), line(vec3Zero, vec3(1, 1, 1), 1, red)], vec3(1, 2, 3), vec3(0.1, 0.2, 0.3), [group([sphere(1, red)])])])
318
+ );
266
319
  const ids = new Set(Array.from(ifc.matchAll(/^#(\d+)=/gm), (match) => match[1]));
267
320
  const referenced = Array.from(ifc.matchAll(/[(,]#(\d+)/g), (match) => match[1]);
268
321
  expect(referenced.filter((id) => !ids.has(id))).toEqual([]);
@@ -3,8 +3,8 @@ import type { Scene, Group, Material, Vec3 } from "../../abstract-3d.js";
3
3
  import { vec3Zero, vec3PosX, vec3PosY, vec3Rot, vec3TransRot, vec3RotCombine } from "../../abstract-3d.js";
4
4
  import type { MutableIfc } from "./ifc-encoding.js";
5
5
  import { add, guid, ifcFile, point, real, ref, refs, serialize, str } from "./ifc-encoding.js";
6
- import type { Triangulation } from "./ifc-geometry.js";
7
- import { toIfc, triangulate } from "./ifc-geometry.js";
6
+ import type { Polyline, Triangulation } from "./ifc-geometry.js";
7
+ import { polyline, toIfc, triangulate } from "./ifc-geometry.js";
8
8
 
9
9
  /** Element classes with the same attributes as IfcBuildingElementProxy (GlobalId, ..., Tag, PredefinedType) */
10
10
  export type IfcElementEntity = "IfcBuildingElementProxy" | "IfcUnitaryEquipment";
@@ -43,7 +43,13 @@ export type IfcOptions = {
43
43
  readonly layer?: (path: ReadonlyArray<Record<string, string>>) => string | undefined;
44
44
  };
45
45
 
46
- type NodeMesh = { readonly material: Material; readonly triangulation: Triangulation; readonly layer: string | undefined };
46
+ /** A triangulated mesh or a line, `type` is the RepresentationType of the shape representation it's written in */
47
+ type NodeMesh = { readonly material: Material; readonly layer: string | undefined } & (
48
+ | { readonly type: "Tessellation"; readonly triangulation: Triangulation }
49
+ | { readonly type: "Curve3D"; readonly polyline: Polyline }
50
+ );
51
+
52
+ const representationTypes = ["Tessellation", "Curve3D"] as const;
47
53
 
48
54
  /** The `data` of the groups from the root down to a group and the layer its meshes are on */
49
55
  type Layering = {
@@ -52,7 +58,7 @@ type Layering = {
52
58
  readonly layer: string | undefined;
53
59
  };
54
60
 
55
- /** A group that becomes an element, groups without any triangulated geometry in them are left out */
61
+ /** A group that becomes an element, groups without any triangulated geometry or lines in them are left out */
56
62
  type ElementNode = {
57
63
  readonly group: Group;
58
64
  readonly elementClass: IfcElementClass;
@@ -66,7 +72,7 @@ const proxyClass: IfcElementClass = { entity: "IfcBuildingElementProxy" };
66
72
 
67
73
  /**
68
74
  * `owner` is the encoded GlobalId and OwnerHistory every IfcRoot entity starts with, call it once per entity since the GlobalId must be unique.
69
- * `layers` are the face sets on each layer
75
+ * `layers` are the representation items (face sets and polylines) on each layer
70
76
  */
71
77
  type IfcContext = {
72
78
  readonly body: number;
@@ -76,10 +82,10 @@ type IfcContext = {
76
82
  };
77
83
 
78
84
  /**
79
- * IFC4 (Reference View) with every mesh as an IfcTriangulatedFaceSet, in millimetres. Every top-level group and every group with a `data.id` or
80
- * `data.name` becomes an IfcBuildingElementProxy placed relative to its parent element and aggregated into it. Other groups are only transforms or
81
- * metadata, so their meshes are merged into the parent element. With `layer`, the face sets are assigned to an IfcPresentationLayerAssignment per
82
- * layer, the presentation layer of the Reference View
85
+ * IFC4 (Reference View) with every mesh as an IfcTriangulatedFaceSet and every line as an IfcPolyline without thickness, in millimetres. Every
86
+ * top-level group and every group with a `data.id` or `data.name` becomes an IfcBuildingElementProxy placed relative to its parent element and
87
+ * aggregated into it. Other groups are only transforms or metadata, so their meshes are merged into the parent element. With `layer`, the face sets
88
+ * and polylines are assigned to an IfcPresentationLayerAssignment per layer, the presentation layer of the Reference View
83
89
  */
84
90
  export function render(scene: Scene, options: IfcOptions = {}): string {
85
91
  const name = options.name ?? "Abstract 3D";
@@ -154,9 +160,16 @@ function elementNode(group: Group, pos: Vec3, rot: Vec3, layering: Layering, ele
154
160
  * `data.id` or `data.name` as elements
155
161
  */
156
162
  function elementContent(group: Group, pos: Vec3, rot: Vec3, layering: Layering): Pick<ElementNode, "meshes" | "children"> {
157
- const meshes = (group.meshes ?? []).flatMap((mesh) => {
163
+ const meshes = (group.meshes ?? []).flatMap((mesh): ReadonlyArray<NodeMesh> => {
164
+ const { material } = mesh;
165
+ const { layer } = layering;
158
166
  const triangulation = triangulate(mesh.geometry, pos, rot);
159
- return triangulation ? [{ material: mesh.material, triangulation, layer: layering.layer }] : [];
167
+ const line = polyline(mesh.geometry, pos, rot);
168
+ return triangulation
169
+ ? [{ type: "Tessellation", material, layer, triangulation }]
170
+ : line
171
+ ? [{ type: "Curve3D", material, layer, polyline: line }]
172
+ : [];
160
173
  });
161
174
  const nested = (group.groups ?? []).map((child) => {
162
175
  const childPos = vec3TransRot(child.pos, pos, rot);
@@ -183,11 +196,11 @@ function groupLayering(group: Group, parent: Layering): Layering {
183
196
  /** `path` is the element's position in the tree (e.g. "2.1"), named after it when the group has no `data.name` or `data.id` since IFC requires a name */
184
197
  function element(m: MutableIfc, node: ElementNode, path: string, parentPlacement: number, c: IfcContext): number {
185
198
  const placement = add(m, `IFCLOCALPLACEMENT(${ref(parentPlacement)},${ref(axisPlacement(m, node.pos, node.rot))})`);
186
- const items = node.meshes.map((mesh) => faceSet(m, mesh, c));
187
- const shape =
188
- items.length > 0
189
- ? ref(add(m, `IFCPRODUCTDEFINITIONSHAPE($,$,(${ref(add(m, `IFCSHAPEREPRESENTATION(${ref(c.body)},'Body','Tessellation',${refs(items)})`))}))`))
190
- : "$";
199
+ const representations = representationTypes.flatMap((type) => {
200
+ const items = node.meshes.filter((mesh) => mesh.type === type).map((mesh) => representationItem(m, mesh, c));
201
+ return items.length > 0 ? [add(m, `IFCSHAPEREPRESENTATION(${ref(c.body)},'Body',${str(type)},${refs(items)})`)] : [];
202
+ });
203
+ const shape = representations.length > 0 ? ref(add(m, `IFCPRODUCTDEFINITIONSHAPE($,$,${refs(representations)})`)) : "$";
191
204
  const id = node.group.data?.["id"];
192
205
  const name = node.group.data?.["name"] ?? id ?? `Element ${path}`;
193
206
  const { entity, predefinedType = "NOTDEFINED" } = node.elementClass;
@@ -201,38 +214,57 @@ function element(m: MutableIfc, node: ElementNode, path: string, parentPlacement
201
214
  return ifcElement;
202
215
  }
203
216
 
204
- /** One face set per mesh, so meshes on different layers are never in the same item */
205
- function faceSet(m: MutableIfc, { material, triangulation: { points, triangles }, layer }: NodeMesh, c: IfcContext): number {
206
- const pointList = add(m, `IFCCARTESIANPOINTLIST3D((${points.join(",")}))`);
207
- const faces = add(m, `IFCTRIANGULATEDFACESET(${ref(pointList)},$,.F.,(${triangles.map((t) => `(${t.join(",")})`).join(",")}),$)`);
208
- add(m, `IFCSTYLEDITEM(${ref(faces)},(${ref(surfaceStyle(m, material, c))}),$)`);
209
- if (layer !== undefined) {
210
- const items = c.layers.get(layer);
217
+ /** One face set or polyline per mesh, so meshes on different layers are never in the same item */
218
+ function representationItem(m: MutableIfc, mesh: NodeMesh, c: IfcContext): number {
219
+ const [item, style] =
220
+ mesh.type === "Tessellation"
221
+ ? [faceSet(m, mesh.triangulation), surfaceStyle(m, mesh.material, c)]
222
+ : [add(m, `IFCPOLYLINE(${refs(mesh.polyline.map((p) => add(m, `IFCCARTESIANPOINT(${p})`)))})`), curveStyle(m, mesh.material, c)];
223
+ add(m, `IFCSTYLEDITEM(${ref(item)},(${ref(style)}),$)`);
224
+ if (mesh.layer !== undefined) {
225
+ const items = c.layers.get(mesh.layer);
211
226
  if (items) {
212
- items.push(faces);
227
+ items.push(item);
213
228
  } else {
214
- c.layers.set(layer, [faces]);
229
+ c.layers.set(mesh.layer, [item]);
215
230
  }
216
231
  }
217
- return faces;
232
+ return item;
233
+ }
234
+
235
+ function faceSet(m: MutableIfc, { points, triangles }: Triangulation): number {
236
+ const pointList = add(m, `IFCCARTESIANPOINTLIST3D((${points.join(",")}))`);
237
+ return add(m, `IFCTRIANGULATEDFACESET(${ref(pointList)},$,.F.,(${triangles.map((t) => `(${t.join(",")})`).join(",")}),$)`);
218
238
  }
219
239
 
220
240
  function surfaceStyle(m: MutableIfc, material: Material, c: IfcContext): number {
221
241
  const opacity = material.opacity ?? 1;
222
- const key = `${material.normal}_${opacity}`;
242
+ return cachedStyle(c, `surface_${material.normal}_${opacity}`, () => {
243
+ // Rendering rather than its supertype shading, since many viewers only read the transparency from rendering
244
+ const rendering = add(m, `IFCSURFACESTYLERENDERING(${ref(colour(m, material))},${real(1 - opacity)},$,$,$,$,$,$,.NOTDEFINED.)`);
245
+ return add(m, `IFCSURFACESTYLE(${str(material.normal)},.BOTH.,(${ref(rendering)}))`);
246
+ });
247
+ }
248
+
249
+ /** Only the colour, IFC has no line width that viewers reliably show */
250
+ const curveStyle = (m: MutableIfc, material: Material, c: IfcContext): number =>
251
+ cachedStyle(c, `curve_${material.normal}`, () => add(m, `IFCCURVESTYLE($,$,$,${ref(colour(m, material))},.T.)`));
252
+
253
+ function cachedStyle(c: IfcContext, key: string, create: () => number): number {
223
254
  const cached = c.styles.get(key);
224
255
  if (cached !== undefined) {
225
256
  return cached;
226
257
  }
227
- const { r, g, b } = new Color(material.normal).getRGB({ r: 0, g: 0, b: 0 }, SRGBColorSpace);
228
- const colour = add(m, `IFCCOLOURRGB($,${real(r)},${real(g)},${real(b)})`);
229
- // Rendering rather than its supertype shading, since many viewers only read the transparency from rendering
230
- const rendering = add(m, `IFCSURFACESTYLERENDERING(${ref(colour)},${real(1 - opacity)},$,$,$,$,$,$,.NOTDEFINED.)`);
231
- const style = add(m, `IFCSURFACESTYLE(${str(material.normal)},.BOTH.,(${ref(rendering)}))`);
258
+ const style = create();
232
259
  c.styles.set(key, style);
233
260
  return style;
234
261
  }
235
262
 
263
+ function colour(m: MutableIfc, material: Material): number {
264
+ const { r, g, b } = new Color(material.normal).getRGB({ r: 0, g: 0, b: 0 }, SRGBColorSpace);
265
+ return add(m, `IFCCOLOURRGB($,${real(r)},${real(g)},${real(b)})`);
266
+ }
267
+
236
268
  /** The group's local axes, converted to IFC's Z-up where three.js' up (Y) becomes the placement's Axis (Z) */
237
269
  function axisPlacement(m: MutableIfc, pos: Vec3, rot: Vec3): number {
238
270
  const location = add(m, `IFCCARTESIANPOINT(${point(toIfc(pos))})`);