@ifc-lite/create 2.1.0 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/ifc-creator-math.d.ts +21 -0
  2. package/dist/ifc-creator-math.d.ts.map +1 -1
  3. package/dist/ifc-creator-math.js +33 -0
  4. package/dist/ifc-creator-math.js.map +1 -1
  5. package/dist/ifc-creator.d.ts +18 -0
  6. package/dist/ifc-creator.d.ts.map +1 -1
  7. package/dist/ifc-creator.js +119 -23
  8. package/dist/ifc-creator.js.map +1 -1
  9. package/dist/in-store/_emit-helpers.d.ts +12 -0
  10. package/dist/in-store/_emit-helpers.d.ts.map +1 -1
  11. package/dist/in-store/_emit-helpers.js +16 -0
  12. package/dist/in-store/_emit-helpers.js.map +1 -1
  13. package/dist/in-store/beam.d.ts.map +1 -1
  14. package/dist/in-store/beam.js +7 -5
  15. package/dist/in-store/beam.js.map +1 -1
  16. package/dist/in-store/column.d.ts.map +1 -1
  17. package/dist/in-store/column.js +2 -5
  18. package/dist/in-store/column.js.map +1 -1
  19. package/dist/in-store/door.d.ts.map +1 -1
  20. package/dist/in-store/door.js +3 -7
  21. package/dist/in-store/door.js.map +1 -1
  22. package/dist/in-store/member.d.ts.map +1 -1
  23. package/dist/in-store/member.js +7 -5
  24. package/dist/in-store/member.js.map +1 -1
  25. package/dist/in-store/plate.d.ts.map +1 -1
  26. package/dist/in-store/plate.js +4 -6
  27. package/dist/in-store/plate.js.map +1 -1
  28. package/dist/in-store/roof.d.ts.map +1 -1
  29. package/dist/in-store/roof.js +4 -6
  30. package/dist/in-store/roof.js.map +1 -1
  31. package/dist/in-store/slab.d.ts.map +1 -1
  32. package/dist/in-store/slab.js +4 -6
  33. package/dist/in-store/slab.js.map +1 -1
  34. package/dist/in-store/space.d.ts.map +1 -1
  35. package/dist/in-store/space.js +4 -6
  36. package/dist/in-store/space.js.map +1 -1
  37. package/dist/in-store/wall.d.ts.map +1 -1
  38. package/dist/in-store/wall.js +7 -5
  39. package/dist/in-store/wall.js.map +1 -1
  40. package/dist/in-store/window.d.ts.map +1 -1
  41. package/dist/in-store/window.js +3 -7
  42. package/dist/in-store/window.js.map +1 -1
  43. package/dist/types.d.ts +7 -2
  44. package/dist/types.d.ts.map +1 -1
  45. package/package.json +4 -4
@@ -18,6 +18,27 @@ export declare function vecLen(v: Point3D): number;
18
18
  export declare const NON_ELEMENT_TYPES: Set<string>;
19
19
  /** Normalize vector — throws on zero-length (indicates geometry bug like Start === End) */
20
20
  export declare function vecNorm(v: Point3D): Point3D;
21
+ /**
22
+ * Assert that every named dimension is a positive finite number.
23
+ *
24
+ * A bare `value <= 0` check is `false` for both `NaN` and `Infinity`, so
25
+ * those values silently pass validation and are emitted into the STEP
26
+ * file as the literal strings `"NaN"` / `"Infinity"` — not valid STEP
27
+ * REAL tokens. Reject them the same way a non-positive value is
28
+ * rejected, with the same message shape callers already throw
29
+ * (`<context>: <name> must be a positive finite number`).
30
+ */
31
+ export declare function assertPositiveFinite(values: Record<string, number>, context: string): void;
32
+ /**
33
+ * Assert that every named 3D point has finite coordinates.
34
+ *
35
+ * Guards `Start`/`End`/`Position`-style inputs before they feed a
36
+ * derived length (e.g. `beamLen = sqrt(dx*dx + dy*dy + dz*dz)`). A
37
+ * `NaN` or `Infinity` component makes the derived length `NaN`, and
38
+ * `NaN <= 0` is `false`, so a bare "must be distinct points" check
39
+ * downstream never fires — the point must be validated at the source.
40
+ */
41
+ export declare function assertFinitePoint3(points: Record<string, Point3D>, context: string): void;
21
42
  /** Cross product */
22
43
  export declare function vecCross(a: Point3D, b: Point3D): Point3D;
23
44
  //# sourceMappingURL=ifc-creator-math.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ifc-creator-math.d.ts","sourceRoot":"","sources":["../src/ifc-creator-math.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAM1C,sCAAsC;AACtC,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvC;AAED,0CAA0C;AAC1C,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,0FAA0F;AAC1F,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAKrC;AAED,oBAAoB;AACpB,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAEzC;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,aAG5B,CAAC;AAEH,2FAA2F;AAC3F,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAI3C;AAED,oBAAoB;AACpB,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAMxD"}
1
+ {"version":3,"file":"ifc-creator-math.d.ts","sourceRoot":"","sources":["../src/ifc-creator-math.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAM1C,sCAAsC;AACtC,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvC;AAED,0CAA0C;AAC1C,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,0FAA0F;AAC1F,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAKrC;AAED,oBAAoB;AACpB,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAEzC;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,aAG5B,CAAC;AAEH,2FAA2F;AAC3F,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAI3C;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAM1F;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAMzF;AAED,oBAAoB;AACpB,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAMxD"}
@@ -39,6 +39,39 @@ export function vecNorm(v) {
39
39
  throw new Error('Cannot normalize zero-length vector (check that Start and End are not identical)');
40
40
  return [v[0] / len, v[1] / len, v[2] / len];
41
41
  }
42
+ /**
43
+ * Assert that every named dimension is a positive finite number.
44
+ *
45
+ * A bare `value <= 0` check is `false` for both `NaN` and `Infinity`, so
46
+ * those values silently pass validation and are emitted into the STEP
47
+ * file as the literal strings `"NaN"` / `"Infinity"` — not valid STEP
48
+ * REAL tokens. Reject them the same way a non-positive value is
49
+ * rejected, with the same message shape callers already throw
50
+ * (`<context>: <name> must be a positive finite number`).
51
+ */
52
+ export function assertPositiveFinite(values, context) {
53
+ for (const [name, value] of Object.entries(values)) {
54
+ if (!Number.isFinite(value) || value <= 0) {
55
+ throw new Error(`${context}: ${name} must be a positive finite number`);
56
+ }
57
+ }
58
+ }
59
+ /**
60
+ * Assert that every named 3D point has finite coordinates.
61
+ *
62
+ * Guards `Start`/`End`/`Position`-style inputs before they feed a
63
+ * derived length (e.g. `beamLen = sqrt(dx*dx + dy*dy + dz*dz)`). A
64
+ * `NaN` or `Infinity` component makes the derived length `NaN`, and
65
+ * `NaN <= 0` is `false`, so a bare "must be distinct points" check
66
+ * downstream never fires — the point must be validated at the source.
67
+ */
68
+ export function assertFinitePoint3(points, context) {
69
+ for (const [name, point] of Object.entries(points)) {
70
+ if (!point.every(Number.isFinite)) {
71
+ throw new Error(`${context}: ${name} must have finite coordinates`);
72
+ }
73
+ }
74
+ }
42
75
  /** Cross product */
43
76
  export function vecCross(a, b) {
44
77
  return [
@@ -1 +1 @@
1
- {"version":3,"file":"ifc-creator-math.js","sourceRoot":"","sources":["../src/ifc-creator-math.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAS/D,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,sCAAsC;AACtC,MAAM,UAAU,GAAG,CAAC,GAAW;IAC7B,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,QAAQ,CAAC,EAAU,EAAE,IAAY,EAAE,IAAY;IAC7D,OAAO,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC;AACpC,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,GAAG,CAAC,CAAS;IAC3B,sEAAsE;IACtE,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;IACvB,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjF,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;AACvC,CAAC;AAED,oBAAoB;AACpB,MAAM,UAAU,MAAM,CAAC,CAAU;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IACvC,aAAa,EAAE,SAAS,EAAE,mBAAmB,EAAE,YAAY;IAC3D,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU;CAC/C,CAAC,CAAC;AAEH,2FAA2F;AAC3F,MAAM,UAAU,OAAO,CAAC,CAAU;IAChC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,GAAG,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAC;IACnH,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AAC9C,CAAC;AAED,oBAAoB;AACpB,MAAM,UAAU,QAAQ,CAAC,CAAU,EAAE,CAAU;IAC7C,OAAO;QACL,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KAC1B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"ifc-creator-math.js","sourceRoot":"","sources":["../src/ifc-creator-math.ts"],"names":[],"mappings":"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"}
@@ -111,6 +111,24 @@ export declare class IfcCreator {
111
111
  * Cross-section centered, extruded upward by Height.
112
112
  */
113
113
  addIfcColumn(storeyId: number, params: ColumnParams): number;
114
+ /**
115
+ * Build a column WITHOUT validating dimensions.
116
+ *
117
+ * `IfcExtrudedAreaSolid.Depth` is typed `IfcPositiveLengthMeasure` in the
118
+ * IFC schema, so a zero (or negative) `Height` is spec-invalid — exactly
119
+ * what `addIfcColumn`'s guard exists to reject for ordinary callers.
120
+ *
121
+ * Corruption-injection tooling (tools/world-gym's `degenerate-geometry`
122
+ * defect) needs the opposite: it deliberately builds a spec-invalid,
123
+ * zero-height column to verify the geometry pipeline drops it (no mesh
124
+ * emitted) instead of crashing, and that requires a path that produces
125
+ * exactly the malformed entity it asks for. Routing that through the
126
+ * validated public constructor would make it impossible to construct the
127
+ * fixture it exists to test. This method is that deliberately-unvalidated
128
+ * seam — for adversarial test fixtures ONLY, never for application code.
129
+ */
130
+ addIfcColumnUnvalidated(storeyId: number, params: ColumnParams): number;
131
+ private buildIfcColumn;
114
132
  /**
115
133
  * Create a beam from Start to End.
116
134
  * Cross-section (Width × Height) centered on the beam axis.
@@ -1 +1 @@
1
- {"version":3,"file":"ifc-creator.d.ts","sourceRoot":"","sources":["../src/ifc-creator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ifc-creator.d.ts","sourceRoot":"","sources":["../src/ifc-creator.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,OAAO,EAAE,OAAO,EAAE,WAAW,EAC7B,iBAAiB,EAAE,UAAU,EAC7B,oBAAoB,EAAE,iBAAiB,EACvC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAC1F,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EACrF,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EACpD,WAAW,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,WAAW,EAC7D,aAAa,EAA8B,YAAY,EACvD,cAAc,EAAe,cAAc,EAC3C,WAAW,EACX,kBAAkB,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAC/C,YAAY,EAC5B,MAAM,YAAY,CAAC;AAoCpB;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,MAAM,CAA+B;IAE7C,gFAAgF;IAChF,OAAO,CAAC,aAAa,CAAqB;IAG1C,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,gBAAgB,CAAK;IAG7B,OAAO,CAAC,SAAS,CAAS;IAG1B,OAAO,CAAC,cAAc,CAAK;IAG3B,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,aAAa,CAA2E;IAGhG,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,gBAAgB,CAAkC;IAG1D,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,cAAc,CAAoC;IAC1D,uEAAuE;IACvE,OAAO,CAAC,gBAAgB,CAAkC;IAC1D,sDAAsD;IACtD,OAAO,CAAC,cAAc,CAAkC;IACxD,4CAA4C;IAC5C,OAAO,CAAC,cAAc,CAAkC;IACxD,sCAAsC;IACtC,OAAO,CAAC,eAAe,CAAkC;IAEzD,OAAO,CAAC,aAAa,CAAgB;IAErC,qFAAqF;IACrF,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAgB;IACjD,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwB;gBAEvC,MAAM,GAAE,aAAkB;IAkBtC,oGAAoG;IACpG,OAAO,CAAC,KAAK;IAIb,mGAAmG;IACnG,OAAO,CAAC,WAAW;IAsBnB,yFAAyF;IACzF,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM;IAsBlD;;;;;;;;;OASG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;;;;;OAMG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM;IAmDxD;;;OAGG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM;IA6CxD;;;OAGG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM;IAK5D;;;;;;;;;;;;;;;OAeG;IACH,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM;IAIvE,OAAO,CAAC,cAAc;IA2BtB;;;OAGG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM;IAuCxD;;;;OAIG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM;IAyD1D;;;;OAIG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM;IA6CxD;;;OAGG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM;IAgFlE;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM;IAsC9D;;;OAGG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,MAAM;IAqClE;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM;IA+BxD;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM;IA8B5D;;;OAGG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM;IA0CxD;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM;IAsE9D;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM;IAkC1D;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM;IAoC5D;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM;IA6B9D;;;OAGG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM;IAqCxD;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM;IAmC1D;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,MAAM;IAqCtE;;OAEG;IACH,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,MAAM;IA8B3E;;OAEG;IACH,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM;IAuCzE;;OAEG;IACH,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;QAC7C,QAAQ,EAAE,OAAO,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,iBAAiB,GAAG,MAAM;IA2B9B;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;QACzC,KAAK,EAAE,OAAO,CAAC;QACf,GAAG,EAAE,OAAO,CAAC;QACb,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,iBAAiB,GAAG,MAAM;IA8C9B;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;QAC3C,KAAK,EAAE,OAAO,CAAC;QACf,GAAG,EAAE,OAAO,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,iBAAiB,GAAG,MAAM;IAuC9B;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;QAC3C,KAAK,EAAE,OAAO,CAAC;QACf,GAAG,EAAE,OAAO,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,iBAAiB,GAAG,MAAM;IA8C9B;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;QAC3C,KAAK,EAAE,OAAO,CAAC;QACf,GAAG,EAAE,OAAO,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,iBAAiB,GAAG,MAAM;IA8C9B;;OAEG;IACH,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;QACnD,QAAQ,EAAE,OAAO,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,iBAAiB,GAAG,MAAM;IA2B9B;;OAEG;IACH,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;QAClD,KAAK,EAAE,OAAO,CAAC;QACf,GAAG,EAAE,OAAO,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,GAAG,iBAAiB,GAAG,MAAM;IAiD9B,0CAA0C;IAC1C,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,MAAM;IAyBlE,8CAA8C;IAC9C,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,MAAM;IA6BtE;;;;;;;OAOG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAQ9E;;;;;;OAMG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI;IAkCzD;;;OAGG;IACH,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM;IAItD;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;IAI9C;;;;OAIG;IACH,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;IA0CtC;;;OAGG;IACH,OAAO,CAAC,cAAc;IAkCtB;;;OAGG;IACH,iBAAiB,CACf,iBAAiB,EAAE,MAAM,EACzB,eAAe,EAAE,MAAM,EACvB,MAAM,GAAE,cAAmB,GAC1B,MAAM;IAsBT;;;;OAIG;IACH,yBAAyB,CAAC,iBAAiB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM;IAUxF;;;OAGG;IACH,yBAAyB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM;IAIxE;;;OAGG;IACH,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM;IAIxE;;;;OAIG;IACH,yBAAyB,CAAC,iBAAiB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM;IAUxF,wEAAwE;IACxE,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM;IAIlE;;;OAGG;IACH,cAAc,CAAC,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM;IAU5E,6DAA6D;IAC7D,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM;IAI/D;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAkCxB,oEAAoE;IACpE,KAAK,IAAI,YAAY;IAsBrB,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,aAAa;IAyErB,OAAO,CAAC,UAAU;IA8BlB,oFAAoF;IACpF,OAAO,CAAC,iBAAiB;IAiBzB,+EAA+E;IAC/E,OAAO,CAAC,cAAc;IAyBtB,+DAA+D;IAC/D,OAAO,CAAC,eAAe;IAiBvB,oFAAoF;IACpF,OAAO,CAAC,mBAAmB;IAW3B,uFAAuF;IACvF,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,mBAAmB;IAQ3B;;;;OAIG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,GAAG,MAAM;IAmBrE;;;;;OAKG;IACH,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM;IAYzE,+BAA+B;IAC/B,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAUxC,qDAAqD;IACrD,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM;IAUrE,wDAAwD;IACxD,gBAAgB,CACd,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAC1C,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAC7C,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM;IAYT,iDAAiD;IACjD,gBAAgB,CACd,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAC/C,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM;IAYT,8CAA8C;IAC9C,gBAAgB,CACd,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAClC,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAC7C,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM;IAYT,kDAAkD;IAClD,gBAAgB,CACd,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAClC,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAC7C,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM;IAYT,sDAAsD;IACtD,gBAAgB,CACd,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAC5B,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GACnC,MAAM;IAWT,wDAAwD;IACxD,yBAAyB,CACvB,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EACjD,iBAAiB,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,GACrD,MAAM;IAaT,kFAAkF;IAClF,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM;IAc9C;;;;;;OAMG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM;IAa1G;;;;OAIG;IACH,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM;IAWlE,kEAAkE;IAClE,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM;IAWnD,4EAA4E;IAC5E,mBAAmB,IAAI,MAAM;IAI7B,2DAA2D;IAC3D,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM;IAIlC;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM;IAqD1C;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,MAAM;IAwClE;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,MAAM;IAuDnE;;;;OAIG;IACH,OAAO,CAAC,cAAc;IA8CtB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IA8BtB,OAAO,CAAC,sBAAsB;IAmB9B,OAAO,CAAC,kBAAkB;IAkB1B,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,oCAAoC;IAQ5C,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,EAAE;IAIV,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,0BAA0B;IAelC,OAAO,CAAC,YAAY;IASpB,kEAAkE;IAClE,OAAO,CAAC,mBAAmB;CAK5B"}
@@ -1,7 +1,7 @@
1
1
  /* This Source Code Form is subject to the terms of the Mozilla Public
2
2
  * License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
- import { esc, stepLine, num, vecLen, vecNorm, vecCross, NON_ELEMENT_TYPES, } from './ifc-creator-math.js';
4
+ import { esc, stepLine, num, vecLen, vecNorm, vecCross, NON_ELEMENT_TYPES, assertPositiveFinite, assertFinitePoint3, } from './ifc-creator-math.js';
5
5
  import { generateIfcGuid, isValidIfcGuid } from '@ifc-lite/encoding';
6
6
  // ============================================================================
7
7
  // STEP attribute helpers (scheduling — optional strings / enums / numbers)
@@ -180,6 +180,8 @@ export class IfcCreator {
180
180
  * upward by Height.
181
181
  */
182
182
  addIfcWall(storeyId, params) {
183
+ assertFinitePoint3({ Start: params.Start, End: params.End }, 'addIfcWall');
184
+ assertPositiveFinite({ Thickness: params.Thickness, Height: params.Height }, 'addIfcWall');
183
185
  const dx = params.End[0] - params.Start[0];
184
186
  const dy = params.End[1] - params.Start[1];
185
187
  const dz = params.End[2] - params.Start[2];
@@ -222,6 +224,11 @@ export class IfcCreator {
222
224
  * Width along +X, Depth along +Y, Thickness extruded along +Z.
223
225
  */
224
226
  addIfcSlab(storeyId, params) {
227
+ assertPositiveFinite({ Thickness: params.Thickness }, 'addIfcSlab');
228
+ if (params.Width !== undefined)
229
+ assertPositiveFinite({ Width: params.Width }, 'addIfcSlab');
230
+ if (params.Depth !== undefined)
231
+ assertPositiveFinite({ Depth: params.Depth }, 'addIfcSlab');
225
232
  const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
226
233
  Location: params.Position,
227
234
  });
@@ -260,6 +267,29 @@ export class IfcCreator {
260
267
  * Cross-section centered, extruded upward by Height.
261
268
  */
262
269
  addIfcColumn(storeyId, params) {
270
+ assertPositiveFinite({ Width: params.Width, Depth: params.Depth, Height: params.Height }, 'addIfcColumn');
271
+ return this.buildIfcColumn(storeyId, params);
272
+ }
273
+ /**
274
+ * Build a column WITHOUT validating dimensions.
275
+ *
276
+ * `IfcExtrudedAreaSolid.Depth` is typed `IfcPositiveLengthMeasure` in the
277
+ * IFC schema, so a zero (or negative) `Height` is spec-invalid — exactly
278
+ * what `addIfcColumn`'s guard exists to reject for ordinary callers.
279
+ *
280
+ * Corruption-injection tooling (tools/world-gym's `degenerate-geometry`
281
+ * defect) needs the opposite: it deliberately builds a spec-invalid,
282
+ * zero-height column to verify the geometry pipeline drops it (no mesh
283
+ * emitted) instead of crashing, and that requires a path that produces
284
+ * exactly the malformed entity it asks for. Routing that through the
285
+ * validated public constructor would make it impossible to construct the
286
+ * fixture it exists to test. This method is that deliberately-unvalidated
287
+ * seam — for adversarial test fixtures ONLY, never for application code.
288
+ */
289
+ addIfcColumnUnvalidated(storeyId, params) {
290
+ return this.buildIfcColumn(storeyId, params);
291
+ }
292
+ buildIfcColumn(storeyId, params) {
263
293
  const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
264
294
  Location: params.Position,
265
295
  });
@@ -285,6 +315,8 @@ export class IfcCreator {
285
315
  * Cross-section (Width × Height) centered on the beam axis.
286
316
  */
287
317
  addIfcBeam(storeyId, params) {
318
+ assertFinitePoint3({ Start: params.Start, End: params.End }, 'addIfcBeam');
319
+ assertPositiveFinite({ Width: params.Width, Height: params.Height }, 'addIfcBeam');
288
320
  const dx = params.End[0] - params.Start[0];
289
321
  const dy = params.End[1] - params.Start[1];
290
322
  const dz = params.End[2] - params.Start[2];
@@ -320,15 +352,15 @@ export class IfcCreator {
320
352
  * (rotated into world space by Direction). Width extends along local +Y.
321
353
  */
322
354
  addIfcStair(storeyId, params) {
323
- if (params.NumberOfRisers <= 0)
324
- throw new Error('addStair: NumberOfRisers must be > 0');
325
- if (params.RiserHeight <= 0)
326
- throw new Error('addStair: RiserHeight must be > 0');
327
- if (params.TreadLength <= 0)
328
- throw new Error('addStair: TreadLength must be > 0');
329
- if (params.Width <= 0)
330
- throw new Error('addStair: Width must be > 0');
355
+ assertPositiveFinite({
356
+ NumberOfRisers: params.NumberOfRisers,
357
+ RiserHeight: params.RiserHeight,
358
+ TreadLength: params.TreadLength,
359
+ Width: params.Width,
360
+ }, 'addStair');
331
361
  const direction = params.Direction ?? 0;
362
+ if (!Number.isFinite(direction))
363
+ throw new Error('addStair: Direction must be a finite number');
332
364
  // Use LocalPlacement rotation so both step positions AND profiles rotate together
333
365
  const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
334
366
  Location: params.Position,
@@ -369,8 +401,9 @@ export class IfcCreator {
369
401
  * Optional Slope is in radians and creates a single slope along +X.
370
402
  */
371
403
  addIfcRoof(storeyId, params) {
404
+ assertPositiveFinite({ Width: params.Width, Depth: params.Depth, Thickness: params.Thickness }, 'addIfcRoof');
372
405
  const slope = params.Slope ?? 0;
373
- if (slope < 0 || slope >= Math.PI / 2) {
406
+ if (!Number.isFinite(slope) || slope < 0 || slope >= Math.PI / 2) {
374
407
  throw new Error('addIfcRoof: Slope must be in radians between 0 and π/2 (e.g. Math.PI / 12 for 15°)');
375
408
  }
376
409
  let axis = [0, 0, 1];
@@ -406,18 +439,13 @@ export class IfcCreator {
406
439
  * The ridge runs along the longer footprint dimension to keep the roof height reasonable.
407
440
  */
408
441
  addIfcGableRoof(storeyId, params) {
409
- if (params.Width <= 0)
410
- throw new Error('addIfcGableRoof: Width must be > 0');
411
- if (params.Depth <= 0)
412
- throw new Error('addIfcGableRoof: Depth must be > 0');
413
- if (params.Thickness <= 0)
414
- throw new Error('addIfcGableRoof: Thickness must be > 0');
415
- if (params.Slope <= 0 || params.Slope >= Math.PI / 2) {
442
+ assertPositiveFinite({ Width: params.Width, Depth: params.Depth, Thickness: params.Thickness }, 'addIfcGableRoof');
443
+ if (!Number.isFinite(params.Slope) || params.Slope <= 0 || params.Slope >= Math.PI / 2) {
416
444
  throw new Error('addIfcGableRoof: Slope must be in radians between 0 and π/2 (e.g. Math.PI / 12 for 15°)');
417
445
  }
418
446
  const overhang = params.Overhang ?? 0;
419
- if (overhang < 0)
420
- throw new Error('addIfcGableRoof: Overhang must be >= 0');
447
+ if (!Number.isFinite(overhang) || overhang < 0)
448
+ throw new Error('addIfcGableRoof: Overhang must be a finite number >= 0');
421
449
  const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
422
450
  Location: params.Position,
423
451
  });
@@ -465,10 +493,10 @@ export class IfcCreator {
465
493
  * Position is wall-local: [distance_along_wall, 0, base_height].
466
494
  */
467
495
  addIfcWallDoor(wallId, params) {
496
+ assertPositiveFinite({ Width: params.Width, Height: params.Height }, 'addIfcWallDoor');
468
497
  const { storeyId, placementId, wallThickness } = this.getHostedWallInfo(wallId);
469
498
  const thickness = params.Thickness ?? wallThickness;
470
- if (thickness <= 0)
471
- throw new Error('addIfcWallDoor: Thickness must be > 0');
499
+ assertPositiveFinite({ Thickness: thickness }, 'addIfcWallDoor');
472
500
  const openingId = this.addWallOpening(wallId, placementId, {
473
501
  Name: params.Name ? `${params.Name} Opening` : 'Door Opening',
474
502
  Width: params.Width,
@@ -500,10 +528,10 @@ export class IfcCreator {
500
528
  * Position is wall-local: [distance_along_wall, 0, sill_height].
501
529
  */
502
530
  addIfcWallWindow(wallId, params) {
531
+ assertPositiveFinite({ Width: params.Width, Height: params.Height }, 'addIfcWallWindow');
503
532
  const { storeyId, placementId, wallThickness } = this.getHostedWallInfo(wallId);
504
533
  const thickness = params.Thickness ?? wallThickness;
505
- if (thickness <= 0)
506
- throw new Error('addIfcWallWindow: Thickness must be > 0');
534
+ assertPositiveFinite({ Thickness: thickness }, 'addIfcWallWindow');
507
535
  const openingId = this.addWallOpening(wallId, placementId, {
508
536
  Name: params.Name ? `${params.Name} Opening` : 'Window Opening',
509
537
  Width: params.Width,
@@ -533,10 +561,12 @@ export class IfcCreator {
533
561
  * Create a door element. Width × Height × Thickness panel.
534
562
  */
535
563
  addIfcDoor(storeyId, params) {
564
+ assertPositiveFinite({ Width: params.Width, Height: params.Height }, 'addIfcDoor');
536
565
  const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
537
566
  Location: params.Position,
538
567
  });
539
568
  const thickness = params.Thickness ?? 0.05;
569
+ assertPositiveFinite({ Thickness: thickness }, 'addIfcDoor');
540
570
  const profileId = this.addRectangleProfile(params.Width, thickness);
541
571
  const solidId = this.addExtrudedAreaSolid(profileId, params.Height);
542
572
  const shapeId = this.addShapeRepresentation('Body', [solidId]);
@@ -559,10 +589,12 @@ export class IfcCreator {
559
589
  * Create a window element. Width × Height × Thickness frame.
560
590
  */
561
591
  addIfcWindow(storeyId, params) {
592
+ assertPositiveFinite({ Width: params.Width, Height: params.Height }, 'addIfcWindow');
562
593
  const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
563
594
  Location: params.Position,
564
595
  });
565
596
  const thickness = params.Thickness ?? 0.05;
597
+ assertPositiveFinite({ Thickness: thickness }, 'addIfcWindow');
566
598
  const profileId = this.addRectangleProfile(params.Width, thickness);
567
599
  const solidId = this.addExtrudedAreaSolid(profileId, params.Height);
568
600
  const shapeId = this.addShapeRepresentation('Body', [solidId]);
@@ -585,7 +617,10 @@ export class IfcCreator {
585
617
  * Width along +Y, Length along +X, Rise optionally inclines the ramp.
586
618
  */
587
619
  addIfcRamp(storeyId, params) {
620
+ assertPositiveFinite({ Width: params.Width, Length: params.Length, Thickness: params.Thickness }, 'addIfcRamp');
588
621
  const rise = params.Rise ?? 0;
622
+ if (!Number.isFinite(rise))
623
+ throw new Error('addIfcRamp: Rise must be a finite number');
589
624
  let axis = [0, 0, 1];
590
625
  let refDir = [1, 0, 0];
591
626
  if (rise > 0) {
@@ -618,6 +653,8 @@ export class IfcCreator {
618
653
  * Create a railing from Start to End with given Height.
619
654
  */
620
655
  addIfcRailing(storeyId, params) {
656
+ assertFinitePoint3({ Start: params.Start, End: params.End }, 'addIfcRailing');
657
+ assertPositiveFinite({ Height: params.Height }, 'addIfcRailing');
621
658
  const dx = params.End[0] - params.Start[0];
622
659
  const dy = params.End[1] - params.Start[1];
623
660
  const dz = params.End[2] - params.Start[2];
@@ -628,6 +665,7 @@ export class IfcCreator {
628
665
  Location: params.Start,
629
666
  });
630
667
  const railWidth = params.Width ?? 0.05;
668
+ assertPositiveFinite({ Width: railWidth }, 'addIfcRailing');
631
669
  // Rail solid — extrude along the rail direction (dir) at rail Height
632
670
  const railProfileId = this.addRectangleProfile(railWidth, railWidth);
633
671
  const railOriginId = this.addCartesianPoint([0, 0, params.Height]);
@@ -672,6 +710,7 @@ export class IfcCreator {
672
710
  * Create a plate (thin flat element, e.g. steel plate).
673
711
  */
674
712
  addIfcPlate(storeyId, params) {
713
+ assertPositiveFinite({ Thickness: params.Thickness }, 'addIfcPlate');
675
714
  const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
676
715
  Location: params.Position,
677
716
  });
@@ -680,6 +719,7 @@ export class IfcCreator {
680
719
  profileId = this.addArbitraryProfile(params.Profile);
681
720
  }
682
721
  else {
722
+ assertPositiveFinite({ Width: params.Width, Depth: params.Depth }, 'addIfcPlate');
683
723
  profileId = this.addRectangleProfile(params.Width, params.Depth, [params.Width / 2, params.Depth / 2]);
684
724
  }
685
725
  const solidId = this.addExtrudedAreaSolid(profileId, params.Thickness);
@@ -701,6 +741,8 @@ export class IfcCreator {
701
741
  * Create a structural member (brace, strut, etc.) from Start to End.
702
742
  */
703
743
  addIfcMember(storeyId, params) {
744
+ assertFinitePoint3({ Start: params.Start, End: params.End }, 'addIfcMember');
745
+ assertPositiveFinite({ Width: params.Width, Height: params.Height }, 'addIfcMember');
704
746
  const dx = params.End[0] - params.Start[0];
705
747
  const dy = params.End[1] - params.Start[1];
706
748
  const dz = params.End[2] - params.Start[2];
@@ -731,6 +773,7 @@ export class IfcCreator {
731
773
  * Create a footing (foundation). Position is top centre, Height extends downward.
732
774
  */
733
775
  addIfcFooting(storeyId, params) {
776
+ assertPositiveFinite({ Width: params.Width, Depth: params.Depth, Height: params.Height }, 'addIfcFooting');
734
777
  // Offset placement downward so extrusion starts at bottom
735
778
  const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
736
779
  Location: [params.Position[0], params.Position[1], params.Position[2] - params.Height],
@@ -757,6 +800,10 @@ export class IfcCreator {
757
800
  * Uses circular cross-section by default, rectangular if IsRectangular is set.
758
801
  */
759
802
  addIfcPile(storeyId, params) {
803
+ assertPositiveFinite({ Length: params.Length, Diameter: params.Diameter }, 'addIfcPile');
804
+ if (params.RectangularDepth !== undefined) {
805
+ assertPositiveFinite({ RectangularDepth: params.RectangularDepth }, 'addIfcPile');
806
+ }
760
807
  const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
761
808
  Location: [params.Position[0], params.Position[1], params.Position[2] - params.Length],
762
809
  });
@@ -787,6 +834,7 @@ export class IfcCreator {
787
834
  * Create a space (room volume).
788
835
  */
789
836
  addIfcSpace(storeyId, params) {
837
+ assertPositiveFinite({ Height: params.Height }, 'addIfcSpace');
790
838
  const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
791
839
  Location: params.Position,
792
840
  });
@@ -795,6 +843,7 @@ export class IfcCreator {
795
843
  profileId = this.addArbitraryProfile(params.Profile);
796
844
  }
797
845
  else {
846
+ assertPositiveFinite({ Width: params.Width, Depth: params.Depth }, 'addIfcSpace');
798
847
  profileId = this.addRectangleProfile(params.Width, params.Depth, [params.Width / 2, params.Depth / 2]);
799
848
  }
800
849
  const solidId = this.addExtrudedAreaSolid(profileId, params.Height);
@@ -817,12 +866,15 @@ export class IfcCreator {
817
866
  * Create a curtain wall. Thin panel from Start to End, extruded by Height.
818
867
  */
819
868
  addIfcCurtainWall(storeyId, params) {
869
+ assertFinitePoint3({ Start: params.Start, End: params.End }, 'addIfcCurtainWall');
870
+ assertPositiveFinite({ Height: params.Height }, 'addIfcCurtainWall');
820
871
  const dx = params.End[0] - params.Start[0];
821
872
  const dy = params.End[1] - params.Start[1];
822
873
  const dz = params.End[2] - params.Start[2];
823
874
  const wallLen = Math.sqrt(dx * dx + dy * dy + dz * dz);
824
875
  const dir = vecNorm([dx, dy, dz]);
825
876
  const thickness = params.Thickness ?? 0.05;
877
+ assertPositiveFinite({ Thickness: thickness }, 'addIfcCurtainWall');
826
878
  const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
827
879
  Location: params.Start,
828
880
  RefDirection: dir,
@@ -847,7 +899,10 @@ export class IfcCreator {
847
899
  * Create a furnishing element (furniture/equipment bounding box).
848
900
  */
849
901
  addIfcFurnishingElement(storeyId, params) {
902
+ assertPositiveFinite({ Width: params.Width, Depth: params.Depth, Height: params.Height }, 'addIfcFurnishingElement');
850
903
  const direction = params.Direction ?? 0;
904
+ if (!Number.isFinite(direction))
905
+ throw new Error('addIfcFurnishingElement: Direction must be a finite number');
851
906
  const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
852
907
  Location: params.Position,
853
908
  RefDirection: direction !== 0 ? [Math.cos(direction), Math.sin(direction), 0] : undefined,
@@ -872,6 +927,7 @@ export class IfcCreator {
872
927
  * Create a proxy element (generic element for custom/unclassified objects).
873
928
  */
874
929
  addIfcBuildingElementProxy(storeyId, params) {
930
+ assertPositiveFinite({ Height: params.Height }, 'addIfcBuildingElementProxy');
875
931
  const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
876
932
  Location: params.Position,
877
933
  });
@@ -880,6 +936,7 @@ export class IfcCreator {
880
936
  profileId = this.addArbitraryProfile(params.Profile);
881
937
  }
882
938
  else {
939
+ assertPositiveFinite({ Width: params.Width, Depth: params.Depth }, 'addIfcBuildingElementProxy');
883
940
  profileId = this.addRectangleProfile(params.Width, params.Depth, [params.Width / 2, params.Depth / 2]);
884
941
  }
885
942
  const solidId = this.addExtrudedAreaSolid(profileId, params.Height);
@@ -905,6 +962,7 @@ export class IfcCreator {
905
962
  * Create a column with circular cross-section.
906
963
  */
907
964
  addIfcCircularColumn(storeyId, params) {
965
+ assertPositiveFinite({ Radius: params.Radius, Height: params.Height }, 'addIfcCircularColumn');
908
966
  const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
909
967
  Location: params.Position,
910
968
  });
@@ -928,6 +986,14 @@ export class IfcCreator {
928
986
  * Create a beam with I-shape (wide-flange/H-shape) cross-section.
929
987
  */
930
988
  addIfcIShapeBeam(storeyId, params) {
989
+ assertFinitePoint3({ Start: params.Start, End: params.End }, 'addIfcIShapeBeam');
990
+ assertPositiveFinite({
991
+ OverallWidth: params.OverallWidth, OverallDepth: params.OverallDepth,
992
+ WebThickness: params.WebThickness, FlangeThickness: params.FlangeThickness,
993
+ }, 'addIfcIShapeBeam');
994
+ if (params.FilletRadius !== undefined) {
995
+ assertPositiveFinite({ FilletRadius: params.FilletRadius }, 'addIfcIShapeBeam');
996
+ }
931
997
  const dx = params.End[0] - params.Start[0];
932
998
  const dy = params.End[1] - params.Start[1];
933
999
  const dz = params.End[2] - params.Start[2];
@@ -958,6 +1024,11 @@ export class IfcCreator {
958
1024
  * Create a member with L-shape (angle) cross-section.
959
1025
  */
960
1026
  addIfcLShapeMember(storeyId, params) {
1027
+ assertFinitePoint3({ Start: params.Start, End: params.End }, 'addIfcLShapeMember');
1028
+ assertPositiveFinite({ Depth: params.Depth, Width: params.Width, Thickness: params.Thickness }, 'addIfcLShapeMember');
1029
+ if (params.FilletRadius !== undefined) {
1030
+ assertPositiveFinite({ FilletRadius: params.FilletRadius }, 'addIfcLShapeMember');
1031
+ }
961
1032
  const dx = params.End[0] - params.Start[0];
962
1033
  const dy = params.End[1] - params.Start[1];
963
1034
  const dz = params.End[2] - params.Start[2];
@@ -988,6 +1059,14 @@ export class IfcCreator {
988
1059
  * Create a member with T-shape cross-section.
989
1060
  */
990
1061
  addIfcTShapeMember(storeyId, params) {
1062
+ assertFinitePoint3({ Start: params.Start, End: params.End }, 'addIfcTShapeMember');
1063
+ assertPositiveFinite({
1064
+ FlangeWidth: params.FlangeWidth, Depth: params.Depth,
1065
+ WebThickness: params.WebThickness, FlangeThickness: params.FlangeThickness,
1066
+ }, 'addIfcTShapeMember');
1067
+ if (params.FilletRadius !== undefined) {
1068
+ assertPositiveFinite({ FilletRadius: params.FilletRadius }, 'addIfcTShapeMember');
1069
+ }
991
1070
  const dx = params.End[0] - params.Start[0];
992
1071
  const dy = params.End[1] - params.Start[1];
993
1072
  const dz = params.End[2] - params.Start[2];
@@ -1018,6 +1097,14 @@ export class IfcCreator {
1018
1097
  * Create a member with U-shape (channel) cross-section.
1019
1098
  */
1020
1099
  addIfcUShapeMember(storeyId, params) {
1100
+ assertFinitePoint3({ Start: params.Start, End: params.End }, 'addIfcUShapeMember');
1101
+ assertPositiveFinite({
1102
+ Depth: params.Depth, FlangeWidth: params.FlangeWidth,
1103
+ WebThickness: params.WebThickness, FlangeThickness: params.FlangeThickness,
1104
+ }, 'addIfcUShapeMember');
1105
+ if (params.FilletRadius !== undefined) {
1106
+ assertPositiveFinite({ FilletRadius: params.FilletRadius }, 'addIfcUShapeMember');
1107
+ }
1021
1108
  const dx = params.End[0] - params.Start[0];
1022
1109
  const dy = params.End[1] - params.Start[1];
1023
1110
  const dz = params.End[2] - params.Start[2];
@@ -1048,6 +1135,7 @@ export class IfcCreator {
1048
1135
  * Create a column or pile with hollow circular cross-section.
1049
1136
  */
1050
1137
  addIfcHollowCircularColumn(storeyId, params) {
1138
+ assertPositiveFinite({ Radius: params.Radius, WallThickness: params.WallThickness, Height: params.Height }, 'addIfcHollowCircularColumn');
1051
1139
  const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
1052
1140
  Location: params.Position,
1053
1141
  });
@@ -1071,6 +1159,14 @@ export class IfcCreator {
1071
1159
  * Create a beam/column with hollow rectangular (tube) cross-section.
1072
1160
  */
1073
1161
  addIfcRectangleHollowBeam(storeyId, params) {
1162
+ assertFinitePoint3({ Start: params.Start, End: params.End }, 'addIfcRectangleHollowBeam');
1163
+ assertPositiveFinite({ XDim: params.XDim, YDim: params.YDim, WallThickness: params.WallThickness }, 'addIfcRectangleHollowBeam');
1164
+ if (params.InnerFilletRadius !== undefined) {
1165
+ assertPositiveFinite({ InnerFilletRadius: params.InnerFilletRadius }, 'addIfcRectangleHollowBeam');
1166
+ }
1167
+ if (params.OuterFilletRadius !== undefined) {
1168
+ assertPositiveFinite({ OuterFilletRadius: params.OuterFilletRadius }, 'addIfcRectangleHollowBeam');
1169
+ }
1074
1170
  const dx = params.End[0] - params.Start[0];
1075
1171
  const dy = params.End[1] - params.Start[1];
1076
1172
  const dz = params.End[2] - params.Start[2];