@ifc-lite/create 1.17.0 → 2.0.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.
- package/README.md +1 -1
- package/dist/ifc-creator.d.ts +31 -1
- package/dist/ifc-creator.d.ts.map +1 -1
- package/dist/ifc-creator.js +57 -23
- package/dist/ifc-creator.js.map +1 -1
- package/dist/in-store/extract-walls.d.ts.map +1 -1
- package/dist/in-store/extract-walls.js +15 -1
- package/dist/in-store/extract-walls.js.map +1 -1
- package/dist/in-store/resolve-anchor.d.ts.map +1 -1
- package/dist/in-store/resolve-anchor.js +14 -4
- package/dist/in-store/resolve-anchor.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +4 -4
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @ifc-lite/create
|
|
2
2
|
|
|
3
|
-
Create valid IFC4 STEP files from scratch, programmatically. `IfcCreator` builds a complete spatial structure (project, site, building, storeys) and adds building elements with real geometry, property sets, quantities, and materials. Inputs are in metres
|
|
3
|
+
Create valid IFC4 STEP files from scratch, programmatically. `IfcCreator` builds a complete spatial structure (project, site, building, storeys) and adds building elements with real geometry, property sets, quantities, and materials. Inputs are in metres. Element coordinates are relative to the storey you add the element to: the storey placement carries `Elevation` and every element chains to it, so an element standing on a storey at `Elevation: 3` is created with `Z = 0`.
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
package/dist/ifc-creator.d.ts
CHANGED
|
@@ -14,6 +14,27 @@
|
|
|
14
14
|
* All values in metres unless LengthUnit is overridden.
|
|
15
15
|
*/
|
|
16
16
|
import type { Point3D, Point2D, Placement3D, ElementAttributes, ProfileDef, GenericElementParams, AxisElementParams, WallParams, SlabParams, ColumnParams, BeamParams, StairParams, RoofParams, GableRoofParams, WallDoorParams, WallWindowParams, DoorParams, WindowParams, RampParams, RailingParams, PlateParams, MemberParams, FootingParams, PileParams, SpaceParams, CurtainWallParams, FurnishingParams, ProxyParams, ProjectParams, StoreyParams, PropertySetDef, QuantitySetDef, MaterialDef, WorkScheduleParams, WorkPlanParams, TaskParams, SequenceParams, CreateResult } from './types.js';
|
|
17
|
+
/**
|
|
18
|
+
* PLACEMENT CONTRACT
|
|
19
|
+
*
|
|
20
|
+
* Every `addIfcXxx(storeyId, …)` / `addElement(storeyId, …)` method takes the
|
|
21
|
+
* storey as its first argument and emits an `IfcRelContainedInSpatialStructure`
|
|
22
|
+
* putting the product in that storey. The product's `IfcLocalPlacement` is
|
|
23
|
+
* therefore chained to the STOREY's placement, never to the world: the
|
|
24
|
+
* placement hierarchy has to agree with the containment hierarchy, or moving a
|
|
25
|
+
* storey leaves its own contents behind.
|
|
26
|
+
*
|
|
27
|
+
* Consequence for callers: **coordinates passed to these methods are
|
|
28
|
+
* storey-relative.** `IfcBuildingStorey.Elevation` is applied exactly once, by
|
|
29
|
+
* the storey's own placement (`[0, 0, Elevation]`, the only placement in this
|
|
30
|
+
* class that is chained to the world). A wall whose floor sits on a storey at
|
|
31
|
+
* `Elevation: 3` is created with `Z = 0`, not `Z = 3`.
|
|
32
|
+
*
|
|
33
|
+
* Before 2.0.0 only `addIfcWall`, `addIfcSlab`, `addIfcColumn`, `addIfcBeam`,
|
|
34
|
+
* `addIfcStair`, `addIfcRoof` and `addIfcGableRoof` behaved this way; the other
|
|
35
|
+
* 21 constructors chained to the world, so a caller mixing them on a storey
|
|
36
|
+
* with a non-zero elevation got two different datums in one model.
|
|
37
|
+
*/
|
|
17
38
|
export declare class IfcCreator {
|
|
18
39
|
private nextId;
|
|
19
40
|
private lines;
|
|
@@ -61,7 +82,16 @@ export declare class IfcCreator {
|
|
|
61
82
|
private newGlobalId;
|
|
62
83
|
/** Add a building storey. Returns the storey expressId for use with element creation. */
|
|
63
84
|
addIfcBuildingStorey(params: StoreyParams): number;
|
|
64
|
-
/**
|
|
85
|
+
/**
|
|
86
|
+
* The `IfcLocalPlacement` every product of this storey chains to.
|
|
87
|
+
*
|
|
88
|
+
* Throws on an unknown storey rather than falling back to the world
|
|
89
|
+
* placement: the fallback silently produced a product on a different datum
|
|
90
|
+
* from its siblings, which is the exact failure this parent is here to make
|
|
91
|
+
* impossible. `trackElement` rejects the same id a few lines later anyway,
|
|
92
|
+
* so failing here only means the half-built placement entities are never
|
|
93
|
+
* emitted.
|
|
94
|
+
*/
|
|
65
95
|
private getStoreyPlacement;
|
|
66
96
|
/**
|
|
67
97
|
* Create a wall from Start to End with given Thickness and Height.
|
|
@@ -1 +1 @@
|
|
|
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,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
|
|
1
|
+
{"version":3,"file":"ifc-creator.d.ts","sourceRoot":"","sources":["../src/ifc-creator.ts"],"names":[],"mappings":"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"}
|
package/dist/ifc-creator.js
CHANGED
|
@@ -25,6 +25,27 @@ function optReal(v) {
|
|
|
25
25
|
// ============================================================================
|
|
26
26
|
// IfcCreator
|
|
27
27
|
// ============================================================================
|
|
28
|
+
/**
|
|
29
|
+
* PLACEMENT CONTRACT
|
|
30
|
+
*
|
|
31
|
+
* Every `addIfcXxx(storeyId, …)` / `addElement(storeyId, …)` method takes the
|
|
32
|
+
* storey as its first argument and emits an `IfcRelContainedInSpatialStructure`
|
|
33
|
+
* putting the product in that storey. The product's `IfcLocalPlacement` is
|
|
34
|
+
* therefore chained to the STOREY's placement, never to the world: the
|
|
35
|
+
* placement hierarchy has to agree with the containment hierarchy, or moving a
|
|
36
|
+
* storey leaves its own contents behind.
|
|
37
|
+
*
|
|
38
|
+
* Consequence for callers: **coordinates passed to these methods are
|
|
39
|
+
* storey-relative.** `IfcBuildingStorey.Elevation` is applied exactly once, by
|
|
40
|
+
* the storey's own placement (`[0, 0, Elevation]`, the only placement in this
|
|
41
|
+
* class that is chained to the world). A wall whose floor sits on a storey at
|
|
42
|
+
* `Elevation: 3` is created with `Z = 0`, not `Z = 3`.
|
|
43
|
+
*
|
|
44
|
+
* Before 2.0.0 only `addIfcWall`, `addIfcSlab`, `addIfcColumn`, `addIfcBeam`,
|
|
45
|
+
* `addIfcStair`, `addIfcRoof` and `addIfcGableRoof` behaved this way; the other
|
|
46
|
+
* 21 constructors chained to the world, so a caller mixing them on a storey
|
|
47
|
+
* with a non-zero elevation got two different datums in one model.
|
|
48
|
+
*/
|
|
28
49
|
export class IfcCreator {
|
|
29
50
|
nextId = 1;
|
|
30
51
|
lines = [];
|
|
@@ -131,9 +152,22 @@ export class IfcCreator {
|
|
|
131
152
|
this.entities.push({ expressId: id, type: 'IfcBuildingStorey', Name: name });
|
|
132
153
|
return id;
|
|
133
154
|
}
|
|
134
|
-
/**
|
|
155
|
+
/**
|
|
156
|
+
* The `IfcLocalPlacement` every product of this storey chains to.
|
|
157
|
+
*
|
|
158
|
+
* Throws on an unknown storey rather than falling back to the world
|
|
159
|
+
* placement: the fallback silently produced a product on a different datum
|
|
160
|
+
* from its siblings, which is the exact failure this parent is here to make
|
|
161
|
+
* impossible. `trackElement` rejects the same id a few lines later anyway,
|
|
162
|
+
* so failing here only means the half-built placement entities are never
|
|
163
|
+
* emitted.
|
|
164
|
+
*/
|
|
135
165
|
getStoreyPlacement(storeyId) {
|
|
136
|
-
|
|
166
|
+
const placementId = this.storeyPlacements.get(storeyId);
|
|
167
|
+
if (placementId === undefined) {
|
|
168
|
+
throw new Error(`Unknown storeyId #${storeyId} — call addIfcBuildingStorey() first`);
|
|
169
|
+
}
|
|
170
|
+
return placementId;
|
|
137
171
|
}
|
|
138
172
|
// ============================================================================
|
|
139
173
|
// Public API — Building Elements
|
|
@@ -499,7 +533,7 @@ export class IfcCreator {
|
|
|
499
533
|
* Create a door element. Width × Height × Thickness panel.
|
|
500
534
|
*/
|
|
501
535
|
addIfcDoor(storeyId, params) {
|
|
502
|
-
const placementId = this.addLocalPlacement(this.
|
|
536
|
+
const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
|
|
503
537
|
Location: params.Position,
|
|
504
538
|
});
|
|
505
539
|
const thickness = params.Thickness ?? 0.05;
|
|
@@ -525,7 +559,7 @@ export class IfcCreator {
|
|
|
525
559
|
* Create a window element. Width × Height × Thickness frame.
|
|
526
560
|
*/
|
|
527
561
|
addIfcWindow(storeyId, params) {
|
|
528
|
-
const placementId = this.addLocalPlacement(this.
|
|
562
|
+
const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
|
|
529
563
|
Location: params.Position,
|
|
530
564
|
});
|
|
531
565
|
const thickness = params.Thickness ?? 0.05;
|
|
@@ -559,7 +593,7 @@ export class IfcCreator {
|
|
|
559
593
|
axis = [Math.sin(slopeAngle), 0, Math.cos(slopeAngle)];
|
|
560
594
|
refDir = [Math.cos(slopeAngle), 0, -Math.sin(slopeAngle)];
|
|
561
595
|
}
|
|
562
|
-
const placementId = this.addLocalPlacement(this.
|
|
596
|
+
const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
|
|
563
597
|
Location: params.Position,
|
|
564
598
|
Axis: axis,
|
|
565
599
|
RefDirection: refDir,
|
|
@@ -590,7 +624,7 @@ export class IfcCreator {
|
|
|
590
624
|
const railLen = Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
591
625
|
const dir = vecNorm([dx, dy, dz]);
|
|
592
626
|
// Use identity orientation so posts can extrude vertically along world Z
|
|
593
|
-
const placementId = this.addLocalPlacement(this.
|
|
627
|
+
const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
|
|
594
628
|
Location: params.Start,
|
|
595
629
|
});
|
|
596
630
|
const railWidth = params.Width ?? 0.05;
|
|
@@ -638,7 +672,7 @@ export class IfcCreator {
|
|
|
638
672
|
* Create a plate (thin flat element, e.g. steel plate).
|
|
639
673
|
*/
|
|
640
674
|
addIfcPlate(storeyId, params) {
|
|
641
|
-
const placementId = this.addLocalPlacement(this.
|
|
675
|
+
const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
|
|
642
676
|
Location: params.Position,
|
|
643
677
|
});
|
|
644
678
|
let profileId;
|
|
@@ -672,7 +706,7 @@ export class IfcCreator {
|
|
|
672
706
|
const dz = params.End[2] - params.Start[2];
|
|
673
707
|
const memberLen = Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
674
708
|
const dir = vecNorm([dx, dy, dz]);
|
|
675
|
-
const placementId = this.addLocalPlacement(this.
|
|
709
|
+
const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
|
|
676
710
|
Location: params.Start,
|
|
677
711
|
Axis: dir,
|
|
678
712
|
RefDirection: this.computeRefDirection(dir),
|
|
@@ -698,7 +732,7 @@ export class IfcCreator {
|
|
|
698
732
|
*/
|
|
699
733
|
addIfcFooting(storeyId, params) {
|
|
700
734
|
// Offset placement downward so extrusion starts at bottom
|
|
701
|
-
const placementId = this.addLocalPlacement(this.
|
|
735
|
+
const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
|
|
702
736
|
Location: [params.Position[0], params.Position[1], params.Position[2] - params.Height],
|
|
703
737
|
});
|
|
704
738
|
const profileId = this.addRectangleProfile(params.Width, params.Depth);
|
|
@@ -723,7 +757,7 @@ export class IfcCreator {
|
|
|
723
757
|
* Uses circular cross-section by default, rectangular if IsRectangular is set.
|
|
724
758
|
*/
|
|
725
759
|
addIfcPile(storeyId, params) {
|
|
726
|
-
const placementId = this.addLocalPlacement(this.
|
|
760
|
+
const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
|
|
727
761
|
Location: [params.Position[0], params.Position[1], params.Position[2] - params.Length],
|
|
728
762
|
});
|
|
729
763
|
let profileId;
|
|
@@ -753,7 +787,7 @@ export class IfcCreator {
|
|
|
753
787
|
* Create a space (room volume).
|
|
754
788
|
*/
|
|
755
789
|
addIfcSpace(storeyId, params) {
|
|
756
|
-
const placementId = this.addLocalPlacement(this.
|
|
790
|
+
const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
|
|
757
791
|
Location: params.Position,
|
|
758
792
|
});
|
|
759
793
|
let profileId;
|
|
@@ -789,7 +823,7 @@ export class IfcCreator {
|
|
|
789
823
|
const wallLen = Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
790
824
|
const dir = vecNorm([dx, dy, dz]);
|
|
791
825
|
const thickness = params.Thickness ?? 0.05;
|
|
792
|
-
const placementId = this.addLocalPlacement(this.
|
|
826
|
+
const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
|
|
793
827
|
Location: params.Start,
|
|
794
828
|
RefDirection: dir,
|
|
795
829
|
});
|
|
@@ -814,7 +848,7 @@ export class IfcCreator {
|
|
|
814
848
|
*/
|
|
815
849
|
addIfcFurnishingElement(storeyId, params) {
|
|
816
850
|
const direction = params.Direction ?? 0;
|
|
817
|
-
const placementId = this.addLocalPlacement(this.
|
|
851
|
+
const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
|
|
818
852
|
Location: params.Position,
|
|
819
853
|
RefDirection: direction !== 0 ? [Math.cos(direction), Math.sin(direction), 0] : undefined,
|
|
820
854
|
});
|
|
@@ -838,7 +872,7 @@ export class IfcCreator {
|
|
|
838
872
|
* Create a proxy element (generic element for custom/unclassified objects).
|
|
839
873
|
*/
|
|
840
874
|
addIfcBuildingElementProxy(storeyId, params) {
|
|
841
|
-
const placementId = this.addLocalPlacement(this.
|
|
875
|
+
const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
|
|
842
876
|
Location: params.Position,
|
|
843
877
|
});
|
|
844
878
|
let profileId;
|
|
@@ -871,7 +905,7 @@ export class IfcCreator {
|
|
|
871
905
|
* Create a column with circular cross-section.
|
|
872
906
|
*/
|
|
873
907
|
addIfcCircularColumn(storeyId, params) {
|
|
874
|
-
const placementId = this.addLocalPlacement(this.
|
|
908
|
+
const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
|
|
875
909
|
Location: params.Position,
|
|
876
910
|
});
|
|
877
911
|
const profileId = this.addCircleProfile(params.Radius);
|
|
@@ -899,7 +933,7 @@ export class IfcCreator {
|
|
|
899
933
|
const dz = params.End[2] - params.Start[2];
|
|
900
934
|
const beamLen = Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
901
935
|
const dir = vecNorm([dx, dy, dz]);
|
|
902
|
-
const placementId = this.addLocalPlacement(this.
|
|
936
|
+
const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
|
|
903
937
|
Location: params.Start,
|
|
904
938
|
Axis: dir,
|
|
905
939
|
RefDirection: this.computeRefDirection(dir),
|
|
@@ -929,7 +963,7 @@ export class IfcCreator {
|
|
|
929
963
|
const dz = params.End[2] - params.Start[2];
|
|
930
964
|
const memberLen = Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
931
965
|
const dir = vecNorm([dx, dy, dz]);
|
|
932
|
-
const placementId = this.addLocalPlacement(this.
|
|
966
|
+
const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
|
|
933
967
|
Location: params.Start,
|
|
934
968
|
Axis: dir,
|
|
935
969
|
RefDirection: this.computeRefDirection(dir),
|
|
@@ -959,7 +993,7 @@ export class IfcCreator {
|
|
|
959
993
|
const dz = params.End[2] - params.Start[2];
|
|
960
994
|
const memberLen = Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
961
995
|
const dir = vecNorm([dx, dy, dz]);
|
|
962
|
-
const placementId = this.addLocalPlacement(this.
|
|
996
|
+
const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
|
|
963
997
|
Location: params.Start,
|
|
964
998
|
Axis: dir,
|
|
965
999
|
RefDirection: this.computeRefDirection(dir),
|
|
@@ -989,7 +1023,7 @@ export class IfcCreator {
|
|
|
989
1023
|
const dz = params.End[2] - params.Start[2];
|
|
990
1024
|
const memberLen = Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
991
1025
|
const dir = vecNorm([dx, dy, dz]);
|
|
992
|
-
const placementId = this.addLocalPlacement(this.
|
|
1026
|
+
const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
|
|
993
1027
|
Location: params.Start,
|
|
994
1028
|
Axis: dir,
|
|
995
1029
|
RefDirection: this.computeRefDirection(dir),
|
|
@@ -1014,7 +1048,7 @@ export class IfcCreator {
|
|
|
1014
1048
|
* Create a column or pile with hollow circular cross-section.
|
|
1015
1049
|
*/
|
|
1016
1050
|
addIfcHollowCircularColumn(storeyId, params) {
|
|
1017
|
-
const placementId = this.addLocalPlacement(this.
|
|
1051
|
+
const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
|
|
1018
1052
|
Location: params.Position,
|
|
1019
1053
|
});
|
|
1020
1054
|
const profileId = this.addCircleHollowProfile(params.Radius, params.WallThickness);
|
|
@@ -1042,7 +1076,7 @@ export class IfcCreator {
|
|
|
1042
1076
|
const dz = params.End[2] - params.Start[2];
|
|
1043
1077
|
const beamLen = Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
1044
1078
|
const dir = vecNorm([dx, dy, dz]);
|
|
1045
|
-
const placementId = this.addLocalPlacement(this.
|
|
1079
|
+
const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
|
|
1046
1080
|
Location: params.Start,
|
|
1047
1081
|
Axis: dir,
|
|
1048
1082
|
RefDirection: this.computeRefDirection(dir),
|
|
@@ -1841,7 +1875,7 @@ ENDSEC;
|
|
|
1841
1875
|
* ```
|
|
1842
1876
|
*/
|
|
1843
1877
|
addElement(storeyId, params) {
|
|
1844
|
-
const placementId = this.addLocalPlacement(this.
|
|
1878
|
+
const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), params.Placement);
|
|
1845
1879
|
const profileId = this.createProfile(params.Profile);
|
|
1846
1880
|
// Handle custom extrusion direction
|
|
1847
1881
|
let extrusionDirId;
|
|
@@ -1911,7 +1945,7 @@ ENDSEC;
|
|
|
1911
1945
|
perp = vecCross(dir, [1, 0, 0]);
|
|
1912
1946
|
}
|
|
1913
1947
|
perp = vecNorm(perp);
|
|
1914
|
-
const placementId = this.addLocalPlacement(this.
|
|
1948
|
+
const placementId = this.addLocalPlacement(this.getStoreyPlacement(storeyId), {
|
|
1915
1949
|
Location: params.Start,
|
|
1916
1950
|
Axis: dir, // local Z = along axis (extrusion direction)
|
|
1917
1951
|
RefDirection: perp, // local X = perpendicular to axis
|