0028661: BRepOffsetAPI_MakePipeShell throws an exception Standard_NoSuchObject: NColl...
[occt.git] / src / BRepTest / BRepTest_FilletCommands.cxx
index ec1c1c8..1f4d76f 100644 (file)
@@ -20,9 +20,6 @@
 #include <Draw_Interpretor.hxx>
 #include <Draw_Appli.hxx>
 #include <BRepFilletAPI_MakeFillet.hxx>
-#include <BRepAlgo_BooleanOperation.hxx>
-#include <BRepAlgo_Fuse.hxx>
-#include <BRepAlgo_Cut.hxx>
 #include <BiTgte_Blend.hxx>
 #include <TopOpeBRepBuild_HBuilder.hxx>
 #include <TopTools_ListIteratorOfListOfShape.hxx>
@@ -35,7 +32,6 @@
 #include <TopExp.hxx>
 #include <TopExp_Explorer.hxx>
 
-//#include <BOPTools_DSFiller.hxx>
 #include <BOPAlgo_PaveFiller.hxx>
 
 #include <BRepAlgoAPI_BooleanOperation.hxx>
@@ -46,6 +42,9 @@
 #include <FilletSurf_Builder.hxx>
 #include <ChFi3d_FilletShape.hxx>
 #include <Geom_TrimmedCurve.hxx>
+#include <Geom_Surface.hxx>
+#include <Geom_Curve.hxx>
+#include <Geom2d_Curve.hxx>
 #include <TopTools_ListOfShape.hxx>
 #include <FilletSurf_StatusType.hxx>
 #include <FilletSurf_ErrorTypeStatus.hxx>
@@ -77,15 +76,15 @@ static Standard_Integer contblend(Draw_Interpretor& di, Standard_Integer narg, c
     switch (blend_cont) {
       case GeomAbs_C0:
          //cout << ""<<endl;
-         di << "C0"<<"\n";
+         di << "C0\n";
         break;
       case GeomAbs_C1:
          //cout << "C1"<<endl;
-         di << "C1"<<"\n";
+         di << "C1\n";
         break;
       case GeomAbs_C2:
          //cout << "C2"<<endl;
-         di << "C2"<<"\n";
+         di << "C2\n";
         break;
        default:
         break;
@@ -212,12 +211,12 @@ static Standard_Integer CheckHist(Draw_Interpretor& di,
 {
   if(Rakk == 0) {
     //cout<<"No active Builder"<<endl;
-    di<<"No active Builder"<<"\n";
+    di<<"No active Builder\n";
     return 1;
   }
   if(!Rakk->IsDone()) {
     //cout<<"Active Builder Not Done"<<endl;
-    di<<"Active Builder Not Done"<<"\n";
+    di<<"Active Builder Not Done\n";
     return 1;
   }
   Standard_Integer nbc = Rakk->NbContours();
@@ -239,7 +238,7 @@ static Standard_Integer CheckHist(Draw_Interpretor& di,
     PrintHist(curshape,It,nbgen);
   }
   //cout<<"foreach g [lsort [dir gen*]] { wclick; puts [dname $g]; donl $g; }"<<endl;
-  di<<"foreach g [lsort [dir gen*]] { wclick; puts [dname $g]; donl $g; }"<<"\n";
+  di<<"foreach g [lsort [dir gen*]] { wclick; puts [dname $g]; donl $g; }\n";
   return 0;
 }
 
@@ -274,7 +273,7 @@ static Standard_Integer UPDATEVOL(Draw_Interpretor& di,
 {
   if(Rake == 0){
     //cout << "MakeFillet not initialized"<<endl;
-    di << "MakeFillet not initialized"<<"\n";
+    di << "MakeFillet not initialized\n";
     return 1 ;
   }
   if(narg%2 != 0 || narg < 4) return 1;
@@ -298,7 +297,7 @@ static Standard_Integer BUILDEVOL(Draw_Interpretor& di,
 {
   if(Rake == 0){
     //cout << "MakeFillet not initialized"<<endl;
-    di << "MakeFillet not initialized"<<"\n";
+    di << "MakeFillet not initialized\n";
     return 1 ;
   }
   Rake->Build();
@@ -315,62 +314,6 @@ static Standard_Integer BUILDEVOL(Draw_Interpretor& di,
 
 
 
-//**********************************************
-// command fuse and cut with fillets *
-//**********************************************
-
-Standard_Integer topoblend(Draw_Interpretor& di, Standard_Integer narg, const char** a)
-{
-  printtolblend(di);
-  if(narg != 5) return 1;
-  Standard_Boolean fuse  = !strcmp(a[0],"fubl");
-  TopoDS_Shape S1 = DBRep::Get(a[2]);
-  TopoDS_Shape S2 = DBRep::Get(a[3]);
-  Standard_Real Rad = Draw::Atof(a[4]);
-  BRepAlgo_BooleanOperation* BC;
-  if(fuse){
-    BC = new BRepAlgo_Fuse(S1,S2);
-  }
-  else{
-    BC = new BRepAlgo_Cut(S1,S2);
-  }
-  TopoDS_Shape ShapeCut = BC->Shape();
-  
-  Handle(TopOpeBRepBuild_HBuilder) build = BC->Builder();
-  TopTools_ListIteratorOfListOfShape its;
-  
-  TopoDS_Compound result;
-  BRep_Builder B; 
-  B.MakeCompound(result);
-  
-  TopExp_Explorer ex;
-  for (ex.Init(ShapeCut,TopAbs_SOLID); ex.More(); ex.Next()) {
-    const TopoDS_Shape& cutsol = ex.Current();  
-    
-    BRepFilletAPI_MakeFillet fill(cutsol);
-    fill.SetParams(ta,t3d,t2d,t3d,t2d,fl);
-    fill.SetContinuity(blend_cont, tapp_angle);
-    its = build->Section();
-    while (its.More()) {
-      TopoDS_Edge E = TopoDS::Edge(its.Value());
-      fill.Add(Rad,E);
-      its.Next();
-    }
-    
-    fill.Build();
-    if(fill.IsDone()){
-      B.Add(result,fill.Shape());
-    }
-    else {
-      B.Add(result,cutsol);
-    }
-  }
-  
-  delete BC;
-  DBRep::Set(a[1],result);
-  return 0;
-}
-
 //**********************************************
 // bfuse or bcut and then blend the section
 //**********************************************
@@ -378,7 +321,11 @@ Standard_Integer topoblend(Draw_Interpretor& di, Standard_Integer narg, const ch
 Standard_Integer boptopoblend(Draw_Interpretor& di, Standard_Integer narg, const char** a)
 {
   printtolblend(di);
-  if(narg != 5) return 1;
+  if(narg < 5)
+  {
+    cout << "Use <command name> result shape1 shape2 radius [-d]" << endl;
+    return 1;
+  }
 
   Standard_Boolean fuse  = !strcmp(a[0],"bfuseblend");
   TopoDS_Shape S1 = DBRep::Get(a[2]);
@@ -388,6 +335,15 @@ Standard_Integer boptopoblend(Draw_Interpretor& di, Standard_Integer narg, const
     return 1;
   }
   Standard_Real Rad = Draw::Atof(a[4]);
+  Standard_Boolean isDebug = Standard_False;
+
+  if(narg == 6)
+  {
+    if(!strcmp(a[5], "-d"))
+    {
+      isDebug = Standard_True;
+    }
+  }
 
   BOPAlgo_PaveFiller theDSFiller;
   BOPCol_ListOfShape aLS;
@@ -410,44 +366,67 @@ Standard_Integer boptopoblend(Draw_Interpretor& di, Standard_Integer narg, const
 
   Standard_Boolean anIsDone = pBuilder->IsDone();
   if (!anIsDone)
-    {
-      printf("boolean operation not done ErrorStatus()=%d\n", pBuilder->ErrorStatus());
-      return 1;
-    }
+  {
+    printf("boolean operation not done ErrorStatus()=%d\n", pBuilder->ErrorStatus());
+    return 1;
+  }
 
   TopoDS_Shape ResultOfBop = pBuilder->Shape();
   
   delete pBuilder;
+
+  const int aStrLen = 1000;
+  char aBuff[aStrLen];
+
+  if(isDebug)
+  {
+    strcpy(aBuff, a[1]);
+    DBRep::Set( strcat(aBuff, "_bop"), ResultOfBop );
+
+    di << "Intermediate result of BOP-operation is saved to \"" << aBuff << "\" variable\n";
+  }
+
   pBuilder = new BRepAlgoAPI_Section( S1, S2, theDSFiller );
   TopoDS_Shape theSection = pBuilder->Shape();
 
+  if(isDebug)
+  {
+    strcpy(aBuff, a[1]);
+    DBRep::Set( strcat(aBuff, "_sec"), theSection );
+     di << "Intermediate bopsection result is saved to \"" << aBuff << "\" variable\n";
+  }
+
   TopoDS_Compound result;
   BRep_Builder BB; 
   BB.MakeCompound(result);
   
   TopExp_Explorer Explo( ResultOfBop, TopAbs_SOLID );
   for (; Explo.More(); Explo.Next())
+  {
+    const TopoDS_Shape& aSolid = Explo.Current();
+
+    BRepFilletAPI_MakeFillet Blender(aSolid);
+    Blender.SetParams(ta,t3d,t2d,t3d,t2d,fl);
+    Blender.SetContinuity( blend_cont, tapp_angle );
+
+    TopExp_Explorer expsec( theSection, TopAbs_EDGE );
+    for (; expsec.More(); expsec.Next())
     {
-      const TopoDS_Shape& aSolid = Explo.Current();
-
-      BRepFilletAPI_MakeFillet Blender(aSolid);
-      Blender.SetParams(ta,t3d,t2d,t3d,t2d,fl);
-      Blender.SetContinuity( blend_cont, tapp_angle );
-
-      TopExp_Explorer expsec( theSection, TopAbs_EDGE );
-      for (; expsec.More(); expsec.Next())
-       {
-         TopoDS_Edge anEdge = TopoDS::Edge(expsec.Current());
-         Blender.Add( Rad, anEdge );
-       }
-
-      Blender.Build();
-      if (Blender.IsDone())
-       BB.Add( result, Blender.Shape() );
-      else
-       BB.Add( result, aSolid );
+      TopoDS_Edge anEdge = TopoDS::Edge(expsec.Current());
+      Blender.Add( Rad, anEdge );
     }
 
+    Blender.Build();
+    if (Blender.IsDone())
+      BB.Add( result, Blender.Shape() );
+    else
+    {
+      di << "Error: Cannot find the result of BLEND-operation."
+        " The result of BOP operation will be returned.\n";
+      BB.Add( result, aSolid );
+    }
+  }
+
   delete pBuilder;
   DBRep::Set( a[1], result );
   return 0;
@@ -489,16 +468,16 @@ static Standard_Integer blend1(Draw_Interpretor& di, Standard_Integer narg, cons
   //  if (Rakk.IsDone()==FilletSurf_IsPartial) cout <<"resultat partiel"<<endl; 
   if (aRakk.IsDone()==FilletSurf_IsNotOk)
    { FilletSurf_ErrorTypeStatus err=aRakk.StatusError();
-     if (err==FilletSurf_EmptyList) di<< "StatusError=EmptyList"<<"\n";
-     else if (err==FilletSurf_EdgeNotG1) di<< "StatusError=NotG1"<<"\n";
-     else if (err==FilletSurf_FacesNotG1) di<< "StatusError=facesNotG1"<<"\n";
+     if (err==FilletSurf_EmptyList) di<< "StatusError=EmptyList\n";
+     else if (err==FilletSurf_EdgeNotG1) di<< "StatusError=NotG1\n";
+     else if (err==FilletSurf_FacesNotG1) di<< "StatusError=facesNotG1\n";
      else if (err==FilletSurf_EdgeNotOnShape)
-     di<< "StatusError=edgenotonshape"<<"\n";
-     else if (err==FilletSurf_NotSharpEdge ) di<< "StatusError=notsharpedge"<<"\n";
-     else if (err==FilletSurf_PbFilletCompute) di <<"StatusError=PBFillet"<<"\n";
+     di<< "StatusError=edgenotonshape\n";
+     else if (err==FilletSurf_NotSharpEdge ) di<< "StatusError=notsharpedge\n";
+     else if (err==FilletSurf_PbFilletCompute) di <<"StatusError=PBFillet\n";
    }
    else {
-    if (aRakk.IsDone()==FilletSurf_IsPartial) di <<"partial result"<<"\n";
+    if (aRakk.IsDone()==FilletSurf_IsPartial) di <<"partial result\n";
  
     nb=aRakk.NbSurface();
     char localname [100];
@@ -515,11 +494,11 @@ static Standard_Integer blend1(Draw_Interpretor& di, Standard_Integer narg, cons
     //else if (Rakk.StartSectionStatus()==FilletSurf_TwoExtremityOnEdge)
     //  {cout<<" type deb conges = WLBLEND"<<endl;}
     if (aRakk.StartSectionStatus()==FilletSurf_NoExtremityOnEdge)
-      {di<<" type start fillets = WLBLOUT"<<"\n";}
+      {di<<" type start fillets = WLBLOUT\n";}
     else if (aRakk.StartSectionStatus()==FilletSurf_OneExtremityOnEdge)
-      { di<<" type start fillets = WLBLSTOP"<<"\n";}
+      { di<<" type start fillets = WLBLSTOP\n";}
     else if (aRakk.StartSectionStatus()==FilletSurf_TwoExtremityOnEdge)
-      {di<<" type start fillets = WLBLEND"<<"\n";}
+      {di<<" type start fillets = WLBLEND\n";}
     
     //if (Rakk.EndSectionStatus()==FilletSurf_NoExtremityOnEdge) 
     //  {cout<<" type fin  conges = WLBLOUT"<<endl;}
@@ -528,11 +507,11 @@ static Standard_Integer blend1(Draw_Interpretor& di, Standard_Integer narg, cons
     //else if (Rakk.EndSectionStatus()==FilletSurf_TwoExtremityOnEdge) 
     //  { cout<<" type fin  conges = WLBLEND"<<endl;}
     if (aRakk.EndSectionStatus()==FilletSurf_NoExtremityOnEdge)
-      {di<<" type end fillets = WLBLOUT"<<"\n";}
+      {di<<" type end fillets = WLBLOUT\n";}
     else if (aRakk.EndSectionStatus()==FilletSurf_OneExtremityOnEdge)
-      {di<<" type end fillets = WLBLSTOP"<<"\n";}
+      {di<<" type end fillets = WLBLSTOP\n";}
     else if (aRakk.EndSectionStatus()==FilletSurf_TwoExtremityOnEdge)
-      { di<<" type end fillets = WLBLEND"<<"\n";}
+      { di<<" type end fillets = WLBLEND\n";}
     Standard_Real f,l;
     f = aRakk.FirstParameter();
     l = aRakk.LastParameter();
@@ -598,7 +577,7 @@ static Standard_Integer blend1(Draw_Interpretor& di, Standard_Integer narg, cons
    for (i=1;i<=nb;i++)
     {Standard_Integer s=aRakk.NbSection(i);
     for (j=1;j<=s;j++)
-     {Handle(Geom_TrimmedCurve Sec);
+     {Handle(Geom_TrimmedCurve) Sec;
      aRakk.Section(i,j,Sec);
     Sprintf(localname, "%s%d%d" ,"sec",i,j);
      temp =localname;
@@ -640,7 +619,7 @@ Standard_Integer rollingball(Draw_Interpretor& di, Standard_Integer n, const cha
 //      TopoDS_Face F1 = TopoDS::Face(DBRep::Get(a[i],TopAbs_FACE));
       if ( F1.IsNull()) {
        //cout << " Stop face not referenced." << endl;
-       di << " Stop face not referenced." << "\n";
+       di << " Stop face not referenced.\n";
        return 1;
       }
       Roll.SetStoppingFace(F1);
@@ -652,7 +631,7 @@ Standard_Integer rollingball(Draw_Interpretor& di, Standard_Integer n, const cha
       i++;
       if ( !strcmp(a[i],"@")) {
        //cout << " Even number of ball support faces is required " << endl;
-       di << " Even number of ball support faces is required " << "\n";
+       di << " Even number of ball support faces is required \n";
        return 1;
       }
       aLocalFace = DBRep::Get(a[i],TopAbs_FACE);
@@ -660,7 +639,7 @@ Standard_Integer rollingball(Draw_Interpretor& di, Standard_Integer n, const cha
 //      TopoDS_Face F2 = TopoDS::Face(DBRep::Get(a[i],TopAbs_FACE));
       if ( F1.IsNull() || F2.IsNull()) {
        //cout << " Support face not referenced." << endl;
-       di << " Support face not referenced." << "\n";
+       di << " Support face not referenced.\n";
        return 1;
       }
       Roll.SetFaces(F1,F2);
@@ -671,7 +650,7 @@ Standard_Integer rollingball(Draw_Interpretor& di, Standard_Integer n, const cha
 //      TopoDS_Edge E = TopoDS::Edge(DBRep::Get(a[i],TopAbs_EDGE));
       if ( E.IsNull()) {
        //cout << " Edge not referenced." << endl;
-       di << " Edge not referenced." << "\n";
+       di << " Edge not referenced.\n";
        return 1;
       }
       Roll.SetEdge(E);
@@ -750,20 +729,12 @@ void  BRepTest::FilletCommands(Draw_Interpretor& theCommands)
                  "buildevol end of the evol fillet computation",__FILE__,
                  BUILDEVOL,g);
 
-  theCommands.Add("fubl",
-                 "fubl result shape1 shape2 radius",__FILE__,
-                 topoblend,g);
-  
-  theCommands.Add("cubl",
-                 "cubl result shape tool radius",__FILE__,
-                 topoblend,g);
-
   theCommands.Add("bfuseblend",
-                 "bfuseblend result shape1 shape2 radius",__FILE__,
+                 "bfuseblend result shape1 shape2 radius [-d]",__FILE__,
                  boptopoblend,g);
   
   theCommands.Add("bcutblend",
-                 "bcutblend result shape tool radius",__FILE__,
+                 "bcutblend result shape1 tool radius [-d]",__FILE__,
                  boptopoblend,g);
 
   theCommands.Add("blend1",