+ // TODO: remove after fix in OCCT.
+ // All named shapes are stored in reversed order, so to fix this we reverse them back.
+ for(TDF_ChildIDIterator aChildIter(aTargetRoot, TNaming_NamedShape::GetID(), true);
+ aChildIter.More();
+ aChildIter.Next()) {
+ Handle(TNaming_NamedShape) aNamedShape =
+ Handle(TNaming_NamedShape)::DownCast(aChildIter.Value());
+ if (aNamedShape.IsNull()) {
+ continue;
+ }
+
+ TopoDS_Shape aShape = aNamedShape->Get();
+ if(aShape.IsNull() || aShape.ShapeType() != TopAbs_COMPOUND) {
+ continue;
+ }
+
+ TNaming_Evolution anEvol = aNamedShape->Evolution();
+ std::list<std::pair<TopoDS_Shape, TopoDS_Shape> > aShapePairs; // to store old and new shapes
+ for(TNaming_Iterator anIter(aNamedShape); anIter.More(); anIter.Next()) {
+ aShapePairs.push_back(
+ std::pair<TopoDS_Shape, TopoDS_Shape>(anIter.OldShape(), anIter.NewShape()));
+ }
+
+ // Add in reverse order.
+ TDF_Label aLabel = aNamedShape->Label();
+ TNaming_Builder aBuilder(aLabel);
+ for(std::list<std::pair<TopoDS_Shape, TopoDS_Shape> >::iterator aPairsIter =
+ aShapePairs.begin();
+ aPairsIter != aShapePairs.end();
+ aPairsIter++) {
+ if (anEvol == TNaming_GENERATED) {
+ aBuilder.Generated(aPairsIter->first, aPairsIter->second);
+ } else if (anEvol == TNaming_MODIFY) {
+ aBuilder.Modify(aPairsIter->first, aPairsIter->second);
+ } else if (anEvol == TNaming_DELETE) {
+ aBuilder.Delete(aPairsIter->first);
+ } else if (anEvol == TNaming_PRIMITIVE) {
+ aBuilder.Generated(aPairsIter->second);
+ } else if (anEvol == TNaming_SELECTED) {
+ aBuilder.Select(aPairsIter->second, aPairsIter->first);
+ }
+ }
+ }
+