@bldrs-ai/conway 1.536.1507 → 1.538.1511
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/compiled/examples/browser-bundled.cjs +1 -1
- package/compiled/examples/cli-bundled.cjs +109 -16
- package/compiled/examples/cli-step-bundled.cjs +1 -1
- package/compiled/examples/validator-bundled.cjs +1 -1
- package/compiled/src/compat/web-ifc/geometry_shard_coordination.test.d.ts +2 -0
- package/compiled/src/compat/web-ifc/geometry_shard_coordination.test.d.ts.map +1 -0
- package/compiled/src/compat/web-ifc/geometry_shard_coordination.test.js +236 -0
- package/compiled/src/compat/web-ifc/ifc_api.d.ts +26 -0
- package/compiled/src/compat/web-ifc/ifc_api.d.ts.map +1 -1
- package/compiled/src/compat/web-ifc/ifc_api.js +33 -0
- package/compiled/src/compat/web-ifc/ifc_api_model_passthrough.d.ts +6 -0
- package/compiled/src/compat/web-ifc/ifc_api_model_passthrough.d.ts.map +1 -1
- package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.d.ts +116 -5
- package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.d.ts.map +1 -1
- package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.js +256 -85
- package/compiled/src/ifc/geometry_dispatch.d.ts +74 -3
- package/compiled/src/ifc/geometry_dispatch.d.ts.map +1 -1
- package/compiled/src/ifc/geometry_dispatch.js +261 -5
- package/compiled/src/ifc/geometry_dispatch.test.js +147 -1
- package/compiled/src/ifc/ifc_geometry_extraction.d.ts +48 -0
- package/compiled/src/ifc/ifc_geometry_extraction.d.ts.map +1 -1
- package/compiled/src/ifc/ifc_geometry_extraction.js +124 -20
- package/compiled/src/index.d.ts +1 -1
- package/compiled/src/index.d.ts.map +1 -1
- package/compiled/src/index.js +1 -1
- package/compiled/src/version/version.js +1 -1
- package/compiled/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -30,7 +30,7 @@ var import_node_process = require("node:process");
|
|
|
30
30
|
var readline = __toESM(require("node:readline"), 1);
|
|
31
31
|
|
|
32
32
|
// compiled/src/version/version.js
|
|
33
|
-
var versionString = "Conway v1.
|
|
33
|
+
var versionString = "Conway v1.538.1511";
|
|
34
34
|
|
|
35
35
|
// compiled/dependencies/conway-geom/interface/conway_geometry.js
|
|
36
36
|
var wasmType = "";
|
|
@@ -14965,7 +14965,7 @@ ${t5.join("\n")}` : "";
|
|
|
14965
14965
|
var import_process = require("process");
|
|
14966
14966
|
|
|
14967
14967
|
// compiled/src/version/version.js
|
|
14968
|
-
var versionString = "Conway v1.
|
|
14968
|
+
var versionString = "Conway v1.538.1511";
|
|
14969
14969
|
|
|
14970
14970
|
// compiled/dependencies/conway-geom/interface/conway_geometry.js
|
|
14971
14971
|
function pThreadsAllowed() {
|
|
@@ -89228,6 +89228,7 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
|
|
|
89228
89228
|
this.deferDanglingPlacements = false;
|
|
89229
89229
|
this.freeVectorPolygonalFaces_ = [];
|
|
89230
89230
|
this.extractionMapsPrepared_ = false;
|
|
89231
|
+
this.aggregateTargetsPaged_ = false;
|
|
89231
89232
|
this.csgMemoization = !this.lowMemoryMode;
|
|
89232
89233
|
this.quietRecoverableLogging = false;
|
|
89233
89234
|
this.materials = model.materials;
|
|
@@ -93440,27 +93441,118 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
|
|
|
93440
93441
|
const targets = /* @__PURE__ */ new Set();
|
|
93441
93442
|
const productTypes = new Set(IfcProduct.query);
|
|
93442
93443
|
for (const relAggregate of this.model.types(IfcRelAggregates)) {
|
|
93444
|
+
this.addAggregateTargets_(relAggregate, targets, productTypes);
|
|
93445
|
+
}
|
|
93446
|
+
this.aggregateTargetLocalIDs_ = targets;
|
|
93447
|
+
return targets;
|
|
93448
|
+
}
|
|
93449
|
+
/**
|
|
93450
|
+
* Windowed twin of {@link aggregateTargetLocalIDs}: page each
|
|
93451
|
+
* relationship record before scanning it, so the set is COMPLETE rather
|
|
93452
|
+
* than whatever this instance's LRU happened to still hold.
|
|
93453
|
+
*
|
|
93454
|
+
* **This is a correctness fix, not a prefetch.** The sync walk reads each
|
|
93455
|
+
* `IfcRelAggregates` record's bytes, and on a windowed source those pages
|
|
93456
|
+
* are routinely gone by the first pump — the parse walked past them
|
|
93457
|
+
* hundreds of megabytes ago. The per-record catch then swallows the
|
|
93458
|
+
* non-resident read, the incomplete set is **cached for the model's
|
|
93459
|
+
* life**, and every child it failed to record stays in the per-product
|
|
93460
|
+
* worklist *as well as* in the aggregates pass. That product is then
|
|
93461
|
+
* emitted twice: once with the uncut/placeholder content the deferral
|
|
93462
|
+
* exists to suppress, and again from the aggregates pass. Measured on
|
|
93463
|
+
* `aggregate_master_voids.ifc` behind 512-byte windows: 0 targets against
|
|
93464
|
+
* a resident open's 1, and 3 demand products against 2.
|
|
93465
|
+
*
|
|
93466
|
+
* Paged in bounded waves, and the scan happens INSIDE each wave rather
|
|
93467
|
+
* than after all of them: a model with many assemblies would otherwise
|
|
93468
|
+
* need every relationship record resident at once, which is the residency
|
|
93469
|
+
* ceiling this is supposed to respect.
|
|
93470
|
+
*
|
|
93471
|
+
* A non-resident read still throws from here — after this has paged the
|
|
93472
|
+
* record, that is a defect in the paging, not a property of the file.
|
|
93473
|
+
*
|
|
93474
|
+
* @param waveSize Relationship records paged and scanned at once.
|
|
93475
|
+
* @return {Promise<Set<number>>} The same set the sync twin caches.
|
|
93476
|
+
*/
|
|
93477
|
+
async ensureAggregateTargetLocalIDs(waveSize = _IfcGeometryExtraction.AGGREGATE_TARGET_WAVE_SIZE_) {
|
|
93478
|
+
if (!this.model.isSourceExternal) {
|
|
93479
|
+
return this.aggregateTargetLocalIDs();
|
|
93480
|
+
}
|
|
93481
|
+
if (this.aggregateTargetsPaged_) {
|
|
93482
|
+
return this.aggregateTargetLocalIDs_;
|
|
93483
|
+
}
|
|
93484
|
+
const targets = /* @__PURE__ */ new Set();
|
|
93485
|
+
const productTypes = new Set(IfcProduct.query);
|
|
93486
|
+
const wave = Math.max(1, Math.floor(waveSize));
|
|
93487
|
+
let pending = [];
|
|
93488
|
+
const drain = async () => {
|
|
93489
|
+
const pinned = /* @__PURE__ */ new Set();
|
|
93443
93490
|
try {
|
|
93444
|
-
|
|
93445
|
-
|
|
93446
|
-
|
|
93447
|
-
|
|
93448
|
-
|
|
93449
|
-
|
|
93450
|
-
|
|
93451
|
-
|
|
93452
|
-
|
|
93453
|
-
|
|
93454
|
-
|
|
93455
|
-
|
|
93456
|
-
|
|
93457
|
-
|
|
93458
|
-
|
|
93491
|
+
for (const relAggregate of pending) {
|
|
93492
|
+
pinned.add(relAggregate.localID);
|
|
93493
|
+
this.model.pinByLocalID(relAggregate.localID);
|
|
93494
|
+
}
|
|
93495
|
+
await Promise.all([...pinned].map((localID) => this.model.ensureResidentByLocalID(localID)));
|
|
93496
|
+
for (const relAggregate of pending) {
|
|
93497
|
+
this.addAggregateTargets_(relAggregate, targets, productTypes, true);
|
|
93498
|
+
}
|
|
93499
|
+
} finally {
|
|
93500
|
+
this.model.releaseSourceViews(pinned);
|
|
93501
|
+
this.model.unpinLocalIDs(pinned);
|
|
93502
|
+
pending = [];
|
|
93503
|
+
}
|
|
93504
|
+
};
|
|
93505
|
+
for (const relAggregate of this.model.types(IfcRelAggregates)) {
|
|
93506
|
+
pending.push(relAggregate);
|
|
93507
|
+
if (pending.length >= wave) {
|
|
93508
|
+
await drain();
|
|
93459
93509
|
}
|
|
93460
93510
|
}
|
|
93511
|
+
if (pending.length > 0) {
|
|
93512
|
+
await drain();
|
|
93513
|
+
}
|
|
93461
93514
|
this.aggregateTargetLocalIDs_ = targets;
|
|
93515
|
+
this.aggregateTargetsPaged_ = true;
|
|
93462
93516
|
return targets;
|
|
93463
93517
|
}
|
|
93518
|
+
/**
|
|
93519
|
+
* Record one relationship's product children.
|
|
93520
|
+
*
|
|
93521
|
+
* Shared by the sync and paged walks so there is a single definition of
|
|
93522
|
+
* what an aggregate target is. Reads only this relationship's own record:
|
|
93523
|
+
* children resolve through the express map and the typeID column, so the
|
|
93524
|
+
* scan never hydrates a child product (doing so paged most of the file
|
|
93525
|
+
* during demand prep).
|
|
93526
|
+
*
|
|
93527
|
+
* @param relAggregate The relationship to scan.
|
|
93528
|
+
* @param targets Accumulator.
|
|
93529
|
+
* @param productTypes The IfcProduct type set.
|
|
93530
|
+
* @param strictResidency When set, a non-resident read propagates instead
|
|
93531
|
+
* of being tolerated — for the paged walk, which has already made the
|
|
93532
|
+
* record resident and so can only reach that error through a defect.
|
|
93533
|
+
*/
|
|
93534
|
+
addAggregateTargets_(relAggregate, targets, productTypes, strictResidency = false) {
|
|
93535
|
+
try {
|
|
93536
|
+
relAggregate.forEachReferenceInField(REL_AGGREGATES_RELATED_OFFSET, REL_AGGREGATES_RELATED_BASE, REL_AGGREGATES_RELATED_DEPTH, (expressID) => {
|
|
93537
|
+
if (expressID === void 0) {
|
|
93538
|
+
return true;
|
|
93539
|
+
}
|
|
93540
|
+
const relatedLocalID = this.model.resolveExpressID(expressID);
|
|
93541
|
+
if (relatedLocalID === void 0) {
|
|
93542
|
+
return true;
|
|
93543
|
+
}
|
|
93544
|
+
const typeID = this.model.typeIDOf(relatedLocalID);
|
|
93545
|
+
if (typeID !== void 0 && productTypes.has(typeID)) {
|
|
93546
|
+
targets.add(relatedLocalID);
|
|
93547
|
+
}
|
|
93548
|
+
return true;
|
|
93549
|
+
});
|
|
93550
|
+
} catch (error) {
|
|
93551
|
+
if (strictResidency && error instanceof StepBufferNotResidentError) {
|
|
93552
|
+
throw error;
|
|
93553
|
+
}
|
|
93554
|
+
}
|
|
93555
|
+
}
|
|
93464
93556
|
/**
|
|
93465
93557
|
* One-time extraction setup shared by the whole-model walk and the
|
|
93466
93558
|
* per-product demand path (Phase B2): linear scaling factor and the
|
|
@@ -94084,6 +94176,7 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
|
|
|
94084
94176
|
}
|
|
94085
94177
|
}
|
|
94086
94178
|
};
|
|
94179
|
+
IfcGeometryExtraction.AGGREGATE_TARGET_WAVE_SIZE_ = 512;
|
|
94087
94180
|
|
|
94088
94181
|
// compiled/src/ifc/ifc_property_extraction.js
|
|
94089
94182
|
var PropertyExtractResult;
|
|
@@ -15943,7 +15943,7 @@ var ParsingBuffer = class {
|
|
|
15943
15943
|
};
|
|
15944
15944
|
|
|
15945
15945
|
// compiled/src/version/version.js
|
|
15946
|
-
var versionString = "Conway v1.
|
|
15946
|
+
var versionString = "Conway v1.538.1511";
|
|
15947
15947
|
|
|
15948
15948
|
// compiled/dependencies/conway-geom/interface/conway_geometry.js
|
|
15949
15949
|
function pThreadsAllowed() {
|
|
@@ -944,7 +944,7 @@ var EntityTypesIfcCount = 909;
|
|
|
944
944
|
var entity_types_ifc_gen_default = EntityTypesIfc;
|
|
945
945
|
|
|
946
946
|
// compiled/src/version/version.js
|
|
947
|
-
var versionString = "Conway v1.
|
|
947
|
+
var versionString = "Conway v1.538.1511";
|
|
948
948
|
|
|
949
949
|
// compiled/dependencies/conway-geom/interface/conway_geometry.js
|
|
950
950
|
var wasmType = "";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry_shard_coordination.test.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/geometry_shard_coordination.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/* eslint-disable no-magic-numbers */
|
|
2
|
+
// A sharded model that recentres — the second of M3's two shard blockers.
|
|
3
|
+
//
|
|
4
|
+
// COORDINATE_TO_ORIGIN derives its anchor from the FIRST geometry an instance
|
|
5
|
+
// captures, so N workers starting on different products derive N frames and
|
|
6
|
+
// reassemble a model shifted between shards. SetCoordinationFrame makes the
|
|
7
|
+
// frame an input instead, so every worker applies the same one.
|
|
8
|
+
//
|
|
9
|
+
// The fixture is georeferenced (~1.6e6, ~8.2e6 m) AND spans several recentre
|
|
10
|
+
// cells, both on purpose, because a weaker one makes these tests unable to
|
|
11
|
+
// fail. Every other IFC fixture in `data/` sits at the origin, where a
|
|
12
|
+
// derived frame and a wrong one both compose to roughly zero. And a
|
|
13
|
+
// georeferenced model inside ONE cell is barely better: recentring snaps to a
|
|
14
|
+
// 1 km grid (COORDINATION_SNAP_M), so shards whose first products sit 80 m
|
|
15
|
+
// apart quantize to the same frame and agree by accident. Spreading the
|
|
16
|
+
// products across cells is what makes a per-shard anchor observable — which
|
|
17
|
+
// is exactly the condition the original refusal named.
|
|
18
|
+
import * as fs from "fs";
|
|
19
|
+
import { beforeAll, describe, expect, test } from "@jest/globals";
|
|
20
|
+
import { InMemoryStepByteStore } from "../../step/step_buffer_provider.js";
|
|
21
|
+
import { COORDINATION_SNAP_M } from "./coordination_f64.js";
|
|
22
|
+
import { IfcAPI } from "./ifc_api.js";
|
|
23
|
+
const DEFERRED_RECENTRED = {
|
|
24
|
+
COORDINATE_TO_ORIGIN: true,
|
|
25
|
+
USE_FAST_BOOLS: true,
|
|
26
|
+
DEFER_GEOMETRY: true,
|
|
27
|
+
};
|
|
28
|
+
/* A frame no derivation would produce for this model: the Z-up -> Y-up
|
|
29
|
+
* normalize with a kilometre bolted on where the georeference belongs. Used
|
|
30
|
+
* only to show that a supplied frame is not quietly ignored. */
|
|
31
|
+
const ARBITRARY_FRAME = [
|
|
32
|
+
1,
|
|
33
|
+
0,
|
|
34
|
+
0,
|
|
35
|
+
0,
|
|
36
|
+
0,
|
|
37
|
+
0,
|
|
38
|
+
-1,
|
|
39
|
+
0,
|
|
40
|
+
0,
|
|
41
|
+
1,
|
|
42
|
+
0,
|
|
43
|
+
0,
|
|
44
|
+
1000,
|
|
45
|
+
2000,
|
|
46
|
+
3000,
|
|
47
|
+
1,
|
|
48
|
+
];
|
|
49
|
+
let fixture;
|
|
50
|
+
beforeAll(() => {
|
|
51
|
+
fixture = new Uint8Array(fs.readFileSync("data/index_georeferenced_multicell.ifc"));
|
|
52
|
+
});
|
|
53
|
+
/**
|
|
54
|
+
* One model, on its own engine instance, opened the way Share opens —
|
|
55
|
+
* store-backed, windowed, deferred, recentred.
|
|
56
|
+
*
|
|
57
|
+
* A fresh IfcAPI per model rather than one shared across the file: reusing an
|
|
58
|
+
* instance for a second deferred model returns garbage native transforms
|
|
59
|
+
* today, which flush to zero and collapse every placement onto the origin
|
|
60
|
+
* (conway#537 — reproduces on main, unrelated to this change). These tests
|
|
61
|
+
* compare placement sets between models, so a shared instance would compare
|
|
62
|
+
* two sets of zeros and pass no matter what this code did.
|
|
63
|
+
*
|
|
64
|
+
* @return {Promise<object>} An initialised API and its open model.
|
|
65
|
+
*/
|
|
66
|
+
async function openIsolated() {
|
|
67
|
+
const api = new IfcAPI();
|
|
68
|
+
await api.Init();
|
|
69
|
+
const modelID = await api.OpenModelStream(new InMemoryStepByteStore(fixture), DEFERRED_RECENTRED);
|
|
70
|
+
return { api, modelID };
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Drain a model's pump, keyed by express ID.
|
|
74
|
+
*
|
|
75
|
+
* @param api The model's engine.
|
|
76
|
+
* @param modelID An open deferred model.
|
|
77
|
+
* @return {Promise<Map>} expressID -> each placement's flat transform.
|
|
78
|
+
*/
|
|
79
|
+
async function pumpPlacements(api, modelID) {
|
|
80
|
+
const placements = new Map();
|
|
81
|
+
for (;;) {
|
|
82
|
+
const { extracted, remaining } = await api.ExtractGeometryBatchAsync(modelID, 8, (mesh) => {
|
|
83
|
+
const transforms = placements.get(mesh.expressID) ?? [];
|
|
84
|
+
for (let where = 0; where < mesh.geometries.size(); ++where) {
|
|
85
|
+
transforms.push(Array.from(mesh.geometries.get(where).flatTransformation));
|
|
86
|
+
}
|
|
87
|
+
placements.set(mesh.expressID, transforms);
|
|
88
|
+
});
|
|
89
|
+
if (remaining === 0 && extracted === 0) {
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return placements;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* The frame a single unsharded instance derives for the fixture, plus the
|
|
97
|
+
* placements it produces — the reference every case below is measured
|
|
98
|
+
* against, and what a real coordinator would hand its pool.
|
|
99
|
+
*
|
|
100
|
+
* @return {Promise<object>} The derived frame and its placements.
|
|
101
|
+
*/
|
|
102
|
+
async function deriveReference() {
|
|
103
|
+
const { api, modelID } = await openIsolated();
|
|
104
|
+
const placements = await pumpPlacements(api, modelID);
|
|
105
|
+
const frame = api.GetAppliedCoordinationMatrix(modelID);
|
|
106
|
+
// Both fixture properties the tests below depend on, checked rather than
|
|
107
|
+
// trusted — an edit to the fixture that quietly lost either would otherwise
|
|
108
|
+
// leave these tests passing while measuring nothing.
|
|
109
|
+
//
|
|
110
|
+
// It recentres at all:
|
|
111
|
+
expect(Math.abs(frame[12]) + Math.abs(frame[14]))
|
|
112
|
+
.toBeGreaterThan(COORDINATION_SNAP_M);
|
|
113
|
+
// ...and it spans more than one recentre cell, so shards that derived their
|
|
114
|
+
// own anchors would land on DIFFERENT frames rather than agreeing by
|
|
115
|
+
// quantization.
|
|
116
|
+
const spans = [...placements.values()].flat().map((each) => each[12]);
|
|
117
|
+
expect(Math.max(...spans) - Math.min(...spans))
|
|
118
|
+
.toBeGreaterThan(COORDINATION_SNAP_M);
|
|
119
|
+
expect(placements.size).toBeGreaterThan(1);
|
|
120
|
+
api.CloseModel(modelID);
|
|
121
|
+
return { frame, placements };
|
|
122
|
+
}
|
|
123
|
+
describe("SetCoordinationFrame", () => {
|
|
124
|
+
test("is what lets a recentred model be sharded at all", async () => {
|
|
125
|
+
// The refusal that blocked Share specifically: its opens set
|
|
126
|
+
// COORDINATE_TO_ORIGIN, so before this seam existed no Share-shaped open
|
|
127
|
+
// could claim a shard, on any source.
|
|
128
|
+
const { api, modelID } = await openIsolated();
|
|
129
|
+
expect(() => api.SetGeometryShard(modelID, { index: 0, count: 4 }))
|
|
130
|
+
.toThrow(/SetCoordinationFrame/);
|
|
131
|
+
expect(api.SetCoordinationFrame(modelID, ARBITRARY_FRAME)).toBe(true);
|
|
132
|
+
expect(() => api.SetGeometryShard(modelID, { index: 0, count: 4 }))
|
|
133
|
+
.not.toThrow();
|
|
134
|
+
// The pump re-checks the same preconditions from scratch (the settings
|
|
135
|
+
// object belongs to the caller and can change under it), so lifting the
|
|
136
|
+
// claim-time refusal alone would still refuse at the first batch.
|
|
137
|
+
await expect(api.ExtractGeometryBatchAsync(modelID, 4))
|
|
138
|
+
.resolves.toBeDefined();
|
|
139
|
+
api.CloseModel(modelID);
|
|
140
|
+
}, 240000);
|
|
141
|
+
test("applies the frame it is given, exactly", async () => {
|
|
142
|
+
// The coordinator's real workflow: derive once, hand the frame out.
|
|
143
|
+
// Supplying an instance the frame another instance derived must place
|
|
144
|
+
// identically to that instance — that is what makes N workers agree.
|
|
145
|
+
const reference = await deriveReference();
|
|
146
|
+
const supplied = await openIsolated();
|
|
147
|
+
supplied.api.SetCoordinationFrame(supplied.modelID, reference.frame);
|
|
148
|
+
const placements = await pumpPlacements(supplied.api, supplied.modelID);
|
|
149
|
+
expect(supplied.api.GetAppliedCoordinationMatrix(supplied.modelID))
|
|
150
|
+
.toEqual(reference.frame);
|
|
151
|
+
expect(placements.size).toBe(reference.placements.size);
|
|
152
|
+
for (const [expressID, transforms] of reference.placements) {
|
|
153
|
+
expect(placements.get(expressID)).toEqual(transforms);
|
|
154
|
+
}
|
|
155
|
+
supplied.api.CloseModel(supplied.modelID);
|
|
156
|
+
// And a DIFFERENT frame must move the model, or the equality above would
|
|
157
|
+
// hold just as well for an implementation that dropped the frame on the
|
|
158
|
+
// floor and derived its own.
|
|
159
|
+
const arbitrary = await openIsolated();
|
|
160
|
+
arbitrary.api.SetCoordinationFrame(arbitrary.modelID, ARBITRARY_FRAME);
|
|
161
|
+
const moved = await pumpPlacements(arbitrary.api, arbitrary.modelID);
|
|
162
|
+
for (const [expressID, transforms] of reference.placements) {
|
|
163
|
+
expect(moved.get(expressID)).not.toEqual(transforms);
|
|
164
|
+
}
|
|
165
|
+
arbitrary.api.CloseModel(arbitrary.modelID);
|
|
166
|
+
}, 240000);
|
|
167
|
+
test("shards under one frame union to exactly the single instance", async () => {
|
|
168
|
+
// M3's exit condition for this half: recentring ON, sharded, windowed
|
|
169
|
+
// — Share's own open settings — and the union is the whole model with
|
|
170
|
+
// nothing duplicated, dropped, or shifted between shards.
|
|
171
|
+
const reference = await deriveReference();
|
|
172
|
+
const shardCount = 3;
|
|
173
|
+
const union = new Map();
|
|
174
|
+
for (let index = 0; index < shardCount; ++index) {
|
|
175
|
+
const shard = await openIsolated();
|
|
176
|
+
shard.api.SetCoordinationFrame(shard.modelID, reference.frame);
|
|
177
|
+
shard.api.SetGeometryShard(shard.modelID, { index, count: shardCount });
|
|
178
|
+
for (const [expressID, transforms] of await pumpPlacements(shard.api, shard.modelID)) {
|
|
179
|
+
// A key already present means two shards claimed one product —
|
|
180
|
+
// the duplication half of a bad partition, which comparing
|
|
181
|
+
// merged sets at the end would hide.
|
|
182
|
+
expect(union.has(expressID)).toBe(false);
|
|
183
|
+
union.set(expressID, transforms);
|
|
184
|
+
}
|
|
185
|
+
shard.api.CloseModel(shard.modelID);
|
|
186
|
+
}
|
|
187
|
+
expect(union.size).toBe(reference.placements.size);
|
|
188
|
+
for (const [expressID, transforms] of reference.placements) {
|
|
189
|
+
expect(union.get(expressID)).toEqual(transforms);
|
|
190
|
+
}
|
|
191
|
+
}, 240000);
|
|
192
|
+
test("can be cleared, handing the model back to deriving", async () => {
|
|
193
|
+
// The undefined-matrix arm, which is the coordinator's way out: a pool
|
|
194
|
+
// that decides not to shard after all should not be stuck in a frame it
|
|
195
|
+
// supplied for shards that will never exist.
|
|
196
|
+
const { api, modelID } = await openIsolated();
|
|
197
|
+
api.SetCoordinationFrame(modelID, ARBITRARY_FRAME);
|
|
198
|
+
api.SetCoordinationFrame(modelID, void 0);
|
|
199
|
+
// The claim refusal is back, so the supplied-frame flag really cleared
|
|
200
|
+
// rather than merely the matrix.
|
|
201
|
+
expect(() => api.SetGeometryShard(modelID, { index: 0, count: 2 }))
|
|
202
|
+
.toThrow(/SetCoordinationFrame/);
|
|
203
|
+
await pumpPlacements(api, modelID);
|
|
204
|
+
// ...and the model derived its own frame, so the adopted one cleared too.
|
|
205
|
+
const derived = api.GetAppliedCoordinationMatrix(modelID);
|
|
206
|
+
expect(derived).not.toEqual(ARBITRARY_FRAME);
|
|
207
|
+
expect(Math.abs(derived[12]) + Math.abs(derived[14]))
|
|
208
|
+
.toBeGreaterThan(COORDINATION_SNAP_M);
|
|
209
|
+
api.CloseModel(modelID);
|
|
210
|
+
}, 240000);
|
|
211
|
+
test("refuses a frame it cannot honour", async () => {
|
|
212
|
+
const { api, modelID } = await openIsolated();
|
|
213
|
+
expect(() => api.SetCoordinationFrame(modelID, [1, 2, 3]))
|
|
214
|
+
.toThrow(/column-major mat4/);
|
|
215
|
+
expect(() => api.SetCoordinationFrame(modelID, [...ARBITRARY_FRAME.slice(0, 15), NaN]))
|
|
216
|
+
.toThrow(/column-major mat4/);
|
|
217
|
+
api.SetCoordinationFrame(modelID, ARBITRARY_FRAME);
|
|
218
|
+
await api.ExtractGeometryBatchAsync(modelID, 4);
|
|
219
|
+
// Too late: placements already emitted carry the frame in force when they
|
|
220
|
+
// were captured and are never re-placed, so a second frame would leave
|
|
221
|
+
// one model in two coordinate systems.
|
|
222
|
+
expect(() => api.SetCoordinationFrame(modelID, ARBITRARY_FRAME))
|
|
223
|
+
.toThrow(/before the first ExtractGeometryBatch/);
|
|
224
|
+
api.CloseModel(modelID);
|
|
225
|
+
}, 240000);
|
|
226
|
+
test("refuses on a classic open, which has already placed everything", async () => {
|
|
227
|
+
const api = new IfcAPI();
|
|
228
|
+
await api.Init();
|
|
229
|
+
const modelID = await api.OpenModelStream(new InMemoryStepByteStore(fixture), { COORDINATE_TO_ORIGIN: true, USE_FAST_BOOLS: true });
|
|
230
|
+
// Same shape as SetGeometryShard's DEFER_GEOMETRY refusal: a frame
|
|
231
|
+
// supplied now would be accepted and then ignored.
|
|
232
|
+
expect(() => api.SetCoordinationFrame(modelID, ARBITRARY_FRAME))
|
|
233
|
+
.toThrow(/DEFER_GEOMETRY/);
|
|
234
|
+
api.CloseModel(modelID);
|
|
235
|
+
}, 240000);
|
|
236
|
+
});
|
|
@@ -482,6 +482,10 @@ export declare class IfcAPI {
|
|
|
482
482
|
* first ExtractGeometryBatch — after that the worklists exist and narrowing
|
|
483
483
|
* them would drop products already reported as pending, so it throws.
|
|
484
484
|
*
|
|
485
|
+
* **Order matters against {@link SetCoordinationFrame}.** A model opened
|
|
486
|
+
* with COORDINATE_TO_ORIGIN is refused here unless a frame has already
|
|
487
|
+
* been supplied, so supply the frame first. The refusal names it.
|
|
488
|
+
*
|
|
485
489
|
* @param modelID handle from a DEFER_GEOMETRY open
|
|
486
490
|
* @param shard `{index, count}`, or omitted for the whole model
|
|
487
491
|
* @return {boolean} false for unknown models and for passthroughs with no
|
|
@@ -491,6 +495,28 @@ export declare class IfcAPI {
|
|
|
491
495
|
index: number;
|
|
492
496
|
count: number;
|
|
493
497
|
}): boolean;
|
|
498
|
+
/**
|
|
499
|
+
* Conway extension (M3): supply the recentre frame a deferred model
|
|
500
|
+
* applies, instead of letting it derive one from its own first geometry.
|
|
501
|
+
*
|
|
502
|
+
* This is what makes COORDINATE_TO_ORIGIN and {@link SetGeometryShard}
|
|
503
|
+
* combinable. A derived frame is anchored on whichever product the
|
|
504
|
+
* instance extracts first, so N workers derive N frames and a model
|
|
505
|
+
* spanning more than one recentre cell reassembles with its shards offset
|
|
506
|
+
* by whole cells — individually plausible placements, a wrong picture.
|
|
507
|
+
* One frame handed to every worker removes the disagreement at the source.
|
|
508
|
+
*
|
|
509
|
+
* Typical use: the coordinator opens once (its parse-time preview channel
|
|
510
|
+
* derives a frame), reads it back with {@link GetAppliedCoordinationMatrix}, and
|
|
511
|
+
* passes it to every worker before their first batch.
|
|
512
|
+
*
|
|
513
|
+
* @param modelID handle from a DEFER_GEOMETRY open
|
|
514
|
+
* @param matrix column-major mat4 of 16 finite numbers, or omitted to drop
|
|
515
|
+
* a previously supplied frame
|
|
516
|
+
* @return {boolean} false for unknown models and for passthroughs with no
|
|
517
|
+
* deferred pump (AP214/STEP), which have no frame to supply
|
|
518
|
+
*/
|
|
519
|
+
SetCoordinationFrame(modelID: number, matrix?: number[]): boolean;
|
|
494
520
|
ExtractGeometryBatch(modelID: number, batchSize: number, meshCallback?: (mesh: FlatMesh) => void): {
|
|
495
521
|
extracted: number;
|
|
496
522
|
remaining: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ifc_api.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/ifc_api.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ifc_api.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/ifc_api.ts"],"names":[],"mappings":"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"}
|
|
@@ -669,6 +669,10 @@ export class IfcAPI {
|
|
|
669
669
|
* first ExtractGeometryBatch — after that the worklists exist and narrowing
|
|
670
670
|
* them would drop products already reported as pending, so it throws.
|
|
671
671
|
*
|
|
672
|
+
* **Order matters against {@link SetCoordinationFrame}.** A model opened
|
|
673
|
+
* with COORDINATE_TO_ORIGIN is refused here unless a frame has already
|
|
674
|
+
* been supplied, so supply the frame first. The refusal names it.
|
|
675
|
+
*
|
|
672
676
|
* @param modelID handle from a DEFER_GEOMETRY open
|
|
673
677
|
* @param shard `{index, count}`, or omitted for the whole model
|
|
674
678
|
* @return {boolean} false for unknown models and for passthroughs with no
|
|
@@ -682,6 +686,35 @@ export class IfcAPI {
|
|
|
682
686
|
result.setGeometryShard(shard);
|
|
683
687
|
return true;
|
|
684
688
|
}
|
|
689
|
+
/**
|
|
690
|
+
* Conway extension (M3): supply the recentre frame a deferred model
|
|
691
|
+
* applies, instead of letting it derive one from its own first geometry.
|
|
692
|
+
*
|
|
693
|
+
* This is what makes COORDINATE_TO_ORIGIN and {@link SetGeometryShard}
|
|
694
|
+
* combinable. A derived frame is anchored on whichever product the
|
|
695
|
+
* instance extracts first, so N workers derive N frames and a model
|
|
696
|
+
* spanning more than one recentre cell reassembles with its shards offset
|
|
697
|
+
* by whole cells — individually plausible placements, a wrong picture.
|
|
698
|
+
* One frame handed to every worker removes the disagreement at the source.
|
|
699
|
+
*
|
|
700
|
+
* Typical use: the coordinator opens once (its parse-time preview channel
|
|
701
|
+
* derives a frame), reads it back with {@link GetAppliedCoordinationMatrix}, and
|
|
702
|
+
* passes it to every worker before their first batch.
|
|
703
|
+
*
|
|
704
|
+
* @param modelID handle from a DEFER_GEOMETRY open
|
|
705
|
+
* @param matrix column-major mat4 of 16 finite numbers, or omitted to drop
|
|
706
|
+
* a previously supplied frame
|
|
707
|
+
* @return {boolean} false for unknown models and for passthroughs with no
|
|
708
|
+
* deferred pump (AP214/STEP), which have no frame to supply
|
|
709
|
+
*/
|
|
710
|
+
SetCoordinationFrame(modelID, matrix) {
|
|
711
|
+
const result = this.models.get(modelID);
|
|
712
|
+
if (result?.setCoordinationFrame === void 0) {
|
|
713
|
+
return false;
|
|
714
|
+
}
|
|
715
|
+
result.setCoordinationFrame(matrix);
|
|
716
|
+
return true;
|
|
717
|
+
}
|
|
685
718
|
ExtractGeometryBatch(modelID, batchSize, meshCallback) {
|
|
686
719
|
const result = this.models.get(modelID);
|
|
687
720
|
if (result?.extractGeometryBatch === void 0) {
|
|
@@ -25,6 +25,12 @@ export interface IfcApiModelPassthrough {
|
|
|
25
25
|
index: number;
|
|
26
26
|
count: number;
|
|
27
27
|
}): void;
|
|
28
|
+
/**
|
|
29
|
+
* Supply the recentre frame instead of deriving one (conway extension,
|
|
30
|
+
* M3) — see IfcAPI.SetCoordinationFrame. Optional: passthroughs with no
|
|
31
|
+
* deferred pump (AP214/STEP) have no frame to supply.
|
|
32
|
+
*/
|
|
33
|
+
setCoordinationFrame?(matrix?: number[]): void;
|
|
28
34
|
/**
|
|
29
35
|
* Set the resident-geometry budget in bytes (conway extension, M3) —
|
|
30
36
|
* see IfcAPI.SetGeometryBudget. Optional so non-IFC passthroughs, whose
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ifc_api_model_passthrough.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/ifc_api_model_passthrough.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ifc_api_model_passthrough.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/ifc_api_model_passthrough.ts"],"names":[],"mappings":"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"}
|