@ifc-lite/parser 4.3.2 → 5.1.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.
Files changed (162) hide show
  1. package/dist/attribute-helpers.d.ts +38 -4
  2. package/dist/attribute-helpers.d.ts.map +1 -1
  3. package/dist/attribute-helpers.js +71 -4
  4. package/dist/attribute-helpers.js.map +1 -1
  5. package/dist/classification-resolver.d.ts +28 -2
  6. package/dist/classification-resolver.d.ts.map +1 -1
  7. package/dist/classification-resolver.js +24 -6
  8. package/dist/classification-resolver.js.map +1 -1
  9. package/dist/columnar-parser-attributes.d.ts.map +1 -1
  10. package/dist/columnar-parser-attributes.js +35 -5
  11. package/dist/columnar-parser-attributes.js.map +1 -1
  12. package/dist/columnar-parser-indexes.d.ts.map +1 -1
  13. package/dist/columnar-parser-indexes.js +14 -2
  14. package/dist/columnar-parser-indexes.js.map +1 -1
  15. package/dist/columnar-parser-relationships.d.ts.map +1 -1
  16. package/dist/columnar-parser-relationships.js +6 -1
  17. package/dist/columnar-parser-relationships.js.map +1 -1
  18. package/dist/columnar-parser.d.ts +4 -2
  19. package/dist/columnar-parser.d.ts.map +1 -1
  20. package/dist/columnar-parser.js +18 -56
  21. package/dist/columnar-parser.js.map +1 -1
  22. package/dist/compact-entity-index-transport.d.ts +23 -0
  23. package/dist/compact-entity-index-transport.d.ts.map +1 -0
  24. package/dist/compact-entity-index-transport.js +28 -0
  25. package/dist/compact-entity-index-transport.js.map +1 -0
  26. package/dist/compact-entity-index.d.ts +1 -10
  27. package/dist/compact-entity-index.d.ts.map +1 -1
  28. package/dist/compact-entity-index.js +29 -26
  29. package/dist/compact-entity-index.js.map +1 -1
  30. package/dist/data-store-transport.d.ts +9 -26
  31. package/dist/data-store-transport.d.ts.map +1 -1
  32. package/dist/data-store-transport.js +16 -35
  33. package/dist/data-store-transport.js.map +1 -1
  34. package/dist/entity-extractor.d.ts.map +1 -1
  35. package/dist/entity-extractor.js +101 -6
  36. package/dist/entity-extractor.js.map +1 -1
  37. package/dist/entity-refs-from-index.d.ts.map +1 -1
  38. package/dist/entity-refs-from-index.js +24 -15
  39. package/dist/entity-refs-from-index.js.map +1 -1
  40. package/dist/entity-scanner.d.ts +63 -0
  41. package/dist/entity-scanner.d.ts.map +1 -1
  42. package/dist/entity-scanner.js +79 -2
  43. package/dist/entity-scanner.js.map +1 -1
  44. package/dist/express-id.d.ts +47 -0
  45. package/dist/express-id.d.ts.map +1 -0
  46. package/dist/express-id.js +57 -0
  47. package/dist/express-id.js.map +1 -0
  48. package/dist/generated/entities.d.ts +1 -1
  49. package/dist/generated/entities.d.ts.map +1 -1
  50. package/dist/generated/schema-registry.js +146 -146
  51. package/dist/generated/schema-registry.js.map +1 -1
  52. package/dist/georef-epset.d.ts +25 -0
  53. package/dist/georef-epset.d.ts.map +1 -0
  54. package/dist/georef-epset.js +214 -0
  55. package/dist/georef-epset.js.map +1 -0
  56. package/dist/georef-extractor.d.ts.map +1 -1
  57. package/dist/georef-extractor.js +38 -175
  58. package/dist/georef-extractor.js.map +1 -1
  59. package/dist/georef-map-conversion.d.ts +29 -0
  60. package/dist/georef-map-conversion.d.ts.map +1 -0
  61. package/dist/georef-map-conversion.js +75 -0
  62. package/dist/georef-map-conversion.js.map +1 -0
  63. package/dist/ifc-schema.d.ts +4 -2
  64. package/dist/ifc-schema.d.ts.map +1 -1
  65. package/dist/ifc-schema.js +15 -5
  66. package/dist/ifc-schema.js.map +1 -1
  67. package/dist/index.d.ts +5 -2
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +5 -2
  70. package/dist/index.js.map +1 -1
  71. package/dist/material-extractor.d.ts +2 -17
  72. package/dist/material-extractor.d.ts.map +1 -1
  73. package/dist/material-extractor.js +12 -37
  74. package/dist/material-extractor.js.map +1 -1
  75. package/dist/material-layer-reader.d.ts +45 -0
  76. package/dist/material-layer-reader.d.ts.map +1 -0
  77. package/dist/material-layer-reader.js +63 -0
  78. package/dist/material-layer-reader.js.map +1 -0
  79. package/dist/material-resolver.d.ts.map +1 -1
  80. package/dist/material-resolver.js +14 -14
  81. package/dist/material-resolver.js.map +1 -1
  82. package/dist/measure-unit-scale.d.ts +41 -0
  83. package/dist/measure-unit-scale.d.ts.map +1 -0
  84. package/dist/measure-unit-scale.js +53 -0
  85. package/dist/measure-unit-scale.js.map +1 -0
  86. package/dist/on-demand-extractors.d.ts +4 -20
  87. package/dist/on-demand-extractors.d.ts.map +1 -1
  88. package/dist/on-demand-extractors.js +54 -264
  89. package/dist/on-demand-extractors.js.map +1 -1
  90. package/dist/on-demand-georeferencing.d.ts +3 -3
  91. package/dist/on-demand-georeferencing.js +27 -4
  92. package/dist/on-demand-georeferencing.js.map +1 -1
  93. package/dist/owning-project.d.ts +54 -0
  94. package/dist/owning-project.d.ts.map +1 -0
  95. package/dist/owning-project.js +76 -0
  96. package/dist/owning-project.js.map +1 -0
  97. package/dist/parser.worker.d.ts +14 -0
  98. package/dist/parser.worker.d.ts.map +1 -1
  99. package/dist/parser.worker.js +16 -3
  100. package/dist/parser.worker.js.map +1 -1
  101. package/dist/project-units-symbols.d.ts +33 -0
  102. package/dist/project-units-symbols.d.ts.map +1 -0
  103. package/dist/project-units-symbols.js +265 -0
  104. package/dist/project-units-symbols.js.map +1 -0
  105. package/dist/project-units.d.ts +11 -19
  106. package/dist/project-units.d.ts.map +1 -1
  107. package/dist/project-units.js +9 -267
  108. package/dist/project-units.js.map +1 -1
  109. package/dist/property-set-merge.d.ts +65 -8
  110. package/dist/property-set-merge.d.ts.map +1 -1
  111. package/dist/property-set-merge.js +130 -29
  112. package/dist/property-set-merge.js.map +1 -1
  113. package/dist/property-value-parser.d.ts +55 -0
  114. package/dist/property-value-parser.d.ts.map +1 -0
  115. package/dist/property-value-parser.js +277 -0
  116. package/dist/property-value-parser.js.map +1 -0
  117. package/dist/quantity-collect.d.ts +42 -3
  118. package/dist/quantity-collect.d.ts.map +1 -1
  119. package/dist/quantity-collect.js +114 -7
  120. package/dist/quantity-collect.js.map +1 -1
  121. package/dist/query-backend-maps.d.ts +5 -8
  122. package/dist/query-backend-maps.d.ts.map +1 -1
  123. package/dist/query-backend-maps.js +155 -15
  124. package/dist/query-backend-maps.js.map +1 -1
  125. package/dist/relationship-extractor.d.ts.map +1 -1
  126. package/dist/relationship-extractor.js +18 -0
  127. package/dist/relationship-extractor.js.map +1 -1
  128. package/dist/scan-entities-balanced.d.ts +38 -0
  129. package/dist/scan-entities-balanced.d.ts.map +1 -0
  130. package/dist/scan-entities-balanced.js +258 -0
  131. package/dist/scan-entities-balanced.js.map +1 -0
  132. package/dist/scan-worker-inline.d.ts +17 -11
  133. package/dist/scan-worker-inline.d.ts.map +1 -1
  134. package/dist/scan-worker-inline.js +9 -235
  135. package/dist/scan-worker-inline.js.map +1 -1
  136. package/dist/scan-worker-source.d.ts +9 -0
  137. package/dist/scan-worker-source.d.ts.map +1 -0
  138. package/dist/scan-worker-source.js +383 -0
  139. package/dist/scan-worker-source.js.map +1 -0
  140. package/dist/spatial-hierarchy-builder.js +3 -3
  141. package/dist/spatial-hierarchy-builder.js.map +1 -1
  142. package/dist/step-lexing.d.ts +2 -0
  143. package/dist/step-lexing.d.ts.map +1 -1
  144. package/dist/step-lexing.js +116 -18
  145. package/dist/step-lexing.js.map +1 -1
  146. package/dist/step-trivia.d.ts +60 -0
  147. package/dist/step-trivia.d.ts.map +1 -0
  148. package/dist/step-trivia.js +63 -0
  149. package/dist/step-trivia.js.map +1 -0
  150. package/dist/tokenizer.d.ts +20 -21
  151. package/dist/tokenizer.d.ts.map +1 -1
  152. package/dist/tokenizer.js +164 -203
  153. package/dist/tokenizer.js.map +1 -1
  154. package/dist/unit-extractor.d.ts +43 -1
  155. package/dist/unit-extractor.d.ts.map +1 -1
  156. package/dist/unit-extractor.js +63 -4
  157. package/dist/unit-extractor.js.map +1 -1
  158. package/dist/worker-parser.d.ts +11 -1
  159. package/dist/worker-parser.d.ts.map +1 -1
  160. package/dist/worker-parser.js +25 -5
  161. package/dist/worker-parser.js.map +1 -1
  162. package/package.json +6 -6
@@ -0,0 +1,25 @@
1
+ /**
2
+ * The IFC2x3 property-set georeferencing path.
3
+ *
4
+ * IFC2x3 has no `IfcMapConversion`, so buildingSMART's geo-referencing guide
5
+ * puts the same six numbers in a property set named `ePSet_MapConversion`,
6
+ * paired with an `ePSet_ProjectedCRS` for the CRS metadata. This file reads
7
+ * that pair; `georef-map-conversion.ts` reads the IFC4 entity. The two are
8
+ * twins and must stay in step — most of all in what they REFUSE, which is why
9
+ * the property list below is written against that file's slot list.
10
+ *
11
+ * Split out of `georef-extractor.ts` for the same reason the entity reader
12
+ * was: that file is at its module-size budget, and this is the half of it a
13
+ * schema revision keeps touching.
14
+ */
15
+ import type { IfcEntity } from './entity-extractor.js';
16
+ import type { GeoreferenceInfo } from './georef-extractor.js';
17
+ /**
18
+ * IFC2x3 fallback: a property set named `ePSet_MapConversion` (any casing)
19
+ * carrying Eastings/Northings/OrthogonalHeight (+ optional
20
+ * XAxisAbscissa/XAxisOrdinate/Scale/TargetCRS), optionally paired with an
21
+ * `ePSet_ProjectedCRS` set carrying the EPSG `Name`. Mirrors
22
+ * `GeoRefExtractor::extract_from_pset` in rust/core/src/georef.rs.
23
+ */
24
+ export declare function extractEPSetMapConversion(entities: Map<number, IfcEntity>, entitiesByType: Map<string, number[]>): GeoreferenceInfo | null;
25
+ //# sourceMappingURL=georef-epset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"georef-epset.d.ts","sourceRoot":"","sources":["../src/georef-epset.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAA+B,MAAM,uBAAuB,CAAC;AAyH3F;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAChC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACpC,gBAAgB,GAAG,IAAI,CA2GzB"}
@@ -0,0 +1,214 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import { computeTransformMatrix } from './georef-transform.js';
5
+ import { getString, getNumber, getReference, isUnrepresentableNumericValue, } from './attribute-helpers.js';
6
+ import { inferMapUnitScaleFromLabel } from './map-unit-label.js';
7
+ /**
8
+ * Unwrap an IfcValue `NominalValue`. The columnar/on-demand extractor delivers
9
+ * typed values as a `[TYPENAME, value]` tuple (e.g.
10
+ * `["IFCLENGTHMEASURE", 160073528]`, `["IFCLABEL", "EPSG:7415"]`), which
11
+ * `getNumber`/`getString` don't see through; raw scalars (used by the
12
+ * entity-map callers) pass through untouched.
13
+ */
14
+ function unwrapNominalValue(value) {
15
+ if (Array.isArray(value) && value.length >= 2 && typeof value[0] === 'string') {
16
+ return value[1];
17
+ }
18
+ return value;
19
+ }
20
+ /**
21
+ * Read an `IfcPropertySet`'s `IfcPropertySingleValue` children into a
22
+ * name → raw-value map, keeping the value as-is (string or number) so both
23
+ * numeric (Eastings) and string (TargetCRS, EPSG Name) properties survive.
24
+ */
25
+ function readPsetSingleValues(entities, pset) {
26
+ const values = {};
27
+ // IfcPropertySet: GlobalId (0), OwnerHistory (1), Name (2), Description (3), HasProperties (4)
28
+ const props = pset.attributes[4];
29
+ if (Array.isArray(props)) {
30
+ for (const propRef of props) {
31
+ const propId = getReference(propRef);
32
+ if (!propId)
33
+ continue;
34
+ const prop = entities.get(propId);
35
+ if (!prop)
36
+ continue;
37
+ // IfcPropertySingleValue: Name (0), Description (1), NominalValue (2)
38
+ const propName = getString(prop.attributes[0]);
39
+ if (!propName)
40
+ continue;
41
+ const raw = unwrapNominalValue(prop.attributes[2]);
42
+ if (typeof raw === 'number') {
43
+ values[propName] = raw;
44
+ }
45
+ else if (typeof raw === 'string') {
46
+ // Keep the raw string verbatim. Coordinate fields are coerced on read
47
+ // via `asNumber` (some writers store Eastings/Scale as strings), while
48
+ // CRS metadata that merely looks numeric — `Name: "7415"`, `MapZone:
49
+ // "31N"` — must stay a string so `asString` doesn't discard it.
50
+ values[propName] = raw;
51
+ }
52
+ }
53
+ }
54
+ return values;
55
+ }
56
+ /**
57
+ * Find the first `IfcPropertySet` whose Name matches `targetName`
58
+ * case-insensitively. buildingSMART's geo-referencing guide spells the
59
+ * IFC2x3 property sets `ePSet_…` (capital S), but real authoring tools (e.g.
60
+ * the `ifc-georeferencer` post-processor) write `ePset_…` (lowercase) — an
61
+ * exact match silently dropped those models to the legacy IfcSite/EPSG:4326
62
+ * fallback, so they displayed the wrong CRS.
63
+ */
64
+ function findPsetByName(entities, entitiesByType, targetName) {
65
+ const target = targetName.toLowerCase();
66
+ const psetIds = entitiesByType.get('IfcPropertySet') || [];
67
+ for (const psetId of psetIds) {
68
+ const pset = entities.get(psetId);
69
+ if (!pset)
70
+ continue;
71
+ const name = getString(pset.attributes[2]);
72
+ if (name && name.toLowerCase() === target)
73
+ return pset;
74
+ }
75
+ return null;
76
+ }
77
+ function asString(value) {
78
+ if (typeof value === 'string')
79
+ return value.length > 0 ? value : undefined;
80
+ if (typeof value === 'number')
81
+ return String(value);
82
+ return undefined;
83
+ }
84
+ /**
85
+ * Delegates outright rather than short-circuiting an already-`number` value.
86
+ *
87
+ * It used to read `typeof value === 'number' ? value : getNumber(value)`,
88
+ * which is the same hole `getNumber` itself was just closed for: `Infinity`
89
+ * and `NaN` are `typeof 'number'`, so the short circuit handed them straight
90
+ * back and this helper's contract read "finite, unless the pset already held
91
+ * a number". `getNumber`'s number branch now returns the value when finite and
92
+ * `undefined` otherwise, which is what the short circuit was approximating —
93
+ * so there is nothing left for it to save, and one guard is easier to keep
94
+ * true than two.
95
+ */
96
+ function asNumber(value) {
97
+ return getNumber(value);
98
+ }
99
+ /**
100
+ * The ePSet placement components, mirroring `TRANSFORM_NUMERIC_SLOTS` in
101
+ * `georef-map-conversion.ts` — the IFC2x3 property-set spelling of the same
102
+ * six `IfcMapConversion` attributes, read by name instead of by slot.
103
+ */
104
+ const EPSET_TRANSFORM_PROPERTIES = [
105
+ 'Eastings',
106
+ 'Northings',
107
+ 'OrthogonalHeight',
108
+ 'XAxisAbscissa',
109
+ 'XAxisOrdinate',
110
+ 'Scale',
111
+ ];
112
+ /**
113
+ * IFC2x3 fallback: a property set named `ePSet_MapConversion` (any casing)
114
+ * carrying Eastings/Northings/OrthogonalHeight (+ optional
115
+ * XAxisAbscissa/XAxisOrdinate/Scale/TargetCRS), optionally paired with an
116
+ * `ePSet_ProjectedCRS` set carrying the EPSG `Name`. Mirrors
117
+ * `GeoRefExtractor::extract_from_pset` in rust/core/src/georef.rs.
118
+ */
119
+ export function extractEPSetMapConversion(entities, entitiesByType) {
120
+ const pset = findPsetByName(entities, entitiesByType, 'ePSet_MapConversion');
121
+ if (!pset)
122
+ return null;
123
+ const values = readPsetSingleValues(entities, pset);
124
+ // The IFC2x3 twin of the refusal in `georef-map-conversion.ts`, and it has
125
+ // to be here rather than there because this path never builds an
126
+ // `IfcMapConversion` entity to hand over. The two are the same fix: a
127
+ // placement component the double range cannot hold refuses the placement
128
+ // instead of substituting a plausible number for it.
129
+ //
130
+ // Without this the `?? 0` below put a `0` easting into a `MapConversion`
131
+ // that still claimed `hasGeoreference: true`, with no diagnostic — the
132
+ // model silently placed at the projection origin. That is the exact failure
133
+ // the native path was changed to stop, and it was reachable here the moment
134
+ // `getNumber` began answering `undefined` for an overflowing literal
135
+ // (before that it answered `Infinity`, which is not nullish, so `?? 0` never
136
+ // fired and the poison at least stayed visible).
137
+ const refusedProperty = EPSET_TRANSFORM_PROPERTIES.find((name) => isUnrepresentableNumericValue(values[name]));
138
+ // Resolve the CRS name from ePSet_ProjectedCRS.Name, falling back to the
139
+ // MapConversion's TargetCRS (the ifc-georeferencer tool writes both as the
140
+ // same EPSG label). Without this the EPSG code in the file was never
141
+ // surfaced on the IFC2x3 path.
142
+ const crsPset = findPsetByName(entities, entitiesByType, 'ePSet_ProjectedCRS');
143
+ const crsValues = crsPset ? readPsetSingleValues(entities, crsPset) : {};
144
+ const crsName = asString(crsValues['Name']) ?? asString(values['TargetCRS']);
145
+ if (refusedProperty !== undefined) {
146
+ console.warn(`[georef-extractor] ePSet_MapConversion #${pset.expressId} ${refusedProperty} is ` +
147
+ `outside the IEEE-754 double range (${String(values[refusedProperty])}); refusing the ` +
148
+ `map conversion rather than placing the model at a substituted origin.`);
149
+ }
150
+ // Some writers store the offsets as strings, so coerce on read.
151
+ const eastings = asNumber(values['Eastings']) ?? 0;
152
+ const northings = asNumber(values['Northings']) ?? 0;
153
+ const orthogonalHeight = asNumber(values['OrthogonalHeight']) ?? 0;
154
+ // Reject only when there is nothing to georeference by: no CRS name AND the
155
+ // placement sits at the local origin. Mirrors `has_georef()` in rust/core
156
+ // (a CRS name OR any non-zero offset is sufficient) so a valid zero-origin
157
+ // placement at a real projected CRS is kept rather than dropping to the
158
+ // legacy IfcSite/EPSG:4326 fallback.
159
+ //
160
+ // A refused placement takes this branch too when the file names no CRS —
161
+ // there is genuinely nothing left to report — and the caller then falls
162
+ // through to the legacy IfcSite/EPSG:4326 path. That fallback is no longer
163
+ // silent: the refusal above has already said why the ePSet was discarded.
164
+ if (!crsName && (refusedProperty !== undefined
165
+ || (eastings === 0 && northings === 0 && orthogonalHeight === 0))) {
166
+ return null;
167
+ }
168
+ let projectedCRS;
169
+ if (crsName || crsPset) {
170
+ const mapUnit = asString(crsValues['MapUnit']);
171
+ projectedCRS = {
172
+ id: crsPset?.expressId ?? pset.expressId,
173
+ name: crsName ?? '',
174
+ description: asString(crsValues['Description']),
175
+ geodeticDatum: asString(crsValues['GeodeticDatum']),
176
+ verticalDatum: asString(crsValues['VerticalDatum']),
177
+ mapProjection: asString(crsValues['MapProjection']),
178
+ mapZone: asString(crsValues['MapZone']),
179
+ mapUnit,
180
+ // An explicit ePSet MapUnit carries its own scale (parity with the native
181
+ // IfcProjectedCRS path). When absent, leave it undefined so consumers fall
182
+ // back to the project length unit per the buildingSMART convention.
183
+ mapUnitScale: inferMapUnitScaleFromLabel(mapUnit),
184
+ };
185
+ }
186
+ if (refusedProperty !== undefined) {
187
+ // Parity with the native path, where a refused conversion leaves
188
+ // `mapConversion` and `transformMatrix` absent while an `IfcProjectedCRS`
189
+ // still claims `hasGeoreference` — the file does declare a CRS, it just
190
+ // carries no usable placement. `source` stays absent for the same reason
191
+ // it does there: it names where the *placement* came from, and there is
192
+ // none.
193
+ return { hasGeoreference: true, projectedCRS };
194
+ }
195
+ const mapConversion = {
196
+ id: pset.expressId,
197
+ sourceCRS: 0,
198
+ targetCRS: 0,
199
+ eastings,
200
+ northings,
201
+ orthogonalHeight,
202
+ xAxisAbscissa: asNumber(values['XAxisAbscissa']),
203
+ xAxisOrdinate: asNumber(values['XAxisOrdinate']),
204
+ scale: asNumber(values['Scale']),
205
+ };
206
+ return {
207
+ hasGeoreference: true,
208
+ source: 'ePSetMapConversion',
209
+ mapConversion,
210
+ projectedCRS,
211
+ transformMatrix: computeTransformMatrix(mapConversion),
212
+ };
213
+ }
214
+ //# sourceMappingURL=georef-epset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"georef-epset.js","sourceRoot":"","sources":["../src/georef-epset.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"georef-extractor.d.ts","sourceRoot":"","sources":["../src/georef-extractor.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,8BAA8B,GAC/B,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAMvD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,CAAC,EAAE,MAAM,EACtB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,GAAG,IAAI,CAIf;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,MAAM,CAAC,EAAE,eAAe,GAAG,oBAAoB,GAAG,cAAc,CAAC;IAEjE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAGtD,CAAC;AAEF;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAChC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACpC,gBAAgB,CAyDlB"}
1
+ {"version":3,"file":"georef-extractor.d.ts","sourceRoot":"","sources":["../src/georef-extractor.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,8BAA8B,GAC/B,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAYvD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,CAAC,EAAE,MAAM,EACtB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,GAAG,IAAI,CAIf;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,MAAM,CAAC,EAAE,eAAe,GAAG,oBAAoB,GAAG,cAAc,CAAC;IAEjE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAGtD,CAAC;AAEF;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAChC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACpC,gBAAgB,CAgElB"}
@@ -5,9 +5,10 @@ import { computeTransformMatrix } from './georef-transform.js';
5
5
  // The transform side lives in ./georef-transform.ts; re-exported here so
6
6
  // every existing `from './georef-extractor.js'` import keeps resolving.
7
7
  export { transformToWorld, transformToLocal, getCoordinateSystemDescription, } from './georef-transform.js';
8
- import { getString, getNumber, getReference } from './attribute-helpers.js';
8
+ import { getString, getNumber, getReference, isUnrepresentableNumericValue, } from './attribute-helpers.js';
9
+ import { extractMapConversion } from './georef-map-conversion.js';
10
+ import { extractEPSetMapConversion } from './georef-epset.js';
9
11
  import { CONVERSION_BASED_UNIT_FACTORS, SI_PREFIX_MULTIPLIERS } from './unit-extractor.js';
10
- import { inferMapUnitScaleFromLabel } from './map-unit-label.js';
11
12
  import { getAttributeNames } from './ifc-schema.js';
12
13
  /**
13
14
  * Compute angle to grid north from XAxisAbscissa and XAxisOrdinate (in degrees).
@@ -53,8 +54,15 @@ export function extractGeoreferencing(entities, entitiesByType) {
53
54
  if (mapConversionIds.length > 0) {
54
55
  const entity = entities.get(mapConversionIds[0]);
55
56
  if (entity) {
56
- info.mapConversion = extractMapConversion(entity);
57
- info.hasGeoreference = true;
57
+ // A refused conversion leaves the field absent and does not claim
58
+ // `hasGeoreference`. An IfcProjectedCRS further down may still claim it —
59
+ // correct: the file does declare a CRS, it just carries no usable
60
+ // placement.
61
+ const mapConversion = extractMapConversion(entity);
62
+ if (mapConversion) {
63
+ info.mapConversion = mapConversion;
64
+ info.hasGeoreference = true;
65
+ }
58
66
  }
59
67
  }
60
68
  // Extract IfcProjectedCRS
@@ -87,153 +95,6 @@ export function extractGeoreferencing(entities, entitiesByType) {
87
95
  }
88
96
  return info;
89
97
  }
90
- /**
91
- * Unwrap an IfcValue `NominalValue`. The columnar/on-demand extractor delivers
92
- * typed values as a `[TYPENAME, value]` tuple (e.g.
93
- * `["IFCLENGTHMEASURE", 160073528]`, `["IFCLABEL", "EPSG:7415"]`), which
94
- * `getNumber`/`getString` don't see through; raw scalars (used by the
95
- * entity-map callers) pass through untouched.
96
- */
97
- function unwrapNominalValue(value) {
98
- if (Array.isArray(value) && value.length >= 2 && typeof value[0] === 'string') {
99
- return value[1];
100
- }
101
- return value;
102
- }
103
- /**
104
- * Read an `IfcPropertySet`'s `IfcPropertySingleValue` children into a
105
- * name → raw-value map, keeping the value as-is (string or number) so both
106
- * numeric (Eastings) and string (TargetCRS, EPSG Name) properties survive.
107
- */
108
- function readPsetSingleValues(entities, pset) {
109
- const values = {};
110
- // IfcPropertySet: GlobalId (0), OwnerHistory (1), Name (2), Description (3), HasProperties (4)
111
- const props = pset.attributes[4];
112
- if (Array.isArray(props)) {
113
- for (const propRef of props) {
114
- const propId = getReference(propRef);
115
- if (!propId)
116
- continue;
117
- const prop = entities.get(propId);
118
- if (!prop)
119
- continue;
120
- // IfcPropertySingleValue: Name (0), Description (1), NominalValue (2)
121
- const propName = getString(prop.attributes[0]);
122
- if (!propName)
123
- continue;
124
- const raw = unwrapNominalValue(prop.attributes[2]);
125
- if (typeof raw === 'number') {
126
- values[propName] = raw;
127
- }
128
- else if (typeof raw === 'string') {
129
- // Keep the raw string verbatim. Coordinate fields are coerced on read
130
- // via `asNumber` (some writers store Eastings/Scale as strings), while
131
- // CRS metadata that merely looks numeric — `Name: "7415"`, `MapZone:
132
- // "31N"` — must stay a string so `asString` doesn't discard it.
133
- values[propName] = raw;
134
- }
135
- }
136
- }
137
- return values;
138
- }
139
- /**
140
- * Find the first `IfcPropertySet` whose Name matches `targetName`
141
- * case-insensitively. buildingSMART's geo-referencing guide spells the
142
- * IFC2x3 property sets `ePSet_…` (capital S), but real authoring tools (e.g.
143
- * the `ifc-georeferencer` post-processor) write `ePset_…` (lowercase) — an
144
- * exact match silently dropped those models to the legacy IfcSite/EPSG:4326
145
- * fallback, so they displayed the wrong CRS.
146
- */
147
- function findPsetByName(entities, entitiesByType, targetName) {
148
- const target = targetName.toLowerCase();
149
- const psetIds = entitiesByType.get('IfcPropertySet') || [];
150
- for (const psetId of psetIds) {
151
- const pset = entities.get(psetId);
152
- if (!pset)
153
- continue;
154
- const name = getString(pset.attributes[2]);
155
- if (name && name.toLowerCase() === target)
156
- return pset;
157
- }
158
- return null;
159
- }
160
- function asString(value) {
161
- if (typeof value === 'string')
162
- return value.length > 0 ? value : undefined;
163
- if (typeof value === 'number')
164
- return String(value);
165
- return undefined;
166
- }
167
- function asNumber(value) {
168
- return typeof value === 'number' ? value : getNumber(value);
169
- }
170
- /**
171
- * IFC2x3 fallback: a property set named `ePSet_MapConversion` (any casing)
172
- * carrying Eastings/Northings/OrthogonalHeight (+ optional
173
- * XAxisAbscissa/XAxisOrdinate/Scale/TargetCRS), optionally paired with an
174
- * `ePSet_ProjectedCRS` set carrying the EPSG `Name`. Mirrors
175
- * `GeoRefExtractor::extract_from_pset` in rust/core/src/georef.rs.
176
- */
177
- function extractEPSetMapConversion(entities, entitiesByType) {
178
- const pset = findPsetByName(entities, entitiesByType, 'ePSet_MapConversion');
179
- if (!pset)
180
- return null;
181
- const values = readPsetSingleValues(entities, pset);
182
- // Some writers store the offsets as strings, so coerce on read.
183
- const eastings = asNumber(values['Eastings']) ?? 0;
184
- const northings = asNumber(values['Northings']) ?? 0;
185
- const orthogonalHeight = asNumber(values['OrthogonalHeight']) ?? 0;
186
- const mapConversion = {
187
- id: pset.expressId,
188
- sourceCRS: 0,
189
- targetCRS: 0,
190
- eastings,
191
- northings,
192
- orthogonalHeight,
193
- xAxisAbscissa: asNumber(values['XAxisAbscissa']),
194
- xAxisOrdinate: asNumber(values['XAxisOrdinate']),
195
- scale: asNumber(values['Scale']),
196
- };
197
- // Resolve the CRS name from ePSet_ProjectedCRS.Name, falling back to the
198
- // MapConversion's TargetCRS (the ifc-georeferencer tool writes both as the
199
- // same EPSG label). Without this the EPSG code in the file was never
200
- // surfaced on the IFC2x3 path.
201
- const crsPset = findPsetByName(entities, entitiesByType, 'ePSet_ProjectedCRS');
202
- const crsValues = crsPset ? readPsetSingleValues(entities, crsPset) : {};
203
- const crsName = asString(crsValues['Name']) ?? asString(values['TargetCRS']);
204
- // Reject only when there is nothing to georeference by: no CRS name AND the
205
- // placement sits at the local origin. Mirrors `has_georef()` in rust/core
206
- // (a CRS name OR any non-zero offset is sufficient) so a valid zero-origin
207
- // placement at a real projected CRS is kept rather than dropping to the
208
- // legacy IfcSite/EPSG:4326 fallback.
209
- if (!crsName && eastings === 0 && northings === 0 && orthogonalHeight === 0)
210
- return null;
211
- let projectedCRS;
212
- if (crsName || crsPset) {
213
- const mapUnit = asString(crsValues['MapUnit']);
214
- projectedCRS = {
215
- id: crsPset?.expressId ?? pset.expressId,
216
- name: crsName ?? '',
217
- description: asString(crsValues['Description']),
218
- geodeticDatum: asString(crsValues['GeodeticDatum']),
219
- verticalDatum: asString(crsValues['VerticalDatum']),
220
- mapProjection: asString(crsValues['MapProjection']),
221
- mapZone: asString(crsValues['MapZone']),
222
- mapUnit,
223
- // An explicit ePSet MapUnit carries its own scale (parity with the native
224
- // IfcProjectedCRS path). When absent, leave it undefined so consumers fall
225
- // back to the project length unit per the buildingSMART convention.
226
- mapUnitScale: inferMapUnitScaleFromLabel(mapUnit),
227
- };
228
- }
229
- return {
230
- hasGeoreference: true,
231
- source: 'ePSetMapConversion',
232
- mapConversion,
233
- projectedCRS,
234
- transformMatrix: computeTransformMatrix(mapConversion),
235
- };
236
- }
237
98
  function getAttributeValueByName(entity, attributeName) {
238
99
  const attributeNames = getAttributeNames(entity.type);
239
100
  const index = attributeNames.indexOf(attributeName);
@@ -241,6 +102,12 @@ function getAttributeValueByName(entity, attributeName) {
241
102
  return undefined;
242
103
  return entity.attributes[index];
243
104
  }
105
+ // Canonical sign lives on the first non-zero component (`minutesRaw < 0`
106
+ // below already handles it); this also defensively honours `-0` on a
107
+ // zero-magnitude degree token, which `x < 0` alone misses (IEEE-754 -0).
108
+ function isNegativeComponent(n) {
109
+ return n < 0 || Object.is(n, -0);
110
+ }
244
111
  function compoundPlaneAngleToDecimalDegrees(value) {
245
112
  if (!Array.isArray(value) || value.length < 3)
246
113
  return undefined;
@@ -250,7 +117,12 @@ function compoundPlaneAngleToDecimalDegrees(value) {
250
117
  if (numbers.length < 3)
251
118
  return undefined;
252
119
  const [degreesRaw, minutesRaw, secondsRaw, millionthsRaw = 0] = numbers;
253
- const sign = degreesRaw < 0 || minutesRaw < 0 || secondsRaw < 0 || millionthsRaw < 0 ? -1 : 1;
120
+ const sign = isNegativeComponent(degreesRaw) ||
121
+ isNegativeComponent(minutesRaw) ||
122
+ isNegativeComponent(secondsRaw) ||
123
+ isNegativeComponent(millionthsRaw)
124
+ ? -1
125
+ : 1;
254
126
  const degrees = Math.abs(degreesRaw);
255
127
  const minutes = Math.abs(minutesRaw);
256
128
  const seconds = Math.abs(secondsRaw);
@@ -265,7 +137,20 @@ function extractLegacySiteGeoreference(entities, entitiesByType) {
265
137
  continue;
266
138
  const latitude = compoundPlaneAngleToDecimalDegrees(getAttributeValueByName(site, 'RefLatitude'));
267
139
  const longitude = compoundPlaneAngleToDecimalDegrees(getAttributeValueByName(site, 'RefLongitude'));
268
- const elevation = getNumber(getAttributeValueByName(site, 'RefElevation')) ?? 0;
140
+ // The same rule again, on the legacy site path. An absent `RefElevation`
141
+ // legitimately means "at the datum" and keeps its `0`; an elevation the
142
+ // double range cannot hold does not, and this site is skipped so a later
143
+ // one — or no georeference at all — is reported instead of a model pinned
144
+ // to the datum. `?? 0` alone stopped being safe when `getNumber` began
145
+ // answering `undefined` for such a literal.
146
+ const rawElevation = getAttributeValueByName(site, 'RefElevation');
147
+ if (isUnrepresentableNumericValue(rawElevation)) {
148
+ console.warn(`[georef-extractor] IfcSite #${site.expressId} RefElevation is outside the ` +
149
+ `IEEE-754 double range (${String(rawElevation)}); skipping this site rather than ` +
150
+ `reporting it at a substituted elevation.`);
151
+ continue;
152
+ }
153
+ const elevation = getNumber(rawElevation) ?? 0;
269
154
  if (latitude === undefined || longitude === undefined)
270
155
  continue;
271
156
  return {
@@ -292,28 +177,6 @@ function extractLegacySiteGeoreference(entities, entitiesByType) {
292
177
  }
293
178
  return null;
294
179
  }
295
- function extractMapConversion(entity) {
296
- // IfcMapConversion attributes (IFC4):
297
- // [0] SourceCRS (IfcCoordinateReferenceSystem)
298
- // [1] TargetCRS (IfcCoordinateReferenceSystem)
299
- // [2] Eastings (IfcLengthMeasure)
300
- // [3] Northings (IfcLengthMeasure)
301
- // [4] OrthogonalHeight (IfcLengthMeasure)
302
- // [5] XAxisAbscissa (OPTIONAL IfcReal)
303
- // [6] XAxisOrdinate (OPTIONAL IfcReal)
304
- // [7] Scale (OPTIONAL IfcReal)
305
- return {
306
- id: entity.expressId,
307
- sourceCRS: getReference(entity.attributes[0]) || 0,
308
- targetCRS: getReference(entity.attributes[1]) || 0,
309
- eastings: getNumber(entity.attributes[2]) || 0,
310
- northings: getNumber(entity.attributes[3]) || 0,
311
- orthogonalHeight: getNumber(entity.attributes[4]) || 0,
312
- xAxisAbscissa: getNumber(entity.attributes[5]),
313
- xAxisOrdinate: getNumber(entity.attributes[6]),
314
- scale: getNumber(entity.attributes[7]),
315
- };
316
- }
317
180
  /**
318
181
  * Resolve an `IfcMeasureWithUnit` reference to metres.
319
182
  *
@@ -1 +1 @@
1
- {"version":3,"file":"georef-extractor.js","sourceRoot":"","sources":["../src/georef-extractor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"georef-extractor.js","sourceRoot":"","sources":["../src/georef-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Reads one `IfcMapConversion` (or `IfcMapConversionScaled`) into a
3
+ * `MapConversion`, or refuses it.
4
+ *
5
+ * Split out of `georef-extractor.ts` the same way the transform side lives in
6
+ * `georef-transform.ts`: the refusal rule below is the part most likely to
7
+ * grow — every mandatory component added to a future schema revision is
8
+ * another slot to check — and it does not belong in a file that is already at
9
+ * its module-size budget.
10
+ */
11
+ import type { IfcEntity } from './entity-extractor.js';
12
+ import type { MapConversion } from './georef-extractor.js';
13
+ /**
14
+ * Refuse the whole map conversion when a component the transform reads names a
15
+ * number the double range cannot hold, rather than letting `|| 0` put a zero
16
+ * there.
17
+ *
18
+ * `eastings`/`northings`/`orthogonalHeight` are typed `number` and feed
19
+ * `transformMatrix`, the STEP georeferencing writer and the viewer's placement
20
+ * editor, so absence cannot be expressed in the field itself.
21
+ * `GeoreferenceInfo.mapConversion` IS optional, and every consumer already
22
+ * reaches it as `georef.mapConversion?.eastings` — so refusing here reports
23
+ * "this file has no usable georeference", which is true and which a caller can
24
+ * see. A zero easting is a plausible coordinate: it silently places the model
25
+ * at the projection origin, and nothing downstream can tell that apart from a
26
+ * model that really sits there.
27
+ */
28
+ export declare function extractMapConversion(entity: IfcEntity): MapConversion | null;
29
+ //# sourceMappingURL=georef-map-conversion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"georef-map-conversion.d.ts","sourceRoot":"","sources":["../src/georef-map-conversion.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AA4B3D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,IAAI,CAiC5E"}