XCAFDoc_Editor::Expand function avoids expanding references to assemblies.
Standard_Boolean isAutoNaming = aShapeTool->AutoNaming();
aShapeTool->SetAutoNaming(Standard_False);
- TopoDS_Shape aS = aShapeTool->GetShape(Shape);
- if (aShapeTool->Expand(Shape))
+ TDF_Label aCompoundPartL = Shape;
+ if (aShapeTool->IsReference(Shape))
+ aShapeTool->GetReferredShape(aCompoundPartL, aCompoundPartL);
+
+ TopoDS_Shape aS = aShapeTool->GetShape(aCompoundPartL);
+ if (aShapeTool->Expand(aCompoundPartL))
{
//move attributes
- TDF_ChildIterator anIter(Shape, Standard_True);
+ TDF_ChildIterator anIter(aCompoundPartL, Standard_True);
for(; anIter.More(); anIter.Next())
{
TDF_Label aChild = anIter.Value();
//if assembly contains compound, expand it recursively(if flag recursively is true)
if(recursively)
{
- anIter.Initialize(Shape);
+ anIter.Initialize(aCompoundPartL);
for(; anIter.More(); anIter.Next())
{
TDF_Label aChild = anIter.Value();
--- /dev/null
+puts "=========="
+puts "OCC29888"
+puts "=========="
+puts ""
+#########################################
+# XCAFDoc_Editor::Expand() removes names
+#########################################
+pload ALL
+
+XOpen [locate_data_file bug29888.xbf] D
+
+set isBAD 1
+
+if {[catch {XExpand D 0} result]} {
+ set isBAD 0
+}
+
+if {$isBAD} {
+ puts "Error: expand unexpandable shape type"
+}
+
+Close D
--- /dev/null
+puts "=========="
+puts "OCC29888"
+puts "=========="
+puts ""
+#########################################
+# XCAFDoc_Editor::Expand() removes names
+#########################################
+pload ALL
+
+XOpen [locate_data_file bug29888_part.xbf] D
+
+XExpand D 0
+
+set name_ref [GetName D 0:1:1:2:4]
+set name_part [GetName D 0:1:1:6]
+if {$name_ref != $name_part || $name_ref != "LanternPole_Body"} {
+ puts "Error: name has been lost"
+}
+
+set name_ref [GetName D 0:1:1:2:5]
+set name_part [GetName D 0:1:1:7]
+if {$name_ref != $name_part || $name_ref != "LanternPole_Chain"} {
+ puts "Error: name has been lost"
+}
+
+set name_ref [GetName D 0:1:1:2:6]
+set name_part [GetName D 0:1:1:8]
+if {$name_ref != $name_part || $name_ref != "LanternPole_Lantern"} {
+ puts "Error: name has been lost"
+}
+
+Close D