+ // Get the profile middle point ( 3D )
+ gp_Pnt aMiddlePoint( theProfile->GetMiddlePoint( true ) );
+
+ // Translate the profile to each point on the guide line ( 3D )
+ Handle(TColgp_HArray1OfPnt) anArrayOfFPnt = new TColgp_HArray1OfPnt(1, aNbPoints );
+ Handle(TColgp_HArray1OfPnt) anArrayOfLPnt = new TColgp_HArray1OfPnt(1, aNbPoints );
+ Handle(TopTools_HArray1OfShape) anArrOfProfiles = new TopTools_HArray1OfShape( 1, aNbPoints );
+
+ for ( int i = 1; i <= aNbPoints; ++i ) {
+ // Get point on the guide line
+ gp_Pnt aPointOnGuide( aPolylinePoints3D.Value( i ) );
+
+ // Define translation and rotation:
+ gp_Trsf Translation, Rotation;
+
+ // Translation
+ Translation.SetTranslation( aMiddlePoint, aPointOnGuide );
+ TopoDS_Wire aTransformedProfile =
+ TopoDS::Wire( BRepBuilderAPI_Transform( aProfileWire, Translation, Standard_True ) );
+
+ // Rotation
+ gp_Vec aVertical( 0., 0., 1. );
+ TopoDS_Vertex aLeftVertex, aRightVertex;
+ TopExp::Vertices( aTransformedProfile, aLeftVertex, aRightVertex );
+ gp_Pnt aLeftPoint = BRep_Tool::Pnt( aLeftVertex );
+ gp_Pnt aRightPoint = BRep_Tool::Pnt( aRightVertex );
+ gp_Vec aLeftToRight( aLeftPoint, aRightPoint);
+ gp_Vec NormalToProfile = aVertical ^ aLeftToRight;
+
+ gp_Vec aDir = aTangents.Value( i );
+ gp_Vec AxisOfRotation = NormalToProfile ^ aDir;
+ if (AxisOfRotation.Magnitude() <= gp::Resolution()) {
+ if ( aVertical * aLeftToRight < 0. ) {
+ gp_Ax1 theVertical(aPointOnGuide, gp::DZ() );
+ Rotation.SetRotation(theVertical, M_PI);
+ }
+ } else {
+ gp_Ax1 theAxis(aPointOnGuide, AxisOfRotation);
+ Standard_Real theAngle = NormalToProfile.AngleWithRef(aDir, AxisOfRotation);
+ Rotation.SetRotation(theAxis, theAngle);
+ }
+
+ aTransformedProfile = TopoDS::Wire(BRepBuilderAPI_Transform( aTransformedProfile, Rotation, Standard_True) );
+
+ // Get the first and the last points of the transformed profile
+ TopoDS_Vertex V1, V2;
+ TopExp::Vertices( aTransformedProfile, V1, V2 );
+
+ // Fill the data
+ anArrayOfFPnt->SetValue( i, BRep_Tool::Pnt( V1 ) );
+ anArrayOfLPnt->SetValue( i, BRep_Tool::Pnt( V2 ) );
+
+ anArrOfProfiles->SetValue( i, aTransformedProfile );
+ }