@ifc-lite/clash 2.0.0 → 2.1.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.
- package/README.md +1 -1
- package/dist/adapters/ifcx.d.ts.map +1 -1
- package/dist/adapters/ifcx.js +30 -2
- package/dist/adapters/ifcx.js.map +1 -1
- package/dist/adapters/step-exclusions.d.ts +21 -0
- package/dist/adapters/step-exclusions.d.ts.map +1 -0
- package/dist/adapters/step-exclusions.js +52 -0
- package/dist/adapters/step-exclusions.js.map +1 -0
- package/dist/adapters/step.d.ts +1 -10
- package/dist/adapters/step.d.ts.map +1 -1
- package/dist/adapters/step.js +38 -49
- package/dist/adapters/step.js.map +1 -1
- package/dist/duplicates.js +5 -5
- package/dist/duplicates.js.map +1 -1
- package/dist/engine-ts/orchestrator.d.ts +27 -0
- package/dist/engine-ts/orchestrator.d.ts.map +1 -1
- package/dist/engine-ts/orchestrator.js +64 -4
- package/dist/engine-ts/orchestrator.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/math/aabb.d.ts +32 -4
- package/dist/math/aabb.d.ts.map +1 -1
- package/dist/math/aabb.js +54 -4
- package/dist/math/aabb.js.map +1 -1
- package/dist/revision.d.ts +68 -0
- package/dist/revision.d.ts.map +1 -0
- package/dist/revision.js +208 -0
- package/dist/revision.js.map +1 -0
- package/dist/types.d.ts +38 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +9 -9
package/README.md
CHANGED
|
@@ -68,7 +68,7 @@ and the SDK `clash` namespace.
|
|
|
68
68
|
|
|
69
69
|
See the [ifc-lite docs](https://ifclite.dev/docs/) and the design
|
|
70
70
|
rationale in
|
|
71
|
-
[
|
|
71
|
+
[Clash-detection architecture](https://github.com/LTplus-AG/ifc-lite/blob/main/docs/architecture/clash-detection.md).
|
|
72
72
|
|
|
73
73
|
## License
|
|
74
74
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ifcx.d.ts","sourceRoot":"","sources":["../../src/adapters/ifcx.ts"],"names":[],"mappings":"AAgDA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG9D;;;;;;;GAOG;AACH,UAAU,gBAAgB;IACxB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACxC;AACD,UAAU,gBAAgB;IACxB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,OAAO,EAAE,gBAAgB,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,kCAAkC;IAClC,MAAM,EAAE,WAAW,CAAC;IACpB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,UAAU,EAAE,YAAY,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"ifcx.d.ts","sourceRoot":"","sources":["../../src/adapters/ifcx.ts"],"names":[],"mappings":"AAgDA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG9D;;;;;;;GAOG;AACH,UAAU,gBAAgB;IACxB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACxC;AACD,UAAU,gBAAgB;IACxB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,OAAO,EAAE,gBAAgB,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,kCAAkC;IAClC,MAAM,EAAE,WAAW,CAAC;IACpB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,UAAU,EAAE,YAAY,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoG9F;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,gBAAgB,EAC/B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GACrC,YAAY,CAoBd"}
|
package/dist/adapters/ifcx.js
CHANGED
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
*/
|
|
44
44
|
import { parseIfcx } from '@ifc-lite/ifcx';
|
|
45
45
|
import { makeExclusionSet, qualifiedKey } from '../exclude.js';
|
|
46
|
-
import { fromPositions } from '../math/aabb.js';
|
|
46
|
+
import { fromPositions, NonFiniteAxisError } from '../math/aabb.js';
|
|
47
47
|
import { isNonClashableTag, mergeMeshes } from './shared.js';
|
|
48
48
|
/**
|
|
49
49
|
* Parse an IFCX buffer and project its pre-tessellated meshes into
|
|
@@ -80,6 +80,9 @@ export async function elementsFromIfcx(options) {
|
|
|
80
80
|
}
|
|
81
81
|
const elements = [];
|
|
82
82
|
const byExpressId = new Map();
|
|
83
|
+
/** Entities dropped because every vertex was non-finite on some axis — see
|
|
84
|
+
* the warning below and {@link NonFiniteAxisError}'s doc (#4254). */
|
|
85
|
+
let nonFiniteBoundsSkipped = 0;
|
|
83
86
|
for (const [expressId, group] of groups) {
|
|
84
87
|
// The prim path is the durable USD identity; skip entities we cannot key.
|
|
85
88
|
// (It was present at grouping time; re-check to narrow without a cast.)
|
|
@@ -95,19 +98,44 @@ export async function elementsFromIfcx(options) {
|
|
|
95
98
|
if (isNonClashableTag(tag))
|
|
96
99
|
continue;
|
|
97
100
|
const merged = mergeMeshes(group);
|
|
101
|
+
// A corrupt mesh (every vertex non-finite on one axis) has no usable
|
|
102
|
+
// AABB — see `NonFiniteAxisError`. Skip just this entity rather than
|
|
103
|
+
// letting it in with an inverted box that would silently vanish from
|
|
104
|
+
// every later spatial query (#4254), and rather than aborting the whole
|
|
105
|
+
// clash run for one corrupt entity among many.
|
|
106
|
+
let bounds;
|
|
107
|
+
try {
|
|
108
|
+
bounds = fromPositions(merged.positions);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
if (err instanceof NonFiniteAxisError) {
|
|
112
|
+
nonFiniteBoundsSkipped += 1;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
throw err;
|
|
116
|
+
}
|
|
98
117
|
const element = {
|
|
99
118
|
key,
|
|
100
119
|
ref: refFromPath(key),
|
|
101
120
|
model: modelId,
|
|
102
121
|
tag,
|
|
103
122
|
name: resolveName(entities, expressId),
|
|
104
|
-
bounds
|
|
123
|
+
bounds,
|
|
105
124
|
positions: merged.positions,
|
|
106
125
|
indices: merged.indices,
|
|
107
126
|
};
|
|
108
127
|
elements.push(element);
|
|
109
128
|
byExpressId.set(expressId, element);
|
|
110
129
|
}
|
|
130
|
+
// Loud by construction: unlike the near-silent inverted box this replaces
|
|
131
|
+
// (#4254), a dropped entity is counted and named here rather than shipping
|
|
132
|
+
// in the result set invisible to every spatial query.
|
|
133
|
+
if (nonFiniteBoundsSkipped > 0) {
|
|
134
|
+
console.warn(`[clash/ifcx] skipped ${nonFiniteBoundsSkipped} entity(ies) in model "${modelId}": every ` +
|
|
135
|
+
'vertex was non-finite on at least one axis, so no usable AABB could be computed. These ' +
|
|
136
|
+
'entities are excluded from clash detection entirely rather than participating with a ' +
|
|
137
|
+
'corrupt bound.');
|
|
138
|
+
}
|
|
111
139
|
const exclusions = buildExclusions
|
|
112
140
|
? buildIfcxExclusions(relationships, byExpressId)
|
|
113
141
|
: makeExclusionSet();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ifcx.js","sourceRoot":"","sources":["../../src/adapters/ifcx.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAAE,SAAS,EAAiB,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"ifcx.js","sourceRoot":"","sources":["../../src/adapters/ifcx.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Void/host/assembly pair exclusions from IFC relationships, precomputed by
|
|
3
|
+
* `elementsFromStep` (`./step.ts`) and re-exported from that module's
|
|
4
|
+
* `@ifc-lite/clash/step` subpath — split out here purely to keep `step.ts`
|
|
5
|
+
* under its module-size budget. `buildStepExclusions` only ever runs against
|
|
6
|
+
* the `byExpressId` map `elementsFromStep` builds, so it stays a sibling of
|
|
7
|
+
* that function rather than a general-purpose export.
|
|
8
|
+
*/
|
|
9
|
+
import { type IfcDataStore } from '@ifc-lite/parser';
|
|
10
|
+
import type { ClashElement, ExclusionSet } from '../types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Pair-exclusions from IFC relationships. Only relationship getters
|
|
13
|
+
* (`voids`/`filledBy`/`decomposedBy`/`decomposes`) are used here; these read
|
|
14
|
+
* the relationship graph and never call `extractEntityAttributesOnDemand`, so
|
|
15
|
+
* the per-element loop stays off the AGENTS.md hot-loop anti-pattern:
|
|
16
|
+
* - host vs the filler of its opening (wall vs door/window)
|
|
17
|
+
* - element vs its own (meshed) opening
|
|
18
|
+
* - members of the same `IfcRelAggregates` assembly
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildStepExclusions(store: IfcDataStore, byExpressId: Map<number, ClashElement[]>): ExclusionSet;
|
|
21
|
+
//# sourceMappingURL=step-exclusions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-exclusions.d.ts","sourceRoot":"","sources":["../../src/adapters/step-exclusions.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE9D;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,YAAY,EACnB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,GACvC,YAAY,CAuCd"}
|
|
@@ -0,0 +1,52 @@
|
|
|
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
|
+
import { EntityNode } from '@ifc-lite/query';
|
|
5
|
+
import { makeExclusionSet, qualifiedKey } from '../exclude.js';
|
|
6
|
+
/**
|
|
7
|
+
* Pair-exclusions from IFC relationships. Only relationship getters
|
|
8
|
+
* (`voids`/`filledBy`/`decomposedBy`/`decomposes`) are used here; these read
|
|
9
|
+
* the relationship graph and never call `extractEntityAttributesOnDemand`, so
|
|
10
|
+
* the per-element loop stays off the AGENTS.md hot-loop anti-pattern:
|
|
11
|
+
* - host vs the filler of its opening (wall vs door/window)
|
|
12
|
+
* - element vs its own (meshed) opening
|
|
13
|
+
* - members of the same `IfcRelAggregates` assembly
|
|
14
|
+
*/
|
|
15
|
+
export function buildStepExclusions(store, byExpressId) {
|
|
16
|
+
const pairs = [];
|
|
17
|
+
for (const [expressId, elementsAtId] of byExpressId) {
|
|
18
|
+
const node = new EntityNode(store, expressId);
|
|
19
|
+
// A relationship is stated between EXPRESS ids, not occurrences: fan it
|
|
20
|
+
// out across every occurrence bucketed at each side (usually one element
|
|
21
|
+
// each; more than one only for a GPU-instanced expressId), so a host's
|
|
22
|
+
// void/assembly exclusions cover every physical placement of the
|
|
23
|
+
// filler/sibling, not just whichever occurrence happened to be built last.
|
|
24
|
+
const pairAll = (otherId) => {
|
|
25
|
+
const others = byExpressId.get(otherId);
|
|
26
|
+
if (!others)
|
|
27
|
+
return;
|
|
28
|
+
for (const a of elementsAtId) {
|
|
29
|
+
const ek = qualifiedKey(a.model, a.key);
|
|
30
|
+
for (const b of others) {
|
|
31
|
+
pairs.push([ek, qualifiedKey(b.model, b.key)]);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
for (const opening of node.voids()) {
|
|
36
|
+
pairAll(opening.expressId);
|
|
37
|
+
for (const filler of opening.filledBy()) {
|
|
38
|
+
pairAll(filler.expressId);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const parent = node.decomposedBy();
|
|
42
|
+
if (parent) {
|
|
43
|
+
for (const sibling of parent.decomposes()) {
|
|
44
|
+
if (sibling.expressId === expressId)
|
|
45
|
+
continue;
|
|
46
|
+
pairAll(sibling.expressId);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return makeExclusionSet(pairs);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=step-exclusions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-exclusions.js","sourceRoot":"","sources":["../../src/adapters/step-exclusions.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAY/D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG/D;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAmB,EACnB,WAAwC;IAExC,MAAM,KAAK,GAA4B,EAAE,CAAC;IAE1C,KAAK,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,IAAI,WAAW,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAE9C,wEAAwE;QACxE,yEAAyE;QACzE,uEAAuE;QACvE,iEAAiE;QACjE,2EAA2E;QAC3E,MAAM,OAAO,GAAG,CAAC,OAAe,EAAQ,EAAE;YACxC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,CAAC,MAAM;gBAAE,OAAO;YACpB,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;gBAC7B,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;gBACxC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;oBACvB,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;YACnC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC3B,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACxC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACnC,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;gBAC1C,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;oBAAE,SAAS;gBAC9C,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC"}
|
package/dist/adapters/step.d.ts
CHANGED
|
@@ -90,14 +90,5 @@ export interface StepAdapterResult {
|
|
|
90
90
|
exclusions: ExclusionSet;
|
|
91
91
|
}
|
|
92
92
|
export declare function elementsFromStep(options: StepAdapterOptions): StepAdapterResult;
|
|
93
|
-
|
|
94
|
-
* Pair-exclusions from IFC relationships. Only relationship getters
|
|
95
|
-
* (`voids`/`filledBy`/`decomposedBy`/`decomposes`) are used here; these read
|
|
96
|
-
* the relationship graph and never call `extractEntityAttributesOnDemand`, so
|
|
97
|
-
* the per-element loop stays off the AGENTS.md hot-loop anti-pattern:
|
|
98
|
-
* - host vs the filler of its opening (wall vs door/window)
|
|
99
|
-
* - element vs its own (meshed) opening
|
|
100
|
-
* - members of the same `IfcRelAggregates` assembly
|
|
101
|
-
*/
|
|
102
|
-
export declare function buildStepExclusions(store: IfcDataStore, byExpressId: Map<number, ClashElement[]>): ExclusionSet;
|
|
93
|
+
export { buildStepExclusions } from './step-exclusions.js';
|
|
103
94
|
//# sourceMappingURL=step.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../../src/adapters/step.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../../src/adapters/step.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAIpE,uFAAuF;AACvF,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;CACxD;AAMD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAuDG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+EAA+E;IAC/E,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,8DAA8D;IAC9D,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,UAAU,EAAE,YAAY,CAAC;CAC1B;AAiED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,GAAG,iBAAiB,CA8N/E;AAKD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/adapters/step.js
CHANGED
|
@@ -2,9 +2,10 @@
|
|
|
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 { EntityNode } from '@ifc-lite/query';
|
|
5
|
-
import { makeExclusionSet
|
|
6
|
-
import { fromPositions } from '../math/aabb.js';
|
|
5
|
+
import { makeExclusionSet } from '../exclude.js';
|
|
6
|
+
import { fromPositions, NonFiniteAxisError } from '../math/aabb.js';
|
|
7
7
|
import { isNonClashableTag, mergeMeshes } from './shared.js';
|
|
8
|
+
import { buildStepExclusions } from './step-exclusions.js';
|
|
8
9
|
/**
|
|
9
10
|
* Lift local-frame vertices into the model's world frame: `world = origin + local`
|
|
10
11
|
* (the inverse of the renderer's per-element local frame). Returns a fresh f32
|
|
@@ -81,6 +82,9 @@ export function elementsFromStep(options) {
|
|
|
81
82
|
const byExpressId = new Map();
|
|
82
83
|
/** Elements whose GlobalId lookup came back empty — see the check below. */
|
|
83
84
|
let missingGlobalIds = 0;
|
|
85
|
+
/** Occurrences dropped because every vertex was non-finite on some axis —
|
|
86
|
+
* see the warning below and {@link NonFiniteAxisError}'s doc (#4254). */
|
|
87
|
+
let nonFiniteBoundsSkipped = 0;
|
|
84
88
|
// Pass 1: group every mesh by its OWNING OCCURRENCE — `occurrenceKey` when
|
|
85
89
|
// present (a GPU-instanced entity's individual placement), else the bare
|
|
86
90
|
// expressId (every other mesh: at most one MeshData per expressId, so the
|
|
@@ -171,6 +175,24 @@ export function elementsFromStep(options) {
|
|
|
171
175
|
// onto one review/exclusion key. Flat meshes are unaffected (occurrenceKey
|
|
172
176
|
// absent, one bucket per expressId as before).
|
|
173
177
|
const key = occurrenceKey ? `${baseKey}:${occurrenceKey}` : baseKey;
|
|
178
|
+
// A corrupt mesh (every vertex non-finite on one axis, e.g. a NaN'd
|
|
179
|
+
// transform or a malformed source file) has no usable AABB — see
|
|
180
|
+
// `NonFiniteAxisError`. Skip just this occurrence rather than letting it
|
|
181
|
+
// in with an inverted box that would silently vanish from every later
|
|
182
|
+
// spatial query (#4254), and rather than aborting the whole clash run
|
|
183
|
+
// for one corrupt element among many.
|
|
184
|
+
let bounds;
|
|
185
|
+
try {
|
|
186
|
+
bounds = fromPositions(merged.positions, worldTransform);
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
if (err instanceof NonFiniteAxisError) {
|
|
190
|
+
nonFiniteBoundsSkipped += 1;
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
throw err;
|
|
194
|
+
}
|
|
195
|
+
// Count only occurrences that survive bounds validation and are returned.
|
|
174
196
|
if (!storedGlobalId)
|
|
175
197
|
missingGlobalIds += 1;
|
|
176
198
|
const element = {
|
|
@@ -188,7 +210,7 @@ export function elementsFromStep(options) {
|
|
|
188
210
|
tag,
|
|
189
211
|
name: storedName || undefined,
|
|
190
212
|
storey: node.storey()?.name || undefined,
|
|
191
|
-
bounds
|
|
213
|
+
bounds,
|
|
192
214
|
positions: merged.positions,
|
|
193
215
|
indices: merged.indices,
|
|
194
216
|
transform: worldTransform,
|
|
@@ -231,55 +253,22 @@ export function elementsFromStep(options) {
|
|
|
231
253
|
'with ids it does not contain — element keys, names and the void/host exclusions are ' +
|
|
232
254
|
'all degraded.');
|
|
233
255
|
}
|
|
256
|
+
// Loud by construction: unlike the near-silent inverted box this replaces
|
|
257
|
+
// (#4254), a dropped occurrence is counted and named here rather than
|
|
258
|
+
// shipping in the result set invisible to every spatial query.
|
|
259
|
+
if (nonFiniteBoundsSkipped > 0) {
|
|
260
|
+
console.warn(`[clash/step] skipped ${nonFiniteBoundsSkipped} occurrence(s) in model "${modelId}": ` +
|
|
261
|
+
'every vertex was non-finite on at least one axis after the world transform, so no ' +
|
|
262
|
+
'usable AABB could be computed. These occurrences are excluded from clash detection ' +
|
|
263
|
+
'entirely rather than participating with a corrupt bound.');
|
|
264
|
+
}
|
|
234
265
|
const exclusions = buildExclusions
|
|
235
266
|
? buildStepExclusions(store, byExpressId)
|
|
236
267
|
: makeExclusionSet();
|
|
237
268
|
return { elements, exclusions };
|
|
238
269
|
}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
* the per-element loop stays off the AGENTS.md hot-loop anti-pattern:
|
|
244
|
-
* - host vs the filler of its opening (wall vs door/window)
|
|
245
|
-
* - element vs its own (meshed) opening
|
|
246
|
-
* - members of the same `IfcRelAggregates` assembly
|
|
247
|
-
*/
|
|
248
|
-
export function buildStepExclusions(store, byExpressId) {
|
|
249
|
-
const pairs = [];
|
|
250
|
-
for (const [expressId, elementsAtId] of byExpressId) {
|
|
251
|
-
const node = new EntityNode(store, expressId);
|
|
252
|
-
// A relationship is stated between EXPRESS ids, not occurrences: fan it
|
|
253
|
-
// out across every occurrence bucketed at each side (usually one element
|
|
254
|
-
// each; more than one only for a GPU-instanced expressId), so a host's
|
|
255
|
-
// void/assembly exclusions cover every physical placement of the
|
|
256
|
-
// filler/sibling, not just whichever occurrence happened to be built last.
|
|
257
|
-
const pairAll = (otherId) => {
|
|
258
|
-
const others = byExpressId.get(otherId);
|
|
259
|
-
if (!others)
|
|
260
|
-
return;
|
|
261
|
-
for (const a of elementsAtId) {
|
|
262
|
-
const ek = qualifiedKey(a.model, a.key);
|
|
263
|
-
for (const b of others) {
|
|
264
|
-
pairs.push([ek, qualifiedKey(b.model, b.key)]);
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
};
|
|
268
|
-
for (const opening of node.voids()) {
|
|
269
|
-
pairAll(opening.expressId);
|
|
270
|
-
for (const filler of opening.filledBy()) {
|
|
271
|
-
pairAll(filler.expressId);
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
const parent = node.decomposedBy();
|
|
275
|
-
if (parent) {
|
|
276
|
-
for (const sibling of parent.decomposes()) {
|
|
277
|
-
if (sibling.expressId === expressId)
|
|
278
|
-
continue;
|
|
279
|
-
pairAll(sibling.expressId);
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
return makeExclusionSet(pairs);
|
|
284
|
-
}
|
|
270
|
+
// Pair-exclusions from IFC relationships (voids/filledBy/decomposedBy/decomposes)
|
|
271
|
+
// live in `./step-exclusions.js`, split out purely to keep this file under its
|
|
272
|
+
// module-size budget; re-exported here so `@ifc-lite/clash/step` is unchanged.
|
|
273
|
+
export { buildStepExclusions } from './step-exclusions.js';
|
|
285
274
|
//# sourceMappingURL=step.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step.js","sourceRoot":"","sources":["../../src/adapters/step.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAe/D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"step.js","sourceRoot":"","sources":["../../src/adapters/step.ts"],"names":[],"mappings":"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"}
|
package/dist/duplicates.js
CHANGED
|
@@ -323,10 +323,10 @@ export function findDuplicates(elements, options = {}) {
|
|
|
323
323
|
}
|
|
324
324
|
}
|
|
325
325
|
// The sweep key must be a TOTAL order, so it is compared, never subtracted.
|
|
326
|
-
// `a - b` returns NaN for any pair involving a non-finite minimum — NaN
|
|
327
|
-
//
|
|
328
|
-
//
|
|
329
|
-
// answers NaN violates the contract `Array.prototype.sort` requires, and V8's
|
|
326
|
+
// `a - b` returns NaN for any pair involving a non-finite minimum — a NaN or inverted
|
|
327
|
+
// (`min > max`) bound, built by hand rather than via `fromPositions` (which now throws
|
|
328
|
+
// `NonFiniteAxisError` instead — see its doc, #4254), can still reach here. A comparator
|
|
329
|
+
// that answers NaN violates the contract `Array.prototype.sort` requires, and V8's
|
|
330
330
|
// TimSort then merges runs against that answer and emits an arbitrary
|
|
331
331
|
// permutation of the WHOLE array: the sweep's eviction sees minima going
|
|
332
332
|
// backwards, drops boxes that are still live, and real duplicates elsewhere in
|
|
@@ -365,7 +365,7 @@ export function findDuplicates(elements, options = {}) {
|
|
|
365
365
|
clashes,
|
|
366
366
|
summary: summarizeClashes(clashes),
|
|
367
367
|
rulesRun: [DUPLICATES_RULE],
|
|
368
|
-
ruleCoverage: [{ rule: DUPLICATES_RULE.id, matchedA: elements.length, matchedB: null }],
|
|
368
|
+
ruleCoverage: [{ rule: DUPLICATES_RULE.id, matchedA: elements.length, matchedB: null, matchedKeysA: [...new Set(elements.map((el) => el.key))].sort(), matchedKeysB: null }],
|
|
369
369
|
settings: { tolerance: positionTolerance, excludeVoidsAndHosts: exclusions != null },
|
|
370
370
|
};
|
|
371
371
|
}
|
package/dist/duplicates.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duplicates.js","sourceRoot":"","sources":["../src/duplicates.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"duplicates.js","sourceRoot":"","sources":["../src/duplicates.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,32 @@
|
|
|
1
1
|
import { type ClashElement, type ClashResult, type ClashRule, type ClashSettings } from '../types.js';
|
|
2
2
|
import type { ClashKernel } from './kernel.js';
|
|
3
|
+
/**
|
|
4
|
+
* Thrown by {@link runClash} when a `tolerance` — either the run-level
|
|
5
|
+
* `ClashSettings.tolerance` or a per-rule `ClashRule.tolerance` — is not a
|
|
6
|
+
* finite number (`NaN`, `+Infinity`, `-Infinity`).
|
|
7
|
+
*
|
|
8
|
+
* `??` (the substitution `runClash` uses for an omitted tolerance) only
|
|
9
|
+
* triggers on `null`/`undefined`, not `NaN`, so a `NaN` tolerance — e.g. from
|
|
10
|
+
* `Number('')`/`Number('abc')` on a cleared UI input, or a unit-conversion
|
|
11
|
+
* division by zero upstream — used to sail through unchanged. It then poisons
|
|
12
|
+
* `Math.max(tolerance, rule.clearance ?? 0)` (`NaN` on any `Math.max` operand
|
|
13
|
+
* is always `NaN`), which poisons the broad-phase AABB inflation
|
|
14
|
+
* (`inflate(bounds, NaN)`), which fails every BVH overlap comparison, which
|
|
15
|
+
* yields zero candidate pairs — silently, with the run still reporting
|
|
16
|
+
* `classifyRuleCoverage() === 'clean'` because `matchedA`/`matchedB` are
|
|
17
|
+
* selector-match counts taken before any geometry ran (#4244). Rejecting the
|
|
18
|
+
* non-finite value at the door, before it can reach `Math.max`, makes that
|
|
19
|
+
* whole chain structurally unreachable rather than merely harder to trigger.
|
|
20
|
+
*
|
|
21
|
+
* A NEGATIVE finite tolerance is unaffected by this check and keeps its
|
|
22
|
+
* existing, correct behaviour: `Math.max(tolerance, clearance ?? 0)` clamps
|
|
23
|
+
* it to at least the clearance (or zero), same as before.
|
|
24
|
+
*/
|
|
25
|
+
export declare class NonFiniteToleranceError extends Error {
|
|
26
|
+
readonly source: string;
|
|
27
|
+
readonly value: number;
|
|
28
|
+
constructor(source: string, value: number);
|
|
29
|
+
}
|
|
3
30
|
/**
|
|
4
31
|
* Backend-agnostic clash orchestration: selection, exclusions, severity, stable
|
|
5
32
|
* identity, dedup, ordering and summary. The geometry (broad + narrow phase) is
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/engine-ts/orchestrator.ts"],"names":[],"mappings":"AAQA,OAAO,EAGL,KAAK,YAAY,EAEjB,KAAK,WAAW,EAChB,KAAK,SAAS,EAEd,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,YAAY,EAAE,EACxB,KAAK,EAAE,SAAS,EAAE,EAClB,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/engine-ts/orchestrator.ts"],"names":[],"mappings":"AAQA,OAAO,EAGL,KAAK,YAAY,EAEjB,KAAK,WAAW,EAChB,KAAK,SAAS,EAEd,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CAU1C;AAQD;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,YAAY,EAAE,EACxB,KAAK,EAAE,SAAS,EAAE,EAClB,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,CAAC,CAkJtB"}
|
|
@@ -6,6 +6,45 @@ import { inferClashSeverity } from '../disciplines.js';
|
|
|
6
6
|
import { isExcluded, qualifiedKey } from '../exclude.js';
|
|
7
7
|
import { summarizeClashes } from '../analysis.js';
|
|
8
8
|
import { DEFAULT_CLASH_SETTINGS, } from '../types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Thrown by {@link runClash} when a `tolerance` — either the run-level
|
|
11
|
+
* `ClashSettings.tolerance` or a per-rule `ClashRule.tolerance` — is not a
|
|
12
|
+
* finite number (`NaN`, `+Infinity`, `-Infinity`).
|
|
13
|
+
*
|
|
14
|
+
* `??` (the substitution `runClash` uses for an omitted tolerance) only
|
|
15
|
+
* triggers on `null`/`undefined`, not `NaN`, so a `NaN` tolerance — e.g. from
|
|
16
|
+
* `Number('')`/`Number('abc')` on a cleared UI input, or a unit-conversion
|
|
17
|
+
* division by zero upstream — used to sail through unchanged. It then poisons
|
|
18
|
+
* `Math.max(tolerance, rule.clearance ?? 0)` (`NaN` on any `Math.max` operand
|
|
19
|
+
* is always `NaN`), which poisons the broad-phase AABB inflation
|
|
20
|
+
* (`inflate(bounds, NaN)`), which fails every BVH overlap comparison, which
|
|
21
|
+
* yields zero candidate pairs — silently, with the run still reporting
|
|
22
|
+
* `classifyRuleCoverage() === 'clean'` because `matchedA`/`matchedB` are
|
|
23
|
+
* selector-match counts taken before any geometry ran (#4244). Rejecting the
|
|
24
|
+
* non-finite value at the door, before it can reach `Math.max`, makes that
|
|
25
|
+
* whole chain structurally unreachable rather than merely harder to trigger.
|
|
26
|
+
*
|
|
27
|
+
* A NEGATIVE finite tolerance is unaffected by this check and keeps its
|
|
28
|
+
* existing, correct behaviour: `Math.max(tolerance, clearance ?? 0)` clamps
|
|
29
|
+
* it to at least the clearance (or zero), same as before.
|
|
30
|
+
*/
|
|
31
|
+
export class NonFiniteToleranceError extends Error {
|
|
32
|
+
source;
|
|
33
|
+
value;
|
|
34
|
+
constructor(source, value) {
|
|
35
|
+
super(`runClash: ${source} is ${value} (not a finite number) — refusing to run, ` +
|
|
36
|
+
'which would silently poison the broad-phase AABB margin and report a ' +
|
|
37
|
+
'false "clean" result over zero examined geometry');
|
|
38
|
+
this.name = 'NonFiniteToleranceError';
|
|
39
|
+
this.source = source;
|
|
40
|
+
this.value = value;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function requireFiniteTolerance(source, value) {
|
|
44
|
+
if (!Number.isFinite(value)) {
|
|
45
|
+
throw new NonFiniteToleranceError(source, value);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
9
48
|
/**
|
|
10
49
|
* Backend-agnostic clash orchestration: selection, exclusions, severity, stable
|
|
11
50
|
* identity, dedup, ordering and summary. The geometry (broad + narrow phase) is
|
|
@@ -15,6 +54,7 @@ import { DEFAULT_CLASH_SETTINGS, } from '../types.js';
|
|
|
15
54
|
*/
|
|
16
55
|
export async function runClash(elements, rules, settings, kernel) {
|
|
17
56
|
const tolerance = settings.tolerance ?? DEFAULT_CLASH_SETTINGS.tolerance;
|
|
57
|
+
requireFiniteTolerance('settings.tolerance', tolerance);
|
|
18
58
|
const excludeVoidsAndHosts = settings.excludeVoidsAndHosts ?? DEFAULT_CLASH_SETTINGS.excludeVoidsAndHosts;
|
|
19
59
|
const exclusions = excludeVoidsAndHosts ? settings.exclusions : undefined;
|
|
20
60
|
const maxPairs = settings.maxCandidatePairs ?? Infinity;
|
|
@@ -44,25 +84,45 @@ export async function runClash(elements, rules, settings, kernel) {
|
|
|
44
84
|
// partition and every later stage is unaware there are two ways in.
|
|
45
85
|
const membersA = clashMemberSet(rule.membersA);
|
|
46
86
|
const membersB = clashMemberSet(rule.membersB);
|
|
87
|
+
// Durable keys of everything each side matched, for `compareClashRevisions`
|
|
88
|
+
// (revision.ts) to answer "was this SPECIFIC element re-examined?" — a
|
|
89
|
+
// count alone (`matchedA`/`matchedB`) cannot tell a narrowed selector that
|
|
90
|
+
// dropped one previously-matched element from one that kept it. Bounded by
|
|
91
|
+
// the same element set already held in memory for this run, so it costs
|
|
92
|
+
// nothing beyond the string references (deduplicated by `Set`).
|
|
93
|
+
const matchedKeysA = new Set();
|
|
94
|
+
const matchedKeysB = groupB ? new Set() : null;
|
|
47
95
|
for (let i = 0; i < elements.length; i += 1) {
|
|
48
96
|
const el = elements[i];
|
|
49
|
-
if (inClashSet(el, rule.a, membersA))
|
|
97
|
+
if (inClashSet(el, rule.a, membersA)) {
|
|
50
98
|
groupA.push(i);
|
|
51
|
-
|
|
99
|
+
matchedKeysA.add(el.key);
|
|
100
|
+
}
|
|
101
|
+
if (groupB && inClashSet(el, rule.b ?? '', membersB)) {
|
|
52
102
|
groupB.push(i);
|
|
103
|
+
matchedKeysB.add(el.key);
|
|
104
|
+
}
|
|
53
105
|
}
|
|
54
|
-
|
|
106
|
+
const coverageEntry = {
|
|
55
107
|
rule: rule.id,
|
|
56
108
|
matchedA: groupA.length,
|
|
57
109
|
matchedB: groupB ? groupB.length : null,
|
|
110
|
+
matchedKeysA: [...matchedKeysA].sort(),
|
|
111
|
+
matchedKeysB: matchedKeysB ? [...matchedKeysB].sort() : null,
|
|
58
112
|
...(membersA ? { fromMembersA: true } : {}),
|
|
59
113
|
...(membersB ? { fromMembersB: true } : {}),
|
|
60
|
-
}
|
|
114
|
+
};
|
|
115
|
+
ruleCoverage.push(coverageEntry);
|
|
61
116
|
const ruleTolerance = rule.tolerance ?? tolerance;
|
|
117
|
+
requireFiniteTolerance(`rule "${rule.id}".tolerance`, ruleTolerance);
|
|
62
118
|
settings.onProgress?.({ phase: 'broad', rule: rule.id, done: 0, total: 0 });
|
|
63
119
|
const { records, candidatesProcessed, candidatesDropped } = await kernel.detectRule(elements, groupA, groupB, rule, ruleTolerance, remaining, settings.signal, settings.onProgress
|
|
64
120
|
? (done, total) => settings.onProgress({ phase: 'narrow', rule: rule.id, done, total })
|
|
65
121
|
: undefined);
|
|
122
|
+
// Threaded onto the coverage entry already pushed above — see
|
|
123
|
+
// `ClashRuleCoverage.candidatesExamined`'s doc for why this is a
|
|
124
|
+
// diagnostic, not a coverage verdict (#4244).
|
|
125
|
+
coverageEntry.candidatesExamined = candidatesProcessed;
|
|
66
126
|
remaining = Math.max(0, remaining - candidatesProcessed);
|
|
67
127
|
droppedPairs += candidatesDropped;
|
|
68
128
|
for (const rec of records) {
|