isard 1.7.0 → 1.9.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/CHANGELOG.md +53 -0
- package/dist/basemap/grid.js +2 -5
- package/dist/basemap/grid.js.map +1 -1
- package/dist/basemap/models/furniture.d.ts +12 -0
- package/dist/basemap/{furniture.js → models/furniture.js} +6 -8
- package/dist/basemap/models/furniture.js.map +1 -0
- package/dist/basemap/{meshes.js → models/meshes.js} +1 -1
- package/dist/basemap/models/meshes.js.map +1 -0
- package/dist/basemap/models/trees.d.ts +21 -0
- package/dist/basemap/{trees.js → models/trees.js} +4 -36
- package/dist/basemap/models/trees.js.map +1 -0
- package/dist/basemap/placed.d.ts +2 -0
- package/dist/basemap/placed.js +2 -0
- package/dist/basemap/placed.js.map +1 -1
- package/dist/basemap/pmtiles.js +4 -3
- package/dist/basemap/pmtiles.js.map +1 -1
- package/dist/basemap/pmtileslayer.d.ts +4 -4
- package/dist/basemap/pmtileslayer.js +2 -1
- package/dist/basemap/pmtileslayer.js.map +1 -1
- package/dist/basemap/resample.js +3 -2
- package/dist/basemap/resample.js.map +1 -1
- package/dist/basemap/terrain.d.ts +5 -0
- package/dist/basemap/terrain.js +6 -4
- package/dist/basemap/terrain.js.map +1 -1
- package/dist/basemap/vectortiles/context.d.ts +3 -2
- package/dist/basemap/vectortiles/context.js.map +1 -1
- package/dist/basemap/vectortiles/extrusions.js.map +1 -1
- package/dist/basemap/vectortiles/furniture.d.ts +3 -3
- package/dist/basemap/vectortiles/furniture.js +2 -1
- package/dist/basemap/vectortiles/furniture.js.map +1 -1
- package/dist/basemap/vectortiles/labels.js +2 -1
- package/dist/basemap/vectortiles/labels.js.map +1 -1
- package/dist/basemap/vectortiles/lamps.d.ts +3 -3
- package/dist/basemap/vectortiles/lamps.js +1 -1
- package/dist/basemap/vectortiles/lamps.js.map +1 -1
- package/dist/basemap/vectortiles/placed.d.ts +3 -2
- package/dist/basemap/vectortiles/placed.js +5 -10
- package/dist/basemap/vectortiles/placed.js.map +1 -1
- package/dist/basemap/vectortiles/street-wind.js +2 -2
- package/dist/basemap/vectortiles/street-wind.js.map +1 -1
- package/dist/basemap/vectortiles/style.js +7 -8
- package/dist/basemap/vectortiles/style.js.map +1 -1
- package/dist/basemap/vectortiles/tiles.d.ts +1 -3
- package/dist/basemap/vectortiles/tiles.js +1 -1
- package/dist/basemap/vectortiles/tiles.js.map +1 -1
- package/dist/basemap/vectortiles/trees.d.ts +4 -4
- package/dist/basemap/vectortiles/trees.js +2 -1
- package/dist/basemap/vectortiles/trees.js.map +1 -1
- package/dist/basemap/vectortiles/vectors.d.ts +2 -3
- package/dist/basemap/vectortiles/vectors.js.map +1 -1
- package/dist/basemap/vectortiles.d.ts +6 -5
- package/dist/basemap/vectortiles.js +4 -3
- package/dist/basemap/vectortiles.js.map +1 -1
- package/dist/basemap/wmts.js +3 -4
- package/dist/basemap/wmts.js.map +1 -1
- package/dist/basemap/{trees.d.ts → woods.d.ts} +2 -19
- package/dist/basemap/woods.js +38 -0
- package/dist/basemap/woods.js.map +1 -0
- package/dist/basemap/workerpool.d.ts +1 -1
- package/dist/basemap/workerpool.js +3 -3
- package/dist/basemap/workerpool.js.map +1 -1
- package/dist/basemap.worker.js +2 -2
- package/dist/basemap.worker.js.map +23 -22
- package/dist/bind/layers.d.ts +10 -3
- package/dist/bind/layers.js +11 -4
- package/dist/bind/layers.js.map +1 -1
- package/dist/data/collada.js +4 -4
- package/dist/data/collada.js.map +1 -1
- package/dist/data/ifc.js +6 -11
- package/dist/data/ifc.js.map +1 -1
- package/dist/decoder.worker.js +5 -5
- package/dist/decoder.worker.js.map +7 -6
- package/dist/decoding/decoders.js.map +1 -0
- package/dist/{engine → decoding}/loader.js +2 -2
- package/dist/decoding/loader.js.map +1 -0
- package/dist/{engine → decoding}/protocol.d.ts +1 -1
- package/dist/decoding/protocol.js.map +1 -0
- package/dist/engine-loader.d.ts +1 -1
- package/dist/engine-loader.js +3 -2
- package/dist/engine-loader.js.map +1 -1
- package/dist/geoplateforme.d.ts +4 -3
- package/dist/geoplateforme.js +8 -10
- package/dist/geoplateforme.js.map +1 -1
- package/dist/index.d.ts +16 -8
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/isard_bg.wasm +0 -0
- package/dist/isard_core_bg.wasm +0 -0
- package/dist/isard_grid_bg.wasm +0 -0
- package/dist/isard_tess_bg.wasm +0 -0
- package/dist/layers/custom.d.ts +56 -0
- package/dist/layers/custom.js +93 -0
- package/dist/layers/custom.js.map +1 -0
- package/dist/layers/extrusions.d.ts +4 -2
- package/dist/layers/extrusions.js +2 -1
- package/dist/layers/extrusions.js.map +1 -1
- package/dist/layers/features.d.ts +3 -14
- package/dist/layers/features.js +4 -25
- package/dist/layers/features.js.map +1 -1
- package/dist/layers/flow.d.ts +3 -3
- package/dist/layers/flow.js +3 -4
- package/dist/layers/flow.js.map +1 -1
- package/dist/layers/glyphs.js +5 -3
- package/dist/layers/glyphs.js.map +1 -1
- package/dist/layers/ground.d.ts +57 -0
- package/dist/layers/ground.js +78 -0
- package/dist/layers/ground.js.map +1 -0
- package/dist/layers/icons.js +8 -6
- package/dist/layers/icons.js.map +1 -1
- package/dist/layers/layers.d.ts +2 -199
- package/dist/layers/layers.js +2 -469
- package/dist/layers/layers.js.map +1 -1
- package/dist/layers/models.d.ts +48 -0
- package/dist/layers/models.js +111 -0
- package/dist/layers/models.js.map +1 -0
- package/dist/layers/network.d.ts +26 -0
- package/dist/layers/network.js +127 -0
- package/dist/layers/network.js.map +1 -0
- package/dist/layers/panoramas.d.ts +2 -11
- package/dist/layers/panoramas.js +19 -9
- package/dist/layers/panoramas.js.map +1 -1
- package/dist/layers/photos.d.ts +4 -7
- package/dist/layers/photos.js +3 -4
- package/dist/layers/photos.js.map +1 -1
- package/dist/layers/pointclouds.d.ts +3 -2
- package/dist/layers/pointclouds.js +3 -3
- package/dist/layers/pointclouds.js.map +1 -1
- package/dist/layers/raster.d.ts +9 -0
- package/dist/layers/raster.js +24 -0
- package/dist/layers/raster.js.map +1 -0
- package/dist/layers/symbols.d.ts +2 -2
- package/dist/layers/symbols.js +2 -1
- package/dist/layers/symbols.js.map +1 -1
- package/dist/layers/tiles3d.d.ts +15 -0
- package/dist/layers/tiles3d.js +55 -0
- package/dist/layers/tiles3d.js.map +1 -0
- package/dist/layers/trees.d.ts +5 -7
- package/dist/layers/trees.js +2 -1
- package/dist/layers/trees.js.map +1 -1
- package/dist/layers/vectors.js.map +1 -1
- package/dist/map/basemap-layers.js +1 -1
- package/dist/map/basemap-layers.js.map +1 -1
- package/dist/map/engine-settings.d.ts +1 -1
- package/dist/map/engine-settings.js +1 -1
- package/dist/map/engine-settings.js.map +1 -1
- package/dist/map/engines.js.map +1 -1
- package/dist/map/layer-spec.d.ts +7 -13
- package/dist/map/layer-spec.js.map +1 -1
- package/dist/map/workers.js +3 -4
- package/dist/map/workers.js.map +1 -1
- package/dist/map.d.ts +15 -58
- package/dist/map.js +39 -52
- package/dist/map.js.map +1 -1
- package/dist/panoramax.d.ts +15 -2
- package/dist/panoramax.js +38 -21
- package/dist/panoramax.js.map +1 -1
- package/dist/react/CustomLayer.d.ts +1 -1
- package/dist/react/CustomLayer.js +5 -4
- package/dist/react/CustomLayer.js.map +1 -1
- package/dist/react/Layer.d.ts +6 -2
- package/dist/react/Layer.js +6 -5
- package/dist/react/Layer.js.map +1 -1
- package/dist/react/VectorGeometry.js +5 -4
- package/dist/react/VectorGeometry.js.map +1 -1
- package/dist/react/VectorTiles.d.ts +2 -2
- package/dist/react/VectorTiles.js +1 -1
- package/dist/react/VectorTiles.js.map +1 -1
- package/dist/react/context.d.ts +3 -0
- package/dist/react/context.js +8 -1
- package/dist/react/context.js.map +1 -1
- package/dist/types.d.ts +14 -4
- package/dist/types.js.map +1 -1
- package/dist/ui/controls.js +2 -1
- package/dist/ui/controls.js.map +1 -1
- package/dist/ui/interaction.js +6 -5
- package/dist/ui/interaction.js.map +1 -1
- package/dist/ui/minimap.js +1 -1
- package/dist/ui/minimap.js.map +1 -1
- package/dist/ui/overlay.js +3 -3
- package/dist/ui/overlay.js.map +1 -1
- package/dist/ui/search.js +1 -1
- package/dist/ui/search.js.map +1 -1
- package/dist/util/animation.js +3 -2
- package/dist/util/animation.js.map +1 -1
- package/dist/util/color.d.ts +10 -0
- package/dist/util/color.js +29 -9
- package/dist/util/color.js.map +1 -1
- package/dist/util/fetch.d.ts +5 -0
- package/dist/util/fetch.js +11 -0
- package/dist/util/fetch.js.map +1 -0
- package/dist/util/geo.d.ts +5 -0
- package/dist/util/geo.js +8 -2
- package/dist/util/geo.js.map +1 -1
- package/dist/util/math.d.ts +3 -0
- package/dist/util/math.js +4 -0
- package/dist/util/math.js.map +1 -0
- package/dist/util/requests.js.map +1 -0
- package/dist/util/roofs.d.ts +0 -2
- package/dist/util/roofs.js +0 -3
- package/dist/util/roofs.js.map +1 -1
- package/dist/wasm/isard.js +1 -1
- package/dist/wasm/isard_core.js +1 -1
- package/dist/workers/basemap/geometry.d.ts +9 -19
- package/dist/workers/{basemap.worker.d.ts → basemap/protocol.d.ts} +29 -23
- package/dist/workers/basemap/street.d.ts +4 -2
- package/dist/workers/basemap/tiles.d.ts +1 -3
- package/dist/workers/basemap/trees.d.ts +2 -2
- package/package.json +1 -1
- package/dist/basemap/furniture.d.ts +0 -26
- package/dist/basemap/furniture.js.map +0 -1
- package/dist/basemap/meshes.js.map +0 -1
- package/dist/basemap/trees.js.map +0 -1
- package/dist/engine/decoders.js.map +0 -1
- package/dist/engine/loader.js.map +0 -1
- package/dist/engine/protocol.js.map +0 -1
- package/dist/engine/requests.js.map +0 -1
- package/dist/workers/basemap/furniture.d.ts +0 -13
- package/dist/workers/basemap/labels.d.ts +0 -24
- package/dist/workers/basemap/lamps.d.ts +0 -10
- package/dist/workers/basemap/raster.d.ts +0 -10
- package/dist/workers/basemap.worker.js +0 -221
- package/dist/workers/basemap.worker.js.map +0 -1
- /package/dist/basemap/{meshes.d.ts → models/meshes.d.ts} +0 -0
- /package/dist/{engine → decoding}/decoders.d.ts +0 -0
- /package/dist/{engine → decoding}/decoders.js +0 -0
- /package/dist/{engine → decoding}/loader.d.ts +0 -0
- /package/dist/{engine → decoding}/protocol.js +0 -0
- /package/dist/{engine → util}/requests.d.ts +0 -0
- /package/dist/{engine → util}/requests.js +0 -0
package/dist/bind/layers.d.ts
CHANGED
|
@@ -34,13 +34,20 @@ export declare const addBoundLayer: (map: GeoMap, { values, ...spec }: BoundLaye
|
|
|
34
34
|
export declare const rebuildBoundLayer: (map: GeoMap, old: Layer, { values, ...spec }: BoundLayerSpec) => Layer;
|
|
35
35
|
/**
|
|
36
36
|
* The layers of a binding in their declared order: `order` (default 0) from the bottom up, layers of the same order by
|
|
37
|
-
*
|
|
37
|
+
* their `rank` (where they were declared: a component's taken when it first renders, before its layer may wait for
|
|
38
|
+
* something, its tiles or its data), else by the time they came. A layer added or made anew is moved under the first
|
|
39
|
+
* layer above it
|
|
38
40
|
*/
|
|
39
41
|
export declare class LayerOrder {
|
|
40
42
|
private readonly entries;
|
|
41
43
|
private seq;
|
|
42
|
-
/**
|
|
43
|
-
|
|
44
|
+
/** The next rank: a component's place among the others, taken as React renders them in their declared order */
|
|
45
|
+
rank(): number;
|
|
46
|
+
/** Places a new layer (at its `rank`, else after every other), or a layer made anew in place of `old` */
|
|
47
|
+
place(layer: Layer, order: number, { old, rank }?: {
|
|
48
|
+
old?: Layer | undefined;
|
|
49
|
+
rank?: number | undefined;
|
|
50
|
+
}): void;
|
|
44
51
|
/** Forgets a layer removed */
|
|
45
52
|
remove(layer: Layer): void;
|
|
46
53
|
}
|
package/dist/bind/layers.js
CHANGED
|
@@ -133,13 +133,20 @@ export const rebuildBoundLayer = (map, old, { values, ...spec }) => {
|
|
|
133
133
|
};
|
|
134
134
|
/**
|
|
135
135
|
* The layers of a binding in their declared order: `order` (default 0) from the bottom up, layers of the same order by
|
|
136
|
-
*
|
|
136
|
+
* their `rank` (where they were declared: a component's taken when it first renders, before its layer may wait for
|
|
137
|
+
* something, its tiles or its data), else by the time they came. A layer added or made anew is moved under the first
|
|
138
|
+
* layer above it
|
|
137
139
|
*/
|
|
138
140
|
export class LayerOrder {
|
|
139
141
|
entries = [];
|
|
140
142
|
seq = 0;
|
|
141
|
-
/**
|
|
142
|
-
|
|
143
|
+
/** The next rank: a component's place among the others, taken as React renders them in their declared order */
|
|
144
|
+
rank() {
|
|
145
|
+
this.seq += 1;
|
|
146
|
+
return this.seq;
|
|
147
|
+
}
|
|
148
|
+
/** Places a new layer (at its `rank`, else after every other), or a layer made anew in place of `old` */
|
|
149
|
+
place(layer, order, { old, rank } = {}) {
|
|
143
150
|
const index = old ? this.entries.findIndex((e) => e.layer === old) : -1;
|
|
144
151
|
const entry = index >= 0 ? this.entries[index] : undefined;
|
|
145
152
|
if (entry) {
|
|
@@ -147,7 +154,7 @@ export class LayerOrder {
|
|
|
147
154
|
entry.order = order;
|
|
148
155
|
}
|
|
149
156
|
else {
|
|
150
|
-
this.entries.push({ layer, order, seq: this.
|
|
157
|
+
this.entries.push({ layer, order, seq: rank ?? this.rank() });
|
|
151
158
|
}
|
|
152
159
|
this.entries.sort((a, b) => a.order - b.order || a.seq - b.seq);
|
|
153
160
|
const at = this.entries.findIndex((e) => e.layer === layer);
|
package/dist/bind/layers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layers.js","sourceRoot":"","sources":["../../src/bind/layers.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * What a framework's binding (isard/react, isard/vue) does when the description of a layer changes: the least the\n * layer needs (its data, its style, its instances), or a new layer in its place when what changed is set at creation\n * (its URL, its grid, its nodes). Free of any framework.\n */\n\nimport type { Layer } from '../layers/layers.ts';\nimport type { GeoMap, LayerSpec } from '../map.ts';\n\n/** A layer as a binding describes it: the options of `map.add`, and the values of its features or nodes\n * (`setValues`: what colors them by a ramp) */\nexport type BoundLayerSpec<P = Record<string, unknown>> = LayerSpec<P> & { values?: Float32Array };\n\n/** The keys `setStyle` takes, by layer type; `'all'`: every key but the data (the feature layers) */\nconst STYLE_KEYS: Record<LayerSpec['type'], 'all' | ReadonlySet<string>> = {\n lines: 'all',\n circles: 'all',\n fills: 'all',\n symbols: 'all',\n extrusions: 'all',\n raster: new Set(['opacity', 'saturation']),\n network: new Set(['width', 'max', 'contour', 'opacity', 'halo', 'haloOpacity', 'ramp', 'unreachedColor', 'fade']),\n tiles3d: new Set(['maxScreenSpaceError', 'opacity', 'pointSize', 'color']),\n pointcloud: new Set([\n 'colorBy',\n 'pointSize',\n 'maxPointSize',\n 'sizeMode',\n 'shape',\n 'edl',\n 'classifications',\n 'elevationRange',\n 'elevationRamp',\n 'intensityRange',\n 'maxScreenSpaceError',\n 'pointBudget',\n ]),\n models: new Set(),\n trees: new Set(),\n ground: new Set(),\n flow: new Set(['colors', 'width', 'opacity', 'height', 'speed', 'density']),\n};\n\n/** Keys a layer takes by a method of its own, by layer type */\nconst OWN_SETTERS: Partial<Record<LayerSpec['type'], ReadonlySet<string>>> = {\n lines: new Set(['data', 'filter', 'values']),\n circles: new Set(['data', 'filter', 'values']),\n fills: new Set(['data', 'filter', 'values']),\n symbols: new Set(['data', 'filter']),\n extrusions: new Set(['data', 'filter', 'values']),\n network: new Set(['costs', 'edgeWidths', 'values']),\n models: new Set(['instances', 'altitudeReference']),\n ground: new Set(['uniforms', 'textures']),\n flow: new Set(['field', 'fields', 'time', 'playing']),\n};\n\n/** The keys of a description and their values */\nconst fields = (spec: BoundLayerSpec): Map<string, unknown> => new Map(Object.entries(spec));\n\n/** What to do with a layer whose description went from `prev` to `next` */\nexport type LayerChange =\n | { rebuild: true }\n | {\n rebuild: false;\n /** The keys changed, with their new values */\n style: Record<string, unknown>;\n own: Record<string, unknown>;\n };\n\n/**\n * The change from one description to the next, or `undefined` when nothing changed. Values are compared by identity:\n * data, functions and arrays given anew at each render are changes (keep them in a memo)\n */\nexport const layerChange = (prev: BoundLayerSpec, next: BoundLayerSpec): LayerChange | undefined => {\n if (prev.type !== next.type) return { rebuild: true };\n\n const before = fields(prev);\n const after = fields(next);\n const styleKeys = STYLE_KEYS[next.type];\n const own = OWN_SETTERS[next.type];\n const change: Extract<LayerChange, { rebuild: false }> = { rebuild: false, style: {}, own: {} };\n const keys = [...new Set([...before.keys(), ...after.keys()])].filter(\n (key) => key !== 'type' && !Object.is(before.get(key), after.get(key)),\n );\n\n if (keys.length === 0) return undefined;\n\n const isStyle = (key: string) => key !== 'before' && (styleKeys === 'all' || styleKeys.has(key));\n\n // A style or setting taken away: the layer goes back to its defaults, as made anew\n if (keys.some((key) => !after.has(key) || !(own?.has(key) || isStyle(key)))) return { rebuild: true };\n keys.forEach((key) => {\n if (own?.has(key)) change.own[key] = after.get(key);\n else change.style[key] = after.get(key);\n });\n\n return change;\n};\n\n/** The methods a change calls on a layer, those of its type */\ntype Setter =\n | 'setStyle'\n | 'setData'\n | 'setFilter'\n | 'setValues'\n | 'setCosts'\n | 'setEdgeWidths'\n | 'setInstances'\n | 'setUniform'\n | 'setTexture'\n | 'setField'\n | 'setFields'\n | 'setTime'\n | 'setPlaying';\n\n/** Calls a setter of the layer, if its type has it */\nconst set = (layer: Layer, setter: Setter, ...args: unknown[]): void => {\n const method: unknown = Reflect.get(layer, setter);\n\n if (typeof method === 'function') method.apply(layer, args);\n};\n\n/** Applies a change that keeps the layer (`rebuild: false`) */\nexport const applyLayerChange = (\n layer: Layer,\n next: BoundLayerSpec,\n change: Extract<LayerChange, { rebuild: false }>,\n): void => {\n const spec = fields(next);\n const own = change.own;\n\n if ('data' in own) set(layer, 'setData', own.data);\n if ('filter' in own) set(layer, 'setFilter', own.filter);\n if ('values' in own) set(layer, 'setValues', own.values);\n if ('field' in own) set(layer, 'setField', own.field);\n if ('fields' in own) set(layer, 'setFields', own.fields, spec.get('time'));\n else if ('time' in own) set(layer, 'setTime', own.time);\n if ('playing' in own) set(layer, 'setPlaying', own.playing ?? true);\n if ('costs' in own) set(layer, 'setCosts', own.costs);\n if ('edgeWidths' in own) set(layer, 'setEdgeWidths', own.edgeWidths);\n if ('instances' in own || 'altitudeReference' in own) {\n set(layer, 'setInstances', spec.get('instances'), spec.get('altitudeReference'));\n }\n if ('uniforms' in own) {\n Object.entries(own.uniforms ?? {}).forEach(([name, value]) => {\n set(layer, 'setUniform', name, value);\n });\n }\n if ('textures' in own) {\n Object.entries(own.textures ?? {}).forEach(([name, texture]) => {\n set(layer, 'setTexture', name, texture);\n });\n }\n if (Object.keys(change.style).length > 0) set(layer, 'setStyle', change.style);\n};\n\n/** Adds a layer from its description, its values set */\nexport const addBoundLayer = (map: GeoMap, { values, ...spec }: BoundLayerSpec): Layer => {\n const layer = map.add(spec as LayerSpec);\n\n if (values) set(layer, 'setValues', values);\n\n return layer;\n};\n\n/** A layer made anew from its description in the place of `old`, its values set */\nexport const rebuildBoundLayer = (map: GeoMap, old: Layer, { values, ...spec }: BoundLayerSpec): Layer => {\n const layer = map.rebuildLayer(old, spec as LayerSpec);\n\n if (values) set(layer, 'setValues', values);\n\n return layer;\n};\n\n/**\n * The layers of a binding in their declared order: `order` (default 0) from the bottom up, layers of the same order by\n * the time they came. A layer added or made anew is moved under the first layer above it\n */\nexport class LayerOrder {\n private readonly entries: { layer: Layer; order: number; seq: number }[] = [];\n private seq = 0;\n\n /** Places a new layer, or a layer made anew in place of `old` */\n place(layer: Layer, order: number, old?: Layer): void {\n const index = old ? this.entries.findIndex((e) => e.layer === old) : -1;\n const entry = index >= 0 ? this.entries[index] : undefined;\n\n if (entry) {\n entry.layer = layer;\n entry.order = order;\n } else {\n this.entries.push({ layer, order, seq: this.seq++ });\n }\n this.entries.sort((a, b) => a.order - b.order || a.seq - b.seq);\n\n const at = this.entries.findIndex((e) => e.layer === layer);\n const above = this.entries[at + 1]?.layer;\n\n if (above) layer.moveBefore(above);\n }\n\n /** Forgets a layer removed */\n remove(layer: Layer): void {\n const index = this.entries.findIndex((e) => e.layer === layer);\n\n if (index >= 0) this.entries.splice(index, 1);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"layers.js","sourceRoot":"","sources":["../../src/bind/layers.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * What a framework's binding (isard/react, isard/vue) does when the description of a layer changes: the least the\n * layer needs (its data, its style, its instances), or a new layer in its place when what changed is set at creation\n * (its URL, its grid, its nodes). Free of any framework.\n */\n\nimport type { Layer } from '../layers/layers.ts';\nimport type { GeoMap, LayerSpec } from '../map.ts';\n\n/** A layer as a binding describes it: the options of `map.add`, and the values of its features or nodes\n * (`setValues`: what colors them by a ramp) */\nexport type BoundLayerSpec<P = Record<string, unknown>> = LayerSpec<P> & { values?: Float32Array };\n\n/** The keys `setStyle` takes, by layer type; `'all'`: every key but the data (the feature layers) */\nconst STYLE_KEYS: Record<LayerSpec['type'], 'all' | ReadonlySet<string>> = {\n lines: 'all',\n circles: 'all',\n fills: 'all',\n symbols: 'all',\n extrusions: 'all',\n raster: new Set(['opacity', 'saturation']),\n network: new Set(['width', 'max', 'contour', 'opacity', 'halo', 'haloOpacity', 'ramp', 'unreachedColor', 'fade']),\n tiles3d: new Set(['maxScreenSpaceError', 'opacity', 'pointSize', 'color']),\n pointcloud: new Set([\n 'colorBy',\n 'pointSize',\n 'maxPointSize',\n 'sizeMode',\n 'shape',\n 'edl',\n 'classifications',\n 'elevationRange',\n 'elevationRamp',\n 'intensityRange',\n 'maxScreenSpaceError',\n 'pointBudget',\n ]),\n models: new Set(),\n trees: new Set(),\n ground: new Set(),\n flow: new Set(['colors', 'width', 'opacity', 'height', 'speed', 'density']),\n};\n\n/** Keys a layer takes by a method of its own, by layer type */\nconst OWN_SETTERS: Partial<Record<LayerSpec['type'], ReadonlySet<string>>> = {\n lines: new Set(['data', 'filter', 'values']),\n circles: new Set(['data', 'filter', 'values']),\n fills: new Set(['data', 'filter', 'values']),\n symbols: new Set(['data', 'filter']),\n extrusions: new Set(['data', 'filter', 'values']),\n network: new Set(['costs', 'edgeWidths', 'values']),\n models: new Set(['instances', 'altitudeReference']),\n ground: new Set(['uniforms', 'textures']),\n flow: new Set(['field', 'fields', 'time', 'playing']),\n};\n\n/** The keys of a description and their values */\nconst fields = (spec: BoundLayerSpec): Map<string, unknown> => new Map(Object.entries(spec));\n\n/** What to do with a layer whose description went from `prev` to `next` */\nexport type LayerChange =\n | { rebuild: true }\n | {\n rebuild: false;\n /** The keys changed, with their new values */\n style: Record<string, unknown>;\n own: Record<string, unknown>;\n };\n\n/**\n * The change from one description to the next, or `undefined` when nothing changed. Values are compared by identity:\n * data, functions and arrays given anew at each render are changes (keep them in a memo)\n */\nexport const layerChange = (prev: BoundLayerSpec, next: BoundLayerSpec): LayerChange | undefined => {\n if (prev.type !== next.type) return { rebuild: true };\n\n const before = fields(prev);\n const after = fields(next);\n const styleKeys = STYLE_KEYS[next.type];\n const own = OWN_SETTERS[next.type];\n const change: Extract<LayerChange, { rebuild: false }> = { rebuild: false, style: {}, own: {} };\n const keys = [...new Set([...before.keys(), ...after.keys()])].filter(\n (key) => key !== 'type' && !Object.is(before.get(key), after.get(key)),\n );\n\n if (keys.length === 0) return undefined;\n\n const isStyle = (key: string) => key !== 'before' && (styleKeys === 'all' || styleKeys.has(key));\n\n // A style or setting taken away: the layer goes back to its defaults, as made anew\n if (keys.some((key) => !after.has(key) || !(own?.has(key) || isStyle(key)))) return { rebuild: true };\n keys.forEach((key) => {\n if (own?.has(key)) change.own[key] = after.get(key);\n else change.style[key] = after.get(key);\n });\n\n return change;\n};\n\n/** The methods a change calls on a layer, those of its type */\ntype Setter =\n | 'setStyle'\n | 'setData'\n | 'setFilter'\n | 'setValues'\n | 'setCosts'\n | 'setEdgeWidths'\n | 'setInstances'\n | 'setUniform'\n | 'setTexture'\n | 'setField'\n | 'setFields'\n | 'setTime'\n | 'setPlaying';\n\n/** Calls a setter of the layer, if its type has it */\nconst set = (layer: Layer, setter: Setter, ...args: unknown[]): void => {\n const method: unknown = Reflect.get(layer, setter);\n\n if (typeof method === 'function') method.apply(layer, args);\n};\n\n/** Applies a change that keeps the layer (`rebuild: false`) */\nexport const applyLayerChange = (\n layer: Layer,\n next: BoundLayerSpec,\n change: Extract<LayerChange, { rebuild: false }>,\n): void => {\n const spec = fields(next);\n const own = change.own;\n\n if ('data' in own) set(layer, 'setData', own.data);\n if ('filter' in own) set(layer, 'setFilter', own.filter);\n if ('values' in own) set(layer, 'setValues', own.values);\n if ('field' in own) set(layer, 'setField', own.field);\n if ('fields' in own) set(layer, 'setFields', own.fields, spec.get('time'));\n else if ('time' in own) set(layer, 'setTime', own.time);\n if ('playing' in own) set(layer, 'setPlaying', own.playing ?? true);\n if ('costs' in own) set(layer, 'setCosts', own.costs);\n if ('edgeWidths' in own) set(layer, 'setEdgeWidths', own.edgeWidths);\n if ('instances' in own || 'altitudeReference' in own) {\n set(layer, 'setInstances', spec.get('instances'), spec.get('altitudeReference'));\n }\n if ('uniforms' in own) {\n Object.entries(own.uniforms ?? {}).forEach(([name, value]) => {\n set(layer, 'setUniform', name, value);\n });\n }\n if ('textures' in own) {\n Object.entries(own.textures ?? {}).forEach(([name, texture]) => {\n set(layer, 'setTexture', name, texture);\n });\n }\n if (Object.keys(change.style).length > 0) set(layer, 'setStyle', change.style);\n};\n\n/** Adds a layer from its description, its values set */\nexport const addBoundLayer = (map: GeoMap, { values, ...spec }: BoundLayerSpec): Layer => {\n const layer = map.add(spec as LayerSpec);\n\n if (values) set(layer, 'setValues', values);\n\n return layer;\n};\n\n/** A layer made anew from its description in the place of `old`, its values set */\nexport const rebuildBoundLayer = (map: GeoMap, old: Layer, { values, ...spec }: BoundLayerSpec): Layer => {\n const layer = map.rebuildLayer(old, spec as LayerSpec);\n\n if (values) set(layer, 'setValues', values);\n\n return layer;\n};\n\n/**\n * The layers of a binding in their declared order: `order` (default 0) from the bottom up, layers of the same order by\n * their `rank` (where they were declared: a component's taken when it first renders, before its layer may wait for\n * something, its tiles or its data), else by the time they came. A layer added or made anew is moved under the first\n * layer above it\n */\nexport class LayerOrder {\n private readonly entries: { layer: Layer; order: number; seq: number }[] = [];\n private seq = 0;\n\n /** The next rank: a component's place among the others, taken as React renders them in their declared order */\n rank(): number {\n this.seq += 1;\n\n return this.seq;\n }\n\n /** Places a new layer (at its `rank`, else after every other), or a layer made anew in place of `old` */\n place(layer: Layer, order: number, { old, rank }: { old?: Layer | undefined; rank?: number | undefined } = {}): void {\n const index = old ? this.entries.findIndex((e) => e.layer === old) : -1;\n const entry = index >= 0 ? this.entries[index] : undefined;\n\n if (entry) {\n entry.layer = layer;\n entry.order = order;\n } else {\n this.entries.push({ layer, order, seq: rank ?? this.rank() });\n }\n this.entries.sort((a, b) => a.order - b.order || a.seq - b.seq);\n\n const at = this.entries.findIndex((e) => e.layer === layer);\n const above = this.entries[at + 1]?.layer;\n\n if (above) layer.moveBefore(above);\n }\n\n /** Forgets a layer removed */\n remove(layer: Layer): void {\n const index = this.entries.findIndex((e) => e.layer === layer);\n\n if (index >= 0) this.entries.splice(index, 1);\n }\n}\n"]}
|
package/dist/data/collada.js
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* axis turned to glTF's; its materials' diffuse colors, transparencies and textures. Lights, cameras, animations and
|
|
5
5
|
* skins are left out; normals too (the models are shaded by their faces).
|
|
6
6
|
*/
|
|
7
|
+
import { fetchOk } from "../util/fetch.js";
|
|
8
|
+
import { RAD } from "../util/geo.js";
|
|
7
9
|
import { bounds, bufferBuilder, glbOf } from "../util/gltf.js";
|
|
8
10
|
import { child, children, childText, parseXml } from "./xml.js";
|
|
9
11
|
const IDENTITY = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
|
|
@@ -39,7 +41,7 @@ const transformOf = (node) => node.children.reduce((m, t) => {
|
|
|
39
41
|
if (t.name === 'rotate') {
|
|
40
42
|
const length = Math.hypot(x, y, z) || 1;
|
|
41
43
|
const [ax, ay, az] = [x / length, y / length, z / length];
|
|
42
|
-
const [c, s] = [Math.cos(
|
|
44
|
+
const [c, s] = [Math.cos(w * RAD), Math.sin(w * RAD)];
|
|
43
45
|
const k = 1 - c;
|
|
44
46
|
return multiply(m, [
|
|
45
47
|
...[c + ax * ax * k, ay * ax * k + az * s, az * ax * k - ay * s, 0],
|
|
@@ -291,9 +293,7 @@ const gltfOf = (primitives, materials, images) => {
|
|
|
291
293
|
};
|
|
292
294
|
/** A COLLADA file and its textures (next to it) read as a glTF binary for `map.addModels({ data })` */
|
|
293
295
|
export const loadCollada = async (url, init) => {
|
|
294
|
-
const response = await
|
|
295
|
-
if (!response.ok)
|
|
296
|
-
throw new Error(`isard: ${url}: ${response.status}`);
|
|
296
|
+
const response = await fetchOk(url, init);
|
|
297
297
|
const source = await response.text();
|
|
298
298
|
const base = new URL(url, typeof document === 'undefined' ? undefined : document.baseURI);
|
|
299
299
|
const images = Object.fromEntries(await Promise.all(colladaImages(source).map(async (path) => {
|
package/dist/data/collada.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collada.js","sourceRoot":"","sources":["../../src/data/collada.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * COLLADA (`.dae`: SketchUp's, Blender's, the BIM tools' exports) to a glTF binary, for `map.addModels({ data })`: its\n * meshes (triangles, polylists, polygons) where its scene's nodes put them, in metres (its `unit`) and with its up\n * axis turned to glTF's; its materials' diffuse colors, transparencies and textures. Lights, cameras, animations and\n * skins are left out; normals too (the models are shaded by their faces).\n */\n\nimport { bounds, bufferBuilder, glbOf } from '../util/gltf.ts';\nimport { child, children, childText, parseXml, type XmlElement } from './xml.ts';\n\n/** A 4×4 matrix, column-major (as glTF's) */\ntype Matrix = number[];\n\nconst IDENTITY: Matrix = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n\n/** To glTF's axes (y up) from a document's up axis: Z_UP's (x, y, z) is (x, z, -y), X_UP's (-y, x, z) */\nconst UP_AXES: Record<string, Matrix> = {\n Y_UP: IDENTITY,\n Z_UP: [1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1],\n X_UP: [0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],\n};\n\n/** `a × b` */\nconst multiply = (a: Matrix, b: Matrix): Matrix =>\n IDENTITY.map((_, i) => {\n const [column, row] = [Math.floor(i / 4), i % 4];\n\n return [0, 1, 2, 3].reduce((sum, k) => sum + (a[k * 4 + row] ?? 0) * (b[column * 4 + k] ?? 0), 0);\n });\n\n/** The numbers of an element's text */\nconst numbers = (element: XmlElement | undefined): number[] =>\n (element?.text ?? '')\n .trim()\n .split(/\\s+/)\n .filter((s) => s !== '')\n .map(Number);\n\n/** A node's transform: its `matrix`, `translate`, `rotate` and `scale` children in their order */\nconst transformOf = (node: XmlElement): Matrix =>\n node.children.reduce((m, t) => {\n const v = numbers(t);\n const [x = 0, y = 0, z = 0, w = 0] = v;\n\n if (t.name === 'matrix' && v.length === 16) {\n // Row-major in COLLADA\n return multiply(\n m,\n IDENTITY.map((_, i) => v[(i % 4) * 4 + Math.floor(i / 4)] ?? 0),\n );\n }\n if (t.name === 'translate') return multiply(m, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1]);\n if (t.name === 'scale') return multiply(m, [x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1]);\n if (t.name === 'rotate') {\n const length = Math.hypot(x, y, z) || 1;\n const [ax, ay, az] = [x / length, y / length, z / length];\n const [c, s] = [Math.cos((w * Math.PI) / 180), Math.sin((w * Math.PI) / 180)];\n const k = 1 - c;\n\n return multiply(m, [\n ...[c + ax * ax * k, ay * ax * k + az * s, az * ax * k - ay * s, 0],\n ...[ax * ay * k - az * s, c + ay * ay * k, az * ay * k + ax * s, 0],\n ...[ax * az * k + ay * s, ay * az * k - ax * s, c + az * az * k, 0],\n ...[0, 0, 0, 1],\n ]);\n }\n\n return m;\n }, IDENTITY);\n\n/** A material as glTF takes it: its color (RGBA, linear as COLLADA's) and its texture's image, if any */\ninterface Material {\n color: [number, number, number, number];\n image?: string;\n}\n\n/** A primitive of the output: its positions (glTF axes, metres), texture coordinates, triangles and material */\ninterface Primitive {\n positions: number[];\n uvs: number[];\n indices: number[];\n material: number;\n}\n\n/** What `parseCollada` reads besides the document: the bytes of its textures by their path in it */\nexport interface ColladaImages {\n [path: string]: Uint8Array;\n}\n\n/** The paths of the images a COLLADA document uses (its `library_images`), to fetch before `parseCollada` */\nexport const colladaImages = (source: string): string[] => {\n return children(child(parseXml(source), 'library_images'), 'image')\n .map((image) => (childText(image, 'init_from') ?? childText(child(image, 'init_from'), 'ref') ?? '').trim())\n .filter((path) => path !== '');\n};\n\n/**\n * A COLLADA document as a glTF binary, its front +Z and its feet at its origin as its scene puts them; `images`: its\n * textures' bytes by their path in it (`colladaImages`), the materials without theirs taking their color\n */\nexport const parseCollada = (source: string, images: ColladaImages = {}): Uint8Array<ArrayBuffer> => {\n const root = parseXml(source);\n\n if (root.name !== 'COLLADA') throw new Error('isard: not a COLLADA document');\n\n // Every element by its id: the document's references are `#id`\n const byId = new Map<string, XmlElement>();\n const index = (e: XmlElement) => {\n if (e.attributes.id) byId.set(e.attributes.id, e);\n e.children.forEach(index);\n };\n\n index(root);\n\n const ref = (url: string | undefined) => (url?.startsWith('#') ? byId.get(url.slice(1)) : undefined);\n const asset = child(root, 'asset');\n const metres = Number(child(asset, 'unit')?.attributes.meter ?? 1) || 1;\n const up = (childText(asset, 'up_axis') ?? 'Y_UP').trim();\n // To glTF's axes, in metres\n const axes = (UP_AXES[up] ?? UP_AXES.Y_UP ?? IDENTITY).map((v, i) => (i < 12 ? v * metres : v));\n\n const materials: Material[] = [];\n const materialIds = new Map<string, number>();\n /** A material's index by its id, read from its effect (once) */\n const materialOf = (id: string | undefined): number => {\n const known = materialIds.get(id ?? '');\n\n if (known !== undefined) return known;\n\n const effect = ref(child(ref(id ? `#${id}` : undefined), 'instance_effect')?.attributes.url);\n const profile = child(effect, 'profile_COMMON');\n const technique = child(profile, 'technique');\n const shading = technique?.children.find((c) => ['phong', 'lambert', 'blinn', 'constant'].includes(c.name));\n const diffuse = child(shading, 'diffuse') ?? child(shading, 'emission');\n const [r = 0.8, g = 0.8, b = 0.8, a = 1] = numbers(child(diffuse, 'color'));\n const transparency = Number(childText(child(shading, 'transparency'), 'float') ?? 1);\n // The texture: sampler, surface, image (COLLADA 1.4's chain by the profile's params' sids)\n const param = (sid: string | undefined) =>\n profile?.children.find((p) => p.name === 'newparam' && p.attributes.sid === sid);\n const texture = child(diffuse, 'texture')?.attributes.texture;\n const sampler = child(param(texture), 'sampler2D');\n const surface = child(param(childText(sampler, 'source')?.trim()), 'surface');\n const imageId = (childText(surface, 'init_from') ?? texture ?? '').trim();\n const path = (childText(byId.get(imageId), 'init_from') ?? '').trim();\n const opacity = Math.min(a, Number.isFinite(transparency) ? transparency : 1);\n const material: Material = { color: [r, g, b, opacity], ...(path && images[path] && { image: path }) };\n const at = materials.length;\n\n materials.push(material);\n materialIds.set(id ?? '', at);\n\n return at;\n };\n\n const primitives: Primitive[] = [];\n\n /** The primitives of a geometry instanced under `matrix`, its materials bound by `binding` */\n const addGeometry = (geometry: XmlElement, matrix: Matrix, binding: Map<string, string>) => {\n const mesh = child(geometry, 'mesh');\n /** A source's values and stride */\n const sourceOf = (url: string | undefined): { values: number[]; stride: number } | undefined => {\n const element = ref(url);\n\n if (element?.name === 'vertices') {\n return sourceOf(\n children(element, 'input').find((i) => i.attributes.semantic === 'POSITION')?.attributes.source,\n );\n }\n\n const accessor = child(child(element, 'technique_common'), 'accessor');\n\n return (\n element && { values: numbers(child(element, 'float_array')), stride: Number(accessor?.attributes.stride ?? 3) }\n );\n };\n\n mesh?.children.forEach((part) => {\n if (!['triangles', 'polylist', 'polygons'].includes(part.name)) return;\n\n const inputs = children(part, 'input');\n const stride = inputs.reduce((n, i) => Math.max(n, Number(i.attributes.offset ?? 0) + 1), 1);\n const input = (semantic: string) => inputs.find((i) => i.attributes.semantic === semantic);\n const [vertex, texcoord] = [input('VERTEX'), input('TEXCOORD')];\n const positions = sourceOf(vertex?.attributes.source);\n const uvs = sourceOf(texcoord?.attributes.source);\n\n if (!vertex || !positions) return;\n\n // The polygons' corners as index tuples, then each polygon fanned into triangles\n const lists = part.name === 'polygons' ? children(part, 'p').map(numbers) : [numbers(child(part, 'p'))];\n // Each list's polygons' corner counts\n const counts = lists.map((p) => {\n if (part.name === 'triangles') return Array.from({ length: Number(part.attributes.count ?? 0) }, () => 3);\n\n return part.name === 'polylist' ? numbers(child(part, 'vcount')) : [p.length / stride];\n });\n const out: Primitive = {\n positions: [],\n uvs: [],\n indices: [],\n material: materialOf(binding.get(part.attributes.material ?? '') ?? part.attributes.material),\n };\n const corners = new Map<string, number>();\n const corner = (p: number[], at: number): number => {\n const v = p[at + Number(vertex.attributes.offset ?? 0)] ?? 0;\n const t = texcoord ? (p[at + Number(texcoord.attributes.offset ?? 0)] ?? 0) : -1;\n const key = `${v}/${t}`;\n const known = corners.get(key);\n\n if (known !== undefined) return known;\n\n const [x = 0, y = 0, z = 0] = positions.values.slice(v * positions.stride, v * positions.stride + 3);\n\n out.positions.push(\n (matrix[0] ?? 0) * x + (matrix[4] ?? 0) * y + (matrix[8] ?? 0) * z + (matrix[12] ?? 0),\n (matrix[1] ?? 0) * x + (matrix[5] ?? 0) * y + (matrix[9] ?? 0) * z + (matrix[13] ?? 0),\n (matrix[2] ?? 0) * x + (matrix[6] ?? 0) * y + (matrix[10] ?? 0) * z + (matrix[14] ?? 0),\n );\n if (uvs) {\n // glTF's v runs down the image\n out.uvs.push(uvs.values[t * uvs.stride] ?? 0, 1 - (uvs.values[t * uvs.stride + 1] ?? 0));\n }\n corners.set(key, corners.size);\n\n return corners.size - 1;\n };\n\n lists.forEach((p, l) => {\n let at = 0;\n\n (counts[l] ?? []).forEach((n) => {\n const first = corner(p, at * stride);\n\n for (let k = 1; k + 1 < n; k += 1) {\n out.indices.push(first, corner(p, (at + k) * stride), corner(p, (at + k + 1) * stride));\n }\n at += n;\n });\n });\n // A mirroring transform turns the faces inside out: wound back\n if (determinant(matrix) < 0) {\n for (let i = 0; i + 2 < out.indices.length; i += 3) {\n [out.indices[i + 1], out.indices[i + 2]] = [out.indices[i + 2] ?? 0, out.indices[i + 1] ?? 0];\n }\n }\n if (out.indices.length > 0) primitives.push(out);\n });\n };\n\n /** A node and those under it, under `parent`'s transform */\n const addNode = (node: XmlElement, parent: Matrix, depth = 0) => {\n if (depth > 64) return;\n\n const matrix = multiply(parent, transformOf(node));\n\n node.children.forEach((c) => {\n if (c.name === 'node') addNode(c, matrix, depth + 1);\n if (c.name === 'instance_node') {\n const target = ref(c.attributes.url);\n\n if (target) addNode(target, matrix, depth + 1);\n }\n if (c.name === 'instance_geometry') {\n const geometry = ref(c.attributes.url);\n const binding = new Map(\n children(child(child(c, 'bind_material'), 'technique_common'), 'instance_material').map((m) => [\n m.attributes.symbol ?? '',\n (m.attributes.target ?? '').replace(/^#/, ''),\n ]),\n );\n\n if (geometry) addGeometry(geometry, matrix, binding);\n }\n });\n };\n\n const scene =\n ref(child(child(root, 'scene'), 'instance_visual_scene')?.attributes.url) ??\n child(child(root, 'library_visual_scenes'), 'visual_scene');\n\n children(scene, 'node').forEach((node) => {\n addNode(node, axes);\n });\n if (primitives.length === 0) throw new Error('isard: no mesh in the COLLADA document');\n\n return gltfOf(primitives, materials, images);\n};\n\n/** The determinant of a matrix's upper 3×3 */\nconst determinant = (m: Matrix): number => {\n const [a = 0, b = 0, c = 0, , d = 0, e = 0, f = 0, , g = 0, h = 0, i = 0] = m;\n\n return a * (e * i - f * h) - d * (b * i - c * h) + g * (b * f - c * e);\n};\n\n/** The glTF binary of primitives and their materials: each primitive's positions, texture coordinates and indices,\n * then the images, in its buffer */\nconst gltfOf = (primitives: Primitive[], materials: Material[], images: ColladaImages): Uint8Array<ArrayBuffer> => {\n const used = [...new Set(materials.flatMap((m) => (m.image ? [m.image] : [])))];\n const { views, append, bin: buffer } = bufferBuilder();\n const accessors: Record<string, unknown>[] = [];\n const meshes = primitives.map((p) => {\n const count = p.positions.length / 3;\n\n accessors.push({\n bufferView: append(new Uint8Array(new Float32Array(p.positions).buffer), 34962),\n componentType: 5126,\n count,\n type: 'VEC3',\n ...bounds(p.positions),\n });\n\n const position = accessors.length - 1;\n const textured = p.uvs.length > 0 && materials[p.material]?.image !== undefined;\n\n if (textured) {\n accessors.push({\n bufferView: append(new Uint8Array(new Float32Array(p.uvs).buffer), 34962),\n componentType: 5126,\n count,\n type: 'VEC2',\n });\n }\n\n const uv = accessors.length - 1;\n\n accessors.push({\n bufferView: append(new Uint8Array(new Uint32Array(p.indices).buffer), 34963),\n componentType: 5125,\n count: p.indices.length,\n type: 'SCALAR',\n });\n\n return {\n attributes: { POSITION: position, ...(textured && { TEXCOORD_0: uv }) },\n indices: accessors.length - 1,\n material: p.material,\n };\n });\n const imageViews = used.map((path) => append(images[path] ?? new Uint8Array()));\n const bin = buffer();\n\n const gltf = {\n asset: { version: '2.0', generator: 'isard (COLLADA)' },\n scene: 0,\n scenes: [{ nodes: [0] }],\n nodes: [{ mesh: 0 }],\n meshes: [{ primitives: meshes }],\n materials: materials.map(({ color, image }) => ({\n pbrMetallicRoughness: {\n baseColorFactor: color,\n metallicFactor: 0,\n roughnessFactor: 1,\n ...(image && { baseColorTexture: { index: used.indexOf(image) } }),\n },\n ...(color[3] < 1 && { alphaMode: 'BLEND' }),\n doubleSided: true,\n })),\n ...(used.length > 0 && {\n textures: used.map((_, i) => ({ source: i, sampler: 0 })),\n samplers: [{ magFilter: 9729, minFilter: 9987, wrapS: 10497, wrapT: 10497 }],\n images: used.map((path, i) => ({\n bufferView: imageViews[i],\n mimeType: /\\.png$/i.test(path) ? 'image/png' : 'image/jpeg',\n })),\n }),\n accessors,\n bufferViews: views,\n buffers: [{ byteLength: bin.byteLength }],\n };\n\n return glbOf(gltf, bin);\n};\n\n/** A COLLADA file and its textures (next to it) read as a glTF binary for `map.addModels({ data })` */\nexport const loadCollada = async (url: string, init?: RequestInit): Promise<Uint8Array<ArrayBuffer>> => {\n const response = await fetch(url, init);\n\n if (!response.ok) throw new Error(`isard: ${url}: ${response.status}`);\n\n const source = await response.text();\n const base = new URL(url, typeof document === 'undefined' ? undefined : document.baseURI);\n const images = Object.fromEntries(\n await Promise.all(\n colladaImages(source).map(async (path) => {\n const image = await fetch(new URL(path, base), init).catch(() => undefined);\n\n return [path, image?.ok ? new Uint8Array(await image.arrayBuffer()) : new Uint8Array()] as const;\n }),\n ),\n );\n\n return parseCollada(source, Object.fromEntries(Object.entries(images).filter(([, bytes]) => bytes.byteLength > 0)));\n};\n"]}
|
|
1
|
+
{"version":3,"file":"collada.js","sourceRoot":"","sources":["../../src/data/collada.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * COLLADA (`.dae`: SketchUp's, Blender's, the BIM tools' exports) to a glTF binary, for `map.addModels({ data })`: its\n * meshes (triangles, polylists, polygons) where its scene's nodes put them, in metres (its `unit`) and with its up\n * axis turned to glTF's; its materials' diffuse colors, transparencies and textures. Lights, cameras, animations and\n * skins are left out; normals too (the models are shaded by their faces).\n */\n\nimport { fetchOk } from '../util/fetch.ts';\nimport { RAD } from '../util/geo.ts';\nimport { bounds, bufferBuilder, glbOf } from '../util/gltf.ts';\nimport { child, children, childText, parseXml, type XmlElement } from './xml.ts';\n\n/** A 4×4 matrix, column-major (as glTF's) */\ntype Matrix = number[];\n\nconst IDENTITY: Matrix = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n\n/** To glTF's axes (y up) from a document's up axis: Z_UP's (x, y, z) is (x, z, -y), X_UP's (-y, x, z) */\nconst UP_AXES: Record<string, Matrix> = {\n Y_UP: IDENTITY,\n Z_UP: [1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1],\n X_UP: [0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],\n};\n\n/** `a × b` */\nconst multiply = (a: Matrix, b: Matrix): Matrix =>\n IDENTITY.map((_, i) => {\n const [column, row] = [Math.floor(i / 4), i % 4];\n\n return [0, 1, 2, 3].reduce((sum, k) => sum + (a[k * 4 + row] ?? 0) * (b[column * 4 + k] ?? 0), 0);\n });\n\n/** The numbers of an element's text */\nconst numbers = (element: XmlElement | undefined): number[] =>\n (element?.text ?? '')\n .trim()\n .split(/\\s+/)\n .filter((s) => s !== '')\n .map(Number);\n\n/** A node's transform: its `matrix`, `translate`, `rotate` and `scale` children in their order */\nconst transformOf = (node: XmlElement): Matrix =>\n node.children.reduce((m, t) => {\n const v = numbers(t);\n const [x = 0, y = 0, z = 0, w = 0] = v;\n\n if (t.name === 'matrix' && v.length === 16) {\n // Row-major in COLLADA\n return multiply(\n m,\n IDENTITY.map((_, i) => v[(i % 4) * 4 + Math.floor(i / 4)] ?? 0),\n );\n }\n if (t.name === 'translate') return multiply(m, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1]);\n if (t.name === 'scale') return multiply(m, [x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1]);\n if (t.name === 'rotate') {\n const length = Math.hypot(x, y, z) || 1;\n const [ax, ay, az] = [x / length, y / length, z / length];\n const [c, s] = [Math.cos(w * RAD), Math.sin(w * RAD)];\n const k = 1 - c;\n\n return multiply(m, [\n ...[c + ax * ax * k, ay * ax * k + az * s, az * ax * k - ay * s, 0],\n ...[ax * ay * k - az * s, c + ay * ay * k, az * ay * k + ax * s, 0],\n ...[ax * az * k + ay * s, ay * az * k - ax * s, c + az * az * k, 0],\n ...[0, 0, 0, 1],\n ]);\n }\n\n return m;\n }, IDENTITY);\n\n/** A material as glTF takes it: its color (RGBA, linear as COLLADA's) and its texture's image, if any */\ninterface Material {\n color: [number, number, number, number];\n image?: string;\n}\n\n/** A primitive of the output: its positions (glTF axes, metres), texture coordinates, triangles and material */\ninterface Primitive {\n positions: number[];\n uvs: number[];\n indices: number[];\n material: number;\n}\n\n/** What `parseCollada` reads besides the document: the bytes of its textures by their path in it */\nexport interface ColladaImages {\n [path: string]: Uint8Array;\n}\n\n/** The paths of the images a COLLADA document uses (its `library_images`), to fetch before `parseCollada` */\nexport const colladaImages = (source: string): string[] => {\n return children(child(parseXml(source), 'library_images'), 'image')\n .map((image) => (childText(image, 'init_from') ?? childText(child(image, 'init_from'), 'ref') ?? '').trim())\n .filter((path) => path !== '');\n};\n\n/**\n * A COLLADA document as a glTF binary, its front +Z and its feet at its origin as its scene puts them; `images`: its\n * textures' bytes by their path in it (`colladaImages`), the materials without theirs taking their color\n */\nexport const parseCollada = (source: string, images: ColladaImages = {}): Uint8Array<ArrayBuffer> => {\n const root = parseXml(source);\n\n if (root.name !== 'COLLADA') throw new Error('isard: not a COLLADA document');\n\n // Every element by its id: the document's references are `#id`\n const byId = new Map<string, XmlElement>();\n const index = (e: XmlElement) => {\n if (e.attributes.id) byId.set(e.attributes.id, e);\n e.children.forEach(index);\n };\n\n index(root);\n\n const ref = (url: string | undefined) => (url?.startsWith('#') ? byId.get(url.slice(1)) : undefined);\n const asset = child(root, 'asset');\n const metres = Number(child(asset, 'unit')?.attributes.meter ?? 1) || 1;\n const up = (childText(asset, 'up_axis') ?? 'Y_UP').trim();\n // To glTF's axes, in metres\n const axes = (UP_AXES[up] ?? UP_AXES.Y_UP ?? IDENTITY).map((v, i) => (i < 12 ? v * metres : v));\n\n const materials: Material[] = [];\n const materialIds = new Map<string, number>();\n /** A material's index by its id, read from its effect (once) */\n const materialOf = (id: string | undefined): number => {\n const known = materialIds.get(id ?? '');\n\n if (known !== undefined) return known;\n\n const effect = ref(child(ref(id ? `#${id}` : undefined), 'instance_effect')?.attributes.url);\n const profile = child(effect, 'profile_COMMON');\n const technique = child(profile, 'technique');\n const shading = technique?.children.find((c) => ['phong', 'lambert', 'blinn', 'constant'].includes(c.name));\n const diffuse = child(shading, 'diffuse') ?? child(shading, 'emission');\n const [r = 0.8, g = 0.8, b = 0.8, a = 1] = numbers(child(diffuse, 'color'));\n const transparency = Number(childText(child(shading, 'transparency'), 'float') ?? 1);\n // The texture: sampler, surface, image (COLLADA 1.4's chain by the profile's params' sids)\n const param = (sid: string | undefined) =>\n profile?.children.find((p) => p.name === 'newparam' && p.attributes.sid === sid);\n const texture = child(diffuse, 'texture')?.attributes.texture;\n const sampler = child(param(texture), 'sampler2D');\n const surface = child(param(childText(sampler, 'source')?.trim()), 'surface');\n const imageId = (childText(surface, 'init_from') ?? texture ?? '').trim();\n const path = (childText(byId.get(imageId), 'init_from') ?? '').trim();\n const opacity = Math.min(a, Number.isFinite(transparency) ? transparency : 1);\n const material: Material = { color: [r, g, b, opacity], ...(path && images[path] && { image: path }) };\n const at = materials.length;\n\n materials.push(material);\n materialIds.set(id ?? '', at);\n\n return at;\n };\n\n const primitives: Primitive[] = [];\n\n /** The primitives of a geometry instanced under `matrix`, its materials bound by `binding` */\n const addGeometry = (geometry: XmlElement, matrix: Matrix, binding: Map<string, string>) => {\n const mesh = child(geometry, 'mesh');\n /** A source's values and stride */\n const sourceOf = (url: string | undefined): { values: number[]; stride: number } | undefined => {\n const element = ref(url);\n\n if (element?.name === 'vertices') {\n return sourceOf(\n children(element, 'input').find((i) => i.attributes.semantic === 'POSITION')?.attributes.source,\n );\n }\n\n const accessor = child(child(element, 'technique_common'), 'accessor');\n\n return (\n element && { values: numbers(child(element, 'float_array')), stride: Number(accessor?.attributes.stride ?? 3) }\n );\n };\n\n mesh?.children.forEach((part) => {\n if (!['triangles', 'polylist', 'polygons'].includes(part.name)) return;\n\n const inputs = children(part, 'input');\n const stride = inputs.reduce((n, i) => Math.max(n, Number(i.attributes.offset ?? 0) + 1), 1);\n const input = (semantic: string) => inputs.find((i) => i.attributes.semantic === semantic);\n const [vertex, texcoord] = [input('VERTEX'), input('TEXCOORD')];\n const positions = sourceOf(vertex?.attributes.source);\n const uvs = sourceOf(texcoord?.attributes.source);\n\n if (!vertex || !positions) return;\n\n // The polygons' corners as index tuples, then each polygon fanned into triangles\n const lists = part.name === 'polygons' ? children(part, 'p').map(numbers) : [numbers(child(part, 'p'))];\n // Each list's polygons' corner counts\n const counts = lists.map((p) => {\n if (part.name === 'triangles') return Array.from({ length: Number(part.attributes.count ?? 0) }, () => 3);\n\n return part.name === 'polylist' ? numbers(child(part, 'vcount')) : [p.length / stride];\n });\n const out: Primitive = {\n positions: [],\n uvs: [],\n indices: [],\n material: materialOf(binding.get(part.attributes.material ?? '') ?? part.attributes.material),\n };\n const corners = new Map<string, number>();\n const corner = (p: number[], at: number): number => {\n const v = p[at + Number(vertex.attributes.offset ?? 0)] ?? 0;\n const t = texcoord ? (p[at + Number(texcoord.attributes.offset ?? 0)] ?? 0) : -1;\n const key = `${v}/${t}`;\n const known = corners.get(key);\n\n if (known !== undefined) return known;\n\n const [x = 0, y = 0, z = 0] = positions.values.slice(v * positions.stride, v * positions.stride + 3);\n\n out.positions.push(\n (matrix[0] ?? 0) * x + (matrix[4] ?? 0) * y + (matrix[8] ?? 0) * z + (matrix[12] ?? 0),\n (matrix[1] ?? 0) * x + (matrix[5] ?? 0) * y + (matrix[9] ?? 0) * z + (matrix[13] ?? 0),\n (matrix[2] ?? 0) * x + (matrix[6] ?? 0) * y + (matrix[10] ?? 0) * z + (matrix[14] ?? 0),\n );\n if (uvs) {\n // glTF's v runs down the image\n out.uvs.push(uvs.values[t * uvs.stride] ?? 0, 1 - (uvs.values[t * uvs.stride + 1] ?? 0));\n }\n corners.set(key, corners.size);\n\n return corners.size - 1;\n };\n\n lists.forEach((p, l) => {\n let at = 0;\n\n (counts[l] ?? []).forEach((n) => {\n const first = corner(p, at * stride);\n\n for (let k = 1; k + 1 < n; k += 1) {\n out.indices.push(first, corner(p, (at + k) * stride), corner(p, (at + k + 1) * stride));\n }\n at += n;\n });\n });\n // A mirroring transform turns the faces inside out: wound back\n if (determinant(matrix) < 0) {\n for (let i = 0; i + 2 < out.indices.length; i += 3) {\n [out.indices[i + 1], out.indices[i + 2]] = [out.indices[i + 2] ?? 0, out.indices[i + 1] ?? 0];\n }\n }\n if (out.indices.length > 0) primitives.push(out);\n });\n };\n\n /** A node and those under it, under `parent`'s transform */\n const addNode = (node: XmlElement, parent: Matrix, depth = 0) => {\n if (depth > 64) return;\n\n const matrix = multiply(parent, transformOf(node));\n\n node.children.forEach((c) => {\n if (c.name === 'node') addNode(c, matrix, depth + 1);\n if (c.name === 'instance_node') {\n const target = ref(c.attributes.url);\n\n if (target) addNode(target, matrix, depth + 1);\n }\n if (c.name === 'instance_geometry') {\n const geometry = ref(c.attributes.url);\n const binding = new Map(\n children(child(child(c, 'bind_material'), 'technique_common'), 'instance_material').map((m) => [\n m.attributes.symbol ?? '',\n (m.attributes.target ?? '').replace(/^#/, ''),\n ]),\n );\n\n if (geometry) addGeometry(geometry, matrix, binding);\n }\n });\n };\n\n const scene =\n ref(child(child(root, 'scene'), 'instance_visual_scene')?.attributes.url) ??\n child(child(root, 'library_visual_scenes'), 'visual_scene');\n\n children(scene, 'node').forEach((node) => {\n addNode(node, axes);\n });\n if (primitives.length === 0) throw new Error('isard: no mesh in the COLLADA document');\n\n return gltfOf(primitives, materials, images);\n};\n\n/** The determinant of a matrix's upper 3×3 */\nconst determinant = (m: Matrix): number => {\n const [a = 0, b = 0, c = 0, , d = 0, e = 0, f = 0, , g = 0, h = 0, i = 0] = m;\n\n return a * (e * i - f * h) - d * (b * i - c * h) + g * (b * f - c * e);\n};\n\n/** The glTF binary of primitives and their materials: each primitive's positions, texture coordinates and indices,\n * then the images, in its buffer */\nconst gltfOf = (primitives: Primitive[], materials: Material[], images: ColladaImages): Uint8Array<ArrayBuffer> => {\n const used = [...new Set(materials.flatMap((m) => (m.image ? [m.image] : [])))];\n const { views, append, bin: buffer } = bufferBuilder();\n const accessors: Record<string, unknown>[] = [];\n const meshes = primitives.map((p) => {\n const count = p.positions.length / 3;\n\n accessors.push({\n bufferView: append(new Uint8Array(new Float32Array(p.positions).buffer), 34962),\n componentType: 5126,\n count,\n type: 'VEC3',\n ...bounds(p.positions),\n });\n\n const position = accessors.length - 1;\n const textured = p.uvs.length > 0 && materials[p.material]?.image !== undefined;\n\n if (textured) {\n accessors.push({\n bufferView: append(new Uint8Array(new Float32Array(p.uvs).buffer), 34962),\n componentType: 5126,\n count,\n type: 'VEC2',\n });\n }\n\n const uv = accessors.length - 1;\n\n accessors.push({\n bufferView: append(new Uint8Array(new Uint32Array(p.indices).buffer), 34963),\n componentType: 5125,\n count: p.indices.length,\n type: 'SCALAR',\n });\n\n return {\n attributes: { POSITION: position, ...(textured && { TEXCOORD_0: uv }) },\n indices: accessors.length - 1,\n material: p.material,\n };\n });\n const imageViews = used.map((path) => append(images[path] ?? new Uint8Array()));\n const bin = buffer();\n\n const gltf = {\n asset: { version: '2.0', generator: 'isard (COLLADA)' },\n scene: 0,\n scenes: [{ nodes: [0] }],\n nodes: [{ mesh: 0 }],\n meshes: [{ primitives: meshes }],\n materials: materials.map(({ color, image }) => ({\n pbrMetallicRoughness: {\n baseColorFactor: color,\n metallicFactor: 0,\n roughnessFactor: 1,\n ...(image && { baseColorTexture: { index: used.indexOf(image) } }),\n },\n ...(color[3] < 1 && { alphaMode: 'BLEND' }),\n doubleSided: true,\n })),\n ...(used.length > 0 && {\n textures: used.map((_, i) => ({ source: i, sampler: 0 })),\n samplers: [{ magFilter: 9729, minFilter: 9987, wrapS: 10497, wrapT: 10497 }],\n images: used.map((path, i) => ({\n bufferView: imageViews[i],\n mimeType: /\\.png$/i.test(path) ? 'image/png' : 'image/jpeg',\n })),\n }),\n accessors,\n bufferViews: views,\n buffers: [{ byteLength: bin.byteLength }],\n };\n\n return glbOf(gltf, bin);\n};\n\n/** A COLLADA file and its textures (next to it) read as a glTF binary for `map.addModels({ data })` */\nexport const loadCollada = async (url: string, init?: RequestInit): Promise<Uint8Array<ArrayBuffer>> => {\n const response = await fetchOk(url, init);\n\n const source = await response.text();\n const base = new URL(url, typeof document === 'undefined' ? undefined : document.baseURI);\n const images = Object.fromEntries(\n await Promise.all(\n colladaImages(source).map(async (path) => {\n const image = await fetch(new URL(path, base), init).catch(() => undefined);\n\n return [path, image?.ok ? new Uint8Array(await image.arrayBuffer()) : new Uint8Array()] as const;\n }),\n ),\n );\n\n return parseCollada(source, Object.fromEntries(Object.entries(images).filter(([, bytes]) => bytes.byteLength > 0)));\n};\n"]}
|
package/dist/data/ifc.js
CHANGED
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
* element a feature of it, picked by the map: `hit.index` is the element's), the elements' properties on demand, and
|
|
6
6
|
* where the model stands (its map conversion in a projected CRS, else its site's latitude and longitude).
|
|
7
7
|
*/
|
|
8
|
-
import {
|
|
8
|
+
import { fetchOk } from "../util/fetch.js";
|
|
9
|
+
import { METRES_PER_DEGREE, RAD } from "../util/geo.js";
|
|
9
10
|
import { bounds, bufferBuilder, glbOf } from "../util/gltf.js";
|
|
10
11
|
import { getCrs } from "./crs.js";
|
|
11
12
|
/** web-ifc's build used by default: its module (`web-ifc-api.js`) and its WebAssembly (`web-ifc.wasm`) */
|
|
@@ -244,7 +245,7 @@ export const placeIfc = ({ shift, unit, map, crs, site, north }) => {
|
|
|
244
245
|
const [lon = 0, lat = 0] = projection.inverse([east, northing]);
|
|
245
246
|
const [lon2 = 0, lat2 = 0] = projection.inverse([east, northing + 100]);
|
|
246
247
|
// The grid's north from the true north there, and the file's north (its y) from the grid's
|
|
247
|
-
const convergence = bearingOf((lon2 - lon) * Math.cos(
|
|
248
|
+
const convergence = bearingOf((lon2 - lon) * Math.cos(lat * RAD), lat2 - lat);
|
|
248
249
|
return {
|
|
249
250
|
lonLat: [lon, lat],
|
|
250
251
|
elevation: h + k * z,
|
|
@@ -261,10 +262,10 @@ export const placeIfc = ({ shift, unit, map, crs, site, north }) => {
|
|
|
261
262
|
const heading = -bearingOf(nx, ny);
|
|
262
263
|
const [lon, lat, elevation] = site;
|
|
263
264
|
// The origin's offset from the site's (metres, the plan turned to the north)
|
|
264
|
-
const turn =
|
|
265
|
+
const turn = heading * RAD;
|
|
265
266
|
const [east, northing] = [x * Math.cos(turn) + y * Math.sin(turn), -x * Math.sin(turn) + y * Math.cos(turn)];
|
|
266
267
|
return {
|
|
267
|
-
lonLat: [lon + east / (METRES_PER_DEGREE * Math.cos(
|
|
268
|
+
lonLat: [lon + east / (METRES_PER_DEGREE * Math.cos(lat * RAD)), lat + northing / METRES_PER_DEGREE],
|
|
268
269
|
elevation: elevation + z,
|
|
269
270
|
heading,
|
|
270
271
|
from: 'site',
|
|
@@ -275,13 +276,7 @@ export const placeIfc = ({ shift, unit, map, crs, site, north }) => {
|
|
|
275
276
|
* when asked, the elements' properties on demand, where it stands
|
|
276
277
|
*/
|
|
277
278
|
export const loadIfc = async (source, options = {}) => {
|
|
278
|
-
const bytes = typeof source === 'string'
|
|
279
|
-
? await fetch(source, options.init).then((r) => {
|
|
280
|
-
if (!r.ok)
|
|
281
|
-
throw new Error(`isard: ${source}: ${r.status}`);
|
|
282
|
-
return r.arrayBuffer();
|
|
283
|
-
})
|
|
284
|
-
: source;
|
|
279
|
+
const bytes = typeof source === 'string' ? await fetchOk(source, options.init).then((r) => r.arrayBuffer()) : source;
|
|
285
280
|
const script = URL.createObjectURL(new Blob([WORKER], { type: 'text/javascript' }));
|
|
286
281
|
const worker = new Worker(script, { type: 'module' });
|
|
287
282
|
/** The answers awaited, by request */
|
package/dist/data/ifc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ifc.js","sourceRoot":"","sources":["../../src/data/ifc.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * IFC models (the BIM tools' own format: Revit, ArchiCAD, Tekla, Allplan, Bonsai…) read by web-ifc (ThatOpen,\n * MPL-2.0) in a worker of their own, web-ifc fetched on first use from a CDN (or a folder of yours): the model's\n * storeys and elements at once, each storey's geometry when asked (a glTF binary for `map.addModels({ data })`, each\n * element a feature of it, picked by the map: `hit.index` is the element's), the elements' properties on demand, and\n * where the model stands (its map conversion in a projected CRS, else its site's latitude and longitude).\n */\n\nimport { METRES_PER_DEGREE } from '../util/geo.ts';\nimport { bounds, bufferBuilder, glbOf } from '../util/gltf.ts';\nimport { getCrs } from './crs.ts';\n\n/** web-ifc's build used by default: its module (`web-ifc-api.js`) and its WebAssembly (`web-ifc.wasm`) */\nexport const WEB_IFC = 'https://cdn.jsdelivr.net/npm/web-ifc@0.0.78/';\n\nexport interface IfcOptions {\n /** Folder of `web-ifc-api.js` and `web-ifc.wasm` (ending with `/`; `WEB_IFC` by default): self-host them for offline\n * or locked-down networks. The worker imports the module from a `blob:` URL: a Content Security Policy needs\n * `blob:` in `worker-src` */\n webIfc?: string;\n /** Request options of the file's fetch (headers of a private source) */\n init?: RequestInit;\n}\n\n/** An element of the model (a wall, a slab, a window, a stair…) */\nexport interface IfcElement {\n /** Its IFC id (STEP line number) */\n id: number;\n /** Its IFC class (`IfcWall`, `IfcSlab`, `IfcWindow`…) */\n type: string;\n name: string;\n /** Its storey in `IfcModel.storeys` */\n storey: number;\n}\n\n/** A storey of the model: its elements, its geometry when asked */\nexport interface IfcStorey {\n id: number;\n name: string;\n /** Metres above the model's origin */\n elevation: number;\n /** Its elements (`IfcModel.elements`' indices) */\n elements: number[];\n /**\n * Its elements' geometry as a glTF binary (their features: `IfcModel.elements`' indices) in the model's frame: y up,\n * its north toward +z (`IfcModel.place.heading` turns it), its origin at the model's; meshed in the worker on the\n * first call (a large model's storeys one at a time, those in view only)\n */\n load(): Promise<Uint8Array<ArrayBuffer>>;\n}\n\n/** An element's properties: its attributes, then its property and quantity sets, by name */\nexport type IfcProperties = Record<string, Record<string, string | number | boolean | null>>;\n\n/** Where a model stands: its origin's position and height, the way its north faces */\nexport interface IfcPlace {\n lonLat: [number, number];\n /** Metres above the sea (its map conversion's height, its site's `RefElevation`) */\n elevation: number;\n /** Degrees clockwise from the north of the model's north (an instance's `heading`) */\n heading: number;\n /** How it is known: its map conversion (exact, `crs` its projected CRS), or its site's latitude and longitude */\n from: 'map' | 'site';\n crs?: string;\n}\n\nexport interface IfcModel {\n /** Its storeys from the lowest up, elements outside any storey (the site's) in one of their own at the start */\n storeys: IfcStorey[];\n /** Its elements, the features of the storeys' models */\n elements: IfcElement[];\n /** Where it stands, if the file says (`IfcMapConversion` in a CRS isard knows, else `IfcSite`'s position) */\n place?: IfcPlace;\n /** An element's properties, read from the file kept open in the worker */\n properties(element: number): Promise<IfcProperties>;\n /** Closes the file and its worker */\n close(): void;\n}\n\n/**\n * The worker's code: web-ifc imported from `base`, the file opened; its storeys, its elements (the spatial structure's\n * products) and what places it (its map conversion, its site, its true north) given at once, a storey's meshes when\n * asked (positions put in the model's frame, colors), the properties asked for\n */\nconst WORKER = `\nlet api, model, W;\nconst text = (v) => (v && typeof v.value !== 'undefined' ? v.value : null);\nconst degrees = (v) => {\n const parts = text(v);\n if (!Array.isArray(parts)) return undefined;\n const [d = 0, m = 0, s = 0, u = 0] = parts.map((p) => text(p) ?? p);\n return d + m / 60 + s / 3600 + u / 3600e6;\n};\nconst plain = (line) => Object.fromEntries(\n Object.entries(line ?? {})\n // Values, not references to other lines (type 5) nor lists\n .filter(([k, v]) => v && typeof v === 'object' && 'value' in v && v.type !== 5 && typeof v.value !== 'object' && k !== 'expressID')\n .map(([k, v]) => [k, v.value]),\n);\nconst ids = (type) => { const v = api.GetLineIDsWithType(model, type); return Array.from({ length: v.size() }, (_, i) => v.get(i)); };\nconst line = (ref) => (ref && ref.value !== undefined ? api.GetLine(model, ref.value) : undefined);\n// The spatial structure's containers, and the products drawn by no element of their own (the site is one when it has\n// a shape: its terrain)\nconst SPATIAL = new Set(['IFCPROJECT', 'IFCBUILDING', 'IFCBUILDINGSTOREY', 'IFCSPACE', 'IFCOPENINGELEMENT']);\nconst PREFIXES = { EXA: 1e18, PETA: 1e15, TERA: 1e12, GIGA: 1e9, MEGA: 1e6, KILO: 1e3, HECTO: 100, DECA: 10, DECI: 0.1, CENTI: 0.01, MILLI: 0.001, MICRO: 1e-6 };\n/** Metres per length unit of the project */\nconst unitScale = () => {\n const project = ids(W.IFCPROJECT).map((id) => api.GetLine(model, id))[0];\n const units = line(project?.UnitsInContext)?.Units ?? [];\n for (const ref of units) {\n const unit = line(ref);\n if (text(unit?.UnitType) !== 'LENGTHUNIT') continue;\n if (unit.Prefix !== undefined || text(unit.Name) === 'METRE') return PREFIXES[text(unit.Prefix)] ?? 1;\n // A conversion-based unit (the foot): its factor, in metres when its unit is\n const factor = line(unit.ConversionFactor);\n const value = Number(text(factor?.ValueComponent) ?? NaN);\n if (Number.isFinite(value)) return value * (PREFIXES[text(line(factor?.UnitComponent)?.Prefix)] ?? 1);\n }\n return 1;\n};\nonmessage = async ({ data }) => {\n try {\n if (data.type === 'open') {\n W = await import(data.base + 'web-ifc-api.js');\n api = new W.IfcAPI();\n api.SetWasmPath(data.base, true);\n await api.Init();\n model = api.OpenModel(new Uint8Array(data.bytes), { COORDINATE_TO_ORIGIN: true });\n const unit = unitScale();\n const storeys = ids(W.IFCBUILDINGSTOREY).map((id) => {\n const l = api.GetLine(model, id);\n return { id, name: text(l.Name) ?? '', elevation: Number(text(l.Elevation) ?? 0) * unit };\n });\n // The products of the spatial structure and their storeys\n const elements = [];\n const walk = (node, storey) => {\n const type = String(node.type);\n const here = type.toUpperCase() === 'IFCBUILDINGSTOREY' ? node.expressID : storey;\n const drawn = type.toUpperCase() !== 'IFCSITE' || api.GetLine(model, node.expressID)?.Representation;\n if (!SPATIAL.has(type.toUpperCase()) && drawn) {\n elements.push({ id: node.expressID, type, name: text(api.GetLine(model, node.expressID)?.Name) ?? '', storey: here ?? -1 });\n }\n (node.children ?? []).forEach((c) => walk(c, here));\n };\n walk(await api.properties.getSpatialStructure(model), undefined);\n // What places it: the shift web-ifc made to bring it near the origin (metres, its y-up frame), the map\n // conversion and its CRS, the site's latitude and longitude, the true north\n const shift = api.GetCoordinationMatrix(model).slice(12, 15);\n const conversion = ids(W.IFCMAPCONVERSION).map((id) => api.GetLine(model, id))[0];\n const site = ids(W.IFCSITE).map((id) => api.GetLine(model, id))[0];\n const north = ids(W.IFCGEOMETRICREPRESENTATIONCONTEXT)\n .map((id) => line(api.GetLine(model, id).TrueNorth))\n .find((d) => d)?.DirectionRatios?.map((r) => text(r) ?? r);\n const [lat, lon] = [degrees(site?.RefLatitude), degrees(site?.RefLongitude)];\n postMessage({\n type: 'model',\n storeys,\n elements,\n place: {\n shift,\n unit,\n ...(conversion && {\n map: ['Eastings', 'Northings', 'OrthogonalHeight', 'XAxisAbscissa', 'XAxisOrdinate', 'Scale'].map((k) => Number(text(conversion[k]) ?? (k === 'Scale' || k === 'XAxisAbscissa' ? 1 : 0))),\n crs: text(line(conversion.TargetCRS)?.Name),\n }),\n ...(lat !== undefined && lon !== undefined && { site: [lon, lat, Number(text(site.RefElevation) ?? 0) * unit] }),\n ...(north && { north }),\n },\n });\n } else if (data.type === 'storey') {\n const parts = [];\n const feature = new Map(data.ids.map((id, i) => [id, data.features[i]]));\n // web-ifc 0.0.78's browser build takes three arguments where its API passes four: called directly then\n const stream = (callback) => {\n try {\n api.StreamMeshes(model, data.ids, callback);\n } catch (error) {\n if (!/arguments/.test(String(error))) throw error;\n api.wasmModule.StreamMeshes(model, data.ids, callback);\n }\n };\n stream((mesh) => {\n for (let i = 0; i < mesh.geometries.size(); i++) {\n const placed = mesh.geometries.get(i);\n const geometry = api.GetGeometry(model, placed.geometryExpressID);\n const v = api.GetVertexArray(geometry.GetVertexData(), geometry.GetVertexDataSize());\n const indices = api.GetIndexArray(geometry.GetIndexData(), geometry.GetIndexDataSize()).slice();\n const m = placed.flatTransformation;\n const positions = new Float32Array((v.length / 6) * 3);\n for (let k = 0, p = 0; k < v.length; k += 6, p += 3) {\n const [x, y, z] = [v[k], v[k + 1], v[k + 2]];\n // Turned half a turn round y: the model's north (-z of web-ifc's y-up frame) toward +z, glTF's front\n positions[p] = -(m[0] * x + m[4] * y + m[8] * z + m[12]);\n positions[p + 1] = m[1] * x + m[5] * y + m[9] * z + m[13];\n positions[p + 2] = -(m[2] * x + m[6] * y + m[10] * z + m[14]);\n }\n const c = placed.color;\n parts.push({ feature: feature.get(mesh.expressID) ?? 0, color: [c.x, c.y, c.z, c.w], positions, indices });\n geometry.delete();\n }\n });\n postMessage({ type: 'storey', request: data.request, parts }, parts.flatMap((p) => [p.positions.buffer, p.indices.buffer]));\n } else if (data.type === 'properties') {\n const properties = { Attributes: plain(api.GetLine(model, data.id)) };\n const sets = await api.properties.getPropertySets(model, data.id, true);\n for (const set of sets) {\n const values = {};\n for (const p of [...(set.HasProperties ?? []), ...(set.Quantities ?? [])]) {\n const name = text(p.Name);\n if (!name) continue;\n const value = p.NominalValue ?? p.LengthValue ?? p.AreaValue ?? p.VolumeValue ?? p.CountValue ?? p.WeightValue;\n values[name] = text(value);\n }\n properties[text(set.Name) ?? 'Set ' + set.expressID] = values;\n }\n postMessage({ type: 'properties', request: data.request, properties });\n }\n } catch (error) {\n postMessage({ type: 'error', request: data.request, message: String(error?.message ?? error) });\n }\n};\n`;\n\n/** A part of the model: an element's geometry in one color */\ninterface Part {\n feature: number;\n color: [number, number, number, number];\n positions: Float32Array;\n indices: Uint32Array;\n}\n\n/** A storey's parts as a glTF binary: a primitive per color, each vertex its element (`_BATCHID`) */\nexport const storeyModel = (parts: readonly Part[]): Uint8Array<ArrayBuffer> => {\n const byColor = new Map<string, Part[]>();\n\n parts.forEach((p) => {\n const key = p.color.map((c) => c.toFixed(3)).join(',');\n\n byColor.set(key, [...(byColor.get(key) ?? []), p]);\n });\n\n const { views, append, bin: buffer } = bufferBuilder();\n const accessors: Record<string, unknown>[] = [];\n const groups = [...byColor.values()];\n const primitives = groups.map((group, material) => {\n const count = group.reduce((n, p) => n + p.positions.length / 3, 0);\n const positions = new Float32Array(count * 3);\n const features = new Float32Array(count);\n const indices = new Uint32Array(group.reduce((n, p) => n + p.indices.length, 0));\n let [vertex, index] = [0, 0];\n\n group.forEach((p) => {\n positions.set(p.positions, vertex * 3);\n features.fill(p.feature, vertex, vertex + p.positions.length / 3);\n p.indices.forEach((i, k) => {\n indices[index + k] = i + vertex;\n });\n vertex += p.positions.length / 3;\n index += p.indices.length;\n });\n accessors.push(\n {\n bufferView: append(new Uint8Array(positions.buffer), 34962),\n componentType: 5126,\n count,\n type: 'VEC3',\n ...bounds([...positions]),\n },\n { bufferView: append(new Uint8Array(features.buffer), 34962), componentType: 5126, count, type: 'SCALAR' },\n {\n bufferView: append(new Uint8Array(indices.buffer), 34963),\n componentType: 5125,\n count: indices.length,\n type: 'SCALAR',\n },\n );\n\n const at = accessors.length - 3;\n\n return { attributes: { POSITION: at, _BATCHID: at + 1 }, indices: at + 2, material };\n });\n const bin = buffer();\n\n return glbOf(\n {\n asset: { version: '2.0', generator: 'isard (IFC)' },\n scene: 0,\n scenes: [{ nodes: [0] }],\n nodes: [{ mesh: 0 }],\n meshes: [{ primitives }],\n materials: groups.map((group) => {\n const color = group[0]?.color ?? [0.8, 0.8, 0.8, 1];\n\n return {\n pbrMetallicRoughness: { baseColorFactor: color, metallicFactor: 0, roughnessFactor: 1 },\n ...(color[3] < 1 && { alphaMode: 'BLEND' }),\n doubleSided: true,\n };\n }),\n accessors,\n bufferViews: views,\n buffers: [{ byteLength: bin.byteLength }],\n },\n bin,\n );\n};\n\n/** What places a model, as the worker reads it: web-ifc's shift of it (metres, its y-up frame), its project's metres\n * per unit, its map conversion (eastings, northings, height, x axis' abscissa and ordinate, scale) and its CRS, its\n * site's longitude, latitude and elevation, its true north (in its plan) */\nexport interface IfcPlacing {\n shift: number[];\n unit: number;\n map?: number[];\n crs?: string | null;\n site?: [number, number, number];\n north?: number[];\n}\n\n/** Degrees clockwise from the north of the true north to (x, y) in a plan whose y would be north */\nconst bearingOf = (x: number, y: number): number => (Math.atan2(x, y) * 180) / Math.PI;\n\n/**\n * Where a model's origin (its glTF's) stands: by its map conversion when its CRS is known (the origin in the file's\n * frame, before web-ifc's shift, taken to the map's eastings and northings, then to longitude and latitude; its north\n * turned by the conversion's x axis and the grid's convergence there), else by its site's latitude and longitude\n * turned by its true north\n */\nexport const placeIfc = ({ shift, unit, map, crs, site, north }: IfcPlacing): IfcPlace | undefined => {\n // The origin in the file's frame (metres, z up): web-ifc's y-up shift undone\n const [sx = 0, sy = 0, sz = 0] = shift;\n const [x, y, z] = [-sx, sz, -sy];\n\n if (map && crs) {\n const projection = (() => {\n try {\n return getCrs(crs);\n } catch {\n return undefined;\n }\n })();\n const [e = 0, n = 0, h = 0, ax = 1, ay = 0, scale = 1] = map;\n\n if (projection) {\n const length = Math.hypot(ax, ay) || 1;\n const [a, b] = [ax / length, ay / length];\n // The conversion's scale takes the project's units to the map's; the geometry is in metres already\n const k = scale / unit;\n const [east, northing] = [e + k * (a * x - b * y), n + k * (b * x + a * y)];\n const [lon = 0, lat = 0] = projection.inverse([east, northing]);\n const [lon2 = 0, lat2 = 0] = projection.inverse([east, northing + 100]);\n // The grid's north from the true north there, and the file's north (its y) from the grid's\n const convergence = bearingOf((lon2 - lon) * Math.cos((lat * Math.PI) / 180), lat2 - lat);\n\n return {\n lonLat: [lon, lat],\n elevation: h + k * z,\n heading: bearingOf(-b, a) + convergence,\n from: 'map',\n crs,\n };\n }\n }\n if (!site) return undefined;\n\n // The true north in the plan: the plan's y turned from it the other way\n const [nx = 0, ny = 1] = north ?? [];\n const heading = -bearingOf(nx, ny);\n const [lon, lat, elevation] = site;\n // The origin's offset from the site's (metres, the plan turned to the north)\n const turn = (heading * Math.PI) / 180;\n const [east, northing] = [x * Math.cos(turn) + y * Math.sin(turn), -x * Math.sin(turn) + y * Math.cos(turn)];\n\n return {\n lonLat: [lon + east / (METRES_PER_DEGREE * Math.cos((lat * Math.PI) / 180)), lat + northing / METRES_PER_DEGREE],\n elevation: elevation + z,\n heading,\n from: 'site',\n };\n};\n\n/** The answer of the worker to a message */\ntype Answer =\n | { type: 'model'; storeys: Omit<IfcStorey, 'elements' | 'load'>[]; elements: IfcElement[]; place: IfcPlacing }\n | { type: 'storey'; request: number; parts: Part[] }\n | { type: 'properties'; request: number; properties: IfcProperties }\n | { type: 'error'; request?: number; message: string };\n\n/**\n * An IFC file (its URL, or its bytes) opened by web-ifc in a worker: its storeys and elements, each storey's geometry\n * when asked, the elements' properties on demand, where it stands\n */\nexport const loadIfc = async (source: string | ArrayBuffer, options: IfcOptions = {}): Promise<IfcModel> => {\n const bytes =\n typeof source === 'string'\n ? await fetch(source, options.init).then((r) => {\n if (!r.ok) throw new Error(`isard: ${source}: ${r.status}`);\n\n return r.arrayBuffer();\n })\n : source;\n const script = URL.createObjectURL(new Blob([WORKER], { type: 'text/javascript' }));\n const worker = new Worker(script, { type: 'module' });\n /** The answers awaited, by request */\n const pending = new Map<number, { resolve: (answer: Answer) => void; reject: (e: Error) => void }>();\n let request = 0;\n const ask = <A extends Answer>(message: Record<string, unknown>): Promise<A> =>\n new Promise((resolve, reject) => {\n request += 1;\n pending.set(request, { resolve: (answer) => resolve(answer as A), reject });\n worker.postMessage({ ...message, request });\n });\n\n URL.revokeObjectURL(script);\n\n const opened = await new Promise<Extract<Answer, { type: 'model' }>>((resolve, reject) => {\n // The worker failing: the model not opened, or (once it is) every answer awaited\n const fail = (error: Error) => {\n reject(error);\n pending.forEach((waiting) => {\n waiting.reject(error);\n });\n pending.clear();\n };\n\n worker.onmessage = ({ data }: MessageEvent<Answer>) => {\n if (data.type === 'model') resolve(data);\n else if (data.request === undefined) fail(new Error(`isard: IFC: ${data.type === 'error' ? data.message : ''}`));\n else {\n const waiting = pending.get(data.request);\n\n pending.delete(data.request);\n if (data.type === 'error') waiting?.reject(new Error(`isard: IFC: ${data.message}`));\n else waiting?.resolve(data);\n }\n };\n worker.onerror = (e) => {\n fail(new Error(`isard: IFC worker: ${e.message}`));\n };\n worker.postMessage({ type: 'open', base: options.webIfc ?? WEB_IFC, bytes }, [bytes]);\n }).catch((error: unknown) => {\n worker.terminate();\n throw error;\n });\n\n // The storeys holding elements from the lowest up, the elements outside any in one of their own first (at the\n // lowest storey's elevation)\n const used = new Set(opened.elements.map((e) => e.storey));\n const sorted = opened.storeys.filter((s) => used.has(s.id)).sort((a, b) => a.elevation - b.elevation);\n const outside = opened.elements.some((e) => !sorted.some((s) => s.id === e.storey));\n const list = [...(outside ? [{ id: -1, name: 'Site', elevation: sorted[0]?.elevation ?? 0 }] : []), ...sorted];\n const storeyIndex = new Map(list.map((s, i) => [s.id, i]));\n const elements: IfcElement[] = opened.elements.map((e) => ({ ...e, storey: storeyIndex.get(e.storey) ?? 0 }));\n const storeys: IfcStorey[] = list.map((s, i) => {\n const members = elements.flatMap((e, k) => (e.storey === i ? [k] : []));\n let loaded: Promise<Uint8Array<ArrayBuffer>> | undefined;\n\n return {\n ...s,\n elements: members,\n load: () => {\n loaded ??= ask<Extract<Answer, { type: 'storey' }>>({\n type: 'storey',\n ids: members.map((k) => elements[k]?.id ?? 0),\n features: members,\n }).then(({ parts }) => storeyModel(parts));\n\n return loaded;\n },\n };\n });\n const place = placeIfc(opened.place);\n\n return {\n storeys,\n elements,\n ...(place && { place }),\n properties: (element: number) => {\n const id = elements[element]?.id;\n\n if (id === undefined) return Promise.reject(new Error(`isard: IFC: no element ${element}`));\n\n return ask<Extract<Answer, { type: 'properties' }>>({ type: 'properties', id }).then((a) => a.properties);\n },\n close: () => {\n worker.terminate();\n pending.forEach(({ reject }) => {\n reject(new Error('isard: IFC model closed'));\n });\n pending.clear();\n },\n };\n};\n"]}
|
|
1
|
+
{"version":3,"file":"ifc.js","sourceRoot":"","sources":["../../src/data/ifc.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * IFC models (the BIM tools' own format: Revit, ArchiCAD, Tekla, Allplan, Bonsai…) read by web-ifc (ThatOpen,\n * MPL-2.0) in a worker of their own, web-ifc fetched on first use from a CDN (or a folder of yours): the model's\n * storeys and elements at once, each storey's geometry when asked (a glTF binary for `map.addModels({ data })`, each\n * element a feature of it, picked by the map: `hit.index` is the element's), the elements' properties on demand, and\n * where the model stands (its map conversion in a projected CRS, else its site's latitude and longitude).\n */\n\nimport { fetchOk } from '../util/fetch.ts';\nimport { METRES_PER_DEGREE, RAD } from '../util/geo.ts';\nimport { bounds, bufferBuilder, glbOf } from '../util/gltf.ts';\nimport { getCrs } from './crs.ts';\n\n/** web-ifc's build used by default: its module (`web-ifc-api.js`) and its WebAssembly (`web-ifc.wasm`) */\nexport const WEB_IFC = 'https://cdn.jsdelivr.net/npm/web-ifc@0.0.78/';\n\nexport interface IfcOptions {\n /** Folder of `web-ifc-api.js` and `web-ifc.wasm` (ending with `/`; `WEB_IFC` by default): self-host them for offline\n * or locked-down networks. The worker imports the module from a `blob:` URL: a Content Security Policy needs\n * `blob:` in `worker-src` */\n webIfc?: string;\n /** Request options of the file's fetch (headers of a private source) */\n init?: RequestInit;\n}\n\n/** An element of the model (a wall, a slab, a window, a stair…) */\nexport interface IfcElement {\n /** Its IFC id (STEP line number) */\n id: number;\n /** Its IFC class (`IfcWall`, `IfcSlab`, `IfcWindow`…) */\n type: string;\n name: string;\n /** Its storey in `IfcModel.storeys` */\n storey: number;\n}\n\n/** A storey of the model: its elements, its geometry when asked */\nexport interface IfcStorey {\n id: number;\n name: string;\n /** Metres above the model's origin */\n elevation: number;\n /** Its elements (`IfcModel.elements`' indices) */\n elements: number[];\n /**\n * Its elements' geometry as a glTF binary (their features: `IfcModel.elements`' indices) in the model's frame: y up,\n * its north toward +z (`IfcModel.place.heading` turns it), its origin at the model's; meshed in the worker on the\n * first call (a large model's storeys one at a time, those in view only)\n */\n load(): Promise<Uint8Array<ArrayBuffer>>;\n}\n\n/** An element's properties: its attributes, then its property and quantity sets, by name */\nexport type IfcProperties = Record<string, Record<string, string | number | boolean | null>>;\n\n/** Where a model stands: its origin's position and height, the way its north faces */\nexport interface IfcPlace {\n lonLat: [number, number];\n /** Metres above the sea (its map conversion's height, its site's `RefElevation`) */\n elevation: number;\n /** Degrees clockwise from the north of the model's north (an instance's `heading`) */\n heading: number;\n /** How it is known: its map conversion (exact, `crs` its projected CRS), or its site's latitude and longitude */\n from: 'map' | 'site';\n crs?: string;\n}\n\nexport interface IfcModel {\n /** Its storeys from the lowest up, elements outside any storey (the site's) in one of their own at the start */\n storeys: IfcStorey[];\n /** Its elements, the features of the storeys' models */\n elements: IfcElement[];\n /** Where it stands, if the file says (`IfcMapConversion` in a CRS isard knows, else `IfcSite`'s position) */\n place?: IfcPlace;\n /** An element's properties, read from the file kept open in the worker */\n properties(element: number): Promise<IfcProperties>;\n /** Closes the file and its worker */\n close(): void;\n}\n\n/**\n * The worker's code: web-ifc imported from `base`, the file opened; its storeys, its elements (the spatial structure's\n * products) and what places it (its map conversion, its site, its true north) given at once, a storey's meshes when\n * asked (positions put in the model's frame, colors), the properties asked for\n */\nconst WORKER = `\nlet api, model, W;\nconst text = (v) => (v && typeof v.value !== 'undefined' ? v.value : null);\nconst degrees = (v) => {\n const parts = text(v);\n if (!Array.isArray(parts)) return undefined;\n const [d = 0, m = 0, s = 0, u = 0] = parts.map((p) => text(p) ?? p);\n return d + m / 60 + s / 3600 + u / 3600e6;\n};\nconst plain = (line) => Object.fromEntries(\n Object.entries(line ?? {})\n // Values, not references to other lines (type 5) nor lists\n .filter(([k, v]) => v && typeof v === 'object' && 'value' in v && v.type !== 5 && typeof v.value !== 'object' && k !== 'expressID')\n .map(([k, v]) => [k, v.value]),\n);\nconst ids = (type) => { const v = api.GetLineIDsWithType(model, type); return Array.from({ length: v.size() }, (_, i) => v.get(i)); };\nconst line = (ref) => (ref && ref.value !== undefined ? api.GetLine(model, ref.value) : undefined);\n// The spatial structure's containers, and the products drawn by no element of their own (the site is one when it has\n// a shape: its terrain)\nconst SPATIAL = new Set(['IFCPROJECT', 'IFCBUILDING', 'IFCBUILDINGSTOREY', 'IFCSPACE', 'IFCOPENINGELEMENT']);\nconst PREFIXES = { EXA: 1e18, PETA: 1e15, TERA: 1e12, GIGA: 1e9, MEGA: 1e6, KILO: 1e3, HECTO: 100, DECA: 10, DECI: 0.1, CENTI: 0.01, MILLI: 0.001, MICRO: 1e-6 };\n/** Metres per length unit of the project */\nconst unitScale = () => {\n const project = ids(W.IFCPROJECT).map((id) => api.GetLine(model, id))[0];\n const units = line(project?.UnitsInContext)?.Units ?? [];\n for (const ref of units) {\n const unit = line(ref);\n if (text(unit?.UnitType) !== 'LENGTHUNIT') continue;\n if (unit.Prefix !== undefined || text(unit.Name) === 'METRE') return PREFIXES[text(unit.Prefix)] ?? 1;\n // A conversion-based unit (the foot): its factor, in metres when its unit is\n const factor = line(unit.ConversionFactor);\n const value = Number(text(factor?.ValueComponent) ?? NaN);\n if (Number.isFinite(value)) return value * (PREFIXES[text(line(factor?.UnitComponent)?.Prefix)] ?? 1);\n }\n return 1;\n};\nonmessage = async ({ data }) => {\n try {\n if (data.type === 'open') {\n W = await import(data.base + 'web-ifc-api.js');\n api = new W.IfcAPI();\n api.SetWasmPath(data.base, true);\n await api.Init();\n model = api.OpenModel(new Uint8Array(data.bytes), { COORDINATE_TO_ORIGIN: true });\n const unit = unitScale();\n const storeys = ids(W.IFCBUILDINGSTOREY).map((id) => {\n const l = api.GetLine(model, id);\n return { id, name: text(l.Name) ?? '', elevation: Number(text(l.Elevation) ?? 0) * unit };\n });\n // The products of the spatial structure and their storeys\n const elements = [];\n const walk = (node, storey) => {\n const type = String(node.type);\n const here = type.toUpperCase() === 'IFCBUILDINGSTOREY' ? node.expressID : storey;\n const drawn = type.toUpperCase() !== 'IFCSITE' || api.GetLine(model, node.expressID)?.Representation;\n if (!SPATIAL.has(type.toUpperCase()) && drawn) {\n elements.push({ id: node.expressID, type, name: text(api.GetLine(model, node.expressID)?.Name) ?? '', storey: here ?? -1 });\n }\n (node.children ?? []).forEach((c) => walk(c, here));\n };\n walk(await api.properties.getSpatialStructure(model), undefined);\n // What places it: the shift web-ifc made to bring it near the origin (metres, its y-up frame), the map\n // conversion and its CRS, the site's latitude and longitude, the true north\n const shift = api.GetCoordinationMatrix(model).slice(12, 15);\n const conversion = ids(W.IFCMAPCONVERSION).map((id) => api.GetLine(model, id))[0];\n const site = ids(W.IFCSITE).map((id) => api.GetLine(model, id))[0];\n const north = ids(W.IFCGEOMETRICREPRESENTATIONCONTEXT)\n .map((id) => line(api.GetLine(model, id).TrueNorth))\n .find((d) => d)?.DirectionRatios?.map((r) => text(r) ?? r);\n const [lat, lon] = [degrees(site?.RefLatitude), degrees(site?.RefLongitude)];\n postMessage({\n type: 'model',\n storeys,\n elements,\n place: {\n shift,\n unit,\n ...(conversion && {\n map: ['Eastings', 'Northings', 'OrthogonalHeight', 'XAxisAbscissa', 'XAxisOrdinate', 'Scale'].map((k) => Number(text(conversion[k]) ?? (k === 'Scale' || k === 'XAxisAbscissa' ? 1 : 0))),\n crs: text(line(conversion.TargetCRS)?.Name),\n }),\n ...(lat !== undefined && lon !== undefined && { site: [lon, lat, Number(text(site.RefElevation) ?? 0) * unit] }),\n ...(north && { north }),\n },\n });\n } else if (data.type === 'storey') {\n const parts = [];\n const feature = new Map(data.ids.map((id, i) => [id, data.features[i]]));\n // web-ifc 0.0.78's browser build takes three arguments where its API passes four: called directly then\n const stream = (callback) => {\n try {\n api.StreamMeshes(model, data.ids, callback);\n } catch (error) {\n if (!/arguments/.test(String(error))) throw error;\n api.wasmModule.StreamMeshes(model, data.ids, callback);\n }\n };\n stream((mesh) => {\n for (let i = 0; i < mesh.geometries.size(); i++) {\n const placed = mesh.geometries.get(i);\n const geometry = api.GetGeometry(model, placed.geometryExpressID);\n const v = api.GetVertexArray(geometry.GetVertexData(), geometry.GetVertexDataSize());\n const indices = api.GetIndexArray(geometry.GetIndexData(), geometry.GetIndexDataSize()).slice();\n const m = placed.flatTransformation;\n const positions = new Float32Array((v.length / 6) * 3);\n for (let k = 0, p = 0; k < v.length; k += 6, p += 3) {\n const [x, y, z] = [v[k], v[k + 1], v[k + 2]];\n // Turned half a turn round y: the model's north (-z of web-ifc's y-up frame) toward +z, glTF's front\n positions[p] = -(m[0] * x + m[4] * y + m[8] * z + m[12]);\n positions[p + 1] = m[1] * x + m[5] * y + m[9] * z + m[13];\n positions[p + 2] = -(m[2] * x + m[6] * y + m[10] * z + m[14]);\n }\n const c = placed.color;\n parts.push({ feature: feature.get(mesh.expressID) ?? 0, color: [c.x, c.y, c.z, c.w], positions, indices });\n geometry.delete();\n }\n });\n postMessage({ type: 'storey', request: data.request, parts }, parts.flatMap((p) => [p.positions.buffer, p.indices.buffer]));\n } else if (data.type === 'properties') {\n const properties = { Attributes: plain(api.GetLine(model, data.id)) };\n const sets = await api.properties.getPropertySets(model, data.id, true);\n for (const set of sets) {\n const values = {};\n for (const p of [...(set.HasProperties ?? []), ...(set.Quantities ?? [])]) {\n const name = text(p.Name);\n if (!name) continue;\n const value = p.NominalValue ?? p.LengthValue ?? p.AreaValue ?? p.VolumeValue ?? p.CountValue ?? p.WeightValue;\n values[name] = text(value);\n }\n properties[text(set.Name) ?? 'Set ' + set.expressID] = values;\n }\n postMessage({ type: 'properties', request: data.request, properties });\n }\n } catch (error) {\n postMessage({ type: 'error', request: data.request, message: String(error?.message ?? error) });\n }\n};\n`;\n\n/** A part of the model: an element's geometry in one color */\ninterface Part {\n feature: number;\n color: [number, number, number, number];\n positions: Float32Array;\n indices: Uint32Array;\n}\n\n/** A storey's parts as a glTF binary: a primitive per color, each vertex its element (`_BATCHID`) */\nexport const storeyModel = (parts: readonly Part[]): Uint8Array<ArrayBuffer> => {\n const byColor = new Map<string, Part[]>();\n\n parts.forEach((p) => {\n const key = p.color.map((c) => c.toFixed(3)).join(',');\n\n byColor.set(key, [...(byColor.get(key) ?? []), p]);\n });\n\n const { views, append, bin: buffer } = bufferBuilder();\n const accessors: Record<string, unknown>[] = [];\n const groups = [...byColor.values()];\n const primitives = groups.map((group, material) => {\n const count = group.reduce((n, p) => n + p.positions.length / 3, 0);\n const positions = new Float32Array(count * 3);\n const features = new Float32Array(count);\n const indices = new Uint32Array(group.reduce((n, p) => n + p.indices.length, 0));\n let [vertex, index] = [0, 0];\n\n group.forEach((p) => {\n positions.set(p.positions, vertex * 3);\n features.fill(p.feature, vertex, vertex + p.positions.length / 3);\n p.indices.forEach((i, k) => {\n indices[index + k] = i + vertex;\n });\n vertex += p.positions.length / 3;\n index += p.indices.length;\n });\n accessors.push(\n {\n bufferView: append(new Uint8Array(positions.buffer), 34962),\n componentType: 5126,\n count,\n type: 'VEC3',\n ...bounds([...positions]),\n },\n { bufferView: append(new Uint8Array(features.buffer), 34962), componentType: 5126, count, type: 'SCALAR' },\n {\n bufferView: append(new Uint8Array(indices.buffer), 34963),\n componentType: 5125,\n count: indices.length,\n type: 'SCALAR',\n },\n );\n\n const at = accessors.length - 3;\n\n return { attributes: { POSITION: at, _BATCHID: at + 1 }, indices: at + 2, material };\n });\n const bin = buffer();\n\n return glbOf(\n {\n asset: { version: '2.0', generator: 'isard (IFC)' },\n scene: 0,\n scenes: [{ nodes: [0] }],\n nodes: [{ mesh: 0 }],\n meshes: [{ primitives }],\n materials: groups.map((group) => {\n const color = group[0]?.color ?? [0.8, 0.8, 0.8, 1];\n\n return {\n pbrMetallicRoughness: { baseColorFactor: color, metallicFactor: 0, roughnessFactor: 1 },\n ...(color[3] < 1 && { alphaMode: 'BLEND' }),\n doubleSided: true,\n };\n }),\n accessors,\n bufferViews: views,\n buffers: [{ byteLength: bin.byteLength }],\n },\n bin,\n );\n};\n\n/** What places a model, as the worker reads it: web-ifc's shift of it (metres, its y-up frame), its project's metres\n * per unit, its map conversion (eastings, northings, height, x axis' abscissa and ordinate, scale) and its CRS, its\n * site's longitude, latitude and elevation, its true north (in its plan) */\nexport interface IfcPlacing {\n shift: number[];\n unit: number;\n map?: number[];\n crs?: string | null;\n site?: [number, number, number];\n north?: number[];\n}\n\n/** Degrees clockwise from the north of the true north to (x, y) in a plan whose y would be north */\nconst bearingOf = (x: number, y: number): number => (Math.atan2(x, y) * 180) / Math.PI;\n\n/**\n * Where a model's origin (its glTF's) stands: by its map conversion when its CRS is known (the origin in the file's\n * frame, before web-ifc's shift, taken to the map's eastings and northings, then to longitude and latitude; its north\n * turned by the conversion's x axis and the grid's convergence there), else by its site's latitude and longitude\n * turned by its true north\n */\nexport const placeIfc = ({ shift, unit, map, crs, site, north }: IfcPlacing): IfcPlace | undefined => {\n // The origin in the file's frame (metres, z up): web-ifc's y-up shift undone\n const [sx = 0, sy = 0, sz = 0] = shift;\n const [x, y, z] = [-sx, sz, -sy];\n\n if (map && crs) {\n const projection = (() => {\n try {\n return getCrs(crs);\n } catch {\n return undefined;\n }\n })();\n const [e = 0, n = 0, h = 0, ax = 1, ay = 0, scale = 1] = map;\n\n if (projection) {\n const length = Math.hypot(ax, ay) || 1;\n const [a, b] = [ax / length, ay / length];\n // The conversion's scale takes the project's units to the map's; the geometry is in metres already\n const k = scale / unit;\n const [east, northing] = [e + k * (a * x - b * y), n + k * (b * x + a * y)];\n const [lon = 0, lat = 0] = projection.inverse([east, northing]);\n const [lon2 = 0, lat2 = 0] = projection.inverse([east, northing + 100]);\n // The grid's north from the true north there, and the file's north (its y) from the grid's\n const convergence = bearingOf((lon2 - lon) * Math.cos(lat * RAD), lat2 - lat);\n\n return {\n lonLat: [lon, lat],\n elevation: h + k * z,\n heading: bearingOf(-b, a) + convergence,\n from: 'map',\n crs,\n };\n }\n }\n if (!site) return undefined;\n\n // The true north in the plan: the plan's y turned from it the other way\n const [nx = 0, ny = 1] = north ?? [];\n const heading = -bearingOf(nx, ny);\n const [lon, lat, elevation] = site;\n // The origin's offset from the site's (metres, the plan turned to the north)\n const turn = heading * RAD;\n const [east, northing] = [x * Math.cos(turn) + y * Math.sin(turn), -x * Math.sin(turn) + y * Math.cos(turn)];\n\n return {\n lonLat: [lon + east / (METRES_PER_DEGREE * Math.cos(lat * RAD)), lat + northing / METRES_PER_DEGREE],\n elevation: elevation + z,\n heading,\n from: 'site',\n };\n};\n\n/** The answer of the worker to a message */\ntype Answer =\n | { type: 'model'; storeys: Omit<IfcStorey, 'elements' | 'load'>[]; elements: IfcElement[]; place: IfcPlacing }\n | { type: 'storey'; request: number; parts: Part[] }\n | { type: 'properties'; request: number; properties: IfcProperties }\n | { type: 'error'; request?: number; message: string };\n\n/**\n * An IFC file (its URL, or its bytes) opened by web-ifc in a worker: its storeys and elements, each storey's geometry\n * when asked, the elements' properties on demand, where it stands\n */\nexport const loadIfc = async (source: string | ArrayBuffer, options: IfcOptions = {}): Promise<IfcModel> => {\n const bytes = typeof source === 'string' ? await fetchOk(source, options.init).then((r) => r.arrayBuffer()) : source;\n const script = URL.createObjectURL(new Blob([WORKER], { type: 'text/javascript' }));\n const worker = new Worker(script, { type: 'module' });\n /** The answers awaited, by request */\n const pending = new Map<number, { resolve: (answer: Answer) => void; reject: (e: Error) => void }>();\n let request = 0;\n const ask = <A extends Answer>(message: Record<string, unknown>): Promise<A> =>\n new Promise((resolve, reject) => {\n request += 1;\n pending.set(request, { resolve: (answer) => resolve(answer as A), reject });\n worker.postMessage({ ...message, request });\n });\n\n URL.revokeObjectURL(script);\n\n const opened = await new Promise<Extract<Answer, { type: 'model' }>>((resolve, reject) => {\n // The worker failing: the model not opened, or (once it is) every answer awaited\n const fail = (error: Error) => {\n reject(error);\n pending.forEach((waiting) => {\n waiting.reject(error);\n });\n pending.clear();\n };\n\n worker.onmessage = ({ data }: MessageEvent<Answer>) => {\n if (data.type === 'model') resolve(data);\n else if (data.request === undefined) fail(new Error(`isard: IFC: ${data.type === 'error' ? data.message : ''}`));\n else {\n const waiting = pending.get(data.request);\n\n pending.delete(data.request);\n if (data.type === 'error') waiting?.reject(new Error(`isard: IFC: ${data.message}`));\n else waiting?.resolve(data);\n }\n };\n worker.onerror = (e) => {\n fail(new Error(`isard: IFC worker: ${e.message}`));\n };\n worker.postMessage({ type: 'open', base: options.webIfc ?? WEB_IFC, bytes }, [bytes]);\n }).catch((error: unknown) => {\n worker.terminate();\n throw error;\n });\n\n // The storeys holding elements from the lowest up, the elements outside any in one of their own first (at the\n // lowest storey's elevation)\n const used = new Set(opened.elements.map((e) => e.storey));\n const sorted = opened.storeys.filter((s) => used.has(s.id)).sort((a, b) => a.elevation - b.elevation);\n const outside = opened.elements.some((e) => !sorted.some((s) => s.id === e.storey));\n const list = [...(outside ? [{ id: -1, name: 'Site', elevation: sorted[0]?.elevation ?? 0 }] : []), ...sorted];\n const storeyIndex = new Map(list.map((s, i) => [s.id, i]));\n const elements: IfcElement[] = opened.elements.map((e) => ({ ...e, storey: storeyIndex.get(e.storey) ?? 0 }));\n const storeys: IfcStorey[] = list.map((s, i) => {\n const members = elements.flatMap((e, k) => (e.storey === i ? [k] : []));\n let loaded: Promise<Uint8Array<ArrayBuffer>> | undefined;\n\n return {\n ...s,\n elements: members,\n load: () => {\n loaded ??= ask<Extract<Answer, { type: 'storey' }>>({\n type: 'storey',\n ids: members.map((k) => elements[k]?.id ?? 0),\n features: members,\n }).then(({ parts }) => storeyModel(parts));\n\n return loaded;\n },\n };\n });\n const place = placeIfc(opened.place);\n\n return {\n storeys,\n elements,\n ...(place && { place }),\n properties: (element: number) => {\n const id = elements[element]?.id;\n\n if (id === undefined) return Promise.reject(new Error(`isard: IFC: no element ${element}`));\n\n return ask<Extract<Answer, { type: 'properties' }>>({ type: 'properties', id }).then((a) => a.properties);\n },\n close: () => {\n worker.terminate();\n pending.forEach(({ reject }) => {\n reject(new Error('isard: IFC model closed'));\n });\n pending.clear();\n },\n };\n};\n"]}
|