X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_AttributeSelection.cpp;h=4818b3a5794277107285a80bdf3c3664d3845125;hb=1b9dd3633d644c358424227423b330e9551be38f;hp=a87cea536a9c23e956a2df8eb3d10670cf5951d4;hpb=4b07d0ae015bc7ed510f8795d9d57d408e0367eb;p=modules%2Fshaper.git diff --git a/src/Model/Model_AttributeSelection.cpp b/src/Model/Model_AttributeSelection.cpp index a87cea536..4818b3a57 100644 --- a/src/Model/Model_AttributeSelection.cpp +++ b/src/Model/Model_AttributeSelection.cpp @@ -15,7 +15,6 @@ #include #include #include -#include #include #include @@ -62,6 +61,7 @@ using namespace std; static const int kSTART_VERTEX_DELTA = 1000000; // identifier that there is simple reference: selection equals to context Standard_GUID kSIMPLE_REF_ID("635eacb2-a1d6-4dec-8348-471fae17cb29"); +Standard_GUID kCONSTUCTION_SIMPLE_REF_ID("635eacb2-a1d6-4dec-8348-471fae17cb28"); // on this label is stored: // TNaming_NamedShape - selected shape @@ -74,19 +74,33 @@ void Model_AttributeSelection::setValue(const ResultPtr& theContext, const std::shared_ptr& theSubShape) { const std::shared_ptr& anOldShape = value(); - bool isOldShape = + bool isOldContext = theContext == myRef.value(); + bool isOldShape = isOldContext && (theSubShape == anOldShape || (theSubShape && anOldShape && theSubShape->isEqual(anOldShape))); if (isOldShape) return; // shape is the same, so context is also unchanged // update the referenced object if needed - bool isOldContext = theContext == myRef.value(); - - if (!isOldContext) myRef.setValue(theContext); // do noth use naming if selected shape is result shape itself, but not sub-shape TDF_Label aSelLab = selectionLabel(); aSelLab.ForgetAttribute(kSIMPLE_REF_ID); + aSelLab.ForgetAttribute(kCONSTUCTION_SIMPLE_REF_ID); + + bool isDegeneratedEdge = false; + // do not use the degenerated edge as a shape, a null context and shape is used in the case + if (theSubShape.get() && !theSubShape->isNull() && theSubShape->isEdge()) { + const TopoDS_Shape& aSubShape = theSubShape->impl(); + if (aSubShape.ShapeType() == TopAbs_EDGE) + isDegeneratedEdge = BRep_Tool::Degenerated(TopoDS::Edge(aSubShape)) == Standard_True; + } + if (!theContext.get() || isDegeneratedEdge) { + // to keep the reference attribute label + TDF_Label aRefLab = myRef.myRef->Label(); + aSelLab.ForgetAllAttributes(true); + myRef.myRef = TDF_Reference::Set(aSelLab.Father(), aSelLab.Father()); + return; + } if (theContext->groupName() == ModelAPI_ResultBody::group()) { // do not select the whole shape for body:it is already must be in the data framework if (theContext->shape().get() && theContext->shape()->isEqual(theSubShape)) { @@ -96,9 +110,18 @@ void Model_AttributeSelection::setValue(const ResultPtr& theContext, selectBody(theContext, theSubShape); } } else if (theContext->groupName() == ModelAPI_ResultConstruction::group()) { - selectConstruction(theContext, theSubShape); + if (!theSubShape.get()) { + // to sub, so the whole result is selected + aSelLab.ForgetAllAttributes(true); + TDataStd_UAttribute::Set(aSelLab, kCONSTUCTION_SIMPLE_REF_ID); + } else { + selectConstruction(theContext, theSubShape); + } } - myIsInitialized = true; + //the attribute initialized state should be changed by sendAttributeUpdated only + //myIsInitialized = true; + + owner()->data()->sendAttributeUpdated(this); std::string aSelName = namingName(); if(!aSelName.empty()) @@ -110,13 +133,12 @@ void Model_AttributeSelection::setValue(const ResultPtr& theContext, //selectSubShape("EDGE", "Extrusion_1/TopFace|Extrusion_1/LateralFace_1"); //selectSubShape("EDGE", "Sketch_1/Edge_6"); #endif - owner()->data()->sendAttributeUpdated(this); } std::shared_ptr Model_AttributeSelection::value() { std::shared_ptr aResult; - if (myIsInitialized) { + if (myRef.isInitialized()) { TDF_Label aSelLab = selectionLabel(); if (aSelLab.IsAttribute(kSIMPLE_REF_ID)) { // it is just reference to shape, not sub-shape ResultPtr aContext = context(); @@ -124,6 +146,9 @@ std::shared_ptr Model_AttributeSelection::value() return aResult; // empty result return aContext->shape(); } + if (aSelLab.IsAttribute(kCONSTUCTION_SIMPLE_REF_ID)) { // it is just reference to construction, nothing is in value + return aResult; // empty result + } Handle(TNaming_NamedShape) aSelection; if (selectionLabel().FindAttribute(TNaming_NamedShape::GetID(), aSelection)) { @@ -141,12 +166,47 @@ std::shared_ptr Model_AttributeSelection::value() return aResult; } +bool Model_AttributeSelection::isInitialized() +{ + if (ModelAPI_AttributeSelection::isInitialized()) { // additional checkings if it is initialized + std::shared_ptr aResult; + if (myRef.isInitialized()) { + TDF_Label aSelLab = selectionLabel(); + if (aSelLab.IsAttribute(kSIMPLE_REF_ID)) { // it is just reference to shape, not sub-shape + ResultPtr aContext = context(); + return aContext.get(); + } + if (aSelLab.IsAttribute(kCONSTUCTION_SIMPLE_REF_ID)) { // it is just reference to construction, nothing is in value + return true; + } + + Handle(TNaming_NamedShape) aSelection; + if (selectionLabel().FindAttribute(TNaming_NamedShape::GetID(), aSelection)) { + return !aSelection->Get().IsNull(); + } else { // for simple construction element: just shape of this construction element + ResultConstructionPtr aConstr = + std::dynamic_pointer_cast(context()); + if (aConstr.get()) { + return aConstr->shape().get(); + } + } + } + } + return false; +} + Model_AttributeSelection::Model_AttributeSelection(TDF_Label& theLabel) : myRef(theLabel) { myIsInitialized = myRef.isInitialized(); } +void Model_AttributeSelection::setID(const std::string theID) +{ + myRef.setID(theID); + ModelAPI_AttributeSelection::setID(theID); +} + ResultPtr Model_AttributeSelection::context() { return std::dynamic_pointer_cast(myRef.value()); } @@ -189,6 +249,9 @@ bool Model_AttributeSelection::update() if (aSelLab.IsAttribute(kSIMPLE_REF_ID)) { // it is just reference to shape, not sub-shape return aContext->shape() && !aContext->shape()->isNull(); } + if (aSelLab.IsAttribute(kCONSTUCTION_SIMPLE_REF_ID)) { // it is just reference to construction, not sub-shape + return aContext->shape() && !aContext->shape()->isNull(); + } if (aContext->groupName() == ModelAPI_ResultBody::group()) { // body: just a named shape, use selection mechanism from OCCT @@ -199,10 +262,13 @@ bool Model_AttributeSelection::update() } else if (aContext->groupName() == ModelAPI_ResultConstruction::group()) { // construction: identification by the results indexes, recompute faces and // take the face that more close by the indexes - std::shared_ptr aWirePtr = - std::dynamic_pointer_cast( - std::dynamic_pointer_cast(aContext)->shape()); - if (aWirePtr && aWirePtr->hasPlane()) { // sketch sub-element + ResultConstructionPtr aConstructionContext = + std::dynamic_pointer_cast(aContext); + FeaturePtr aContextFeature = aContext->document()->feature(aContext); + // sketch sub-element + if (aConstructionContext && + std::dynamic_pointer_cast(aContextFeature).get()) + { TDF_Label aLab = myRef.myRef->Label(); // getting a type of selected shape Handle(TDataStd_Integer) aTypeAttr; @@ -216,24 +282,20 @@ bool Model_AttributeSelection::update() bool aNoIndexes = !aLab.FindAttribute(TDataStd_IntPackedMap::GetID(), aSubIds) || aSubIds->Extent() == 0; // for now working only with composite features - FeaturePtr aContextFeature = aContext->document()->feature(aContext); CompositeFeaturePtr aComposite = std::dynamic_pointer_cast(aContextFeature); - if (!aComposite || aComposite->numberOfSubs() == 0) { + if (!aComposite.get() || aComposite->numberOfSubs() == 0) { return false; } - if (aShapeType == TopAbs_FACE) { + if (aShapeType == TopAbs_FACE) { // compound is for the whole sketch selection // If this is a wire with plane defined thin it is a sketch-like object - std::list > aFaces; - GeomAlgoAPI_SketchBuilder::createFaces(aWirePtr->origin(), aWirePtr->dirX(), - aWirePtr->dirY(), aWirePtr->norm(), aWirePtr, aFaces); - if (aFaces.empty()) // no faces, update can not work correctly + if (!aConstructionContext->facesNum()) // no faces, update can not work correctly return false; // if there is no edges indexes, any face can be used: take the first std::shared_ptr aNewSelected; if (aNoIndexes) { - aNewSelected = *(aFaces.begin()); + aNewSelected = aConstructionContext->face(0); } else { // searching for most looks-like initial face by the indexes // prepare edges of the current resut for the fast searching TColStd_MapOfTransient allCurves; @@ -258,12 +320,11 @@ bool Model_AttributeSelection::update() } } } - // iterate new result faces and searching for these edges - std::list >::iterator aFacesIter = aFaces.begin(); double aBestFound = 0; // best percentage of found edges - for(; aFacesIter != aFaces.end(); aFacesIter++) { + for(int aFaceIndex = 0; aFaceIndex < aConstructionContext->facesNum(); aFaceIndex++) { int aFound = 0, aNotFound = 0; - TopExp_Explorer anEdgesExp((*aFacesIter)->impl(), TopAbs_EDGE); + TopExp_Explorer anEdgesExp( + aConstructionContext->face(aFaceIndex)->impl(), TopAbs_EDGE); for(; anEdgesExp.More(); anEdgesExp.Next()) { TopoDS_Edge anEdge = TopoDS::Edge(anEdgesExp.Current()); if (!anEdge.IsNull()) { @@ -280,7 +341,7 @@ bool Model_AttributeSelection::update() double aPercentage = double(aFound) / double(aFound + aNotFound); if (aPercentage > aBestFound) { aBestFound = aPercentage; - aNewSelected = *aFacesIter; + aNewSelected = aConstructionContext->face(aFaceIndex); } } } @@ -370,28 +431,31 @@ void Model_AttributeSelection::selectBody( { // perform the selection TNaming_Selector aSel(selectionLabel()); - TopoDS_Shape aNewShape = theSubShape ? theSubShape->impl() : TopoDS_Shape(); TopoDS_Shape aContext; ResultBodyPtr aBody = std::dynamic_pointer_cast(myRef.value()); if (aBody) { aContext = aBody->shape()->impl(); } else { - ResultConstructionPtr aConstr = - std::dynamic_pointer_cast(myRef.value()); - if (aConstr) { - aContext = aConstr->shape()->impl(); + ResultPtr aResult = + std::dynamic_pointer_cast(myRef.value()); + if (aResult) { + aContext = aResult->shape()->impl(); } else { Events_Error::send("A result with shape is expected"); return; } } + TopoDS_Shape aNewShape = theSubShape ? theSubShape->impl() : aContext; /// fix for issue 411: result modified shapes must not participate in this selection mechanism + /* FeaturePtr aFeatureOwner = std::dynamic_pointer_cast(owner()); if (aFeatureOwner.get()) aFeatureOwner->eraseResults(); - - aSel.Select(aNewShape, aContext); + */ + if (!aContext.IsNull()) { + aSel.Select(aNewShape, aContext); + } } /// registers the name of the shape in the label (theID == 0) of sub label (theID is a tag) @@ -616,10 +680,11 @@ bool isTrivial (const TopTools_ListOfShape& theAncestors, TopTools_IndexedMapOfS if(aNumber > 1) return false; return true; } -std::string Model_AttributeSelection::namingName() +std::string Model_AttributeSelection::namingName(const std::string& theDefaultName) { std::string aName(""); - if(!this->isInitialized()) return aName; + if(!this->isInitialized()) + return !theDefaultName.empty() ? theDefaultName : aName; Handle(TDataStd_Name) anAtt; if(selectionLabel().FindAttribute(TDataStd_Name::GetID(), anAtt)) { aName = TCollection_AsciiString(anAtt->Get()).ToCString(); @@ -629,13 +694,18 @@ std::string Model_AttributeSelection::namingName() std::shared_ptr aSubSh = value(); ResultPtr aCont = context(); aName = "Undefined name"; - if(!aSubSh.get() || aSubSh->isNull() || !aCont.get() || aCont->shape()->isNull()) - return aName; + if(!aCont.get() || aCont->shape()->isNull()) + return !theDefaultName.empty() ? theDefaultName : aName; + if (!aSubSh.get() || aSubSh->isNull()) { // no subshape, so just the whole feature name + return aCont->data()->name(); + } TopoDS_Shape aSubShape = aSubSh->impl(); TopoDS_Shape aContext = aCont->shape()->impl(); #ifdef DEB_NAMING + if(aSubShape.ShapeType() == TopAbs_COMPOUND) { BRepTools::Write(aSubShape, "Selection.brep"); BRepTools::Write(aContext, "Context.brep"); + } #endif std::shared_ptr aDoc = std::dynamic_pointer_cast(aCont->document()); @@ -647,65 +717,69 @@ std::string Model_AttributeSelection::namingName() switch (aType) { case TopAbs_FACE: // the Face should be in DF. If it is not the case, it is an error ==> to be debugged - break; - case TopAbs_EDGE: - { - // name structure: F1 | F2 [| F3 | F4], where F1 & F2 the faces which gives the Edge in trivial case - // if it is not atrivial case we use localization by neighbours. F3 & F4 - neighbour faces - TopTools_IndexedDataMapOfShapeListOfShape aMap; - TopExp::MapShapesAndAncestors(aContext, TopAbs_EDGE, TopAbs_FACE, aMap); - TopTools_IndexedMapOfShape aSMap; // map for ancestors of the sub-shape - bool isTrivialCase(true); - /* for (int i = 1; i <= aMap.Extent(); i++) { - const TopoDS_Shape& aKey = aMap.FindKey(i); - //if (aKey.IsNotEqual(aSubShape)) continue; // find exactly the selected key - if (aKey.IsSame(aSubShape)) continue; - const TopTools_ListOfShape& anAncestors = aMap.FindFromIndex(i); - // check that it is not a trivial case (F1 & F2: aNumber = 1) - isTrivialCase = isTrivial(anAncestors, aSMap); - break; - }*/ - if(aMap.Contains(aSubShape)) { - const TopTools_ListOfShape& anAncestors = aMap.FindFromKey(aSubShape); - // check that it is not a trivial case (F1 & F2: aNumber = 1) - isTrivialCase = isTrivial(anAncestors, aSMap); - } else - break; - TopTools_ListOfShape aListOfNbs; - if(!isTrivialCase) { // find Neighbors - TNaming_Localizer aLocalizer; - TopTools_MapOfShape aMap3; - aLocalizer.FindNeighbourg(aContext, aSubShape, aMap3); - //int n = aMap3.Extent(); - TopTools_MapIteratorOfMapOfShape it(aMap3); - for(;it.More();it.Next()) { - const TopoDS_Shape& aNbShape = it.Key(); // neighbor edge - //TopAbs_ShapeEnum aType = aNbShape.ShapeType(); - const TopTools_ListOfShape& aList = aMap.FindFromKey(aNbShape); - TopTools_ListIteratorOfListOfShape it2(aList); - for(;it2.More();it2.Next()) { - if(aSMap.Contains(it2.Value())) continue; // skip this Face - aListOfNbs.Append(it2.Value()); - } - } - } // else a trivial case - - // build name of the sub-shape Edge - for(int i=1; i <= aSMap.Extent(); i++) { - const TopoDS_Shape& aFace = aSMap.FindKey(i); - std::string aFaceName = GetShapeName(aDoc, aFace, selectionLabel()); - if(i == 1) - aName = aFaceName; - else - aName += "|" + aFaceName; - } - TopTools_ListIteratorOfListOfShape itl(aListOfNbs); - for (;itl.More();itl.Next()) { - std::string aFaceName = GetShapeName(aDoc, itl.Value(), selectionLabel()); - aName += "|" + aFaceName; - } - } - break; + break; + case TopAbs_EDGE: + { + // name structure: F1 | F2 [| F3 | F4], where F1 & F2 the faces which gives the Edge in trivial case + // if it is not atrivial case we use localization by neighbours. F3 & F4 - neighbour faces + if (BRep_Tool::Degenerated(TopoDS::Edge(aSubShape))) { + aName = "Degenerated_Edge"; + break; + } + TopTools_IndexedDataMapOfShapeListOfShape aMap; + TopExp::MapShapesAndAncestors(aContext, TopAbs_EDGE, TopAbs_FACE, aMap); + TopTools_IndexedMapOfShape aSMap; // map for ancestors of the sub-shape + bool isTrivialCase(true); +/* for (int i = 1; i <= aMap.Extent(); i++) { + const TopoDS_Shape& aKey = aMap.FindKey(i); + //if (aKey.IsNotEqual(aSubShape)) continue; // find exactly the selected key + if (aKey.IsSame(aSubShape)) continue; + const TopTools_ListOfShape& anAncestors = aMap.FindFromIndex(i); + // check that it is not a trivial case (F1 & F2: aNumber = 1) + isTrivialCase = isTrivial(anAncestors, aSMap); + break; + }*/ + if(aMap.Contains(aSubShape)) { + const TopTools_ListOfShape& anAncestors = aMap.FindFromKey(aSubShape); + // check that it is not a trivial case (F1 & F2: aNumber = 1) + isTrivialCase = isTrivial(anAncestors, aSMap); + } else + break; + TopTools_ListOfShape aListOfNbs; + if(!isTrivialCase) { // find Neighbors + TNaming_Localizer aLocalizer; + TopTools_MapOfShape aMap3; + aLocalizer.FindNeighbourg(aContext, aSubShape, aMap3); + //int n = aMap3.Extent(); + TopTools_MapIteratorOfMapOfShape it(aMap3); + for(;it.More();it.Next()) { + const TopoDS_Shape& aNbShape = it.Key(); // neighbor edge + //TopAbs_ShapeEnum aType = aNbShape.ShapeType(); + const TopTools_ListOfShape& aList = aMap.FindFromKey(aNbShape); + TopTools_ListIteratorOfListOfShape it2(aList); + for(;it2.More();it2.Next()) { + if(aSMap.Contains(it2.Value())) continue; // skip this Face + aListOfNbs.Append(it2.Value()); + } + } + } // else a trivial case + + // build name of the sub-shape Edge + for(int i=1; i <= aSMap.Extent(); i++) { + const TopoDS_Shape& aFace = aSMap.FindKey(i); + std::string aFaceName = GetShapeName(aDoc, aFace, selectionLabel()); + if(i == 1) + aName = aFaceName; + else + aName += "|" + aFaceName; + } + TopTools_ListIteratorOfListOfShape itl(aListOfNbs); + for (;itl.More();itl.Next()) { + std::string aFaceName = GetShapeName(aDoc, itl.Value(), selectionLabel()); + aName += "|" + aFaceName; + } + } + break; case TopAbs_VERTEX: // name structure (Monifold Topology): @@ -735,12 +809,24 @@ std::string Model_AttributeSelection::namingName() //n = aList.Extent(); #endif int n = aList.Extent(); - if(n < 3) { // open topology case => via edges + if(n < 3) { // open topology case or Compound case => via edges TopTools_IndexedDataMapOfShapeListOfShape aMap; TopExp::MapShapesAndAncestors(aContext, TopAbs_VERTEX, TopAbs_EDGE, aMap); - const TopTools_ListOfShape& aList2 = aMap.FindFromKey(aSubShape); - if(aList2.Extent() >= 2) { // regular solution - TopTools_ListIteratorOfListOfShape itl(aList2); + const TopTools_ListOfShape& aList22 = aMap.FindFromKey(aSubShape); + if(aList22.Extent() >= 2) { // regular solution +#ifdef FIX_BUG1 + + // bug! duplication; fix is below + aFMap.Clear(); + TopTools_ListOfShape aListE; + TopTools_ListIteratorOfListOfShape itl2(aList22); + for (int i = 1;itl2.More();itl2.Next(),i++) { + if(aFMap.Add(itl2.Value())) + aListE.Append(itl2.Value()); + } + n = aListE.Extent(); +#endif + TopTools_ListIteratorOfListOfShape itl(aListE); for (int i = 1;itl.More();itl.Next(),i++) { const TopoDS_Shape& anEdge = itl.Value(); std::string anEdgeName = GetShapeName(aDoc, anEdge, selectionLabel()); @@ -749,6 +835,9 @@ std::string Model_AttributeSelection::namingName() else aName += "|" + anEdgeName; } + }//reg + else { // dangle vertex: if(aList22.Extent() == 1) + //it should be already in DF } } else { @@ -774,30 +863,38 @@ std::string Model_AttributeSelection::namingName() TopAbs_ShapeEnum translateType (const std::string& theType) { - TCollection_AsciiString aStr(theType.c_str()); - aStr.UpperCase(); - if(aStr.IsEqual("COMP")) - return TopAbs_COMPOUND; - else if(aStr.IsEqual("COMS")) - return TopAbs_COMPSOLID; - else if(aStr.IsEqual("SOLD")) - return TopAbs_SOLID; - else if(aStr.IsEqual("SHEL")) - return TopAbs_SHELL; - else if(aStr.IsEqual("FACE")) - return TopAbs_FACE; - else if(aStr.IsEqual("WIRE")) - return TopAbs_WIRE; - else if(aStr.IsEqual("EDGE")) - return TopAbs_EDGE; - else if(aStr.IsEqual("VERT")) - return TopAbs_VERTEX; - + // map from the textual shape types to OCCT enumeration + static std::map MyShapeTypes; + if (MyShapeTypes.size() == 0) { + MyShapeTypes["face"] = TopAbs_FACE; + MyShapeTypes["faces"] = TopAbs_FACE; + MyShapeTypes["vertex"] = TopAbs_VERTEX; + MyShapeTypes["vertices"] = TopAbs_VERTEX; + MyShapeTypes["wire"] = TopAbs_WIRE; + MyShapeTypes["edge"] = TopAbs_EDGE; + MyShapeTypes["edges"] = TopAbs_EDGE; + MyShapeTypes["shell"] = TopAbs_SHELL; + MyShapeTypes["solid"] = TopAbs_SOLID; + MyShapeTypes["solids"] = TopAbs_SOLID; + MyShapeTypes["FACE"] = TopAbs_FACE; + MyShapeTypes["FACES"] = TopAbs_FACE; + MyShapeTypes["VERTEX"] = TopAbs_VERTEX; + MyShapeTypes["VERTICES"] = TopAbs_VERTEX; + MyShapeTypes["WIRE"] = TopAbs_WIRE; + MyShapeTypes["EDGE"] = TopAbs_EDGE; + MyShapeTypes["EDGES"] = TopAbs_EDGE; + MyShapeTypes["SHELL"] = TopAbs_SHELL; + MyShapeTypes["SOLID"] = TopAbs_SOLID; + MyShapeTypes["SOLIDS"] = TopAbs_SOLID; + } + if (MyShapeTypes.find(theType) != MyShapeTypes.end()) + return MyShapeTypes[theType]; + Events_Error::send("Shape type defined in XML is not implemented!"); return TopAbs_SHAPE; } -const TopoDS_Shape getShapeFromCompound( - const std::string& theSubShapeName, const TopoDS_Shape& theCompound) +const TopoDS_Shape getShapeFromNS( + const std::string& theSubShapeName, Handle(TNaming_NamedShape) theNS) { TopoDS_Shape aSelection; std::string::size_type n = theSubShapeName.rfind('/'); @@ -807,13 +904,12 @@ const TopoDS_Shape getShapeFromCompound( if (n == std::string::npos) return aSelection; aSubString = aSubString.substr(n+1); int indx = atoi(aSubString.c_str()); - TopoDS_Iterator it(theCompound); - for (int i = 1;it.More();it.Next(), i++) { - if(i == indx) { - aSelection = it.Value(); - break; + + TNaming_Iterator anItL(theNS); + for(int i = 1; anItL.More(); anItL.Next(), i++) { + if (i == indx) { + return anItL.NewShape(); } - else continue; } return aSelection; } @@ -837,13 +933,7 @@ const TopoDS_Shape findFaceByName( if(aLabel.IsNull()) return aFace; Handle(TNaming_NamedShape) aNS; if(aLabel.FindAttribute(TNaming_NamedShape::GetID(), aNS)) { - const TopoDS_Shape& aShape = aNS->Get(); - if(!aShape.IsNull()) { - if(aShape.ShapeType() == TopAbs_COMPOUND) - aFace = getShapeFromCompound(theSubShapeName, aShape); - else - aFace = aShape; - } + aFace = getShapeFromNS(theSubShapeName, aNS); } return aFace; } @@ -1002,13 +1092,7 @@ void Model_AttributeSelection::selectSubShape( if(!aLabel.IsNull()) { Handle(TNaming_NamedShape) aNS; if(aLabel.FindAttribute(TNaming_NamedShape::GetID(), aNS)) { - const TopoDS_Shape& aShape = aNS->Get(); - if(!aShape.IsNull()) { - if(aShape.ShapeType() == TopAbs_COMPOUND) - aSelection = getShapeFromCompound(theSubShapeName, aShape); - else - aSelection = aShape; - } + aSelection = getShapeFromNS(theSubShapeName, aNS); } } if(aSelection.IsNull()) { @@ -1038,13 +1122,7 @@ void Model_AttributeSelection::selectSubShape( if(!aLabel.IsNull()) { Handle(TNaming_NamedShape) aNS; if(aLabel.FindAttribute(TNaming_NamedShape::GetID(), aNS)) { - const TopoDS_Shape& aShape = aNS->Get(); - if(!aShape.IsNull()) { - if(aShape.ShapeType() == TopAbs_COMPOUND) - aSelection = getShapeFromCompound(theSubShapeName, aShape); - else - aSelection = aShape; - } + aSelection = getShapeFromNS(theSubShapeName, aNS); } } if(aSelection.IsNull()) {