@@ -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