@pascal-app/ifc-converter 1.0.4 → 1.0.5

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/README.md CHANGED
@@ -35,7 +35,6 @@ The importer writes intent for Pascal's room-first model; the scene load
35
35
  migrations (room adoption, floor plates) and the structure kernel turn it into
36
36
  rooms, floor plates and ceilings. `tests/room-first-load.test.ts` converts the
37
37
  reference files and runs that load chain.
38
-
39
38
  - **Walls.** Merged collinear fragments, then every straight wall end moves
40
39
  along its axis onto the centreline it meets (L and T joins; ends inside
41
40
  another wall's body reach its centreline, `IfcRelConnectsPathElements` widens
@@ -1 +1 @@
1
- {"version":3,"file":"guid.d.ts","sourceRoot":"","sources":["../../src/export/guid.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEzD;AA+CD,mEAAmE;AACnE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAS3D;AAED,6FAA6F;AAC7F,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;;GAIG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;IAEzC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM;CAYjD"}
1
+ {"version":3,"file":"guid.d.ts","sourceRoot":"","sources":["../../src/export/guid.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEzD;AA+CD,mEAAmE;AACnE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAS3D;AAED,6FAA6F;AAC7F,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;;GAIG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;IAEzC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAW/C;CACF"}
@@ -75,6 +75,10 @@ export declare const bool: (value: boolean) => {
75
75
  readonly type: string;
76
76
  readonly value: StepValue;
77
77
  };
78
+ export declare const logical: (value: boolean) => {
79
+ readonly type: string;
80
+ readonly value: StepValue;
81
+ };
78
82
  export declare const length: (value: number) => {
79
83
  readonly type: string;
80
84
  readonly value: StepValue;
@@ -1 +1 @@
1
- {"version":3,"file":"ifc-model.d.ts","sourceRoot":"","sources":["../../src/export/ifc-model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ifc-model.d.ts","sourceRoot":"","sources":["../../src/export/ifc-model.ts"],"names":[],"mappings":"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"}
@@ -178,6 +178,7 @@ export const label = (value) => typed('IFCLABEL', value);
178
178
  export const identifier = (value) => typed('IFCIDENTIFIER', value);
179
179
  export const text = (value) => typed('IFCTEXT', value);
180
180
  export const bool = (value) => typed('IFCBOOLEAN', value);
181
+ export const logical = (value) => typed('IFCLOGICAL', value);
181
182
  export const length = (value) => typed('IFCLENGTHMEASURE', value);
182
183
  export const ratio = (value) => typed('IFCPOSITIVERATIOMEASURE', value);
183
184
  export { DERIVED, enumValue, int };
@@ -1 +1 @@
1
- {"version":3,"file":"scene-to-ifc.d.ts","sourceRoot":"","sources":["../../src/export/scene-to-ifc.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAIZ,KAAK,UAAU,EAmChB,MAAM,kBAAkB,CAAA;AAwBzB,0FAA0F;AAC1F,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IAC5B,OAAO,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IAC3B,+BAA+B;IAC/B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;IAClD,oGAAoG;IACpG,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAA;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,sDAAsD;IACtD,SAAS,CAAC,EAAE,IAAI,CAAA;IAChB,qFAAqF;IACrF,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,aAAa,GAAG,YAAY,GAAG,UAAU,CAAA;CAClD;AAED,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,OAAO,EAAE,aAAa,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,gBAAgB,CAAA;CAC1B;AAoMD,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAkyCrE;AAiCD,wDAAwD;AACxD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAE9D"}
1
+ {"version":3,"file":"scene-to-ifc.d.ts","sourceRoot":"","sources":["../../src/export/scene-to-ifc.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAIZ,KAAK,UAAU,EAoChB,MAAM,kBAAkB,CAAA;AAyBzB,0FAA0F;AAC1F,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IAC5B,OAAO,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IAC3B,+BAA+B;IAC/B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;IAClD,oGAAoG;IACpG,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAA;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,sDAAsD;IACtD,SAAS,CAAC,EAAE,IAAI,CAAA;IAChB,qFAAqF;IACrF,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,aAAa,GAAG,YAAY,GAAG,UAAU,CAAA;CAClD;AAED,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,OAAO,EAAE,aAAa,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,gBAAgB,CAAA;CAC1B;AAoMD,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAm1CrE;AAiCD,wDAAwD;AACxD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAE9D"}
@@ -1,6 +1,6 @@
1
- import { calculateLevelMiters, DEFAULT_WALL_THICKNESS, difference, getLevelElevations, getOpeningWallCut, getRenderableSlabPolygon, getWallBodyCenterOffset, getWallCurveFrameAt, getWallCurveLength, getWallFaceOffsets, getWallPlaneTop, getWallPlanFootprint, hidesDescendants, intersection, isCurvedWall, liftedManualSlab, measureStair, prepareSlabPolygonContext, resolveCeilingHeight, resolveWallTop, sampleWallCenterline, union, wallSupportForNodes, } from '@pascal-app/core';
1
+ import { calculateLevelMiters, DEFAULT_WALL_THICKNESS, difference, getLevelElevations, getOpeningWallCut, getRenderableSlabPolygon, getWallAssemblyPreset, getWallBodyCenterOffset, getWallCurveFrameAt, getWallCurveLength, getWallFaceOffsets, getWallPlanFootprint, getWallTop, hidesDescendants, intersection, isCurvedWall, liftedManualSlab, measureStair, prepareSlabPolygonContext, resolveCeilingHeight, resolveWallExteriorSide, sampleWallCenterline, union, wallSupportForNodes, } from '@pascal-app/core';
2
2
  import { doorGlazingFraction, doorOperationForIfc } from './door-operation';
3
- import { bool, cleanRing, DERIVED, enumValue, frameToLocal, IDENTITY_FRAME, IfcModel, identifier, int, label, ratio, relativeFrame, } from './ifc-model';
3
+ import { bool, cleanRing, DERIVED, enumValue, frameToLocal, IDENTITY_FRAME, IfcModel, identifier, int, label, logical, ratio, relativeFrame, } from './ifc-model';
4
4
  import { typed } from './step';
5
5
  import { wallBaseCells, wallCellBand } from './wall-base';
6
6
  const NON_PHYSICAL_TYPES = new Set([
@@ -514,6 +514,47 @@ export function buildIfcExport(input) {
514
514
  }
515
515
  const layerUsages = new Map();
516
516
  const wallMaterial = step.add('IFCMATERIAL', 'Wall', null, null);
517
+ // One IfcMaterial per (material, role) used by an assembly layer.
518
+ const layerMaterials = new Map();
519
+ const layerMaterial = (name, category) => {
520
+ const key = `${name}|${category ?? ''}`;
521
+ let ref = layerMaterials.get(key);
522
+ if (!ref) {
523
+ ref = step.add('IFCMATERIAL', name, null, category);
524
+ layerMaterials.set(key, ref);
525
+ }
526
+ return ref;
527
+ };
528
+ // IFC4's suggested layer categories.
529
+ const layerCategory = (role, core) => core
530
+ ? 'LoadBearing'
531
+ : role === 'insulation'
532
+ ? 'Insulation'
533
+ : role === 'finish' || role === 'lining'
534
+ ? 'Finish'
535
+ : null;
536
+ /**
537
+ * The wall's assembly as IFC layers, ordered from Pascal's front face (+n),
538
+ * which is where an AXIS2/POSITIVE usage starting at -faces.a begins. Null
539
+ * when the wall has no assembly or its layers don't add up to the body.
540
+ */
541
+ const wallAssemblyLayers = (wall, thickness) => {
542
+ const assembly = wall.assembly;
543
+ if (!assembly?.layers.length)
544
+ return null;
545
+ const sum = assembly.layers.reduce((total, layer) => total + layer.thickness, 0);
546
+ if (Math.abs(sum - thickness) > 1e-4)
547
+ return null;
548
+ // Layers run from the front face unless the stack starts at the exterior
549
+ // and the exterior is the back face.
550
+ const startsAtBack = assembly.face === 'exterior' && (resolveWallExteriorSide(wall) ?? -1) === -1;
551
+ const layers = startsAtBack ? [...assembly.layers].reverse() : assembly.layers;
552
+ const preset = getWallAssemblyPreset(assembly.presetId);
553
+ return {
554
+ name: preset?.label ?? null,
555
+ layers: layers.filter((layer) => layer.thickness > 0),
556
+ };
557
+ };
517
558
  const wallsByLevel = new Map();
518
559
  for (const wall of ofType('wall'))
519
560
  if (wall.parentId)
@@ -536,7 +577,7 @@ export function buildIfcExport(input) {
536
577
  const chord = Math.hypot(endPlan[0] - startPlan[0], endPlan[1] - startPlan[1]);
537
578
  const support = wallSupportForNodes(wall, nodes);
538
579
  const base = support.elevation;
539
- const top = resolveWallTop(wall, getWallPlaneTop(wall, levelId, nodes), base);
580
+ const top = getWallTop(wall, levelId, nodes, base);
540
581
  const cells = wallBaseCells(wall, support, top);
541
582
  if (chord < 1e-6 || cells.every((cell) => top - cell.bottom <= 1e-4)) {
542
583
  skipped.push({ nodeId: wall.id, type: wall.type, reason: 'degenerate' });
@@ -597,11 +638,22 @@ export function buildIfcExport(input) {
597
638
  // Pascal's body spans [b, a] along its left normal; that normal is
598
639
  // IFC -Y in the wall frame, so the first layer starts at -a.
599
640
  const offset = -faces.a;
600
- const usageKey = `${thickness.toFixed(6)}|${offset.toFixed(6)}`;
641
+ const stack = wallAssemblyLayers(wall, thickness);
642
+ const stackKey = stack
643
+ ? stack.layers
644
+ .map((l) => `${l.role}:${l.material ?? ''}:${l.thickness.toFixed(6)}:${l.core ? 1 : 0}`)
645
+ .join(',')
646
+ : 'core';
647
+ const usageKey = `${thickness.toFixed(6)}|${offset.toFixed(6)}|${stackKey}`;
601
648
  let usage = layerUsages.get(usageKey);
602
649
  if (!usage) {
603
- const layer = step.add('IFCMATERIALLAYER', wallMaterial, thickness, null, 'Core', null, null, null);
604
- const layerSet = step.add('IFCMATERIALLAYERSET', [layer], `Wall ${Math.round(thickness * 1000)} mm`, null);
650
+ const layers = stack
651
+ ? stack.layers.map((l) => {
652
+ const category = layerCategory(l.role, l.core === true);
653
+ return step.add('IFCMATERIALLAYER', layerMaterial(l.material ?? l.role, category), l.thickness, l.role === 'air' ? logical(true) : null, l.id, l.role, category, null);
654
+ })
655
+ : [step.add('IFCMATERIALLAYER', wallMaterial, thickness, null, 'Core', null, null, null)];
656
+ const layerSet = step.add('IFCMATERIALLAYERSET', layers, stack?.name ?? `Wall ${Math.round(thickness * 1000)} mm`, null);
605
657
  usage = {
606
658
  usage: step.add('IFCMATERIALLAYERSETUSAGE', layerSet, enumValue('AXIS2'), enumValue('POSITIVE'), offset, null),
607
659
  walls: [],
@@ -1 +1 @@
1
- {"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../../src/export/step.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,qBAAa,OAAO;IACN,QAAQ,CAAC,EAAE,EAAE,MAAM;gBAAV,EAAE,EAAE,MAAM;CAChC;AAED,cAAM,QAAQ;IACA,QAAQ,CAAC,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM;CACnC;AAED,cAAM,OAAO;IACC,QAAQ,CAAC,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM;CACnC;AAED,cAAM,SAAS;IAEX,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,KAAK,EAAE,SAAS;gBADhB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS;CAE5B;AAED,cAAM,OAAO;IACC,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;CAClC;AAED,QAAA,MAAM,aAAa,eAAoB,CAAA;AAEvC,MAAM,MAAM,SAAS,GACjB,IAAI,GACJ,SAAS,GACT,OAAO,GACP,MAAM,GACN,MAAM,GACN,OAAO,GACP,QAAQ,GACR,OAAO,GACP,SAAS,GACT,OAAO,GACP,OAAO,aAAa,GACpB,SAAS,SAAS,EAAE,CAAA;AAExB,2DAA2D;AAC3D,eAAO,MAAM,OAAO,EAAE,OAAO,aAA6B,CAAA;AAC1D,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,aAAwB,CAAA;AAC/D,eAAO,MAAM,GAAG,GAAI,OAAO,MAAM,YAAmC,CAAA;AACpE,eAAO,MAAM,KAAK,GAAI,MAAM,MAAM,EAAE,OAAO,SAAS,cAA+B,CAAA;AACnF,iFAAiF;AACjF,eAAO,MAAM,GAAG,GAAI,MAAM,MAAM,YAAsB,CAAA;AAEtD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,CAc9D;AAED,2FAA2F;AAC3F,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAsBlD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAYpD;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,iBAAiB,EAAE,MAAM,CAAA;IACzB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,MAAM,CAAI;IAClB,QAAQ,CAAC,MAAM,sBAA4B;IAE3C,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO;IAOhD,iFAAiF;IACjF,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO;IAStD,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;CAoBtC"}
1
+ {"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../../src/export/step.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,qBAAa,OAAO;IACN,QAAQ,CAAC,EAAE,EAAE,MAAM;IAA/B,YAAqB,EAAE,EAAE,MAAM,EAAI;CACpC;AAED,cAAM,QAAQ;IACA,QAAQ,CAAC,KAAK,EAAE,MAAM;IAAlC,YAAqB,KAAK,EAAE,MAAM,EAAI;CACvC;AAED,cAAM,OAAO;IACC,QAAQ,CAAC,KAAK,EAAE,MAAM;IAAlC,YAAqB,KAAK,EAAE,MAAM,EAAI;CACvC;AAED,cAAM,SAAS;IAEX,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,KAAK,EAAE,SAAS;IAF3B,YACW,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,EACvB;CACL;AAED,cAAM,OAAO;IACC,QAAQ,CAAC,IAAI,EAAE,MAAM;IAAjC,YAAqB,IAAI,EAAE,MAAM,EAAI;CACtC;AAED,QAAA,MAAM,aAAa,eAAoB,CAAA;AAEvC,MAAM,MAAM,SAAS,GACjB,IAAI,GACJ,SAAS,GACT,OAAO,GACP,MAAM,GACN,MAAM,GACN,OAAO,GACP,QAAQ,GACR,OAAO,GACP,SAAS,GACT,OAAO,GACP,OAAO,aAAa,GACpB,SAAS,SAAS,EAAE,CAAA;AAExB,2DAA2D;AAC3D,eAAO,MAAM,OAAO,EAAE,OAAO,aAA6B,CAAA;AAC1D,eAAO,MAAM,SAAS,UAAW,MAAM,aAAwB,CAAA;AAC/D,eAAO,MAAM,GAAG,UAAW,MAAM,YAAmC,CAAA;AACpE,eAAO,MAAM,KAAK,SAAU,MAAM,SAAS,SAAS,cAA+B,CAAA;AACnF,iFAAiF;AACjF,eAAO,MAAM,GAAG,SAAU,MAAM,YAAsB,CAAA;AAEtD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,CAc9D;AAED,2FAA2F;AAC3F,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAsBlD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAYpD;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,iBAAiB,EAAE,MAAM,CAAA;IACzB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,MAAM,CAAI;IAClB,QAAQ,CAAC,MAAM,sBAA4B;IAE3C,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO,CAK/C;IAED,iFAAiF;IACjF,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO,CAOrD;IAED,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAmBpC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pascal-app/ifc-converter",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "IFC → Pascal scene-graph conversion. Pure logic — no DOM, no React.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -28,13 +28,13 @@
28
28
  "prepublishOnly": "npm run build"
29
29
  },
30
30
  "dependencies": {
31
- "@pascal-app/core": "^1.0.4",
32
- "web-ifc": "^0.0.77"
31
+ "@pascal-app/core": "^1.0.5",
32
+ "web-ifc": "^0.0.78"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@pascal/typescript-config": "*",
36
- "@types/bun": "^1.4.2",
37
- "typescript": "6.0.3"
36
+ "@types/bun": "^1.4.3",
37
+ "typescript": "7.0.2"
38
38
  },
39
39
  "repository": {
40
40
  "type": "git",