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.
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))
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
{
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);
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;
--- /dev/null
+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
--- /dev/null
+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