@ifc-lite/viewer 1.19.0 → 1.21.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/.turbo/turbo-build.log +59 -43
- package/.turbo/turbo-typecheck.log +1 -1
- package/CHANGELOG.md +496 -0
- package/dist/assets/basketViewActivator-Bzw51jhm.js +71 -0
- package/dist/assets/{bcf-DOG9_WPX.js → bcf-4K724hw0.js} +18 -18
- package/dist/assets/decode-worker-t2EGKAxO.js +1708 -0
- package/dist/assets/drawing-2d-Bjy8YPrg.js +257 -0
- package/dist/assets/exporters-u0sz2Upj.js +259119 -0
- package/dist/assets/geometry-controller.worker-NH8pZmrU.js +7 -0
- package/dist/assets/geometry.worker-Bp4rW_R1.js +1 -0
- package/dist/assets/ids-B7AXEv7h.js +4067 -0
- package/dist/assets/ifc-lite-DfZHk36-.js +7 -0
- package/dist/assets/ifc-lite_bg-DlKs5-yM.wasm +0 -0
- package/dist/assets/ifc-lite_bg-PqmRe3Ph.wasm +0 -0
- package/dist/assets/index-CSWgTe1s.css +1 -0
- package/dist/assets/{index-BOi3BuUI.js → index-DVNSvEMh.js} +49877 -28410
- package/dist/assets/laz-perf-Cvr_Lepg.js +1 -0
- package/dist/assets/laz-perf-DnSyzVYH.wasm +0 -0
- package/dist/assets/{native-bridge-CpBeOPQa.js → native-bridge-BiD01jI9.js} +2 -2
- package/dist/assets/parser.worker-Bnbrl6gy.js +182 -0
- package/dist/assets/{sandbox-Baez7n-t.js → sandbox-DPD1ROr0.js} +548 -530
- package/dist/assets/{server-client-BB6cMAXE.js → server-client-DP8fMPY9.js} +1 -1
- package/dist/assets/three-CDRZThFA.js +4057 -0
- package/dist/assets/{wasm-bridge-CAYCUHbE.js → wasm-bridge-CErti6zX.js} +1 -1
- package/dist/assets/workerHelpers-CBbWSJmd.js +36 -0
- package/dist/index.html +10 -9
- package/dist/samples/building-architecture.ifc +453 -0
- package/dist/samples/hello-wall.ifc +1054 -0
- package/dist/samples/infra-bridge.ifc +962 -0
- package/index.html +1 -1
- package/package.json +15 -10
- package/public/samples/building-architecture.ifc +453 -0
- package/public/samples/hello-wall.ifc +1054 -0
- package/public/samples/infra-bridge.ifc +962 -0
- package/src/App.tsx +37 -3
- package/src/components/mcp/HeroScene.tsx +876 -0
- package/src/components/mcp/McpLanding.tsx +1318 -0
- package/src/components/mcp/McpPlayground.tsx +524 -0
- package/src/components/mcp/PlaygroundChat.tsx +1097 -0
- package/src/components/mcp/PlaygroundViewer.tsx +815 -0
- package/src/components/mcp/README.md +171 -0
- package/src/components/mcp/data.ts +659 -0
- package/src/components/mcp/playground-dispatcher.ts +1649 -0
- package/src/components/mcp/playground-files.ts +107 -0
- package/src/components/mcp/playground-uploads.ts +122 -0
- package/src/components/mcp/types.ts +65 -0
- package/src/components/mcp/use-mcp-page.ts +109 -0
- package/src/components/viewer/BasketPresentationDock.tsx +3 -0
- package/src/components/viewer/CesiumOverlay.tsx +165 -120
- package/src/components/viewer/DeviationPanel.tsx +172 -0
- package/src/components/viewer/HierarchyPanel.tsx +29 -3
- package/src/components/viewer/HoverTooltip.tsx +5 -0
- package/src/components/viewer/IDSAuditSummary.tsx +389 -0
- package/src/components/viewer/IDSPanel.tsx +80 -26
- package/src/components/viewer/MainToolbar.tsx +79 -7
- package/src/components/viewer/MergeLayersBanner.tsx +108 -0
- package/src/components/viewer/MobileToolbar.tsx +326 -0
- package/src/components/viewer/PointCloudClasses.tsx +111 -0
- package/src/components/viewer/PointCloudLegend.tsx +119 -0
- package/src/components/viewer/PointCloudPanel.tsx +52 -1
- package/src/components/viewer/PropertiesPanel.tsx +37 -6
- package/src/components/viewer/RectSelectionOverlay.tsx +48 -0
- package/src/components/viewer/StatusBar.tsx +14 -0
- package/src/components/viewer/ViewerLayout.tsx +288 -95
- package/src/components/viewer/Viewport.tsx +86 -18
- package/src/components/viewer/ViewportContainer.tsx +60 -15
- package/src/components/viewer/ViewportOverlays.tsx +41 -26
- package/src/components/viewer/mouseHandlerTypes.ts +22 -0
- package/src/components/viewer/properties/GeoreferencingPanel.tsx +77 -8
- package/src/components/viewer/properties/MaterialCard.tsx +2 -2
- package/src/components/viewer/selectionHandlers.ts +41 -0
- package/src/components/viewer/tools/SectionPanel.tsx +181 -24
- package/src/components/viewer/tools/SectionVisualization.tsx +384 -3
- package/src/components/viewer/useAnimationLoop.ts +22 -0
- package/src/components/viewer/useMouseControls.ts +296 -3
- package/src/components/viewer/usePointCloudSync.ts +8 -1
- package/src/components/viewer/useRenderUpdates.ts +21 -1
- package/src/components/viewer/useTouchControls.ts +100 -41
- package/src/generated/mcp-catalog.json +82 -0
- package/src/hooks/federationLoadGate.test.ts +90 -0
- package/src/hooks/federationLoadGate.ts +127 -0
- package/src/hooks/ids/idsDataAccessor.ts +11 -259
- package/src/hooks/ingest/pointCloudIngest.ts +127 -16
- package/src/hooks/useDrawingGeneration.ts +81 -8
- package/src/hooks/useIDS.ts +90 -10
- package/src/hooks/useIfcFederation.ts +94 -16
- package/src/hooks/useIfcLoader.ts +289 -64
- package/src/hooks/useViewerSelectors.ts +10 -0
- package/src/lib/geo/cesium-bridge.ts +84 -67
- package/src/lib/geo/clamp-anchor.test.ts +80 -0
- package/src/lib/geo/clamp-anchor.ts +57 -0
- package/src/lib/geo/effective-georef.test.ts +79 -1
- package/src/lib/geo/effective-georef.ts +83 -0
- package/src/lib/geo/reproject.ts +26 -13
- package/src/lib/geo/terrain-elevation.ts +166 -0
- package/src/lib/lens/adapter.ts +1 -1
- package/src/lib/llm/context-builder.ts +1 -1
- package/src/lib/perf/memoryAccounting.test.ts +92 -0
- package/src/lib/perf/memoryAccounting.ts +235 -0
- package/src/sdk/adapters/mutation-view.ts +1 -1
- package/src/store/constants.ts +39 -2
- package/src/store/index.ts +6 -1
- package/src/store/slices/cesiumSlice.ts +1 -1
- package/src/store/slices/idsSlice.ts +24 -0
- package/src/store/slices/loadingSlice.ts +12 -0
- package/src/store/slices/pointCloudSlice.ts +72 -1
- package/src/store/slices/sectionSlice.test.ts +590 -1
- package/src/store/slices/sectionSlice.ts +344 -17
- package/src/store/slices/uiSlice.merge-layers.test.ts +217 -0
- package/src/store/slices/uiSlice.ts +60 -2
- package/src/store/types.ts +42 -0
- package/src/store.ts +13 -0
- package/src/utils/acquireFileBuffer.test.ts +231 -0
- package/src/utils/acquireFileBuffer.ts +128 -0
- package/src/utils/ifcConfig.ts +24 -0
- package/src/utils/nativeSpatialDataStore.ts +20 -2
- package/src/utils/spatialHierarchy.test.ts +116 -0
- package/src/utils/spatialHierarchy.ts +23 -0
- package/tailwind.config.js +5 -0
- package/tsconfig.json +1 -0
- package/vite.config.ts +12 -0
- package/dist/assets/basketViewActivator-RZy5c3Td.js +0 -1
- package/dist/assets/decode-worker-Collf_X_.js +0 -1320
- package/dist/assets/drawing-2d-DoxKMqbO.js +0 -257
- package/dist/assets/exporters-BraHBeoi.js +0 -81583
- package/dist/assets/geometry.worker-DQEZB2rB.js +0 -1
- package/dist/assets/ids-DQ5jY0E8.js +0 -1
- package/dist/assets/ifc-lite_bg-4yUkDRD8.wasm +0 -0
- package/dist/assets/index-0XpVr_S5.css +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,501 @@
|
|
|
1
1
|
# @ifc-lite/viewer
|
|
2
2
|
|
|
3
|
+
## 1.21.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#650](https://github.com/louistrue/ifc-lite/pull/650) [`2ff772d`](https://github.com/louistrue/ifc-lite/commit/2ff772d0174f8cd6657f7e4090e15bc7744e8158) Thanks [@louistrue](https://github.com/louistrue)! - Arbitrary-normal section planes with face-pick (Bonsai-style) and a
|
|
8
|
+
properly-rendered cap on tilted planes (#243). Click any face in the
|
|
9
|
+
section tool's "Pick" mode to cut through it; the kept half-space
|
|
10
|
+
defaults to the side facing the camera. The cardinal "Down / Front /
|
|
11
|
+
Side" presets are unchanged.
|
|
12
|
+
|
|
13
|
+
Renderer:
|
|
14
|
+
|
|
15
|
+
- New `planeBasis(normal)` + `nearestCardinalAxis(normal)` exports
|
|
16
|
+
derive a deterministic in-plane basis used by both the cap renderer
|
|
17
|
+
and the 2D cutter — without a single shared derivation the cap hatch
|
|
18
|
+
rotated when state was reconstructed.
|
|
19
|
+
- `SectionPlaneRenderOptions` and `SectionPlane` gain optional
|
|
20
|
+
`normal` + `distance` fields. When set, the shader clips on that
|
|
21
|
+
plane verbatim (no axis mapping, no building-rotation, no
|
|
22
|
+
position-percentage math) and the gizmo renders as a violet quad
|
|
23
|
+
oriented from `planeBasis(normal)`.
|
|
24
|
+
- `Section2DOverlayRenderer.uploadDrawing` accepts an optional
|
|
25
|
+
`customPlane = { origin, tangent, bitangent }`. When supplied it
|
|
26
|
+
replaces the cardinal-axis 2D→3D coordinate swap with
|
|
27
|
+
`origin + tangent·x + bitangent·y`, so the cap silhouette lands
|
|
28
|
+
exactly on the tilted plane (the bug PR #581 hid by suppressing the
|
|
29
|
+
cap entirely for non-cardinal planes).
|
|
30
|
+
|
|
31
|
+
Drawing-2d:
|
|
32
|
+
|
|
33
|
+
- `SectionPlaneConfig` gains an optional `customPlane`. `SectionCutter`
|
|
34
|
+
uses it verbatim for the plane equation and projects intersections
|
|
35
|
+
to 2D via `(dot(p − origin, tangent), dot(p − origin, bitangent))`,
|
|
36
|
+
matching the cap renderer's lift exactly.
|
|
37
|
+
- `DrawingGenerator` now rebuilds the CPU cutter on each `generate()`
|
|
38
|
+
call so a switch from cardinal to custom (or between custom planes)
|
|
39
|
+
takes effect immediately.
|
|
40
|
+
|
|
41
|
+
Tests: 11 new viewer tests covering normalisation, sign-preserving
|
|
42
|
+
cardinal mapping, basis orthonormality, half-space flip, slice
|
|
43
|
+
clearing on cardinal preset, and degenerate-normal handling. 6 new
|
|
44
|
+
renderer tests covering basis derivation across cardinal axes,
|
|
45
|
+
near-axis tilts, and the +Y / −Y reference-axis boundary.
|
|
46
|
+
|
|
47
|
+
### Patch Changes
|
|
48
|
+
|
|
49
|
+
- Updated dependencies [[`2ff772d`](https://github.com/louistrue/ifc-lite/commit/2ff772d0174f8cd6657f7e4090e15bc7744e8158)]:
|
|
50
|
+
- @ifc-lite/renderer@1.20.0
|
|
51
|
+
- @ifc-lite/drawing-2d@1.16.0
|
|
52
|
+
|
|
53
|
+
## 1.20.0
|
|
54
|
+
|
|
55
|
+
### Minor Changes
|
|
56
|
+
|
|
57
|
+
- [#614](https://github.com/louistrue/ifc-lite/pull/614) [`7efc878`](https://github.com/louistrue/ifc-lite/commit/7efc8783314559b674509131f1e203ae7c1fda8e) Thanks [@louistrue](https://github.com/louistrue)! - Per-class visibility toggles for ASPRS-classified point clouds.
|
|
58
|
+
|
|
59
|
+
A new "Classes" section in the point cloud panel exposes a checkbox
|
|
60
|
+
list of every LAS 1.4 standard class (Ground, Vegetation, Building,
|
|
61
|
+
Water, Wires, Bridge deck, ...). Toggling a class hides every point
|
|
62
|
+
with that classification. Works in any colour mode; the swatch
|
|
63
|
+
colours mirror the splat shader's classification palette so the UI
|
|
64
|
+
matches what's on screen.
|
|
65
|
+
|
|
66
|
+
Implementation:
|
|
67
|
+
|
|
68
|
+
- New `pointCloudClassMask: number` (u32 bitmask, default
|
|
69
|
+
`0xFFFFFFFF`) on the point cloud slice. `togglePointCloudClass(id)`
|
|
70
|
+
flips a single bit; `setPointCloudClassMask(mask)` replaces all 32.
|
|
71
|
+
- `PointCloudRenderOptions.classMask` plumbed through the renderer.
|
|
72
|
+
Stored in uniform slot `flags.w` (was unused).
|
|
73
|
+
- Splat shader checks `(flags.w >> classId) & 1` per vertex; hidden
|
|
74
|
+
classes get a degenerate `clipPos = vec4(0, 0, -2, 1)` so they're
|
|
75
|
+
culled before rasterisation rather than wasted on a fragment-stage
|
|
76
|
+
discard.
|
|
77
|
+
- New `PointCloudClasses` component in the panel renders a
|
|
78
|
+
`<details>` collapsible with "Show all" + per-class toggles. A
|
|
79
|
+
badge surfaces "N of 32 visible" when not all are on.
|
|
80
|
+
- `usePointCloudSync` forwards the mask to
|
|
81
|
+
`setPointCloudOptions({ classMask })`.
|
|
82
|
+
|
|
83
|
+
Class ids ≥32 always show — the mask only covers the standard
|
|
84
|
+
range. Custom-labelled scans need a richer UI (deferred).
|
|
85
|
+
|
|
86
|
+
- [#614](https://github.com/louistrue/ifc-lite/pull/614) [`7efc878`](https://github.com/louistrue/ifc-lite/commit/7efc8783314559b674509131f1e203ae7c1fda8e) Thanks [@louistrue](https://github.com/louistrue)! - BIM ↔ scan deviation heatmap — GPU compute pipeline that colours each
|
|
87
|
+
scan point by signed distance to the nearest mesh surface. Works with
|
|
88
|
+
every IFC ingest path (STEP / IFCx / GLB / federated) and with every
|
|
89
|
+
point cloud format (inline IFCx + streamed LAS / LAZ / PLY / PCD / E57
|
|
90
|
+
/ PTS / XYZ — anywhere `Scene.forEachMeshData` reaches and any node
|
|
91
|
+
the splat pipeline already renders).
|
|
92
|
+
|
|
93
|
+
Pipeline:
|
|
94
|
+
|
|
95
|
+
1. **Per-triangle BVH** built from `Scene.forEachMeshData()` —
|
|
96
|
+
reaches every CPU-side `MeshData` regardless of source. Median
|
|
97
|
+
split along longest axis, max 16 tris per leaf, flattened to a
|
|
98
|
+
`Float32Array` of 32-byte nodes during the build (no second
|
|
99
|
+
pass).
|
|
100
|
+
2. **Two GPU storage buffers** — nodes + triangles — uploaded once
|
|
101
|
+
per mesh-set change. Cached by a `(meshCount, totalPositions)`
|
|
102
|
+
fingerprint so re-running deviation against the same model is a
|
|
103
|
+
pure dispatch.
|
|
104
|
+
3. **Compute shader** with stack-based BVH descent (workgroup-size
|
|
105
|
+
64). Per point: descend BVH pruning by squared point-to-AABB
|
|
106
|
+
distance, run Ericson §5.1.5 closest-point-on-triangle on every
|
|
107
|
+
leaf candidate, output signed distance via the closest face's
|
|
108
|
+
precomputed normal.
|
|
109
|
+
4. **Per-chunk deviation buffer** allocated alongside the splat
|
|
110
|
+
vertex buffer (`STORAGE | VERTEX | COPY_DST`, 4 bytes per point,
|
|
111
|
+
zero-initialised). Compute reads the vertex buffer's positions
|
|
112
|
+
directly — no CPU copy of streamed clouds needed.
|
|
113
|
+
5. **Splat shader** gains a 2nd vertex buffer (location 4 = `f32`
|
|
114
|
+
deviation), a new `deviation` color mode, and a diverging
|
|
115
|
+
blue → white → red `deviation_ramp`. Uniform block grows by 16
|
|
116
|
+
bytes (new `deviationRange: vec4<f32>` slot for centre + half-
|
|
117
|
+
range), `POINT_UNIFORM_SIZE` 208 → 224.
|
|
118
|
+
6. **Public API** — `Renderer.computeDeviations({ maxRange?,
|
|
119
|
+
forceRebuild? })` returns `{ bvhTriangles, bvhNodes,
|
|
120
|
+
chunksProcessed, pointsProcessed, bounds, suggestedHalfRange }`.
|
|
121
|
+
Awaits `queue.onSubmittedWorkDone` so callers see populated
|
|
122
|
+
buffers when the promise resolves.
|
|
123
|
+
7. **UI** — new `DeviationPanel` inside `PointCloudPanel`. Compute
|
|
124
|
+
button (gated on `triangleCount > 0`), live progress + duration
|
|
125
|
+
readout, range slider in millimetres (1 mm to 1 m), inline
|
|
126
|
+
blue-white-red legend. Auto-suggests a half-range from the BVH
|
|
127
|
+
bbox (±max-extent / 1000) and auto-switches the colour mode to
|
|
128
|
+
`deviation` on success.
|
|
129
|
+
8. **Slice** — `pointCloudColorMode` gains `'deviation'`, plus
|
|
130
|
+
`pointCloudDeviationCenterOffset`, `pointCloudDeviationHalfRange`
|
|
131
|
+
(default ±5 cm), and `pointCloudDeviationComputed`. Sync hook
|
|
132
|
+
forwards the range to the renderer uniform.
|
|
133
|
+
|
|
134
|
+
Sign convention: positive = scan point is on the outward-normal
|
|
135
|
+
side of the closest triangle (typical "scan overshoots wall by
|
|
136
|
+
5 mm"). Negative = inside / behind. Non-watertight BIM (typical
|
|
137
|
+
IFC) means "inside the building" isn't globally defined, but
|
|
138
|
+
per-surface front/back is always meaningful.
|
|
139
|
+
|
|
140
|
+
Limitations / future work:
|
|
141
|
+
|
|
142
|
+
- The dispatch processes every uploaded point against every
|
|
143
|
+
triangle in the scene; isolated / hidden meshes still contribute
|
|
144
|
+
to the BVH. A `meshFilter` predicate is a natural follow-up.
|
|
145
|
+
- Histogram + auto-range from p5/p95 not yet implemented — the
|
|
146
|
+
default half-range suggestion is a coarse bbox/1000 heuristic.
|
|
147
|
+
Phase B will add a 2nd compute pass with atomic histogram.
|
|
148
|
+
- The BVH walk uses a 64-deep per-thread stack. Pathologically
|
|
149
|
+
unbalanced trees (>64 deep) silently drop the deepest branch.
|
|
150
|
+
Real BIMs don't get there; SAH or surface-area cost would help
|
|
151
|
+
if we ever hit it.
|
|
152
|
+
|
|
153
|
+
Verified: full repo typecheck (24/24), 655 viewer tests, viewer
|
|
154
|
+
Vite build green.
|
|
155
|
+
|
|
156
|
+
- [#614](https://github.com/louistrue/ifc-lite/pull/614) [`7efc878`](https://github.com/louistrue/ifc-lite/commit/7efc8783314559b674509131f1e203ae7c1fda8e) Thanks [@louistrue](https://github.com/louistrue)! - Near-term UX features from #611.
|
|
157
|
+
|
|
158
|
+
**Hover XYZ readback.** GPU pick now also samples the depth texel at
|
|
159
|
+
the click position and unprojects it through the inverse view-
|
|
160
|
+
projection. `PickResult` carries an optional `worldXYZ`. Reverse-Z is
|
|
161
|
+
honoured (depth=1 = near, 0 = far / miss). The hover tooltip shows
|
|
162
|
+
`x, y, z` (2 decimals) under the entity id. Useful for measurement
|
|
163
|
+
hooks and point-cloud picks where the synthetic entity has no
|
|
164
|
+
surface property to display.
|
|
165
|
+
|
|
166
|
+
**Solid-color picker.** When the point-cloud panel's colour mode is
|
|
167
|
+
set to `fixed`, a native `<input type="color">` swatch appears.
|
|
168
|
+
Hex round-trips through the existing `[r,g,b,a]` store tuple.
|
|
169
|
+
|
|
170
|
+
**Colour-mode legend.** A new `PointCloudLegend` component renders
|
|
171
|
+
inline beneath the colour-mode buttons:
|
|
172
|
+
|
|
173
|
+
- Classification → list of ASPRS LAS 1.4 class id / colour swatch /
|
|
174
|
+
label (Ground, Vegetation, Building, ...). Palette mirrors
|
|
175
|
+
`point-shader.wgsl.ts` exactly.
|
|
176
|
+
- Intensity → black-to-white gradient bar with low/high labels.
|
|
177
|
+
- Height → cool-warm gradient bar (blue → cyan → green → yellow →
|
|
178
|
+
red), matching the shader's `height_ramp`.
|
|
179
|
+
RGB and Solid don't render a legend.
|
|
180
|
+
|
|
181
|
+
**Cancel button for in-flight streams.** New
|
|
182
|
+
`activeStreamCanceller` field on the loading slice. Both ingest
|
|
183
|
+
sites (`useIfcLoader`, `useIfcFederation`) register
|
|
184
|
+
`() => streamHandle.cancel()` after starting and clear on success /
|
|
185
|
+
error. `StatusBar` shows a Cancel button while the canceller is
|
|
186
|
+
non-null. AbortError on cancel is reported as "Cancelled" rather
|
|
187
|
+
than a scary error string.
|
|
188
|
+
|
|
189
|
+
- [#614](https://github.com/louistrue/ifc-lite/pull/614) [`7efc878`](https://github.com/louistrue/ifc-lite/commit/7efc8783314559b674509131f1e203ae7c1fda8e) Thanks [@louistrue](https://github.com/louistrue)! - PTS / XYZ ASCII point cloud reader.
|
|
190
|
+
|
|
191
|
+
Both formats are line-oriented plain-text scans common in legacy
|
|
192
|
+
survey workflows. They share the same syntax — they differ only in
|
|
193
|
+
the optional first-line point count (PTS may have one; XYZ never
|
|
194
|
+
does). One shared decoder + streaming source handles both.
|
|
195
|
+
|
|
196
|
+
Auto-detected per-line layouts (by column count of the first data
|
|
197
|
+
line):
|
|
198
|
+
|
|
199
|
+
- 3 cols → `X Y Z`
|
|
200
|
+
- 4 cols → `X Y Z I` (intensity)
|
|
201
|
+
- 6 cols → `X Y Z R G B`
|
|
202
|
+
- 7 cols → `X Y Z I R G B` (canonical PTS)
|
|
203
|
+
- 9 cols → `X Y Z R G B Nx Ny Nz` (XYZ-with-normals; normals dropped)
|
|
204
|
+
- 10 cols → `X Y Z I R G B Nx Ny Nz` (PTS-with-normals; normals dropped)
|
|
205
|
+
- For XYZ with unknown column counts ≥3 we still emit positions and
|
|
206
|
+
skip the rest, so weird custom exports load instead of erroring.
|
|
207
|
+
|
|
208
|
+
Other behaviour:
|
|
209
|
+
|
|
210
|
+
- Comment lines (`#`, `//`) and blank lines are skipped.
|
|
211
|
+
- Intensity normalisation: 0..1 vs 0..255 vs raw sensor detected from
|
|
212
|
+
the observed maximum, then mapped to u16.
|
|
213
|
+
- RGB normalisation: same heuristic (>1.0 → 0..255 source).
|
|
214
|
+
- Whole-file decode wrapped in `AsciiPointsStreamingSource`; the
|
|
215
|
+
streaming host's 25M-point cap stride-downsamples on the way out.
|
|
216
|
+
|
|
217
|
+
Wired into the decode worker, format detection
|
|
218
|
+
(`detectPointCloudFormat` returns `'pts'` / `'xyz'`), the file
|
|
219
|
+
picker accept lists, drop handlers, and both `useIfcLoader` /
|
|
220
|
+
`useIfcFederation` ingest branches. The "PTS / XYZ ASCII points —
|
|
221
|
+
not yet supported" toast is removed from `describeUnsupportedFormat`.
|
|
222
|
+
|
|
223
|
+
10 new unit tests cover layout probing, decoder round-trips for the
|
|
224
|
+
common shapes, and the comment / header-count edge cases.
|
|
225
|
+
|
|
226
|
+
- [#614](https://github.com/louistrue/ifc-lite/pull/614) [`7efc878`](https://github.com/louistrue/ifc-lite/commit/7efc8783314559b674509131f1e203ae7c1fda8e) Thanks [@louistrue](https://github.com/louistrue)! - GPU rectangle pick (marquee select) — meshes + point clouds.
|
|
227
|
+
|
|
228
|
+
Hold `Ctrl` (or `⌘` on macOS) and drag with the left mouse button
|
|
229
|
+
in the select tool to draw a rectangle. On release, every entity
|
|
230
|
+
(mesh or point cloud) whose pixel falls inside the rect becomes
|
|
231
|
+
the new selection. A teal-dashed SVG outline tracks the drag.
|
|
232
|
+
|
|
233
|
+
Implementation:
|
|
234
|
+
|
|
235
|
+
- `Picker.pickRect(x0, y0, x1, y1, …) → Set<expressId>` renders the
|
|
236
|
+
same pick pass as `pick()` and reads back the texel rect, deduping
|
|
237
|
+
hits to a Set. Mesh + point splats both participate (point splats
|
|
238
|
+
share the depth buffer in the pick pass).
|
|
239
|
+
- A new private `Picker.renderPickPass` extracts the shared render-
|
|
240
|
+
pass setup so single-pixel `pick` and rect `pickRect` don't drift.
|
|
241
|
+
- `PickingManager.pickRect` applies the same visibility filtering
|
|
242
|
+
(`hiddenIds`, `isolatedIds`) as `pick`. The CPU-raycast and
|
|
243
|
+
dynamic-mesh-creation fallbacks `pick` uses for very large batched
|
|
244
|
+
models are skipped — rect pick only sees already-hydrated meshes.
|
|
245
|
+
- `Renderer.pickRect` exposes the manager's API.
|
|
246
|
+
- New `RectSelectionOverlay` component renders the dashed SVG box
|
|
247
|
+
while dragging; lives inside `Viewport.tsx` as a sibling of the
|
|
248
|
+
canvas.
|
|
249
|
+
- `useMouseControls` tracks a new `mouseState.isRectSelecting` flag,
|
|
250
|
+
suppresses orbit/pan during the drag, and on mouseup runs
|
|
251
|
+
`renderer.pickRect(...)` and feeds the result into
|
|
252
|
+
`setSelectedEntityIds`. A 4-pixel minimum rect size avoids
|
|
253
|
+
clobbering selection on a stray Ctrl-click.
|
|
254
|
+
- `MouseState.isRectSelecting?: boolean` and a new
|
|
255
|
+
`setRectSelection?` callback added to `UseMouseControlsParams`.
|
|
256
|
+
|
|
257
|
+
Lasso (polygonal) pick still pending — covered by issue #611's
|
|
258
|
+
mid-term list. Per-class isolation for points is a separate
|
|
259
|
+
follow-up.
|
|
260
|
+
|
|
261
|
+
- [#614](https://github.com/louistrue/ifc-lite/pull/614) [`7efc878`](https://github.com/louistrue/ifc-lite/commit/7efc8783314559b674509131f1e203ae7c1fda8e) Thanks [@louistrue](https://github.com/louistrue)! - Section-plane drag preview — render at 1/4 density during slider
|
|
262
|
+
drag for responsive section-cutting on huge point clouds.
|
|
263
|
+
|
|
264
|
+
The splat shader gains a `previewStride` uniform that culls
|
|
265
|
+
`(instance_index % stride) != 0` at the start of `vs_main`. The
|
|
266
|
+
section-plane position slider wires `onPointerDown` to set
|
|
267
|
+
`previewStride: 4` and `onPointerUp` to restore `1`, so scans of
|
|
268
|
+
millions of points stay responsive while the user drags.
|
|
269
|
+
|
|
270
|
+
Implementation:
|
|
271
|
+
|
|
272
|
+
- `POINT_UNIFORM_SIZE` bumped from 208 → 224 to add a new
|
|
273
|
+
`extras: vec4<u32>` slot. `extras.x` carries `previewStride`;
|
|
274
|
+
`yzw` reserved for future per-frame state.
|
|
275
|
+
- `PointCloudRenderOptions.previewStride?: number` clamped to
|
|
276
|
+
[1, 256] in the renderer.
|
|
277
|
+
- Vertex shader culls hidden instances by writing
|
|
278
|
+
`clipPos = vec4(0, 0, -2, 1)` (outside reverse-Z `[0, 1]`) so they
|
|
279
|
+
drop pre-rasterisation.
|
|
280
|
+
- New `pointCloudPreviewStride` field on the point cloud slice
|
|
281
|
+
(default 1) with `setPointCloudPreviewStride` action.
|
|
282
|
+
- `usePointCloudSync` forwards the stride to
|
|
283
|
+
`setPointCloudOptions`.
|
|
284
|
+
- `SectionOverlay`'s position slider triggers stride 4 on
|
|
285
|
+
drag start (pointer + keyboard), 1 on release. Only flips when
|
|
286
|
+
`pointCloudAssetCount > 0` so IFC-only sessions are unaffected.
|
|
287
|
+
|
|
288
|
+
Triangle meshes ignore the stride — they're cheap enough that
|
|
289
|
+
section drag was already smooth.
|
|
290
|
+
|
|
291
|
+
Verified: full repo typecheck (24/24), 655 viewer tests, viewer
|
|
292
|
+
Vite build green.
|
|
293
|
+
|
|
294
|
+
### Patch Changes
|
|
295
|
+
|
|
296
|
+
- [#614](https://github.com/louistrue/ifc-lite/pull/614) [`7efc878`](https://github.com/louistrue/ifc-lite/commit/7efc8783314559b674509131f1e203ae7c1fda8e) Thanks [@louistrue](https://github.com/louistrue)! - Fix LAZ load failing with `WebAssembly: Response has unsupported MIME
|
|
297
|
+
type 'text/plain'` on real-world files (e.g. autzen-classified.laz).
|
|
298
|
+
|
|
299
|
+
`laz-perf`'s emscripten shim resolves the wasm via `locateFile()` and
|
|
300
|
+
calls `fetch("laz-perf.wasm")` relative to its own script directory.
|
|
301
|
+
In a Vite-bundled module worker that path becomes `/assets/<chunk>/…`
|
|
302
|
+
or just `/laz-perf.wasm` — both 404, and the SPA fallback returns
|
|
303
|
+
`index.html` as `text/plain`, which `instantiateStreaming` rightly
|
|
304
|
+
rejects. The async fallback then 404s the same way and aborts.
|
|
305
|
+
|
|
306
|
+
`loadLazPerf` now resolves the wasm asset URL through Vite's
|
|
307
|
+
`?url` import (`laz-perf/lib/web/laz-perf.wasm?url`), pre-fetches the
|
|
308
|
+
bytes itself, and hands them to emscripten as `Module.wasmBinary` so
|
|
309
|
+
the shim's own fetch is bypassed entirely. Failure modes (asset
|
|
310
|
+
resolution, fetch HTTP error) now produce a precise error message
|
|
311
|
+
naming the URL and status instead of the opaque emscripten "Aborted".
|
|
312
|
+
|
|
313
|
+
- [#614](https://github.com/louistrue/ifc-lite/pull/614) [`7efc878`](https://github.com/louistrue/ifc-lite/commit/7efc8783314559b674509131f1e203ae7c1fda8e) Thanks [@louistrue](https://github.com/louistrue)! - Near-term batch — correctness + robustness items from #611.
|
|
314
|
+
|
|
315
|
+
**`computeBBox` empty / non-finite guards.** Both `e57.ts` and
|
|
316
|
+
`ifcx-points.ts` now return `{0,0,0}/{0,0,0}` for empty arrays and
|
|
317
|
+
skip non-finite triplets. Previously a zero-point or NaN-poisoned
|
|
318
|
+
chunk produced ±Infinity bounds that broke camera fit-to-view and
|
|
319
|
+
section-plane sliders.
|
|
320
|
+
|
|
321
|
+
**Magic-byte-first format detection.** `detectPointCloudFormat` now
|
|
322
|
+
probes the buffer (E57 magic, LASF magic, "ply" / "#" / ".PCD"
|
|
323
|
+
ASCII tokens) before falling back to extension. A LAS file
|
|
324
|
+
mistakenly named `*.ply` no longer goes down the wrong decoder. LAS
|
|
325
|
+
vs LAZ still uses the extension to disambiguate (they share the
|
|
326
|
+
LASF magic).
|
|
327
|
+
|
|
328
|
+
**E57 packet-bounds + per-stream guards.** Validate that the
|
|
329
|
+
DataPacket header, bytestream-length table, and each individual
|
|
330
|
+
bytestream stay inside `payloadEnd = packetEnd - 4` before reading.
|
|
331
|
+
Corrupt files now fail with a precise "bytestream X runs past
|
|
332
|
+
packet payload" error instead of silently reading into the next
|
|
333
|
+
packet.
|
|
334
|
+
|
|
335
|
+
**`e57.ts` split (631 → 4 files).** `e57-page.ts` (header / page CRC
|
|
336
|
+
/ section-header resolver), `e57-xml.ts` (prototype + Data3D
|
|
337
|
+
parser), `e57-decode.ts` (per-scan binary decoder), `e57.ts`
|
|
338
|
+
(orchestrator + re-exports). All four under the AGENTS ~400-line
|
|
339
|
+
guideline.
|
|
340
|
+
|
|
341
|
+
**`point-cloud-renderer.ts` extract.** Pulled the uniform-block
|
|
342
|
+
writer into `point-cloud-uniforms.ts` (`writePointCloudUniforms` +
|
|
343
|
+
mode index maps). Renderer drops below 400 lines.
|
|
344
|
+
|
|
345
|
+
Verified: 62 pointcloud unit tests pass, full repo typecheck
|
|
346
|
+
(24/24).
|
|
347
|
+
|
|
348
|
+
- [#614](https://github.com/louistrue/ifc-lite/pull/614) [`7efc878`](https://github.com/louistrue/ifc-lite/commit/7efc8783314559b674509131f1e203ae7c1fda8e) Thanks [@louistrue](https://github.com/louistrue)! - Round 2 of CodeRabbit feedback on PR #614:
|
|
349
|
+
|
|
350
|
+
- **E57 stride downsampling drops classifications.** `applyStride` rebuilt
|
|
351
|
+
positions / colors / intensities into new arrays but never copied the
|
|
352
|
+
per-point class IDs, so any non-default stride (`{ stride: 2 }` and up)
|
|
353
|
+
silently lost them and `hasClassification` flipped to false.
|
|
354
|
+
- **Federation abort can stomp a newer load.** The AbortError handler in
|
|
355
|
+
`useIfcFederation.addModel()` wrote `progress`, `error`, and `loading`
|
|
356
|
+
unconditionally — if a second `addModel()` started after the first was
|
|
357
|
+
cancelled, it lost its spinner and progress to the cancelled load's
|
|
358
|
+
cleanup. Added a `loadSessionRef` token (mirrors `useIfcLoader`) and
|
|
359
|
+
gate state writes on `loadSessionRef.current === currentSession`.
|
|
360
|
+
- **E57 Integer classification subtracts `minimum`.** Class IDs are
|
|
361
|
+
absolute labels (ASPRS LAS 1.4 0..31), not range-normalised offsets.
|
|
362
|
+
`raw - minimum` was corrupting class IDs whenever a producer declared
|
|
363
|
+
a non-zero `minimum` on the Integer-encoded classification field. The
|
|
364
|
+
Integer branch now matches the ScaledInteger branch's intent: keep
|
|
365
|
+
the raw byte, clamp to 0..255.
|
|
366
|
+
- **PCD probe missed `VERSION` / `FIELDS` headers.** The magic-byte
|
|
367
|
+
detector only recognised `# .PCD …` comment-style headers. Real PCDs
|
|
368
|
+
emitted by PCL's `pcl_io` and a few third-party tools start directly
|
|
369
|
+
with `VERSION 0.7\n…` or `FIELDS x y z\n…` — these now route through
|
|
370
|
+
the PCD decoder instead of falling through to extension-based
|
|
371
|
+
detection (which would mis-route a renamed PCD).
|
|
372
|
+
- **Catch-block logging.** Per repo convention, log point-cloud ingest
|
|
373
|
+
failures in `useIfcLoader.ts` before the early return so abort vs.
|
|
374
|
+
real-failure vs. stale-session paths are distinguishable in console
|
|
375
|
+
triage.
|
|
376
|
+
|
|
377
|
+
Test cleanup: drop the shadowed (and unused) ScaledInteger packet
|
|
378
|
+
buffer in `e57.test.ts` so only the live `fullBuf` setup remains.
|
|
379
|
+
|
|
380
|
+
- Updated dependencies [[`8408c88`](https://github.com/louistrue/ifc-lite/commit/8408c88c4c0a1e848fade6c60474952eca1a4149), [`2334993`](https://github.com/louistrue/ifc-lite/commit/2334993827839b9f5b96ca8008c49543fb597660), [`ba7553a`](https://github.com/louistrue/ifc-lite/commit/ba7553af693939896a840074999b5f6806a94815), [`2ab0e4c`](https://github.com/louistrue/ifc-lite/commit/2ab0e4c0eafc21feb22bfc7cd96c467b8b9ff599), [`7efc878`](https://github.com/louistrue/ifc-lite/commit/7efc8783314559b674509131f1e203ae7c1fda8e), [`7efc878`](https://github.com/louistrue/ifc-lite/commit/7efc8783314559b674509131f1e203ae7c1fda8e), [`7efc878`](https://github.com/louistrue/ifc-lite/commit/7efc8783314559b674509131f1e203ae7c1fda8e), [`7efc878`](https://github.com/louistrue/ifc-lite/commit/7efc8783314559b674509131f1e203ae7c1fda8e), [`7efc878`](https://github.com/louistrue/ifc-lite/commit/7efc8783314559b674509131f1e203ae7c1fda8e), [`7efc878`](https://github.com/louistrue/ifc-lite/commit/7efc8783314559b674509131f1e203ae7c1fda8e), [`7efc878`](https://github.com/louistrue/ifc-lite/commit/7efc8783314559b674509131f1e203ae7c1fda8e), [`7efc878`](https://github.com/louistrue/ifc-lite/commit/7efc8783314559b674509131f1e203ae7c1fda8e), [`7efc878`](https://github.com/louistrue/ifc-lite/commit/7efc8783314559b674509131f1e203ae7c1fda8e), [`7efc878`](https://github.com/louistrue/ifc-lite/commit/7efc8783314559b674509131f1e203ae7c1fda8e), [`7efc878`](https://github.com/louistrue/ifc-lite/commit/7efc8783314559b674509131f1e203ae7c1fda8e)]:
|
|
381
|
+
- @ifc-lite/wasm@1.16.9
|
|
382
|
+
- @ifc-lite/geometry@1.18.0
|
|
383
|
+
- @ifc-lite/parser@2.4.0
|
|
384
|
+
- @ifc-lite/data@1.17.0
|
|
385
|
+
- @ifc-lite/renderer@1.19.0
|
|
386
|
+
- @ifc-lite/pointcloud@0.3.0
|
|
387
|
+
- @ifc-lite/ids@1.15.1
|
|
388
|
+
- @ifc-lite/lists@1.14.12
|
|
389
|
+
|
|
390
|
+
## 1.19.2
|
|
391
|
+
|
|
392
|
+
### Patch Changes
|
|
393
|
+
|
|
394
|
+
- [#622](https://github.com/louistrue/ifc-lite/pull/622) [`28db7df`](https://github.com/louistrue/ifc-lite/commit/28db7df0fa64dc8cab0d08f4948fb1d9b67e0f70) Thanks [@louistrue](https://github.com/louistrue)! - Cesium overlay: precomputed terrain placement, ground-floor clamping,
|
|
395
|
+
and a refactored camera path.
|
|
396
|
+
|
|
397
|
+
**Placement is now resolved before the bridge is built** (no more
|
|
398
|
+
"model loads at IFC OrthogonalHeight, then jumps to terrain"):
|
|
399
|
+
|
|
400
|
+
- `terrain-elevation.ts` (new module) tries sources in fast-first
|
|
401
|
+
order — sync `globe.getHeight`, sync `scene.sampleHeight`, async
|
|
402
|
+
`scene.sampleHeightMostDetailed` with a 3.5 s timeout, then
|
|
403
|
+
Open-Meteo as a bare-earth fallback. Implausible elevations
|
|
404
|
+
(e.g. depth-buffer noise from Google Photorealistic 3D Tiles
|
|
405
|
+
returning `-69184 m`) are range-checked against terrestrial bounds.
|
|
406
|
+
Results are cached per-session via `clearTerrainElevationCache()`.
|
|
407
|
+
- `sampleHeightMostDetailed` runs _before_ Open-Meteo so the model
|
|
408
|
+
lands on the same surface the user actually sees in 3D Tiles
|
|
409
|
+
(street decks, podiums) rather than the bare-earth DEM.
|
|
410
|
+
- `createCesiumBridge` accepts a `placementHeightOverride` so the
|
|
411
|
+
computed placement is baked into the `enuToEcef` origin altitude
|
|
412
|
+
for both camera frame and model matrix from creation.
|
|
413
|
+
|
|
414
|
+
**`findClampAnchorY` (new helper, 9 unit tests)** picks the anchor
|
|
415
|
+
viewer-Y that auto-clamp pins to terrain. Primary: the
|
|
416
|
+
`IfcBuildingStorey` whose elevation is closest to 0 (ground floor),
|
|
417
|
+
within the model AABB. Fallback: `bounds.min.y`. Without this,
|
|
418
|
+
basements and foundations dragged the model deep below the terrain
|
|
419
|
+
surface.
|
|
420
|
+
|
|
421
|
+
**`oHeightForBaseAltitude`** in the Georeferencing panel now mirrors
|
|
422
|
+
the auto-clamp formula (anchor-aware, shift- and RTC-aware), so the
|
|
423
|
+
"Set OrthogonalHeight to Cesium terrain elevation" button produces
|
|
424
|
+
the same world position as toggling the clamp.
|
|
425
|
+
|
|
426
|
+
**UX behaviours**
|
|
427
|
+
|
|
428
|
+
- `cesiumTerrainClamp` defaults to `true` (slice + reset path).
|
|
429
|
+
- Clamp toggle is now actually uncheckable — dropped the auto-toggle
|
|
430
|
+
branch that fought the user's setting.
|
|
431
|
+
- Editing OrthogonalHeight directly auto-releases the clamp so the
|
|
432
|
+
edit takes effect (with clamp on, placement is intentionally
|
|
433
|
+
terrain-anchored regardless of OrthogonalHeight).
|
|
434
|
+
- Stale `terrainHeight` / `terrainClipY` are cleared when a re-query
|
|
435
|
+
fails so the clip plane doesn't drift relative to the new bridge.
|
|
436
|
+
- Effect 2d depends on `bridgeVersion` so the model matrix refreshes
|
|
437
|
+
after an async bridge rebuild.
|
|
438
|
+
|
|
439
|
+
**Camera navigation refactor.** Reported symptom: orbit/zoom
|
|
440
|
+
restricted to the terrain plane. Two coupled root causes:
|
|
441
|
+
|
|
442
|
+
1. `screenSpaceCameraController.enableInputs` was still default-true.
|
|
443
|
+
Any input slipping past the overlay's `pointer-events: none`
|
|
444
|
+
reached Cesium and got processed in the locked frame, fighting
|
|
445
|
+
our externally-driven pose. Now flipped to `false` (master kill-
|
|
446
|
+
switch) on top of the per-mode flags.
|
|
447
|
+
2. `syncCamera` used `lookAtTransform(viewerToEcef)` to write
|
|
448
|
+
position/direction/up in viewer-space. `lookAtTransform` _locks_
|
|
449
|
+
Cesium's reference frame; rotate/tilt/zoom operations are then
|
|
450
|
+
constrained to that local frame — the "stuck to terrain plane"
|
|
451
|
+
behaviour. Refactored to clear `lookAtTransform` with
|
|
452
|
+
`Matrix4.IDENTITY` and write position/direction/up directly in
|
|
453
|
+
ECEF (Cesium's RTC handles shader precision for primitives).
|
|
454
|
+
|
|
455
|
+
**Network hygiene.** `queryTerrainElevation` (Open-Meteo) gets a 5 s
|
|
456
|
+
`AbortController` timeout and a `console.warn` so failures are
|
|
457
|
+
visible instead of silently swallowed.
|
|
458
|
+
|
|
459
|
+
- [#622](https://github.com/louistrue/ifc-lite/pull/622) [`28db7df`](https://github.com/louistrue/ifc-lite/commit/28db7df0fa64dc8cab0d08f4948fb1d9b67e0f70) Thanks [@louistrue](https://github.com/louistrue)! - Apply IfcMapConversion.Scale per IFC schema (issue #595).
|
|
460
|
+
|
|
461
|
+
Scale converts local engineering coordinates (in the project length unit)
|
|
462
|
+
to map CRS units (e.g. `0.001` for a millimetre project with a metre map).
|
|
463
|
+
ifc-lite's geometry pipeline already converts vertices to metres during
|
|
464
|
+
extraction, so applying the raw Scale to viewer-space coordinates double-
|
|
465
|
+
scaled the model — making the Cesium 3D world context unusable for files
|
|
466
|
+
authored per spec.
|
|
467
|
+
|
|
468
|
+
Introduces `getEffectiveHorizontalScale(scale, mapUnitScale, lengthUnitScale)`
|
|
469
|
+
which returns `(scale × mapUnitScale) / lengthUnitScale` — the correct
|
|
470
|
+
multiplier for metre-converted geometry. For files where Scale is set
|
|
471
|
+
consistently with the unit difference this evaluates to 1.0 and the
|
|
472
|
+
geometry passes through unchanged. Wired through:
|
|
473
|
+
|
|
474
|
+
- `cesium-bridge.ts` — 3D model origin and the viewer→ENU rotation.
|
|
475
|
+
- `CesiumOverlay.tsx::buildModelMatrix` — GLB placement.
|
|
476
|
+
- `reproject.ts` — 2D map centre, footprint, and reverse-pick.
|
|
477
|
+
- `useIfcFederation.ts` — multi-model alignment transform.
|
|
478
|
+
|
|
479
|
+
Adds a visible amber warning in the Georeferencing panel when
|
|
480
|
+
`Scale × mapUnitScale ≠ lengthUnitScale` (the IFC schema invariant) so
|
|
481
|
+
authoring errors are discoverable. The warning surfaces both inline (in
|
|
482
|
+
the expanded Coordinate Operation section) and as a small indicator on
|
|
483
|
+
the collapsed section header.
|
|
484
|
+
|
|
485
|
+
- Updated dependencies [[`7c85376`](https://github.com/louistrue/ifc-lite/commit/7c853760ef96e6f0f88ebdc29c17aefae724ff43), [`7c85376`](https://github.com/louistrue/ifc-lite/commit/7c853760ef96e6f0f88ebdc29c17aefae724ff43), [`5439cce`](https://github.com/louistrue/ifc-lite/commit/5439cce34edaff1c050ce8975a330163167df6fd)]:
|
|
486
|
+
- @ifc-lite/data@1.16.0
|
|
487
|
+
- @ifc-lite/ids@1.15.0
|
|
488
|
+
- @ifc-lite/geometry@1.17.1
|
|
489
|
+
- @ifc-lite/lists@1.14.11
|
|
490
|
+
|
|
491
|
+
## 1.19.1
|
|
492
|
+
|
|
493
|
+
### Patch Changes
|
|
494
|
+
|
|
495
|
+
- Updated dependencies [[`7a7cf79`](https://github.com/louistrue/ifc-lite/commit/7a7cf79c181004f9974bd303181aeeaa97d6869d), [`7a7cf79`](https://github.com/louistrue/ifc-lite/commit/7a7cf79c181004f9974bd303181aeeaa97d6869d)]:
|
|
496
|
+
- @ifc-lite/ids@1.14.11
|
|
497
|
+
- @ifc-lite/mcp@0.2.0
|
|
498
|
+
|
|
3
499
|
## 1.19.0
|
|
4
500
|
|
|
5
501
|
### Minor Changes
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { u as o, __tla as __tla_0 } from "./index-DVNSvEMh.js";
|
|
2
|
+
import "./cesium-DUOzBlqv.js";
|
|
3
|
+
import "./arrow-CZ5kQ26f.js";
|
|
4
|
+
import { __tla as __tla_1 } from "./exporters-u0sz2Upj.js";
|
|
5
|
+
import "./bcf-4K724hw0.js";
|
|
6
|
+
import "./zip-DBEtpeu6.js";
|
|
7
|
+
import { __tla as __tla_2 } from "./sandbox-DPD1ROr0.js";
|
|
8
|
+
import "./lens-CSASnhAL.js";
|
|
9
|
+
import "./drawing-2d-Bjy8YPrg.js";
|
|
10
|
+
import { __tla as __tla_3 } from "./server-client-DP8fMPY9.js";
|
|
11
|
+
import { __tla as __tla_4 } from "./ids-B7AXEv7h.js";
|
|
12
|
+
import "./three-CDRZThFA.js";
|
|
13
|
+
let T;
|
|
14
|
+
let __tla = Promise.all([
|
|
15
|
+
(()=>{
|
|
16
|
+
try {
|
|
17
|
+
return __tla_0;
|
|
18
|
+
} catch {}
|
|
19
|
+
})(),
|
|
20
|
+
(()=>{
|
|
21
|
+
try {
|
|
22
|
+
return __tla_1;
|
|
23
|
+
} catch {}
|
|
24
|
+
})(),
|
|
25
|
+
(()=>{
|
|
26
|
+
try {
|
|
27
|
+
return __tla_2;
|
|
28
|
+
} catch {}
|
|
29
|
+
})(),
|
|
30
|
+
(()=>{
|
|
31
|
+
try {
|
|
32
|
+
return __tla_3;
|
|
33
|
+
} catch {}
|
|
34
|
+
})(),
|
|
35
|
+
(()=>{
|
|
36
|
+
try {
|
|
37
|
+
return __tla_4;
|
|
38
|
+
} catch {}
|
|
39
|
+
})()
|
|
40
|
+
]).then(async ()=>{
|
|
41
|
+
const n = 700;
|
|
42
|
+
T = function(s) {
|
|
43
|
+
const e = o.getState(), i = e.basketViews.find((t)=>t.id === s);
|
|
44
|
+
if (i) {
|
|
45
|
+
if (e.setDrawing2D(null), e.setDrawing2DPanelVisible(!1), e.updateDrawing2DDisplayOptions({
|
|
46
|
+
show3DOverlay: !1
|
|
47
|
+
}), e.clearEntitySelection(), e.restoreBasketEntities(i.entityRefs, s), i.viewpoint) {
|
|
48
|
+
const t = i.transitionMs ?? n;
|
|
49
|
+
e.cameraCallbacks.applyViewpoint?.(i.viewpoint, !0, t);
|
|
50
|
+
}
|
|
51
|
+
if (i.section) {
|
|
52
|
+
const t = i.section;
|
|
53
|
+
o.setState({
|
|
54
|
+
sectionPlane: {
|
|
55
|
+
...t.plane
|
|
56
|
+
},
|
|
57
|
+
drawing2DPanelVisible: !1
|
|
58
|
+
}), t.plane.enabled ? (e.activeTool !== "section" && e.setSuppressNextSection2DPanelAutoOpen(!0), e.setActiveTool("section")) : e.activeTool === "section" && e.setActiveTool("select");
|
|
59
|
+
} else {
|
|
60
|
+
const t = o.getState().sectionPlane;
|
|
61
|
+
o.setState({
|
|
62
|
+
sectionPlane: {
|
|
63
|
+
...t,
|
|
64
|
+
enabled: !1
|
|
65
|
+
}
|
|
66
|
+
}), e.activeTool === "section" && e.setActiveTool("select");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
export { T as activateBasketViewFromStore, __tla };
|