-
- FeaturePtr aResult;
- for(TNaming_SameShapeIterator anIter(aShape, myDoc->Main()); anIter.More(); anIter.Next()) {
- TDF_Label aNSLab = anIter.Label();
- while(aNSLab.Depth() > 4)
- aNSLab = aNSLab.Father();
- FeaturePtr aFeature = myObjs->feature(aNSLab);
- if (aFeature.get()) {
- if (!aResult.get() || myObjs->isLater(aResult, aFeature)) {
- aResult = aFeature;
+ // for comsolids and compounds all the naming is located in the main object, so, try to use
+ // it first
+ ResultCompSolidPtr aMain = ModelAPI_Tools::compSolidOwner(theResult);
+ if (aMain.get()) {
+ FeaturePtr aMainRes = producedByFeature(aMain, theShape);
+ if (aMainRes)
+ return aMainRes;
+ }
+
+ std::shared_ptr<Model_Data> aBodyData = std::dynamic_pointer_cast<Model_Data>(theResult->data());
+ if (!aBodyData.get() || !aBodyData->isValid())
+ return FeaturePtr();
+
+ TopoDS_Shape anOldShape; // old shape in the pair oldshape->theShape in the named shape
+ TopoDS_Shape aShapeContainer; // old shape of the shape that contains aShape as sub-element
+ Handle(TNaming_NamedShape) aCandidatInThis, aCandidatContainer;
+ TDF_Label aBodyLab = aBodyData->label();
+ // use childs and this label (the lowest priority)
+ TDF_ChildIDIterator aNSIter(aBodyLab, TNaming_NamedShape::GetID(), Standard_True);
+ bool aUseThis = !aNSIter.More();
+ while(anOldShape.IsNull() && (aNSIter.More() || aUseThis)) {
+ Handle(TNaming_NamedShape) aNS;
+ if (aUseThis) {
+ if (!aBodyLab.FindAttribute(TNaming_NamedShape::GetID(), aNS))
+ break;
+ } else {
+ aNS = Handle(TNaming_NamedShape)::DownCast(aNSIter.Value());
+ }
+ for(TNaming_Iterator aShapesIter(aNS); aShapesIter.More(); aShapesIter.Next()) {
+ if (aShapesIter.Evolution() == TNaming_SELECTED || aShapesIter.Evolution() == TNaming_DELETE)
+ continue; // don't use the selection evolution
+ if (aShapesIter.NewShape().IsSame(aShape)) { // found the original shape
+ aCandidatInThis = aNS;
+ if (aCandidatInThis->Evolution() == TNaming_MODIFY)
+ anOldShape = aShapesIter.OldShape();
+ // otherwise may me searching for another item of this shape with longer history
+ if (!anOldShape.IsNull())
+ break;