@ifc-lite/export 1.20.0 → 2.0.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/README.md +12 -9
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/lod1-generator.d.ts.map +1 -1
- package/dist/lod1-generator.js +10 -11
- package/dist/lod1-generator.js.map +1 -1
- package/dist/retype.d.ts +33 -0
- package/dist/retype.d.ts.map +1 -0
- package/dist/retype.js +155 -0
- package/dist/retype.js.map +1 -0
- package/dist/step-exporter.d.ts.map +1 -1
- package/dist/step-exporter.js +53 -8
- package/dist/step-exporter.js.map +1 -1
- package/package.json +5 -5
- package/dist/csv-exporter.d.ts +0 -54
- package/dist/csv-exporter.d.ts.map +0 -1
- package/dist/csv-exporter.js +0 -254
- package/dist/csv-exporter.js.map +0 -1
- package/dist/gltf-exporter.d.ts +0 -57
- package/dist/gltf-exporter.d.ts.map +0 -1
- package/dist/gltf-exporter.js +0 -352
- package/dist/gltf-exporter.js.map +0 -1
- package/dist/jsonld-exporter.d.ts +0 -36
- package/dist/jsonld-exporter.d.ts.map +0 -1
- package/dist/jsonld-exporter.js +0 -167
- package/dist/jsonld-exporter.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# @ifc-lite/export
|
|
2
2
|
|
|
3
|
-
Export formats for IFClite. Writes
|
|
3
|
+
Export formats for IFClite. Writes Apache Parquet, Apache Arrow, IFC STEP (with mutations applied), IFC5 IFCX (JSON + USD geometry), and lightweight LOD0/LOD1 envelopes — all from a single parsed `IfcDataStore`.
|
|
4
|
+
|
|
5
|
+
> **glTF/GLB, CSV and JSON-LD moved to Rust.** They are now assembled by the `ifc-lite-export` crate and reached through `GeometryProcessor` in [`@ifc-lite/geometry`](../geometry); the standalone `GLTFExporter`/`CSVExporter`/`JSONLDExporter` classes were retired.
|
|
4
6
|
|
|
5
7
|
## Installation
|
|
6
8
|
|
|
@@ -11,17 +13,18 @@ npm install @ifc-lite/export
|
|
|
11
13
|
## glTF / GLB — for the web
|
|
12
14
|
|
|
13
15
|
```typescript
|
|
14
|
-
import {
|
|
16
|
+
import { GeometryProcessor } from '@ifc-lite/geometry';
|
|
15
17
|
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
const gp = new GeometryProcessor();
|
|
19
|
+
await gp.init();
|
|
20
|
+
|
|
21
|
+
// From already-produced meshes (no re-mesh) …
|
|
22
|
+
const glb = gp.exportGlbFromMeshes(result.meshes, /* includeMetadata */ true);
|
|
23
|
+
// … or straight from IFC bytes (meshes internally):
|
|
24
|
+
// gp.exportGlb(bytes, true, new Uint32Array(), new Uint32Array(), '')
|
|
22
25
|
|
|
23
26
|
// Download
|
|
24
|
-
const url = URL.createObjectURL(new Blob([glb], { type: 'model/gltf-binary' }));
|
|
27
|
+
const url = URL.createObjectURL(new Blob([new Uint8Array(glb)], { type: 'model/gltf-binary' }));
|
|
25
28
|
```
|
|
26
29
|
|
|
27
30
|
## IFC STEP — with mutations
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @ifc-lite/export - Export formats
|
|
3
3
|
*/
|
|
4
|
-
export { GLTFExporter, type GLTFExportOptions } from './gltf-exporter.js';
|
|
5
4
|
export { ParquetExporter, type ParquetExportOptions } from './parquet-exporter.js';
|
|
6
|
-
export { CSVExporter, type CSVExportOptions } from './csv-exporter.js';
|
|
7
|
-
export { JSONLDExporter, type JSONLDExportOptions } from './jsonld-exporter.js';
|
|
8
5
|
export { StepExporter, exportToStep, type StepExportOptions, type StepExportResult, type StepExportProgress } from './step-exporter.js';
|
|
9
6
|
export { MergedExporter, type MergeModelInput, type MergeExportOptions, type MergeExportResult, type ExportProgress } from './merged-exporter.js';
|
|
10
7
|
export { collectReferencedEntityIds, getVisibleEntityIds, collectStyleEntities } from './reference-collector.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA;;GAEG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAKnF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxI,OAAO,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAClJ,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACjH,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACvI,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGxH,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACvH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,10 +4,13 @@
|
|
|
4
4
|
/**
|
|
5
5
|
* @ifc-lite/export - Export formats
|
|
6
6
|
*/
|
|
7
|
-
|
|
7
|
+
// GLTFExporter removed — glTF/GLB is now assembled in Rust (ifc-lite-export).
|
|
8
|
+
// Use GeometryProcessor.exportGlb (from bytes) / exportGlbFromMeshes (from meshes).
|
|
8
9
|
export { ParquetExporter } from './parquet-exporter.js';
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
// CSVExporter removed — CSV is now produced in Rust (ifc-lite-export).
|
|
11
|
+
// Use GeometryProcessor.exportCsv(bytes, mode, …) — mode ∈ entities|properties|quantities|spatial.
|
|
12
|
+
// JSONLDExporter removed — JSON-LD is now produced in Rust (ifc-lite-export).
|
|
13
|
+
// Use GeometryProcessor.exportJsonld(bytes, …).
|
|
11
14
|
export { StepExporter, exportToStep } from './step-exporter.js';
|
|
12
15
|
export { MergedExporter } from './merged-exporter.js';
|
|
13
16
|
export { collectReferencedEntityIds, getVisibleEntityIds, collectStyleEntities } from './reference-collector.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;GAEG;AAEH,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;GAEG;AAEH,8EAA8E;AAC9E,oFAAoF;AACpF,OAAO,EAAE,eAAe,EAA6B,MAAM,uBAAuB,CAAC;AACnF,uEAAuE;AACvE,mGAAmG;AACnG,8EAA8E;AAC9E,gDAAgD;AAChD,OAAO,EAAE,YAAY,EAAE,YAAY,EAA0E,MAAM,oBAAoB,CAAC;AACxI,OAAO,EAAE,cAAc,EAA8F,MAAM,sBAAsB,CAAC;AAClJ,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACjH,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAyB,MAAM,uBAAuB,CAAC;AACvI,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAiD,MAAM,oBAAoB,CAAC;AAIxH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAA4B,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lod1-generator.d.ts","sourceRoot":"","sources":["../src/lod1-generator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAA4B,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"lod1-generator.d.ts","sourceRoot":"","sources":["../src/lod1-generator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAA4B,MAAM,oBAAoB,CAAC;AAIpF,OAAO,KAAK,EAAE,kBAAkB,EAA0B,QAAQ,EAAQ,MAAM,yBAAyB,CAAC;AAG1G,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B;;;OAGG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC,CAAC;AAsGF,wBAAsB,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAqElH"}
|
package/dist/lod1-generator.js
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
4
|
import { GeometryProcessor } from '@ifc-lite/geometry';
|
|
5
|
-
import { GLTFExporter } from './gltf-exporter.js';
|
|
6
5
|
import { extractGlbMapping } from './glb.js';
|
|
7
6
|
import { generateLod0 } from './lod0-generator.js';
|
|
8
7
|
import { toIfcArrayBuffer } from './lod-geometry-utils.js';
|
|
@@ -112,8 +111,11 @@ export async function generateLod1(input, options = {}) {
|
|
|
112
111
|
const gp = new GeometryProcessor({ quality: options.quality });
|
|
113
112
|
await gp.init();
|
|
114
113
|
const geom = await processGeometryAdaptive(gp, buffer);
|
|
115
|
-
|
|
116
|
-
|
|
114
|
+
// Assemble the GLB in Rust over the meshes (no re-meshing); extractGlbMapping
|
|
115
|
+
// reads node `extras.expressId`, which the from-meshes path emits.
|
|
116
|
+
const glb = gp.exportGlbFromMeshes(geom.meshes, true);
|
|
117
|
+
if (!glb)
|
|
118
|
+
throw new Error('GLB assembly returned no data');
|
|
117
119
|
const mapping = extractGlbMapping(glb);
|
|
118
120
|
const mappedIds = new Set(Object.keys(mapping).map((k) => Number(k)).filter((n) => Number.isFinite(n)));
|
|
119
121
|
const failedElements = [];
|
|
@@ -140,14 +142,11 @@ export async function generateLod1(input, options = {}) {
|
|
|
140
142
|
const errMsg = e instanceof Error ? e.message : String(e);
|
|
141
143
|
notes.push(`Meshing failed; using fallback boxes from LOD0. (${errMsg})`);
|
|
142
144
|
const { meshes } = buildFallbackGeometryFromLod0(lod0);
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
};
|
|
149
|
-
const exporter = new GLTFExporter(fallbackResult);
|
|
150
|
-
const glb = exporter.exportGLB({ includeMetadata: true });
|
|
145
|
+
const gp = new GeometryProcessor();
|
|
146
|
+
await gp.init();
|
|
147
|
+
const glb = gp.exportGlbFromMeshes(meshes, true);
|
|
148
|
+
if (!glb)
|
|
149
|
+
throw e;
|
|
151
150
|
const mapping = extractGlbMapping(glb);
|
|
152
151
|
const meta = {
|
|
153
152
|
schema: 'ifc-lite-geometry',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lod1-generator.js","sourceRoot":"","sources":["../src/lod1-generator.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAG/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"lod1-generator.js","sourceRoot":"","sources":["../src/lod1-generator.ts"],"names":[],"mappings":"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"}
|
package/dist/retype.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { IfcSchemaVersion } from './schema-converter.js';
|
|
2
|
+
export interface RetypeArgsResult {
|
|
3
|
+
tokens: string[];
|
|
4
|
+
/** True when the layout was resolved from schema; false ⇒ keyword-only swap. */
|
|
5
|
+
resolved: boolean;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Re-lay-out an entity's STEP argument tokens for a new class.
|
|
9
|
+
*
|
|
10
|
+
* `argTokens` are already-serialized STEP fragments (as produced by
|
|
11
|
+
* {@link splitTopLevelArgs}). Returns a fresh token array in the target
|
|
12
|
+
* class's attribute order. When source or target layout can't be resolved
|
|
13
|
+
* from the schema (vendor extension, malformed), `resolved` is false and the
|
|
14
|
+
* caller should fall back to a keyword-only swap.
|
|
15
|
+
*/
|
|
16
|
+
export declare function retypeArgTokens(argTokens: string[], sourceType: string, newType: string, predefinedType: string | null | undefined, schema: IfcSchemaVersion): RetypeArgsResult;
|
|
17
|
+
/**
|
|
18
|
+
* Rewrite a raw STEP entity line to a new IFC class.
|
|
19
|
+
*
|
|
20
|
+
* `entityText` is a single STEP record (`#123=IFCFOO(...);`, possibly with a
|
|
21
|
+
* trailing newline). Returns the rewritten line, or the original unchanged if
|
|
22
|
+
* it can't be parsed.
|
|
23
|
+
*
|
|
24
|
+
* `schema` is the schema the raw text is in (the source schema). When the
|
|
25
|
+
* exporter is ALSO converting to a different output schema, the retype runs
|
|
26
|
+
* first in the source schema and the converter runs after. A narrow edge
|
|
27
|
+
* follows from that ordering: if the target class gains a `PredefinedType`
|
|
28
|
+
* slot only in the OUTPUT schema (e.g. IFC2X3 `IfcColumn` → IFC4 `IfcColumn`),
|
|
29
|
+
* an explicit override has no slot to land in and is dropped. Retyping within
|
|
30
|
+
* a single schema (the common case) is unaffected.
|
|
31
|
+
*/
|
|
32
|
+
export declare function retypeStepLine(entityText: string, sourceType: string, newType: string, predefinedType: string | null | undefined, schema: IfcSchemaVersion): string;
|
|
33
|
+
//# sourceMappingURL=retype.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retype.d.ts","sourceRoot":"","sources":["../src/retype.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAoD9D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,gFAAgF;IAChF,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACzC,MAAM,EAAE,gBAAgB,GACvB,gBAAgB,CA+ClB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACzC,MAAM,EAAE,gBAAgB,GACvB,MAAM,CAsBR"}
|
package/dist/retype.js
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
/**
|
|
5
|
+
* Entity retype (reassign class) materialization for STEP export.
|
|
6
|
+
*
|
|
7
|
+
* Mirrors IfcOpenShell's `ifcopenshell.util.schema.reassign_class`: an entity
|
|
8
|
+
* keeps its expressId (so geometry / placement / representation and every
|
|
9
|
+
* `IfcRel*` reference — all keyed by `#id` — carry over unchanged) while its
|
|
10
|
+
* class keyword and attribute layout are swapped to the target class.
|
|
11
|
+
*
|
|
12
|
+
* Attributes are re-laid-out BY NAME against the target class's declared
|
|
13
|
+
* attribute list:
|
|
14
|
+
* - attributes the target class doesn't declare are dropped
|
|
15
|
+
* (e.g. IFC2X3 `IfcBuildingElementProxy.CompositionType` when retyping to
|
|
16
|
+
* `IfcColumn`, which has no 9th attribute);
|
|
17
|
+
* - attributes the target declares but the source lacks become `$`;
|
|
18
|
+
* - the `PredefinedType` enum is validated against the target class's
|
|
19
|
+
* domain — an out-of-domain carried value is dropped, and an explicit
|
|
20
|
+
* out-of-domain override falls back to `USERDEFINED` + `ObjectType`.
|
|
21
|
+
*
|
|
22
|
+
* For the common building-element subtypes (Proxy ↔ Column / Beam / Member /
|
|
23
|
+
* Plate / Wall) the IFC4 attribute layout is identical, so the re-layout is an
|
|
24
|
+
* identity and only the keyword (and optionally PredefinedType) changes — the
|
|
25
|
+
* raw argument tokens are preserved byte-for-byte.
|
|
26
|
+
*/
|
|
27
|
+
import { ENTITIES_IFC2X3, ENTITIES_IFC4, ENTITIES_IFC4X3 } from '@ifc-lite/data';
|
|
28
|
+
import { escapeStepString, splitTopLevelArgs } from './step-serialization.js';
|
|
29
|
+
function buildSchemaMap(list) {
|
|
30
|
+
const map = new Map();
|
|
31
|
+
for (const entity of list) {
|
|
32
|
+
map.set(entity.name.toUpperCase(), {
|
|
33
|
+
attributes: entity.attributes,
|
|
34
|
+
predefinedTypes: entity.predefinedTypes,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return map;
|
|
38
|
+
}
|
|
39
|
+
const SCHEMA_MAPS = {
|
|
40
|
+
IFC2X3: buildSchemaMap(ENTITIES_IFC2X3),
|
|
41
|
+
IFC4: buildSchemaMap(ENTITIES_IFC4),
|
|
42
|
+
IFC4X3: buildSchemaMap(ENTITIES_IFC4X3),
|
|
43
|
+
// IFC5 isn't STEP; never reached for retype, but keep the lookup total.
|
|
44
|
+
IFC5: buildSchemaMap(ENTITIES_IFC4X3),
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Look up a class's attribute layout + PredefinedType domain for a schema.
|
|
48
|
+
* Falls back to the IFC4 registry for vendor extensions absent from the
|
|
49
|
+
* requested schema's bundle, then to `null` for genuinely unknown classes.
|
|
50
|
+
*/
|
|
51
|
+
function lookupEntityInfo(schema, name) {
|
|
52
|
+
const upper = name.toUpperCase();
|
|
53
|
+
return SCHEMA_MAPS[schema]?.get(upper) ?? SCHEMA_MAPS.IFC4.get(upper) ?? null;
|
|
54
|
+
}
|
|
55
|
+
/** Strip the dot-wrapping from a STEP enum token: `.ELEMENT.` → `ELEMENT`. */
|
|
56
|
+
function enumValue(token) {
|
|
57
|
+
const t = token.trim();
|
|
58
|
+
if (t.length >= 2 && t.startsWith('.') && t.endsWith('.')) {
|
|
59
|
+
return t.slice(1, -1);
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
/** Normalize a caller-supplied predefined type to a bare enum symbol. */
|
|
64
|
+
function normalizePredefined(value) {
|
|
65
|
+
return (enumValue(value) ?? value).trim().toUpperCase();
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Re-lay-out an entity's STEP argument tokens for a new class.
|
|
69
|
+
*
|
|
70
|
+
* `argTokens` are already-serialized STEP fragments (as produced by
|
|
71
|
+
* {@link splitTopLevelArgs}). Returns a fresh token array in the target
|
|
72
|
+
* class's attribute order. When source or target layout can't be resolved
|
|
73
|
+
* from the schema (vendor extension, malformed), `resolved` is false and the
|
|
74
|
+
* caller should fall back to a keyword-only swap.
|
|
75
|
+
*/
|
|
76
|
+
export function retypeArgTokens(argTokens, sourceType, newType, predefinedType, schema) {
|
|
77
|
+
const sourceInfo = lookupEntityInfo(schema, sourceType);
|
|
78
|
+
const targetInfo = lookupEntityInfo(schema, newType);
|
|
79
|
+
// Without both layouts we can't map by name. Fall back to keyword-only swap,
|
|
80
|
+
// preserving the original argument list verbatim.
|
|
81
|
+
if (!sourceInfo || !targetInfo) {
|
|
82
|
+
return { tokens: argTokens.slice(), resolved: false };
|
|
83
|
+
}
|
|
84
|
+
// Map source attribute NAME → its serialized token.
|
|
85
|
+
const byName = new Map();
|
|
86
|
+
const span = Math.min(sourceInfo.attributes.length, argTokens.length);
|
|
87
|
+
for (let i = 0; i < span; i++) {
|
|
88
|
+
byName.set(sourceInfo.attributes[i], argTokens[i]);
|
|
89
|
+
}
|
|
90
|
+
const tokens = targetInfo.attributes.map((name) => byName.get(name) ?? '$');
|
|
91
|
+
const predefinedIdx = targetInfo.attributes.indexOf('PredefinedType');
|
|
92
|
+
if (predefinedIdx >= 0) {
|
|
93
|
+
if (predefinedType != null && predefinedType !== '') {
|
|
94
|
+
const sym = normalizePredefined(predefinedType);
|
|
95
|
+
if (targetInfo.predefinedTypes.includes(sym)) {
|
|
96
|
+
tokens[predefinedIdx] = `.${sym}.`;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// Unknown enum value → USERDEFINED + carry the literal on ObjectType /
|
|
100
|
+
// ElementType, mirroring IfcOpenShell's reassign_class fallback.
|
|
101
|
+
tokens[predefinedIdx] = '.USERDEFINED.';
|
|
102
|
+
const labelIdx = targetInfo.attributes.indexOf('ObjectType') >= 0
|
|
103
|
+
? targetInfo.attributes.indexOf('ObjectType')
|
|
104
|
+
: targetInfo.attributes.indexOf('ElementType');
|
|
105
|
+
if (labelIdx >= 0) {
|
|
106
|
+
tokens[labelIdx] = `'${escapeStepString(predefinedType)}'`;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
// No override: sanitize a carried-over enum that isn't valid for the
|
|
112
|
+
// target class. PredefinedType is optional, so dropping to `$` is valid.
|
|
113
|
+
const carried = enumValue(tokens[predefinedIdx]);
|
|
114
|
+
if (carried !== null && !targetInfo.predefinedTypes.includes(carried)) {
|
|
115
|
+
tokens[predefinedIdx] = '$';
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return { tokens, resolved: true };
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Rewrite a raw STEP entity line to a new IFC class.
|
|
123
|
+
*
|
|
124
|
+
* `entityText` is a single STEP record (`#123=IFCFOO(...);`, possibly with a
|
|
125
|
+
* trailing newline). Returns the rewritten line, or the original unchanged if
|
|
126
|
+
* it can't be parsed.
|
|
127
|
+
*
|
|
128
|
+
* `schema` is the schema the raw text is in (the source schema). When the
|
|
129
|
+
* exporter is ALSO converting to a different output schema, the retype runs
|
|
130
|
+
* first in the source schema and the converter runs after. A narrow edge
|
|
131
|
+
* follows from that ordering: if the target class gains a `PredefinedType`
|
|
132
|
+
* slot only in the OUTPUT schema (e.g. IFC2X3 `IfcColumn` → IFC4 `IfcColumn`),
|
|
133
|
+
* an explicit override has no slot to land in and is dropped. Retyping within
|
|
134
|
+
* a single schema (the common case) is unaffected.
|
|
135
|
+
*/
|
|
136
|
+
export function retypeStepLine(entityText, sourceType, newType, predefinedType, schema) {
|
|
137
|
+
const eq = entityText.indexOf('=');
|
|
138
|
+
const openParen = entityText.indexOf('(');
|
|
139
|
+
const closeParen = entityText.lastIndexOf(');');
|
|
140
|
+
const newUpper = newType.toUpperCase();
|
|
141
|
+
if (eq < 0 || openParen < eq || closeParen < openParen) {
|
|
142
|
+
return entityText;
|
|
143
|
+
}
|
|
144
|
+
const idPrefix = entityText.slice(0, eq + 1); // "#123="
|
|
145
|
+
const argTokens = splitTopLevelArgs(entityText.slice(openParen + 1, closeParen));
|
|
146
|
+
const { tokens, resolved } = retypeArgTokens(argTokens, sourceType, newType, predefinedType, schema);
|
|
147
|
+
if (!resolved) {
|
|
148
|
+
// Keyword-only swap: keep the original argument list verbatim.
|
|
149
|
+
return `${idPrefix}${newUpper}${entityText.slice(openParen)}`;
|
|
150
|
+
}
|
|
151
|
+
// `entityText.slice(closeParen)` keeps the closing `);` plus any trailing
|
|
152
|
+
// bytes (newline) intact.
|
|
153
|
+
return `${idPrefix}${newUpper}(${tokens.join(',')}${entityText.slice(closeParen)}`;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=retype.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retype.js","sourceRoot":"","sources":["../src/retype.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step-exporter.d.ts","sourceRoot":"","sources":["../src/step-exporter.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAsC,MAAM,kBAAkB,CAAC;AACzF,OAAO,EAOL,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"step-exporter.d.ts","sourceRoot":"","sources":["../src/step-exporter.ts"],"names":[],"mappings":"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"}
|
package/dist/step-exporter.js
CHANGED
|
@@ -6,6 +6,7 @@ import { safeUtf8Decode } from '@ifc-lite/data';
|
|
|
6
6
|
import { generateIfcGuid } from '@ifc-lite/encoding';
|
|
7
7
|
import { collectReferencedEntityIds, getVisibleEntityIds, collectStyleEntities } from './reference-collector.js';
|
|
8
8
|
import { convertStepLine, needsConversion } from './schema-converter.js';
|
|
9
|
+
import { retypeStepLine, retypeArgTokens } from './retype.js';
|
|
9
10
|
import { getCompleteEntityIndex, getMaxExpressId } from './entity-iteration.js';
|
|
10
11
|
import { escapeStepString, toStepReal, quantityTypeToIfcType, serializePropertyValue, serializeAttributeValue, serializeStepArgs, serializeStepValue, splitTopLevelArgs, splitTopLevelStepArguments, assembleStepBytes, } from './step-serialization.js';
|
|
11
12
|
/**
|
|
@@ -439,9 +440,32 @@ export class StepExporter {
|
|
|
439
440
|
// SharedArrayBuffer-backed view; the parser deliberately keeps
|
|
440
441
|
// `source` zero-copy SAB-backed for worker sharing).
|
|
441
442
|
const entityText = safeUtf8Decode(source, entityRef.byteOffset, entityRef.byteOffset + entityRef.byteLength);
|
|
442
|
-
let nextEntityText =
|
|
443
|
-
|
|
444
|
-
|
|
443
|
+
let nextEntityText = entityText;
|
|
444
|
+
// Entity retype (reassign class) runs FIRST so attribute mutations
|
|
445
|
+
// below resolve against the TARGET class's attribute names. The
|
|
446
|
+
// expressId is unchanged, so geometry / placement / representation and
|
|
447
|
+
// every IfcRel* reference (keyed by #id) carry over untouched.
|
|
448
|
+
//
|
|
449
|
+
// This materializes inside the source-iteration loop, which `deltaOnly`
|
|
450
|
+
// skips — so, like in-place attribute/positional edits to existing
|
|
451
|
+
// entities, an existing-entity retype is only emitted by a full export
|
|
452
|
+
// (the common `applyMutations` path). Retyped OVERLAY-created entities
|
|
453
|
+
// are emitted under `deltaOnly` via the new-entities pass below.
|
|
454
|
+
const typeMutation = overlayActive && typeof this.mutationView.getEntityTypeMutation === 'function'
|
|
455
|
+
? this.mutationView.getEntityTypeMutation(expressId)
|
|
456
|
+
: null;
|
|
457
|
+
let workingType = entityType;
|
|
458
|
+
if (typeMutation) {
|
|
459
|
+
nextEntityText = retypeStepLine(nextEntityText, entityRef.type, typeMutation.newType, typeMutation.predefinedType ?? null, sourceSchema);
|
|
460
|
+
workingType = typeMutation.newType.toUpperCase();
|
|
461
|
+
if (!modifiedEntities.has(expressId)) {
|
|
462
|
+
modifiedEntities.add(expressId);
|
|
463
|
+
modifiedEntityCount++;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
if (modifiedAttributes.has(expressId)) {
|
|
467
|
+
nextEntityText = this.applyAttributeMutations(nextEntityText, workingType, modifiedAttributes.get(expressId));
|
|
468
|
+
}
|
|
445
469
|
const positional = overlayActive && typeof this.mutationView.getPositionalMutationsForEntity === 'function'
|
|
446
470
|
? this.mutationView.getPositionalMutationsForEntity(expressId)
|
|
447
471
|
: null;
|
|
@@ -508,18 +532,39 @@ export class StepExporter {
|
|
|
508
532
|
if (this.mutationView
|
|
509
533
|
&& (options.applyMutations !== false)
|
|
510
534
|
&& typeof this.mutationView.getNewEntities === 'function') {
|
|
535
|
+
const getTypeMut = typeof this.mutationView.getEntityTypeMutation === 'function'
|
|
536
|
+
? this.mutationView.getEntityTypeMutation.bind(this.mutationView)
|
|
537
|
+
: null;
|
|
511
538
|
for (const entity of this.mutationView.getNewEntities()) {
|
|
512
|
-
//
|
|
513
|
-
//
|
|
514
|
-
//
|
|
515
|
-
|
|
539
|
+
// A retyped overlay entity keeps its AUTHORED type on `entity.type`
|
|
540
|
+
// (the overlay typeMutation is the source of truth for the effective
|
|
541
|
+
// class). Resolve the effective class, then re-lay-out the authored
|
|
542
|
+
// attributes from the authored layout up to it.
|
|
543
|
+
const typeMut = getTypeMut ? getTypeMut(entity.expressId) : null;
|
|
544
|
+
const effectiveType = typeMut?.newType ?? entity.type;
|
|
545
|
+
// STEP requires UPPERCASE entity type tokens; the upper-case happens
|
|
546
|
+
// here at the file-format boundary.
|
|
547
|
+
const upperType = effectiveType.toUpperCase();
|
|
516
548
|
if (options.includeGeometry === false && this.isGeometryEntity(upperType)) {
|
|
517
549
|
continue;
|
|
518
550
|
}
|
|
519
551
|
if (allowedEntityIds !== null && !allowedEntityIds.has(entity.expressId)) {
|
|
520
552
|
continue;
|
|
521
553
|
}
|
|
522
|
-
|
|
554
|
+
// Re-lay-out by name against the effective class (identity for
|
|
555
|
+
// compatible layouts). Runs whenever a retype intent exists — even a
|
|
556
|
+
// same-class retype, which carries a PredefinedType override
|
|
557
|
+
// (e.g. setEntityType(id, 'IfcColumn', 'PILASTER')).
|
|
558
|
+
let argsText;
|
|
559
|
+
if (typeMut) {
|
|
560
|
+
const srcTokens = entity.attributes.map(serializeStepValue);
|
|
561
|
+
const { tokens } = retypeArgTokens(srcTokens, entity.type, effectiveType, typeMut.predefinedType ?? null, sourceSchema);
|
|
562
|
+
argsText = tokens.join(',');
|
|
563
|
+
}
|
|
564
|
+
else {
|
|
565
|
+
argsText = serializeStepArgs(entity.attributes);
|
|
566
|
+
}
|
|
567
|
+
const line = `#${entity.expressId}=${upperType}(${argsText});`;
|
|
523
568
|
if (converting) {
|
|
524
569
|
const converted = convertStepLine(line, sourceSchema, schema);
|
|
525
570
|
if (converted !== null) {
|