From a3283545a333038161c30cb0d925a49dc61ffae2 Mon Sep 17 00:00:00 2001 From: mpv Date: Wed, 11 Nov 2015 14:02:21 +0300 Subject: [PATCH] Fix for the issue #1082 --- src/Model/Model_AttributeSelection.cpp | 23 +++++--- src/Model/Model_BodyBuilder.cpp | 5 ++ src/Model/Model_ResultPart.cpp | 72 +++++++++++--------------- 3 files changed, 49 insertions(+), 51 deletions(-) diff --git a/src/Model/Model_AttributeSelection.cpp b/src/Model/Model_AttributeSelection.cpp index bdc924e27..76514a28d 100644 --- a/src/Model/Model_AttributeSelection.cpp +++ b/src/Model/Model_AttributeSelection.cpp @@ -205,15 +205,22 @@ std::shared_ptr Model_AttributeSelection::value() return std::shared_ptr(); // postponed naming needed Handle(TDataStd_Integer) anIndex; if (selectionLabel().FindAttribute(TDataStd_Integer::GetID(), anIndex)) { - return aPart->selectionValue(anIndex->Get()); - } - /* - Handle(TDataStd_Name) aName; - if (!selectionLabel().FindAttribute(TDataStd_Name::GetID(), aName)) { - return std::shared_ptr(); // something is wrong + if (anIndex->Get()) { // special selection attribute was created, use it + return aPart->selectionValue(anIndex->Get()); + } else { // face with name is already in the data model, so try to take it by name + Handle(TDataStd_Name) aName; + if (selectionLabel().FindAttribute(TDataStd_Name::GetID(), aName)) { + std::string aSubShapeName(TCollection_AsciiString(aName->Get()).ToCString()); + std::size_t aPartEnd = aSubShapeName.find('/'); + if (aPartEnd != string::npos && aPartEnd != aSubShapeName.rfind('/')) { + string aNameInPart = aSubShapeName.substr(aPartEnd + 1); + int anIndex; + std::string aType; // to reuse already existing selection the type is not needed + return aPart->shapeInPart(aNameInPart, aType, anIndex); + } + } + } } - return aPart->shapeInPart(TCollection_AsciiString(aName->Get()).ToCString()); - */ } Handle(TNaming_NamedShape) aSelection; diff --git a/src/Model/Model_BodyBuilder.cpp b/src/Model/Model_BodyBuilder.cpp index ee6ba1b79..22a621d62 100755 --- a/src/Model/Model_BodyBuilder.cpp +++ b/src/Model/Model_BodyBuilder.cpp @@ -751,6 +751,11 @@ std::shared_ptr Model_BodyBuilder::shape() Handle(TNaming_NamedShape) aName; if (aShapeLab.FindAttribute(TNaming_NamedShape::GetID(), aName)) { TopoDS_Shape aShape = aName->Get(); + if (aShape.IsNull()) + std::cout<<"Model_BodyBuilder::shape returns empty shape "< aRes(new GeomAPI_Shape); aRes->setImpl(new TopoDS_Shape(aShape)); diff --git a/src/Model/Model_ResultPart.cpp b/src/Model/Model_ResultPart.cpp index 124fecd49..a067b7224 100644 --- a/src/Model/Model_ResultPart.cpp +++ b/src/Model/Model_ResultPart.cpp @@ -221,53 +221,30 @@ std::string Model_ResultPart::nameInPart(const std::shared_ptr& t if (!aDoc.get()) // the part document is not presented for the moment return ""; TDF_Label anAccessLabel = aDoc->generalLabel(); - + // make the selection attribute anyway: otherwise just by name it is not stable to search the result std::string aName; - // check if the subShape is already in DF - Handle(TNaming_NamedShape) aNS = TNaming_Tool::NamedShape(aShape, anAccessLabel); - Handle(TDataStd_Name) anAttr; - if(!aNS.IsNull() && !aNS->IsEmpty()) { // in the document - if(aNS->Label().FindAttribute(TDataStd_Name::GetID(), anAttr)) { - aName = TCollection_AsciiString(anAttr->Get()).ToCString(); - if(!aName.empty()) { - const TDF_Label& aLabel = aDoc->findNamingName(aName); - - static const std::string aPostFix("_"); - TNaming_Iterator anItL(aNS); - for(int i = 1; anItL.More(); anItL.Next(), i++) { - if(anItL.NewShape() == aShape) { - aName += aPostFix; - aName += TCollection_AsciiString (i).ToCString(); - break; - } - } - } - } - } - if (aName.empty()) { // not found, so use the selection mechanism - // for this the context result is needed - ResultPtr aContext; - const std::string& aBodyGroup = ModelAPI_ResultBody::group(); - for(int a = aDoc->size(aBodyGroup) - 1; a >= 0; a--) { - ResultPtr aBody = std::dynamic_pointer_cast(aDoc->object(aBodyGroup, a)); - if (aBody.get() && aBody->shape().get() && !aBody->isDisabled()) { - TopoDS_Shape aBodyShape = *(aBody->shape()->implPtr()); - // check is body contain the selected sub-shape - for(TopExp_Explorer anExp(aBodyShape, aShape.ShapeType()); anExp.More(); anExp.Next()) { - if (aShape.IsEqual(anExp.Current())) { - aContext = aBody; - break; - } + // for this the context result is needed + ResultPtr aContext; + const std::string& aBodyGroup = ModelAPI_ResultBody::group(); + for(int a = aDoc->size(aBodyGroup) - 1; a >= 0; a--) { + ResultPtr aBody = std::dynamic_pointer_cast(aDoc->object(aBodyGroup, a)); + if (aBody.get() && aBody->shape().get() && !aBody->isDisabled()) { + TopoDS_Shape aBodyShape = *(aBody->shape()->implPtr()); + // check is body contain the selected sub-shape + for(TopExp_Explorer anExp(aBodyShape, aShape.ShapeType()); anExp.More(); anExp.Next()) { + if (aShape.IsEqual(anExp.Current())) { + aContext = aBody; + break; } } } - if (aContext.get()) { - AttributeSelectionListPtr aSelAttr = aDoc->selectionInPartFeature(); - aSelAttr->append(aContext, theShape); - theIndex = aSelAttr->size(); - AttributeSelectionPtr aNewAttr = aSelAttr->value(theIndex - 1); - return aNewAttr->namingName(); - } + } + if (aContext.get()) { + AttributeSelectionListPtr aSelAttr = aDoc->selectionInPartFeature(); + aSelAttr->append(aContext, theShape); + theIndex = aSelAttr->size(); + AttributeSelectionPtr aNewAttr = aSelAttr->value(theIndex - 1); + return aNewAttr->namingName(); } return aName; } @@ -295,6 +272,15 @@ std::shared_ptr Model_ResultPart::shapeInPart( return aResult; AttributeSelectionListPtr aSelAttr = aDoc->selectionInPartFeature(); + // check this selection is already there: reuse it + int aSize = aSelAttr->size(); + for(int a = 0; a < aSize; a++) { + if (aSelAttr->value(a)->namingName() == theName) { + theIndex = a; + return aSelAttr->value(a)->value(); + } + } + aSelAttr->append(theName, theType); theIndex = aSelAttr->size(); aResult = aSelAttr->value(theIndex - 1)->value(); -- 2.39.2