0028880: Modeling Algorithms - add missing BRepFeat_SplitShape::Right() getter
authorantonavt <antonavtamonov37@gmail.com>
Mon, 2 Mar 2020 09:16:14 +0000 (12:16 +0300)
committerbugmaster <bugmaster@opencascade.com>
Tue, 24 Mar 2020 16:55:05 +0000 (19:55 +0300)
- Added Right() method to BRepFeat_SplitShape;
- Added an option in command buc60854, which allows to select Left() or Right() method;
- Modified method BUC60854 in QABugs_14.cxx;
- Added new option to the help of command buc60854;
- Modified test case buc60854. Now its state is "OK";
- Added check Right() in buc60854 test case.

src/BRepFeat/BRepFeat_SplitShape.cxx
src/BRepFeat/BRepFeat_SplitShape.hxx
src/QABugs/QABugs_14.cxx
tests/bugs/moddata_1/buc60854

index 6d0e7b4..2a559c0 100644 (file)
@@ -27,6 +27,7 @@
 #include <TopoDS_Shape.hxx>
 #include <TopoDS_Wire.hxx>
 #include <TopTools_ListIteratorOfListOfShape.hxx>
+#include <TopExp_Explorer.hxx>
 
 //=======================================================================
 //function : Build
@@ -38,6 +39,7 @@ void BRepFeat_SplitShape::Build ()
   if (mySShape.IsDone()) {
     Done();
     myShape = mySShape.ResultingShape();
+    myRight.Clear();
   }
 }
 
@@ -64,6 +66,33 @@ const TopTools_ListOfShape& BRepFeat_SplitShape::Left() const
   return mySShape.Left();
 }
 
+
+//=======================================================================
+//function : Right
+//purpose  : 
+//=======================================================================
+
+const TopTools_ListOfShape& BRepFeat_SplitShape::Right() const
+{
+  if (myRight.IsEmpty())
+  {
+    TopTools_MapOfShape aMapOfLeft;
+    TopTools_ListIteratorOfListOfShape anIterator;
+    for (anIterator.Initialize(mySShape.Left()); anIterator.More(); anIterator.Next())
+    {
+      aMapOfLeft.Add(anIterator.Value());
+    }
+    TopExp_Explorer anExplorer;
+    for (anExplorer.Init(myShape, TopAbs_FACE); anExplorer.More(); anExplorer.Next())
+    {
+      const TopoDS_Shape& aFace = anExplorer.Current();
+      if (!aMapOfLeft.Contains(aFace))
+        myRight.Append(aFace);
+    }
+  }
+  return myRight;
+}
+
 //=======================================================================
 //function : isDeleted
 //purpose  : 
index 17941df..dad7cd0 100644 (file)
@@ -105,6 +105,9 @@ public:
   //! Raises NotDone if IsDone returns <Standard_False>.
   Standard_EXPORT const TopTools_ListOfShape& Left() const;
   
+  //! Returns the faces of the "right" part on the shape.
+  Standard_EXPORT const TopTools_ListOfShape& Right() const;
+  
   //! Builds the cut and the resulting faces and edges as well.
   Standard_EXPORT void Build() Standard_OVERRIDE;
   
@@ -130,6 +133,8 @@ private:
   LocOpe_Spliter mySShape;
   Handle(LocOpe_WiresOnShape) myWOnShape;
 
+  mutable TopTools_ListOfShape myRight;
+
 
 };
 
index 796f048..c49cb76 100644 (file)
@@ -239,7 +239,8 @@ static Standard_Integer BUC60854 (Draw_Interpretor& /*di*/, Standard_Integer arg
     else
       return 1;
   }
-  for (i++; i<argc; i+=2) {
+  i++;
+  while (argv[i][0] != '#') {
     TopoDS_Shape Ew,Es;
     TopoDS_Shape aLocalShape(DBRep::Get(argv[i],TopAbs_EDGE));
     Es = TopoDS::Edge(aLocalShape);
@@ -252,13 +253,24 @@ static Standard_Integer BUC60854 (Draw_Interpretor& /*di*/, Standard_Integer arg
       return 1;
     }
     Spls.Add(TopoDS::Edge(Ew),TopoDS::Edge(Es));
+    i += 2;
   }
   Spls.Build();
   const TopTools_ListOfShape& aLeftPart = Spls.Left();
+  const TopTools_ListOfShape& aRightPart = Spls.Right();
   BRep_Builder BB;
   TopoDS_Shape aShell;
   BB.MakeShell(TopoDS::Shell(aShell));
-  TopTools_ListIteratorOfListOfShape anIter(aLeftPart);
+  TopTools_ListIteratorOfListOfShape anIter;
+  if (argv[argc - 1][0] == 'L') {
+    anIter.Initialize(aLeftPart);
+  } 
+  else if (argv[argc - 1][0] == 'R') {
+    anIter.Initialize(aRightPart);
+  }
+  else {
+    return 1;
+  }
   for(; anIter.More(); anIter.Next()) BB.Add(aShell, anIter.Value());
   aShell.Closed (BRep_Tool::IsClosed (aShell));
   DBRep::Set(argv[1],aShell);
@@ -1044,7 +1056,7 @@ void QABugs::Commands_14(Draw_Interpretor& theCommands) {
   theCommands.Add ("BUC60897", "BUC60897", __FILE__, BUC60897, group);
   theCommands.Add ("BUC60889", "BUC60889 point_1 point_2 name_of_edge bndbox_X1 bndbox_Y1 bndbox_Z1 bndbox_X2 bndbox_Y2 bndbox_Z2", __FILE__, BUC60889, group);
   theCommands.Add ("BUC60852", "BUC60852 name_of_edge bndbox_X1 bndbox_Y1 bndbox_Z1 bndbox_X2 bndbox_Y2 bndbox_Z2", __FILE__, BUC60852, group);
-  theCommands.Add ("BUC60854", "BUC60854 result_shape name_of_shape name_of_face name_of_wire/name_of_edge [ name_of_wire/name_of_edge ... ] [ name_of_face name_of_wire/name_of_edge [ name_of_wire/name_of_edge ... ] ... ] [ @ edge_on_shape edge_on_wire [ edge_on_shape edge_on_wire ... ] ] ", __FILE__, BUC60854, group);
+  theCommands.Add ("BUC60854", "BUC60854 result_shape name_of_shape name_of_face name_of_wire/name_of_edge [ name_of_wire/name_of_edge ... ] [ name_of_face name_of_wire/name_of_edge [ name_of_wire/name_of_edge ... ] ... ] [ @ edge_on_shape edge_on_wire [ edge_on_shape edge_on_wire ... ] ] [ # L/R ]", __FILE__, BUC60854, group);
   theCommands.Add ("BUC60870", "BUC60870 result name_of_shape_1 name_of_shape_2 dev", __FILE__, BUC60870, group);
   theCommands.Add ("BUC60902", "BUC60902", __FILE__, BUC60902, group);
   theCommands.Add ("BUC60944", "BUC60944 path", __FILE__, BUC60944, group);
index 375cecd..fd434ab 100755 (executable)
@@ -1,5 +1,3 @@
-puts "TODO OCC12345 ALL: BUC60854: Error"
-
 puts "========"
 puts "BUC60854"
 puts "========"
@@ -21,17 +19,15 @@ renamevar test_shape_1 test_face
 
 vertex test_vertex_3 0.2 0.5 0
 vertex test_vertex_4 0.8 0.5 0
-edge test_edge_1 test_vertex_3 test_vertex_4
+edge test_edge_1 test_vertex_4 test_vertex_3
 
 vertex test_vertex_5 0 1 0
-edge test_edge_2 test_vertex_5 test_vertex_3
+edge test_edge_2 test_vertex_3 test_vertex_5
 
 vertex test_vertex_6 1 1 0
-edge test_edge_3 test_vertex_4 test_vertex_6
-
-BUC60854 result test_shape test_face test_edge_2 test_edge_3 @ test_edge test_edge_1
+edge test_edge_3 test_vertex_6 test_vertex_4
 
-erase test_plane
+BUC60854 result test_shape test_face test_edge_2 test_edge_3 @ test_edge test_edge_1 # L
 
 regexp {FACE +: +([-0-9.+eE]+)} [numshapes result] full FACE_num
 
@@ -39,5 +35,15 @@ if {${FACE_num} != 3} {
   puts "BUC60854: Error"
 }
 
-checkview -display result -2d -path ${imagedir}/${test_image}.png
+BUC60854 result_2 test_shape test_face test_edge_2 test_edge_3 @ test_edge test_edge_1 # R
+
+regexp {FACE +: +([-0-9.+eE]+)} [numshapes result_2] full FACE_num
+
+if {${FACE_num} != 1} {
+  puts "BUC60854: Error"
+}
+
+erase test_plane
+
+checkview -display result -2d -with ${result_2} -path ${imagedir}/${test_image}.png