0024869: OCAF testing framework extending
authorszy <szy@opencascade.com>
Thu, 8 May 2014 07:35:35 +0000 (11:35 +0400)
committerbugmaster <bugmaster@opencascade.com>
Thu, 8 May 2014 07:36:43 +0000 (11:36 +0400)
OCAF testing framework extending.
Test case for issue CR24869

src/DNaming/DNaming_BooleanOperationDriver.cdl
src/DNaming/DNaming_BooleanOperationDriver.cxx
src/DNaming/DNaming_ModelingCommands.cxx
src/DNaming/ModelDefinitions.hxx
tests/bugs/caf/bug24869 [new file with mode: 0644]

index cee6439..b8347c5 100644 (file)
@@ -57,6 +57,9 @@ is
     LoadNamingDS(me; theResultLabel : Label from TDF; MS : in out BooleanOperation from BRepAlgoAPI)  
     is private; 
 
+    LoadSectionNDS(me; theResultLabel : Label from TDF; MS : in out BooleanOperation from BRepAlgoAPI)  
+    is private; 
+
     CheckAndLoad(me; theMkOpe : in out BooleanOperation from BRepAlgoAPI; 
                     theFunction : Function from TFunction)   
     returns Boolean from Standard is private; 
index 9ed3fbf..dfc93c3 100644 (file)
@@ -35,6 +35,7 @@
 #include <BRepAlgoAPI_Fuse.hxx>
 #include <BRepAlgoAPI_Cut.hxx>
 #include <BRepAlgoAPI_Common.hxx>
+#include <BRepAlgoAPI_Section.hxx>
 #include <TopoDS_Iterator.hxx>
 #include <TopTools_MapOfShape.hxx>
 #include <TopExp_Explorer.hxx>
@@ -148,6 +149,11 @@ Standard_Integer DNaming_BooleanOperationDriver::Execute(TFunction_Logbook& theL
     BRepAlgoAPI_Common aMkCom (anOBJECT, aTOOL);    
     anIsDone = CheckAndLoad(aMkCom, aFunction);
   }
+    // case SECTION
+  else if(aFunction->GetDriverGUID() == SECTION_GUID){
+    BRepAlgoAPI_Section aMkSect (anOBJECT, aTOOL);    
+    anIsDone = CheckAndLoad(aMkSect, aFunction);
+  }
   else {
     aFunction->SetFailure(UNSUPPORTED_FUNCTION);
     return -1;
@@ -320,6 +326,39 @@ void DNaming_BooleanOperationDriver::LoadNamingDS (const TDF_Label& theResultLab
 }
 
 //=======================================================================
+//function : LoadNamingDS
+//purpose  : 
+//=======================================================================
+void DNaming_BooleanOperationDriver::LoadSectionNDS (const TDF_Label& theResultLabel, 
+                                          BRepAlgoAPI_BooleanOperation& MS) const
+{
+
+  const TopoDS_Shape& ResSh = MS.Shape();
+  const TopoDS_Shape& ObjSh = MS.Shape1();
+  const TopoDS_Shape& ToolSh = MS.Shape2();
+ if (ResSh.IsNull()) {
+#ifdef DEB
+   cout<<"LoadSectionNamingDS: The result of the boolean operation is null"<<endl;
+#endif
+    return;
+  }
+
+  // LoadResult
+  DNaming::LoadResult(theResultLabel, MS);
+
+  TopTools_DataMapOfShapeShape SubShapes;
+  TopExp_Explorer Exp(ResSh, TopAbs_EDGE);
+  for (; Exp.More(); Exp.Next()) {
+    SubShapes.Bind(Exp.Current(),Exp.Current());
+  }
+
+ // Naming of modified faces: 
+  TNaming_Builder genEdB (theResultLabel.NewChild()); //FindChild(1,Standard_True)); 
+  DNaming::LoadAndOrientGeneratedShapes (MS, ObjSh,  TopAbs_FACE, genEdB,SubShapes);  
+  DNaming::LoadAndOrientGeneratedShapes (MS, ToolSh, TopAbs_FACE, genEdB, SubShapes);
+
+}
+//=======================================================================
 //function : CheckAndLoad
 //purpose  : checks result of operation and performs Topological Naming
 //=======================================================================
@@ -351,8 +390,10 @@ Standard_Boolean DNaming_BooleanOperationDriver::CheckAndLoad
       else if(theFunction->GetDriverGUID() == CUT_GUID) {
        LoadNamingDS(RESPOSITION(theFunction), theMkOpe); // the same naming only for case of solids
       } else if(theFunction->GetDriverGUID() == COMMON_GUID) {
-       LoadNamingDS(RESPOSITION(theFunction), theMkOpe); 
-      }
+           LoadNamingDS(RESPOSITION(theFunction), theMkOpe); 
+      } else if(theFunction->GetDriverGUID() == SECTION_GUID) {
+           LoadSectionNDS(RESPOSITION(theFunction), theMkOpe); 
+         }
       
       theFunction->SetFailure(DONE);
       return Standard_True;
index 57c21f0..5d8c9c0 100644 (file)
@@ -124,25 +124,26 @@ static Standard_Boolean GetFuncGUID(Standard_CString aKey,Standard_GUID& GUID)
   Standard_Boolean aRes(Standard_False);
   
   if(!isBuilt) {
-    aDMap.Bind("PntXYZ", PNTXYZ_GUID);
-    aDMap.Bind("PntRLT", PNTRLT_GUID);
-    aDMap.Bind("Line3D", LINE3D_GUID);
-    aDMap.Bind("Box",   BOX_GUID);//+
-    aDMap.Bind("Sph",   SPH_GUID);//+
-    aDMap.Bind("Cyl",   CYL_GUID);//+
-    aDMap.Bind("Cut",   CUT_GUID);//+
-    aDMap.Bind("Fuse",  FUSE_GUID);//+
-    aDMap.Bind("Comm",  COMMON_GUID);//+
-    aDMap.Bind("Prism", PRISM_GUID);//+
-    aDMap.Bind("FulRevol", FULREVOL_GUID);//+
-    aDMap.Bind("SecRevol", SECREVOL_GUID);//+
-    aDMap.Bind("PMirr", PMIRR_GUID);//+
-    aDMap.Bind("PTxyz", PTXYZ_GUID);//+
-    aDMap.Bind("PTALine", PTALINE_GUID);//+
-    aDMap.Bind("PRLine", PRRLINE_GUID);//+
-    aDMap.Bind("Fillet",FILLT_GUID);//+
-    aDMap.Bind("Attach",ATTCH_GUID);//+
-    aDMap.Bind("XAttach",XTTCH_GUID);//+
+    aDMap.Bind("PntXYZ",   PNTXYZ_GUID);
+    aDMap.Bind("PntRLT",   PNTRLT_GUID);
+    aDMap.Bind("Line3D",   LINE3D_GUID);
+    aDMap.Bind("Box",      BOX_GUID);
+    aDMap.Bind("Sph",      SPH_GUID);
+    aDMap.Bind("Cyl",      CYL_GUID);
+    aDMap.Bind("Cut",      CUT_GUID);
+    aDMap.Bind("Fuse",     FUSE_GUID);
+    aDMap.Bind("Comm",     COMMON_GUID);
+    aDMap.Bind("Prism",    PRISM_GUID);
+    aDMap.Bind("FulRevol", FULREVOL_GUID);
+    aDMap.Bind("SecRevol", SECREVOL_GUID);
+    aDMap.Bind("PMirr",    PMIRR_GUID);
+    aDMap.Bind("PTxyz",    PTXYZ_GUID);
+    aDMap.Bind("PTALine",  PTALINE_GUID);
+    aDMap.Bind("PRLine",   PRRLINE_GUID);
+    aDMap.Bind("Fillet",   FILLT_GUID);
+    aDMap.Bind("Attach",   ATTCH_GUID);
+    aDMap.Bind("XAttach",  XTTCH_GUID);
+    aDMap.Bind("Section",  SECTION_GUID);
     isBuilt = Standard_True;
   }
 
@@ -192,8 +193,10 @@ static Handle(TFunction_Driver) GetDriver(const TCollection_AsciiString& name)
     aDrv = new DNaming_PointDriver();
   else if(name == "PntRLT") 
     aDrv = new DNaming_PointDriver();
-else if(name == "Line3D") 
+  else if(name == "Line3D") 
     aDrv = new DNaming_Line3DDriver();
+  else if(name == "Section") 
+    aDrv = new DNaming_BooleanOperationDriver();
   else 
     cout << "the specified driver is not supported" <<endl;
   return aDrv;
@@ -961,6 +964,38 @@ static Standard_Integer DNaming_CylRad (Draw_Interpretor& theDI,
  }
 
 //=======================================================================
+//function : DNaming_AddSection
+//purpose  : "AddSection Doc Object Tool"
+//=======================================================================
+
+ static Standard_Integer DNaming_AddSection (Draw_Interpretor& theDI,
+                                                    Standard_Integer theNb, const char** theArg)
+ {
+   if (theNb == 4) {
+
+    Handle(TDocStd_Document) aDocument;   
+    Standard_CString aDocS(theArg[1]);
+    if (!DDocStd::GetDocument(aDocS, aDocument)) return 1;
+
+    Handle(TDataStd_UAttribute) anObject, aTool;
+    if (!DDocStd::Find(aDocument, theArg[2], GEOMOBJECT_GUID, anObject)) return 1;
+    if (!DDocStd::Find(aDocument, theArg[3], GEOMOBJECT_GUID, aTool)) return 1;
+    Standard_GUID funGUID;
+    if(!GetFuncGUID("Section",funGUID)) return 1;
+    Handle(TFunction_Function) aFun = SetFunctionDS(anObject->Label(), funGUID);
+    if(aFun.IsNull()) return 1;
+    TDataStd_Name::Set(aFun->Label(), "Section");
+    
+    TDF_Reference::Set(anObject->Label(), aFun->Label().FindChild(FUNCTION_RESULT_LABEL)); //result is here 
+    DNaming::SetObjectArg(aFun, BOOL_TOOL, aTool); 
+    DDF::ReturnLabel(theDI, aFun->Label());
+    return 0;
+  }
+   cout << "DModel_AddSection : Error" << endl;
+   return 1;  
+ }
+
+//=======================================================================
 //function : DNaming_AddFillet
 //purpose  : "AddFillet Doc Object Radius Path "
 //=======================================================================
@@ -2168,6 +2203,8 @@ void DNaming::ModelingCommands (Draw_Interpretor& theCommands)
 
   theCommands.Add ("AddCommon", "AddCommon Doc Object Tool",  __FILE__, DNaming_AddCommon, g2);  
 
+  theCommands.Add ("AddSection", "AddSection Doc Object Tool",  __FILE__, DNaming_AddSection, g2);  
+
   theCommands.Add ("AddFillet", 
                   "AddFillet Doc Object Radius Path [SurfaceType(0-Rational;1-QuasiAngular;2-Polynomial)]",
                   __FILE__, DNaming_AddFillet, g2);
index d59cfe4..49fe7d5 100644 (file)
@@ -33,6 +33,7 @@
 #define CUT_GUID           Standard_GUID("12e94548-6dbc-11d4-b9c8-0060b0ee281b")
 #define FUSE_GUID          Standard_GUID("12e94549-6dbc-11d4-b9c8-0060b0ee281b")
 #define COMMON_GUID        Standard_GUID("12e9454a-6dbc-11d4-b9c8-0060b0ee281b")
+#define SECTION_GUID       Standard_GUID("12e9454b-6dbc-11d4-b9c8-0060b0ee281b")
 
 #define PRISM_GUID         Standard_GUID("12e94550-6dbc-11d4-b9c8-0060b0ee281b")
 #define FULREVOL_GUID      Standard_GUID("12e94551-6dbc-11d4-b9c8-0060b0ee281b")
@@ -59,6 +60,8 @@
 #define CYL_AXIS   3
 #define ATTACH_ARG 1
 #define BOOL_TOOL  1
+#define SECT_OBJECT 1
+#define SECT_TOOL   2
 #define FILLET_RADIUS 1
 #define FILLET_SURFTYPE 2
 #define FILLET_PATH   3
diff --git a/tests/bugs/caf/bug24869 b/tests/bugs/caf/bug24869
new file mode 100644 (file)
index 0000000..39b17de
--- /dev/null
@@ -0,0 +1,66 @@
+puts "=========="
+puts "OCC24869"
+puts "=========="
+puts ""
+###################################################
+# OCAF testing framework extending
+###################################################
+
+NewDocument D MDTV-Standard
+
+#1 - create box1
+NewCommand D
+set B1 [AddObject D]
+set F1 [AddFunction D $B1 Box]
+BoxDX D $B1 100
+BoxDY D $B1 200
+BoxDZ D $B1 300
+InitLogBook D
+AddDriver D Box Section PTxyz
+ComputeFun D $F1
+GetShape D $F1:2 Box1
+
+#1 - create box2
+NewCommand D
+set B2 [AddObject D]
+set F2 [AddFunction D $B2 Box]
+BoxDX D $B2 150
+BoxDY D $B2 200
+BoxDZ D $B2 300
+ComputeFun D $F2
+
+NewCommand D
+set FTr2 [PTranslateDXYZ D $B2 30 40 50]
+ComputeFun D $FTr2
+# get modified result
+GetShape D $FTr2:2 Box2
+
+#3 Make Section Box1 Box2
+NewCommand D
+set CS [AddSection D $B1 $B2]
+ComputeFun D $CS
+erase
+GetShape D $CS:2 S
+
+# Check result
+NewCommand D
+erase
+ExploreShape D $CS:2:1 R
+
+# should be 12 edges
+set l1 [llength [directory R_*] ]
+
+# should be 12 faces
+set l2 [llength [directory oldR_*] ]
+
+if { ${l1} == 12 } {
+  puts "OK: Good edge number"
+} else {
+  puts "Error: Bad edge number"
+}
+
+if { ${l2} == 12 } {
+  puts "OK: Good face number"
+} else {
+  puts "Error: Bad face number"
+}