Skip to content

Commit ae0e1f9

Browse files
committed
Read 3D alignment curves
1 parent aaa5e06 commit ae0e1f9

File tree

1 file changed

+104
-27
lines changed

1 file changed

+104
-27
lines changed

src/web-ifc-api.ts

Lines changed: 104 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -802,41 +802,118 @@ export class IfcAPI {
802802
* @param modelID model ID
803803
* @returns Lists with horizontal and vertical curves as sets of points
804804
*/
805-
GetAllAlignments(modelID: Number): any
806-
{
807-
const alignments = this.wasmModule.GetAllAlignments(modelID);
805+
GetAllAlignments(modelID: Number): any {
806+
const alignments = this.wasmModule.GetAllAlignments(modelID);
808807
const alignmentList = [];
809808
for (let i = 0; i < alignments.size(); i++) {
810-
const alignment = alignments.get(i);
811-
const horList = [];
809+
const alignment = alignments.get(i);
810+
const horList = [];
811+
for (let j = 0; j < alignment.Horizontal.curves.size(); j++) {
812+
const curve = alignment.Horizontal.curves.get(j);
813+
const ptList = [];
814+
for (let p = 0; p < curve.points.size(); p++) {
815+
const pt = curve.points.get(p);
816+
const newPoint = { x: pt.x, y: pt.y };
817+
ptList.push(newPoint);
818+
}
819+
const newCurve = { points: ptList };
820+
horList.push(newCurve);
821+
}
822+
const verList = [];
823+
for (let j = 0; j < alignment.Vertical.curves.size(); j++) {
824+
const curve = alignment.Vertical.curves.get(j);
825+
const ptList = [];
826+
for (let p = 0; p < curve.points.size(); p++) {
827+
const pt = curve.points.get(p);
828+
const newPoint = { x: pt.x, y: pt.y };
829+
ptList.push(newPoint);
830+
}
831+
const newCurve = { points: ptList };
832+
verList.push(newCurve);
833+
}
834+
835+
const curve3DList = [];
836+
if (
837+
alignment.Horizontal.curves.size() > 0 &&
838+
alignment.Vertical.curves.size() > 0
839+
) {
840+
const startH = { x: 0, y: 0, z: 0 };
841+
const startV = { x: 0, y: 0, z: 0 };
842+
843+
// Construct 3D polyline from horizontal and vertical polylines
844+
845+
let lastx = 0;
846+
let lasty = 0;
847+
let length = 0;
812848
for (let j = 0; j < alignment.Horizontal.curves.size(); j++) {
813-
const curve = alignment.Horizontal.curves.get(j);
814-
const ptList = [];
815-
for (let p = 0; p < curve.points.size(); p++) {
816-
const pt = curve.points.get(p);
817-
const newPoint = { x: pt.x, y: pt.y };
818-
ptList.push(newPoint);
849+
const curve = alignment.Horizontal.curves.get(j);
850+
const points = [];
851+
for (let k = 0; k < curve.points.size(); k++) {
852+
let alt = 0;
853+
const pt = curve.points.get(k);
854+
if (j === 0 && k === 0) {
855+
lastx = pt.x;
856+
lasty = pt.y;
819857
}
820-
const newCurve = { points: ptList };
821-
horList.push(newCurve);
822-
}
823-
const verList = [];
824-
for (let j = 0; j < alignment.Vertical.curves.size(); j++) {
825-
const curve = alignment.Vertical.curves.get(j);
826-
const ptList = [];
827-
for (let p = 0; p < curve.points.size(); p++) {
828-
const pt = curve.points.get(p);
829-
const newPoint = { x: pt.x, y: pt.y };
830-
ptList.push(newPoint);
858+
const valueX = pt.x - lastx;
859+
const valueY = pt.y - lasty;
860+
lastx = pt.x;
861+
lasty = pt.y;
862+
length += Math.sqrt(valueX * valueX + valueY * valueY);
863+
let first = true;
864+
let lastAlt = 0;
865+
let lastX = 0;
866+
let done = false;
867+
for (let ii = 0; ii < alignment.Vertical.curves.size(); ii++) {
868+
const curve = alignment.Vertical.curves.get(ii);
869+
for (let jj = 0; jj < curve.points.size(); jj++) {
870+
const pt = curve.points.get(jj);
871+
if (first) {
872+
first = false;
873+
alt = pt.y;
874+
lastAlt = pt.y;
875+
if (pt.x >= length) {
876+
break;
877+
}
878+
}
879+
if (pt.x >= length) {
880+
const value1 = pt.x - lastX;
881+
const value2 = length - lastX;
882+
const value3 = value2 / value1;
883+
alt = lastAlt * (1 - value3) + pt.y * value3;
884+
done = true;
885+
break;
886+
}
887+
lastAlt = pt.y;
888+
lastX = pt.x;
889+
}
890+
if (done) {
891+
break;
892+
}
831893
}
832-
const newCurve = { points: ptList };
833-
verList.push(newCurve);
894+
points.push({
895+
x: pt.x - startH.x,
896+
y: alt - startV.y,
897+
z: startH.y - pt.y,
898+
});
899+
}
900+
const newCurve = { points: points };
901+
curve3DList.push(newCurve);
834902
}
835-
const align = { origin, horizontal: horList, vertical: verList };
836-
alignmentList.push(align);
903+
}
904+
905+
const align = {
906+
origin,
907+
horizontal: horList,
908+
vertical: verList,
909+
curve3D: curve3DList,
910+
};
911+
alignmentList.push(align);
912+
913+
/////
837914
}
838915
return alignmentList;
839-
}
916+
}
840917

841918
/**
842919
* Set the transformation matrix

0 commit comments

Comments
 (0)