abstract-3d 2.11.1 → 2.12.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.
- package/lib/abstract-3d.d.ts +2 -0
- package/lib/abstract-3d.d.ts.map +1 -1
- package/lib/abstract-3d.js.map +1 -1
- package/lib/renderers/ifc/ifc-encoding.d.ts +10 -2
- package/lib/renderers/ifc/ifc-encoding.d.ts.map +1 -1
- package/lib/renderers/ifc/ifc-encoding.js +12 -3
- package/lib/renderers/ifc/ifc-encoding.js.map +1 -1
- package/lib/renderers/ifc/ifc.d.ts +21 -3
- package/lib/renderers/ifc/ifc.d.ts.map +1 -1
- package/lib/renderers/ifc/ifc.js +76 -31
- package/lib/renderers/ifc/ifc.js.map +1 -1
- package/lib/renderers/react/react-image-material.d.ts.map +1 -1
- package/lib/renderers/react/react-image-material.js +2 -2
- package/lib/renderers/react/react-image-material.js.map +1 -1
- package/lib/renderers/react/react-material.js +2 -2
- package/lib/renderers/react/react-material.js.map +1 -1
- package/package.json +3 -3
- package/src/abstract-3d.ts +2 -0
- package/src/renderers/ifc/ifc-encoding.ts +21 -4
- package/src/renderers/ifc/ifc.test.ts +152 -3
- package/src/renderers/ifc/ifc.ts +115 -35
- package/src/renderers/react/react-image-material.tsx +2 -2
- package/src/renderers/react/react-material.tsx +2 -2
package/lib/renderers/ifc/ifc.js
CHANGED
|
@@ -4,82 +4,127 @@ import { add, guid, ifcFile, point, real, ref, refs, serialize, str } from "./if
|
|
|
4
4
|
import { toIfc, triangulate } from "./ifc-geometry.js";
|
|
5
5
|
const proxyClass = { entity: "IfcBuildingElementProxy" };
|
|
6
6
|
/**
|
|
7
|
-
* IFC4 (Reference View) with every mesh as an IfcTriangulatedFaceSet, in millimetres. Every top-level group and every group with `data`
|
|
8
|
-
* IfcBuildingElementProxy placed relative to its parent element and aggregated into it.
|
|
9
|
-
* are merged into the parent element
|
|
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
|
|
10
11
|
*/
|
|
11
12
|
export function render(scene, options = {}) {
|
|
12
13
|
const name = options.name ?? "Abstract 3D";
|
|
14
|
+
const author = options.author ?? " ";
|
|
15
|
+
const organization = options.organization ?? "UNKNOWN";
|
|
16
|
+
const application = options.application ?? { name: "Abstract 3D" };
|
|
17
|
+
const now = new Date();
|
|
13
18
|
const m = ifcFile();
|
|
19
|
+
const ownerHistory = ownerHistoryEntity(m, author, organization, application, now);
|
|
14
20
|
const world = axisPlacement(m, vec3Zero, vec3Zero);
|
|
15
21
|
const context = add(m, `IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,${ref(world)},$)`);
|
|
16
22
|
const body = add(m, `IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,${ref(context)},$,.MODEL_VIEW.,$)`);
|
|
23
|
+
const c = { body, owner: (id) => `${str(guid(m, id))},${ref(ownerHistory)}`, styles: new Map(), layers: new Map() };
|
|
17
24
|
const units = [
|
|
18
25
|
add(m, "IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.)"),
|
|
19
26
|
add(m, "IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.)"),
|
|
20
27
|
add(m, "IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.)"),
|
|
21
28
|
add(m, "IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.)"),
|
|
22
29
|
];
|
|
23
|
-
const project = add(m, `IFCPROJECT(${
|
|
30
|
+
const project = add(m, `IFCPROJECT(${c.owner()},${str(name)},$,$,$,$,(${ref(context)}),${ref(add(m, `IFCUNITASSIGNMENT(${refs(units)})`))})`);
|
|
24
31
|
const sitePlacement = add(m, `IFCLOCALPLACEMENT($,${ref(world)})`);
|
|
25
|
-
const site = add(m, `IFCSITE(${
|
|
32
|
+
const site = add(m, `IFCSITE(${c.owner()},'Site',$,$,${ref(sitePlacement)},$,$,.ELEMENT.,$,$,$,$,$)`);
|
|
26
33
|
const buildingPlacement = add(m, `IFCLOCALPLACEMENT(${ref(sitePlacement)},${ref(world)})`);
|
|
27
|
-
const building = add(m, `IFCBUILDING(${
|
|
34
|
+
const building = add(m, `IFCBUILDING(${c.owner()},'Building',$,$,${ref(buildingPlacement)},$,$,.ELEMENT.,$,$,$)`);
|
|
28
35
|
const storeyPlacement = add(m, `IFCLOCALPLACEMENT(${ref(buildingPlacement)},${ref(world)})`);
|
|
29
|
-
const storey = add(m, `IFCBUILDINGSTOREY(${
|
|
30
|
-
aggregate(m, project, [site]);
|
|
31
|
-
aggregate(m, site, [building]);
|
|
32
|
-
aggregate(m, building, [storey]);
|
|
36
|
+
const storey = add(m, `IFCBUILDINGSTOREY(${c.owner()},'Storey',$,$,${ref(storeyPlacement)},$,$,.ELEMENT.,0.)`);
|
|
37
|
+
aggregate(m, c, project, [site]);
|
|
38
|
+
aggregate(m, c, site, [building]);
|
|
39
|
+
aggregate(m, c, building, [storey]);
|
|
33
40
|
const center = scene.center_deprecated ?? vec3Zero;
|
|
34
41
|
const sceneRot = scene.rotation_deprecated ?? vec3Zero;
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
42
|
+
const top = { layerOf: options.layer, path: [], layer: undefined };
|
|
43
|
+
const rootGroup = options.root && { pos: center, rot: sceneRot, groups: scene.groups, data: { name: options.root.name } };
|
|
44
|
+
const nodes = rootGroup
|
|
45
|
+
? [elementNode(rootGroup, center, sceneRot, groupLayering(rootGroup, top), options.root)]
|
|
46
|
+
: scene.groups.map((g) => elementNode(g, vec3TransRot(g.pos, center, sceneRot), vec3RotCombine(sceneRot, g.rot ?? vec3Zero), groupLayering(g, top)));
|
|
39
47
|
const elements = nodes.flatMap((node) => node ?? []).map((node, i) => element(m, node, `${i + 1}`, storeyPlacement, c));
|
|
40
48
|
if (elements.length > 0) {
|
|
41
|
-
add(m, `IFCRELCONTAINEDINSPATIALSTRUCTURE(${
|
|
49
|
+
add(m, `IFCRELCONTAINEDINSPATIALSTRUCTURE(${c.owner()},$,$,${refs(elements)},${ref(storey)})`);
|
|
42
50
|
}
|
|
43
|
-
|
|
44
|
-
|
|
51
|
+
c.layers.forEach((items, layer) => add(m, `IFCPRESENTATIONLAYERASSIGNMENT(${str(layer)},$,${refs(items)},$)`));
|
|
52
|
+
const date = now.toISOString().split(".")[0] ?? "1970-01-01T00:00:00";
|
|
53
|
+
return serialize(m, { fileName: `${name}.ifc`, date, author, organization, originatingSystem: application.name });
|
|
45
54
|
}
|
|
46
|
-
|
|
47
|
-
|
|
55
|
+
/** The author as the owning user and the application, ADDED requires LastModifiedDate in IFC4 so it's set to the creation date */
|
|
56
|
+
function ownerHistoryEntity(m, author, organization, application, now) {
|
|
57
|
+
const person = add(m, `IFCPERSON(${str(author)},$,$,$,$,$,$,$)`);
|
|
58
|
+
const owningOrganization = add(m, `IFCORGANIZATION($,${str(organization)},$,$,$)`);
|
|
59
|
+
const { name, version = "", developer = "Divid AB" } = application;
|
|
60
|
+
const developerOrganization = developer === organization ? owningOrganization : add(m, `IFCORGANIZATION($,${str(developer)},$,$,$)`);
|
|
61
|
+
const user = add(m, `IFCPERSONANDORGANIZATION(${ref(person)},${ref(owningOrganization)},$)`);
|
|
62
|
+
const app = add(m, `IFCAPPLICATION(${ref(developerOrganization)},${str(version)},${str(name)},${str(name)})`);
|
|
63
|
+
const timestamp = Math.floor(now.getTime() / 1000);
|
|
64
|
+
return add(m, `IFCOWNERHISTORY(${ref(user)},${ref(app)},$,.ADDED.,${timestamp},$,$,${timestamp})`);
|
|
65
|
+
}
|
|
66
|
+
/** `layering` is the group's own, see `groupLayering` */
|
|
67
|
+
function elementNode(group, pos, rot, layering, elementClass = proxyClass) {
|
|
68
|
+
const { meshes, children } = elementContent(group, vec3Zero, vec3Zero, layering);
|
|
48
69
|
return meshes.length > 0 || children.length > 0 ? { group, elementClass, pos, rot, meshes, children } : undefined;
|
|
49
70
|
}
|
|
50
|
-
/**
|
|
51
|
-
|
|
71
|
+
/**
|
|
72
|
+
* Meshes of the group and its descendants that aren't elements, relative to the element the group is at pos/rot in, and the descendants with a
|
|
73
|
+
* `data.id` or `data.name` as elements
|
|
74
|
+
*/
|
|
75
|
+
function elementContent(group, pos, rot, layering) {
|
|
52
76
|
const meshes = (group.meshes ?? []).flatMap((mesh) => {
|
|
53
77
|
const triangulation = triangulate(mesh.geometry, pos, rot);
|
|
54
|
-
return triangulation ? [{ material: mesh.material, triangulation }] : [];
|
|
78
|
+
return triangulation ? [{ material: mesh.material, triangulation, layer: layering.layer }] : [];
|
|
55
79
|
});
|
|
56
80
|
const nested = (group.groups ?? []).map((child) => {
|
|
57
81
|
const childPos = vec3TransRot(child.pos, pos, rot);
|
|
58
82
|
const childRot = vec3RotCombine(rot, child.rot ?? vec3Zero);
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
:
|
|
83
|
+
const childLayering = groupLayering(child, layering);
|
|
84
|
+
return child.data?.["id"] !== undefined || child.data?.["name"] !== undefined
|
|
85
|
+
? { meshes: [], children: [elementNode(child, childPos, childRot, childLayering)].flatMap((node) => node ?? []) }
|
|
86
|
+
: elementContent(child, childPos, childRot, childLayering);
|
|
62
87
|
});
|
|
63
88
|
return { meshes: [...meshes, ...nested.flatMap((n) => n.meshes)], children: nested.flatMap((n) => n.children) };
|
|
64
89
|
}
|
|
90
|
+
/** Groups with `data` are added to the path and get the layer `layerOf` returns for it, if any, otherwise the layer of the parent */
|
|
91
|
+
function groupLayering(group, parent) {
|
|
92
|
+
const data = group.data;
|
|
93
|
+
if (data === undefined || Object.keys(data).length === 0) {
|
|
94
|
+
return parent;
|
|
95
|
+
}
|
|
96
|
+
const path = [...parent.path, data];
|
|
97
|
+
const layer = parent.layerOf?.(path);
|
|
98
|
+
return { ...parent, path, layer: layer === undefined || layer === "" ? parent.layer : layer };
|
|
99
|
+
}
|
|
65
100
|
/** `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 */
|
|
66
101
|
function element(m, node, path, parentPlacement, c) {
|
|
67
102
|
const placement = add(m, `IFCLOCALPLACEMENT(${ref(parentPlacement)},${ref(axisPlacement(m, node.pos, node.rot))})`);
|
|
68
|
-
const items = node.meshes.map((
|
|
103
|
+
const items = node.meshes.map((mesh) => faceSet(m, mesh, c));
|
|
69
104
|
const shape = items.length > 0
|
|
70
105
|
? ref(add(m, `IFCPRODUCTDEFINITIONSHAPE($,$,(${ref(add(m, `IFCSHAPEREPRESENTATION(${ref(c.body)},'Body','Tessellation',${refs(items)})`))}))`))
|
|
71
106
|
: "$";
|
|
72
107
|
const id = node.group.data?.["id"];
|
|
73
108
|
const name = node.group.data?.["name"] ?? id ?? `Element ${path}`;
|
|
74
109
|
const { entity, predefinedType = "NOTDEFINED" } = node.elementClass;
|
|
75
|
-
const ifcElement = add(m, `${entity.toUpperCase()}(${
|
|
76
|
-
aggregate(m, ifcElement, node.children.map((child, i) => element(m, child, `${path}.${i + 1}`, placement, c)));
|
|
110
|
+
const ifcElement = add(m, `${entity.toUpperCase()}(${c.owner(id)},${str(name)},$,$,${ref(placement)},${shape},${str(id)},.${predefinedType}.)`);
|
|
111
|
+
aggregate(m, c, ifcElement, node.children.map((child, i) => element(m, child, `${path}.${i + 1}`, placement, c)));
|
|
77
112
|
return ifcElement;
|
|
78
113
|
}
|
|
79
|
-
|
|
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) {
|
|
80
116
|
const pointList = add(m, `IFCCARTESIANPOINTLIST3D((${points.join(",")}))`);
|
|
81
117
|
const faces = add(m, `IFCTRIANGULATEDFACESET(${ref(pointList)},$,.F.,(${triangles.map((t) => `(${t.join(",")})`).join(",")}),$)`);
|
|
82
118
|
add(m, `IFCSTYLEDITEM(${ref(faces)},(${ref(surfaceStyle(m, material, c))}),$)`);
|
|
119
|
+
if (layer !== undefined) {
|
|
120
|
+
const items = c.layers.get(layer);
|
|
121
|
+
if (items) {
|
|
122
|
+
items.push(faces);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
c.layers.set(layer, [faces]);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
83
128
|
return faces;
|
|
84
129
|
}
|
|
85
130
|
function surfaceStyle(m, material, c) {
|
|
@@ -103,9 +148,9 @@ function axisPlacement(m, pos, rot) {
|
|
|
103
148
|
const refDirection = add(m, `IFCDIRECTION(${point(toIfc(vec3Rot(vec3PosX, vec3Zero, rot)))})`);
|
|
104
149
|
return add(m, `IFCAXIS2PLACEMENT3D(${ref(location)},${ref(axis)},${ref(refDirection)})`);
|
|
105
150
|
}
|
|
106
|
-
function aggregate(m, parent, children) {
|
|
151
|
+
function aggregate(m, c, parent, children) {
|
|
107
152
|
if (children.length > 0) {
|
|
108
|
-
add(m, `IFCRELAGGREGATES(${
|
|
153
|
+
add(m, `IFCRELAGGREGATES(${c.owner()},$,$,${ref(parent)},${refs(children)})`);
|
|
109
154
|
}
|
|
110
155
|
}
|
|
111
156
|
//# sourceMappingURL=ifc.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ifc.js","sourceRoot":"","sources":["../../../src/renderers/ifc/ifc.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ifc.js","sourceRoot":"","sources":["../../../src/renderers/ifc/ifc.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-image-material.d.ts","sourceRoot":"","sources":["../../../src/renderers/react/react-image-material.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,
|
|
1
|
+
{"version":3,"file":"react-image-material.d.ts","sourceRoot":"","sources":["../../../src/renderers/react/react-image-material.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAwC,aAAa,EAA+C,MAAM,OAAO,CAAC;AACzH,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,eAAO,MAAM,aAAa,eAAsB,CAAC;AAGjD,eAAO,MAAM,kBAAkB;aAC7B,OAAO,EAAE,IAAI;aACb,MAAM,EAAE,IAAI;aACZ,YAAY,EAAE,IAAI;CACV,CAAC;AACX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,OAAO,kBAAkB,CAAC,CAAC;AAG9F,eAAO,MAAM,mBAAmB;aAC9B,OAAO,EAAE,IAAI;aACb,MAAM,EAAE,IAAI;CACJ,CAAC;AACX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC;AAEjG,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,mBAAmB,CAAC;CACnC,CAAC;AAKF,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,mBAAmB,EACnB,QAAQ,EACR,YAAY,EACZ,OAAO,EACP,QAAQ,EACR,aAAa,GACd,EAAE;IACD,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACjE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,YAAY,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,aAAa,EAAE,aAAa,GAAG,SAAS,CAAC;CACnD,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAmBpB"}
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { createSVG } from "abstract-image";
|
|
3
3
|
import React from "react";
|
|
4
4
|
import { suspend } from "suspend-react";
|
|
5
|
-
import { CanvasTexture, DoubleSide, PlaneGeometry, SRGBColorSpace, TextureLoader } from "three";
|
|
5
|
+
import { CanvasTexture, DoubleSide, FrontSide, PlaneGeometry, SRGBColorSpace, TextureLoader } from "three";
|
|
6
6
|
import { ERROR_IMG_KEY, getColor, materialDefaults, selectMat } from "./react-material.js";
|
|
7
7
|
export const planeGeometry = new PlaneGeometry();
|
|
8
8
|
// oxlint-disable-next-line no-redeclare -- value + type share a name, the standard enum-replacement pattern (erasableSyntaxOnly forbids enum)
|
|
@@ -25,7 +25,7 @@ export function ImageMaterial({ image, materialStateImages, material, useAlphaTe
|
|
|
25
25
|
? `data:image/svg+xml,${createSVG(image.image)}`
|
|
26
26
|
: image.url;
|
|
27
27
|
const texture = suspend(urlIsSvg(url) ? loadSvg(url, filter) : loadNormal(url, filter), [url]);
|
|
28
|
-
return (_jsx("meshBasicMaterial", { color: getColor(selected, hovered, material, selectMat), side: DoubleSide, alphaTest: (useAlphaTest ?? true) ? 0.8 : undefined, map: texture, ...(material.opacity !== undefined && material.opacity < 1 ? { opacity: material.opacity } : materialDefaults), transparent: true }));
|
|
28
|
+
return (_jsx("meshBasicMaterial", { color: getColor(selected, hovered, material, selectMat), side: material.backfaceCulling ? FrontSide : DoubleSide, alphaTest: (useAlphaTest ?? true) ? 0.8 : undefined, map: texture, ...(material.opacity !== undefined && material.opacity < 1 ? { opacity: material.opacity } : materialDefaults), transparent: true }));
|
|
29
29
|
}
|
|
30
30
|
function urlIsSvg(url) {
|
|
31
31
|
return url.startsWith("data:image/svg+xml") || url.endsWith(".svg") || url.includes(".svg?");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-image-material.js","sourceRoot":"","sources":["../../../src/renderers/react/react-image-material.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAgB,aAAa,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"react-image-material.js","sourceRoot":"","sources":["../../../src/renderers/react/react-image-material.tsx"],"names":[],"mappings":"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"}
|
|
@@ -13,14 +13,14 @@ export function ReactMaterial({ material, selected, hovered, disabled, materialS
|
|
|
13
13
|
if (isHotSpot) {
|
|
14
14
|
return (_jsx("meshBasicMaterial", { color: getColor(selected, hovered, mat, selectMat), side: drawBackOnly === true ? BackSide : DoubleSide, depthTest: true, depthWrite: true, transparent: false, opacity: 1.0 }, "mesh_material_hotspot"));
|
|
15
15
|
}
|
|
16
|
-
return (_jsx("meshStandardMaterial", { color: getColor(selected, hovered, mat, selectMat), roughness: mat.roughness, metalness: mat.metalness, side: DoubleSide, ...(opacity < 1 || disabled
|
|
16
|
+
return (_jsx("meshStandardMaterial", { color: getColor(selected, hovered, mat, selectMat), roughness: mat.roughness, metalness: mat.metalness, side: material.backfaceCulling ? FrontSide : DoubleSide, ...(opacity < 1 || disabled
|
|
17
17
|
? {
|
|
18
18
|
transparent: true,
|
|
19
19
|
depthWrite: false,
|
|
20
20
|
opacity: disabled ? opacity * decreasedOpacity : opacity,
|
|
21
21
|
depthTest: true,
|
|
22
22
|
}
|
|
23
|
-
: materialDefaults) }, `mesh_material_standard_${mat.normal}_${mat.metalness}_${mat.opacity}_${mat.roughness}`));
|
|
23
|
+
: materialDefaults) }, `mesh_material_standard_${mat.normal}_${mat.metalness}_${mat.opacity}_${mat.roughness}_${material.backfaceCulling}`));
|
|
24
24
|
}
|
|
25
25
|
export const materialDefaults = {
|
|
26
26
|
transparent: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-material.js","sourceRoot":"","sources":["../../../src/renderers/react/react-material.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAA2B,MAAM,OAAO,CAAC;AAEjF,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAG/B,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AAErC,MAAM,UAAU,aAAa,CAAC,EAC5B,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,aAAa,EACb,MAAM,EACN,SAAS,EACT,YAAY,GAUb;IACC,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;IAEnI,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,gBAAgB,CAAC,OAAQ,CAAC;IAC9D,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CACL,4BAEE,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,aAAa,CAAC,EACtD,IAAI,EAAE,SAAS,EACf,WAAW,WACP,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAJ7C,oBAAoB,CAKzB,CACH,CAAC;IACJ,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CACL,4BAEE,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,EAClD,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,EACnD,SAAS,EAAE,IAAI,EACf,UAAU,EAAE,IAAI,EAChB,WAAW,EAAE,KAAK,EAClB,OAAO,EAAE,GAAG,IANR,uBAAuB,CAO3B,CACH,CAAC;IACJ,CAAC;IACD,OAAO,CACL,+BAEE,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,EAClD,SAAS,EAAE,GAAG,CAAC,SAAS,EACxB,SAAS,EAAE,GAAG,CAAC,SAAS,EACxB,IAAI,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"react-material.js","sourceRoot":"","sources":["../../../src/renderers/react/react-material.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "abstract-3d",
|
|
3
|
-
"version": "2.
|
|
4
|
-
"gitHead": "
|
|
3
|
+
"version": "2.12.0",
|
|
4
|
+
"gitHead": "9974b3dd8cde2880c3072b597c1c0109d1163612",
|
|
5
5
|
"description": "Abstract 3D",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "Divid AB <info@divid.se>",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"@react-three/drei": "^10.7.9",
|
|
58
58
|
"@react-three/fiber": "^9.8.1",
|
|
59
59
|
"@react-three/postprocessing": "^3.1.3",
|
|
60
|
-
"abstract-image": "^13.3.
|
|
60
|
+
"abstract-image": "^13.3.2",
|
|
61
61
|
"suspend-react": "^0.1.3",
|
|
62
62
|
"three": "^0.186.1",
|
|
63
63
|
"ts-exhaustive-check": "^1.0.0"
|
package/src/abstract-3d.ts
CHANGED
|
@@ -91,6 +91,8 @@ export type Material = {
|
|
|
91
91
|
readonly opacity?: number;
|
|
92
92
|
readonly metalness?: number;
|
|
93
93
|
readonly roughness?: number;
|
|
94
|
+
/** Draw only the front side, e.g. an image on a wall that should not show through from behind. Default is both sides. */
|
|
95
|
+
readonly backfaceCulling?: boolean;
|
|
94
96
|
};
|
|
95
97
|
|
|
96
98
|
export type ImageMesh = {
|
|
@@ -74,12 +74,30 @@ export function guid(m: MutableIfc, uuid?: string): string {
|
|
|
74
74
|
return id;
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
|
|
77
|
+
/** FILE_NAME header fields, `originatingSystem` is the application that produced the scene */
|
|
78
|
+
export type IfcHeader = {
|
|
79
|
+
readonly fileName: string;
|
|
80
|
+
readonly date: string;
|
|
81
|
+
readonly author: string;
|
|
82
|
+
readonly organization: string;
|
|
83
|
+
readonly originatingSystem: string;
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export const header = (h: IfcHeader): string => `ISO-10303-21;
|
|
78
87
|
HEADER;
|
|
79
88
|
FILE_DESCRIPTION(('ViewDefinition [ReferenceView_V1.2]'),'2;1');
|
|
80
|
-
FILE_NAME(
|
|
89
|
+
FILE_NAME(
|
|
90
|
+
/* name */ ${str(h.fileName)},
|
|
91
|
+
/* time_stamp */ ${str(h.date)},
|
|
92
|
+
/* author */ (${str(h.author)}),
|
|
93
|
+
/* organization */ (${str(h.organization)}),
|
|
94
|
+
/* preprocessor_version */ 'Abstract 3D to IFC Exporter',
|
|
95
|
+
/* originating_system */ ${str(h.originatingSystem)},
|
|
96
|
+
/* authorization */ 'None');
|
|
97
|
+
|
|
81
98
|
FILE_SCHEMA(('IFC4'));
|
|
82
99
|
ENDSEC;
|
|
100
|
+
|
|
83
101
|
DATA;
|
|
84
102
|
`;
|
|
85
103
|
|
|
@@ -87,5 +105,4 @@ export const footer = (): string => `ENDSEC;
|
|
|
87
105
|
END-ISO-10303-21;
|
|
88
106
|
`;
|
|
89
107
|
|
|
90
|
-
export const serialize = (m: MutableIfc,
|
|
91
|
-
header(fileName, date) + m.entities.map((e, i) => `#${i + 1}=${e};\n`).join("") + footer();
|
|
108
|
+
export const serialize = (m: MutableIfc, h: IfcHeader): string => header(h) + m.entities.map((e, i) => `#${i + 1}=${e};\n`).join("") + footer();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
2
|
import type { Scene } from "../../abstract-3d.js";
|
|
3
3
|
import { box, cylinder, group, line, roundHole, sphere, vec2, vec3, vec3Zero } from "../../abstract-3d.js";
|
|
4
4
|
import { guid, ifcFile, real, str } from "./ifc-encoding.js";
|
|
@@ -8,6 +8,38 @@ import { render } from "./ifc.js";
|
|
|
8
8
|
const red = { normal: "rgb(255, 0, 0)", opacity: 0.5 };
|
|
9
9
|
const scene = (groups: Scene["groups"]): Scene => ({ size_deprecated: vec3Zero, groups });
|
|
10
10
|
const count = (ifc: string, entity: string): number => ifc.split(`=${entity}(`).length - 1;
|
|
11
|
+
const ids = (s: string): ReadonlyArray<string> => Array.from(s.matchAll(/#(\d+)/g), (match) => match[1]);
|
|
12
|
+
/** Random GlobalIds replaced, to compare files */
|
|
13
|
+
const normalize = (ifc: string): string => ifc.replaceAll(/'[0-9A-Za-z_$]{22}'/g, "'guid'");
|
|
14
|
+
|
|
15
|
+
/** The layer of every face set of the element named `name`, in order */
|
|
16
|
+
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]]));
|
|
18
|
+
const layers = new Map(
|
|
19
|
+
Array.from(ifc.matchAll(/[=]IFCPRESENTATIONLAYERASSIGNMENT\('([^']*)',\$,\(([^)]*)\),\$\);/g)).flatMap(([, layer, items]) =>
|
|
20
|
+
ids(items).map((item) => [item, layer] as const)
|
|
21
|
+
)
|
|
22
|
+
);
|
|
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])!);
|
|
26
|
+
return items.map((item) => layers.get(item));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** An air handler component with a panel and a fan with a motor, the motor's meshes two groups without data down */
|
|
30
|
+
const component = (id: string, key: string): Scene["groups"][number] =>
|
|
31
|
+
group(
|
|
32
|
+
[box(vec3(1, 1, 1), red)],
|
|
33
|
+
vec3Zero,
|
|
34
|
+
vec3Zero,
|
|
35
|
+
[
|
|
36
|
+
group([box(vec3(1, 1, 1), red)], vec3Zero, vec3Zero, [], { type: "panel" }),
|
|
37
|
+
group([sphere(1, red)], vec3Zero, vec3Zero, [group([], vec3Zero, vec3Zero, [group([cylinder(vec3Zero, 1, 2, red)])])], { type: "fan_wall" }),
|
|
38
|
+
],
|
|
39
|
+
{ id, key }
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
const layered = (layer: string, groups: Scene["groups"]): Scene["groups"][number] => group([], vec3Zero, vec3Zero, groups, { layer });
|
|
11
43
|
|
|
12
44
|
describe("ifc encoding", () => {
|
|
13
45
|
it("writes reals with a decimal point", () => {
|
|
@@ -94,11 +126,128 @@ describe("ifc render", () => {
|
|
|
94
126
|
]),
|
|
95
127
|
{ root: { entity: "IfcUnitaryEquipment", predefinedType: "AIRHANDLER", name: "AHU" } }
|
|
96
128
|
);
|
|
97
|
-
expect(ifc).toMatch(/[=]IFCUNITARYEQUIPMENT\('[^']{22}'
|
|
129
|
+
expect(ifc).toMatch(/[=]IFCUNITARYEQUIPMENT\('[^']{22}',#\d+,'AHU',\$,\$,#\d+,\$,\$,\.AIRHANDLER\.\);/);
|
|
98
130
|
expect(count(ifc, "IFCBUILDINGELEMENTPROXY")).toBe(2);
|
|
99
131
|
// Only the root is in the storey, the groups are aggregated into it
|
|
100
|
-
expect(ifc).toMatch(/[=]IFCRELCONTAINEDINSPATIALSTRUCTURE\('[^']{22}'
|
|
132
|
+
expect(ifc).toMatch(/[=]IFCRELCONTAINEDINSPATIALSTRUCTURE\('[^']{22}',#\d+,\$,\$,\(#\d+\),#\d+\);/);
|
|
133
|
+
expect(count(ifc, "IFCRELAGGREGATES")).toBe(4);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it("writes the owner history on every rooted entity and the author and application in the header", () => {
|
|
137
|
+
const ifc = render(
|
|
138
|
+
scene([group([box(vec3(1, 1, 1), red)], vec3Zero, vec3Zero, [group([sphere(1, red)], vec3Zero, vec3Zero, [], { name: "Fan" })])]),
|
|
139
|
+
{
|
|
140
|
+
author: "Ivan",
|
|
141
|
+
organization: "Acme",
|
|
142
|
+
application: { name: "airCalc ACOM", version: "10.1" },
|
|
143
|
+
}
|
|
144
|
+
);
|
|
145
|
+
expect(ifc).toContain("/* name */ 'Abstract 3D.ifc',");
|
|
146
|
+
expect(ifc).toContain("/* author */ ('Ivan'),\n/* organization */ ('Acme'),");
|
|
147
|
+
expect(ifc).toContain("/* originating_system */ 'airCalc ACOM',");
|
|
148
|
+
expect(ifc).toMatch(/[=]IFCPERSON\('Ivan',/);
|
|
149
|
+
expect(ifc).toContain("IFCORGANIZATION($,'Acme',$,$,$)");
|
|
150
|
+
expect(ifc).toMatch(/[=]IFCAPPLICATION\(#\d+,'10.1','airCalc ACOM','airCalc ACOM'\);/);
|
|
151
|
+
expect(ifc).toMatch(/[=]IFCOWNERHISTORY\(#\d+,#\d+,\$,\.ADDED\.,\d+,\$,\$,\d+\);/);
|
|
152
|
+
const ownerHistory = /^#(\d+)=IFCOWNERHISTORY\(/m.exec(ifc)![1];
|
|
153
|
+
const rooted = Array.from(ifc.matchAll(/^#\d+=IFC\w+\('[^']{22}',([^,]+),/gm), (match) => match[1]);
|
|
154
|
+
// Project, site, building, storey, 2 elements, 4 aggregates and the containment
|
|
155
|
+
expect(rooted).toHaveLength(11);
|
|
156
|
+
expect(rooted.every((owner) => owner === `#${ownerHistory}`)).toBe(true);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it("defaults the owner to an unknown author and organization and the application to Abstract 3D by Divid AB", () => {
|
|
160
|
+
const ifc = render(scene([group([box(vec3(1, 1, 1), red)])]));
|
|
161
|
+
expect(ifc).toContain("/* author */ (' '),\n/* organization */ ('UNKNOWN'),");
|
|
162
|
+
expect(ifc).toContain("/* originating_system */ 'Abstract 3D',");
|
|
163
|
+
expect(ifc).toContain("IFCORGANIZATION($,'UNKNOWN',$,$,$)");
|
|
164
|
+
expect(ifc).toContain("IFCORGANIZATION($,'Divid AB',$,$,$)");
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
it("uses one organization as both owner and application developer when they're the same", () => {
|
|
168
|
+
const ifc = render(scene([group([box(vec3(1, 1, 1), red)])]), { organization: "Divid AB" });
|
|
169
|
+
expect(count(ifc, "IFCORGANIZATION")).toBe(1);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it("makes elements only of groups with data.id or data.name, merging groups with other data into their parent", () => {
|
|
173
|
+
const ifc = render(
|
|
174
|
+
scene([
|
|
175
|
+
group([box(vec3(1, 1, 1), red)], vec3Zero, vec3Zero, [
|
|
176
|
+
group([box(vec3(1, 1, 1), red)], vec3Zero, vec3Zero, [group([sphere(1, red)], vec3Zero, vec3Zero, [], { id: "fan" })], { type: "panel" }),
|
|
177
|
+
group([sphere(1, red)], vec3Zero, vec3Zero, [], { name: "Motor", type: "motor" }),
|
|
178
|
+
]),
|
|
179
|
+
])
|
|
180
|
+
);
|
|
181
|
+
expect(count(ifc, "IFCBUILDINGELEMENTPROXY")).toBe(3);
|
|
182
|
+
// The panel's box is merged into the top-level element, the element below the panel is aggregated into it
|
|
183
|
+
expect(elementLayers(ifc, "Element 1")).toHaveLength(2);
|
|
101
184
|
expect(count(ifc, "IFCRELAGGREGATES")).toBe(4);
|
|
185
|
+
expect(ifc).toMatch(/[=]IFCRELAGGREGATES\('[^']{22}',#\d+,\$,\$,#\d+,\(#\d+,#\d+\)\);/);
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it("puts the meshes on the layer of the nearest group above them with one, from the data path of the root and the groups with data", () => {
|
|
189
|
+
const paths: Array<ReadonlyArray<Record<string, string>>> = [];
|
|
190
|
+
const ifc = render(scene([component("a1", "FAN"), component("a2", "FAN"), component("a3", "DUCTCONNECTORS")]), {
|
|
191
|
+
root: { entity: "IfcUnitaryEquipment", predefinedType: "AIRHANDLER", name: "AHU" },
|
|
192
|
+
layer: (path) => {
|
|
193
|
+
paths.push(path);
|
|
194
|
+
const key = path.filter((d) => "key" in d).at(-1)?.key;
|
|
195
|
+
return path.at(-1)?.type === "panel" ? "acomSECTIONS" : key ? `acom${key}` : undefined;
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
// Box, panel, fan and the motor two groups without data further down
|
|
199
|
+
expect(elementLayers(ifc, "a1")).toEqual(["acomFAN", "acomSECTIONS", "acomFAN", "acomFAN"]);
|
|
200
|
+
expect(elementLayers(ifc, "a3")).toEqual(["acomDUCTCONNECTORS", "acomSECTIONS", "acomDUCTCONNECTORS", "acomDUCTCONNECTORS"]);
|
|
201
|
+
// One layer per name across the elements
|
|
202
|
+
expect(count(ifc, "IFCPRESENTATIONLAYERASSIGNMENT")).toBe(3);
|
|
203
|
+
expect(ifc).toMatch(/[=]IFCPRESENTATIONLAYERASSIGNMENT\('acomSECTIONS',\$,\(#\d+,#\d+,#\d+\),\$\);/);
|
|
204
|
+
expect(ifc).toMatch(/[=]IFCPRESENTATIONLAYERASSIGNMENT\('acomFAN',\$,\((#\d+,){5}#\d+\),\$\);/);
|
|
205
|
+
expect(paths).toContainEqual([{ name: "AHU" }, { id: "a1", key: "FAN" }, { type: "panel" }]);
|
|
206
|
+
// The root, 3 components and their panel and fan, groups without data are skipped
|
|
207
|
+
expect(paths).toHaveLength(10);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it("inherits the layer through groups without data and groups the layer returns undefined or an empty name for", () => {
|
|
211
|
+
const ifc = render(
|
|
212
|
+
scene([
|
|
213
|
+
group(
|
|
214
|
+
[box(vec3(1, 1, 1), red)],
|
|
215
|
+
vec3Zero,
|
|
216
|
+
vec3Zero,
|
|
217
|
+
[
|
|
218
|
+
group([box(vec3(1, 1, 1), red)], vec3Zero, vec3Zero, [], { type: "panel" }),
|
|
219
|
+
layered("", [group([box(vec3(1, 1, 1), red)])]),
|
|
220
|
+
layered("B", [group([], vec3Zero, vec3Zero, [group([box(vec3(1, 1, 1), red)])])]),
|
|
221
|
+
layered("B", [group([box(vec3(1, 1, 1), red)], vec3Zero, vec3Zero, [], { name: "Inner", type: "fan" })]),
|
|
222
|
+
],
|
|
223
|
+
{ layer: "A" }
|
|
224
|
+
),
|
|
225
|
+
group([box(vec3(1, 1, 1), red)]),
|
|
226
|
+
]),
|
|
227
|
+
{ layer: (path) => path.at(-1)?.layer }
|
|
228
|
+
);
|
|
229
|
+
expect(elementLayers(ifc, "Element 1")).toEqual(["A", "A", "A", "B"]);
|
|
230
|
+
expect(elementLayers(ifc, "Inner")).toEqual(["B"]);
|
|
231
|
+
// Meshes without a layer above them get none
|
|
232
|
+
expect(elementLayers(ifc, "Element 2")).toEqual([undefined]);
|
|
233
|
+
expect(count(ifc, "IFCPRESENTATIONLAYERASSIGNMENT")).toBe(2);
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
it("only adds the layers to the output", () => {
|
|
237
|
+
vi.useFakeTimers({ now: new Date("2026-10-12T10:00:00Z") });
|
|
238
|
+
const s = scene([
|
|
239
|
+
group([box(vec3(1, 1, 1), red)], vec3(1, 2, 3), vec3(0.1, 0, 0), [
|
|
240
|
+
group([sphere(1, red)], vec3Zero, vec3Zero, [group([cylinder(vec3Zero, 1, 2, red)])], { name: "Fan" }),
|
|
241
|
+
]),
|
|
242
|
+
]);
|
|
243
|
+
const plain = normalize(render(s));
|
|
244
|
+
const undefinedLayers = normalize(render(s, { layer: () => undefined }));
|
|
245
|
+
const withLayers = normalize(render(s, { layer: () => "A" }));
|
|
246
|
+
vi.useRealTimers();
|
|
247
|
+
expect(count(plain, "IFCPRESENTATIONLAYERASSIGNMENT")).toBe(0);
|
|
248
|
+
expect(undefinedLayers).toBe(plain);
|
|
249
|
+
// Only the fan's meshes are in a group with data
|
|
250
|
+
expect(withLayers.replace(/^#\d+=IFCPRESENTATIONLAYERASSIGNMENT\('A',\$,\(#\d+,#\d+\),\$\);\n/m, "")).toBe(plain);
|
|
102
251
|
});
|
|
103
252
|
|
|
104
253
|
it("only references entities that exist", () => {
|