Salome HOME
refs #430: incorrect coordinates in dump polyline
[modules/hydro.git] / src / HYDROData / HYDROData_Pipes.cxx
index 141dd5bd0f0652e3faa1e95c0c58a3ddac181fcd..2427ba03eb3d4ae915ba2f96dca9dfd72d24547e 100644 (file)
@@ -960,7 +960,7 @@ static void addEdgeRelation(TopTools_DataMapOfShapeShape& theMap,
 
 HYDROData_Canal3dAnd2d::HYDROData_Canal3dAnd2d(const TopoDS_Wire& Profile,
                            const TopoDS_Wire& Guideline)
-  : myProfile(Profile), myOriginalGuideline(Guideline)
+  : myProfile(Profile), myOriginalGuideline(Guideline), myStatus(0)
 {
   TopExp::Vertices(myProfile, myLeftVertex, myRightVertex);
   gp_Pnt LeftPoint  = BRep_Tool::Pnt(myLeftVertex);
@@ -974,10 +974,15 @@ HYDROData_Canal3dAnd2d::HYDROData_Canal3dAnd2d(const TopoDS_Wire& Profile,
   else
     myGuideline = myOriginalGuideline;
 
-  ProjectWireOntoXOY(myGuideline, myProjectedGuideline);
-  Make2dProfile();
-  SetMiddlePoint2d();
-  SetMiddlePoint3d();
+  if (myStatus == 0)
+  {
+    if (ProjectWireOntoXOY(myGuideline, myProjectedGuideline))
+    {
+      Make2dProfile();
+      SetMiddlePoint2d();
+      SetMiddlePoint3d();
+    }
+  }
 }
 
 void HYDROData_Canal3dAnd2d::MakeSharpVertexList()
@@ -1042,10 +1047,14 @@ Standard_Boolean HYDROData_Canal3dAnd2d::MakeFillet()
     TopoDS_Wire LocalWire = BRepLib_MakeWire(anEdge1, anEdge2);
     //if ( !takePlane(anEdge1, anEdge2, aV, aPlane) )
     if (!PlaneOfWire(LocalWire, aPlane))
+    {
+      myStatus = 1;
       return Standard_False; // seems edges does not belong to same plane or parallel (fillet can not be build)
+    }
 
     GEOMImpl_Fillet1d aFilletAlgo (anEdge1, anEdge2, aPlane);
     if (!aFilletAlgo.Perform(myFilletRadius)) {
+      myStatus = 2;
       return Standard_False; //can not create fillet at this vertex with given radius
     }
 
@@ -1053,6 +1062,7 @@ Standard_Boolean HYDROData_Canal3dAnd2d::MakeFillet()
     TopoDS_Edge aModifE1, aModifE2;
     TopoDS_Edge aNewE = aFilletAlgo.Result(BRep_Tool::Pnt(aV), aModifE1, aModifE2);
     if (aNewE.IsNull()) {
+      myStatus = 3;
       return Standard_False; //fillet failed at this vertex
     }
 
@@ -1068,6 +1078,7 @@ Standard_Boolean HYDROData_Canal3dAnd2d::MakeFillet()
   }
 
   if (anEdgeToEdgeMap.IsEmpty() && aListOfNewEdge.IsEmpty()) {
+    myStatus = 4;
     return Standard_False; //fillet can't be computed on the given shape with the given radius
   }
 
@@ -1108,7 +1119,10 @@ Standard_Boolean HYDROData_Canal3dAnd2d::ProjectWireOntoXOY(const TopoDS_Wire& a
   OrtProj.BuildWire(Wires);
 
   if (Wires.Extent() != 1)
+  {
+    myStatus = 5;
     return Standard_False;
+  }
   
   ProjectedWire = TopoDS::Wire(Wires.First());
   return Standard_True;
@@ -1220,10 +1234,16 @@ Standard_Boolean HYDROData_Canal3dAnd2d::Create3dPresentation()
   mySweep3d = new BRepOffsetAPI_MakePipeShell(myGuideline);
   mySweep3d->SetMode(gp::DZ()); //optional
   mySweep3d->Add(myTransformedProfile3d);
-  //mySweep3d->SetTransitionMode(BRepBuilderAPI_RightCorner); //optional
+  //Set approx parameters
+  mySweep3d->SetMaxDegree(14);
+  mySweep3d->SetMaxSegments(500);
+  ///////////////////////
   mySweep3d->Build();
   if (!mySweep3d->IsDone())
+  {
+    myStatus = 6;
     return Standard_False;
+  }
 
   myPipe3d = mySweep3d->Shape();
   return Standard_True;
@@ -1236,10 +1256,16 @@ Standard_Boolean HYDROData_Canal3dAnd2d::Create2dPresentation()
   mySweep2d = new BRepOffsetAPI_MakePipeShell(myProjectedGuideline);
   mySweep2d->SetMode(gp::DZ()); //optional
   mySweep2d->Add(myTransformedProfile2d);
-  //mySweep2d->SetTransitionMode(BRepBuilderAPI_RightCorner); //optional
+  //Set approx parameters
+  mySweep2d->SetMaxDegree(14);
+  mySweep2d->SetMaxSegments(500);
+  ///////////////////////
   mySweep2d->Build();
   if (!mySweep2d->IsDone())
+  {
+    myStatus = 7;
     return Standard_False;
+  }
 
   myPipe2d = mySweep2d->Shape();
   myUnifier.Initialize(myPipe2d);
@@ -1323,6 +1349,12 @@ TopoDS_Wire HYDROData_Canal3dAnd2d::GetRightBank()
   return GetBank(myRightVertex2d);
 }
 
+Standard_Integer HYDROData_Canal3dAnd2d::GetStatus()
+{
+  return myStatus;
+}
+
+
 /*TopoDS_Wire HYDROData_Canal3dAnd2d::GetRoundedGuideline()
 {
   return myGuideline;