0029890: Data Exchange - Problem in Expand Compounds
authorika <ika@opencascade.com>
Thu, 21 Jun 2018 12:57:39 +0000 (15:57 +0300)
committerbugmaster <bugmaster@opencascade.com>
Fri, 29 Jun 2018 09:10:37 +0000 (12:10 +0300)
XCAFDoc_ShapeTool::Expand method now avoids creation of subshapes under assemblies.
XCAFDoc_ShapeTool::AddSubShape now avoids creation subshapes under all labels except for simple parts.

src/XCAFDoc/XCAFDoc_ShapeTool.cxx
src/XCAFDoc/XCAFDoc_ShapeTool.hxx
tests/bugs/xde/bug29890_1 [new file with mode: 0644]
tests/bugs/xde/bug29890_2 [new file with mode: 0644]

index 480a1d9..553b15d 100644 (file)
@@ -1097,6 +1097,9 @@ TDF_Label XCAFDoc_ShapeTool::AddSubShape (const TDF_Label &shapeL,
                                           const TopoDS_Shape &sub) const
 {
   TDF_Label L;
+  if (!IsSimpleShape(shapeL) || !IsTopLevel(shapeL))
+    return L;
+
   if ( FindSubShape ( shapeL, sub, L ) ) return L;
   
   if (!IsSubShape(shapeL, sub))
@@ -1833,7 +1836,7 @@ Standard_Boolean XCAFDoc_ShapeTool::Expand (const TDF_Label& theShapeL)
     TopoDS_Iterator anIter(aShape);
     for(; anIter.More(); anIter.Next())
     {
-      TopoDS_Shape aChildShape = anIter.Value();
+      const TopoDS_Shape& aChildShape = anIter.Value();
       TDF_Label aChild, aPart;
 
       // Find child shape as subshape of expanded shape
@@ -1895,11 +1898,18 @@ void XCAFDoc_ShapeTool::makeSubShape (const TDF_Label& theMainShapeL,
 {
   TopoDS_Iterator anIter(theShape);
   Standard_Boolean isCompoundPart = (GetShape(thePart).ShapeType() == TopAbs_COMPOUND);
+  Standard_Boolean isAssembly = IsAssembly(thePart);
   for(; anIter.More(); anIter.Next()) {
-    TopoDS_Shape aChildShape = anIter.Value();
+    const TopoDS_Shape& aChildShape = anIter.Value();
     TDF_Label aChildLabel;
     FindSubShape(theMainShapeL, aChildShape, aChildLabel);
     if(!aChildLabel.IsNull()) {
+      if (isAssembly) {
+        aChildLabel.ForgetAllAttributes();
+        makeSubShape(theMainShapeL, thePart, aChildShape, theLoc);
+        continue;
+      }
+
       //get name
       Handle(TDataStd_Name) anAttr;
       aChildLabel.FindAttribute(TDataStd_Name::GetID(), anAttr);
index db58719..2df242a 100644 (file)
@@ -432,7 +432,8 @@ private:
   Standard_EXPORT static void MakeReference (const TDF_Label& L, const TDF_Label& refL, const TopLoc_Location& loc);
 
   //! Auxiliary method for Expand
-  //! Make subshape for thePart from theShape after expanding theMainShapeL
+  //! Add declared under expanded theMainShapeL subshapes to new part label thePart
+  //! Recursively iterate all subshapes of shape from thePart, current shape to iterate its subshapes is theShape.
   Standard_EXPORT void makeSubShape(const TDF_Label& theMainShapeL, const TDF_Label& thePart, const TopoDS_Shape& theShape, const TopLoc_Location& theLoc);
 
   XCAFDoc_DataMapOfShapeLabel myShapeLabels;
diff --git a/tests/bugs/xde/bug29890_1 b/tests/bugs/xde/bug29890_1
new file mode 100644 (file)
index 0000000..09b33e4
--- /dev/null
@@ -0,0 +1,19 @@
+puts "=========="
+puts "OCC29890"
+puts "=========="
+puts ""
+##############################
+# Problem in Expand Compounds
+##############################
+pload ALL
+
+# Open file and expand
+XOpen [locate_data_file bug29890.xbf] D
+XExpand D 1 0:1:1:1238
+
+# Check
+set children [Children D 0:1:1:1239]
+if {$children != "0:1:1:1239:1 0:1:1:1239:3 "} {
+  puts "Error: wrong expand compounds."
+}
+Close D
diff --git a/tests/bugs/xde/bug29890_2 b/tests/bugs/xde/bug29890_2
new file mode 100644 (file)
index 0000000..39db5e8
--- /dev/null
@@ -0,0 +1,45 @@
+puts "=========="
+puts "OCC29890"
+puts "=========="
+puts ""
+##############################
+# Problem in Expand Compounds
+##############################
+pload ALL
+
+# Add subshape to assembly
+box b 1 1 1
+compound b comp
+XNewDoc D
+XAddShape D comp
+explode comp f
+set sub1 [XAddSubShape D comp_1 0:1:1:1]
+if {$sub1 != ""} {
+  puts "Error: inconsistent model after add subshape to assembly."
+}
+Close D
+
+# Add subshape to reference
+box b 1 1 1
+ttranslate b 1 0 0 
+XNewDoc D
+XAddShape D b
+explode b f
+set sub2 [XAddSubShape D b_1 0:1:1:1]
+if {$sub2 != ""} {
+  puts "Error: inconsistent model after add subshape to reference."
+}
+Close D
+
+# Add subshape to subshape
+box b 1 1 1
+XNewDoc D
+XAddShape D b
+explode b f
+XAddSubShape D b_1 0:1:1:1
+explode b_1 e
+set sub3 [XAddSubShape D b_1_1 0:1:1:1:1]
+if {$sub3 != ""} {
+  puts "Error: inconsistent model after add subshape to subshape."
+}
+Close D