X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_AttributeSelection.cpp;h=92be8663dbc26432cf9469ff69e52055c14d0e7e;hb=c4eab94a20a0d93100549a210582d46409fec1cc;hp=fd20f15660e9dd16c6288850f053670bc808d291;hpb=5e5cf940e4f1d733e98bb008f02648be4a90133a;p=modules%2Fshaper.git diff --git a/src/Model/Model_AttributeSelection.cpp b/src/Model/Model_AttributeSelection.cpp index fd20f1566..92be8663d 100644 --- a/src/Model/Model_AttributeSelection.cpp +++ b/src/Model/Model_AttributeSelection.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2019 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -12,10 +12,9 @@ // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or -// email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include "Model_AttributeSelection.h" @@ -178,18 +177,6 @@ bool Model_AttributeSelection::setValue(const ObjectPtr& theContext, std::shared_ptr aSubShape; if (theSubShape.get() && !aConstruction->shape()->isEqual(theSubShape)) aSubShape = theSubShape; // the whole context - if (aConstruction->isInfinite()) { - // For correct naming selection, put the shape into the naming structure. - // It seems sub-shapes are not needed: only this shape is (and can be) selected. - /* - TNaming_Builder aBuilder(aSelLab); - aBuilder.Generated(aConstruction->shape()->impl()); - std::string anInfinitiveName = contextName(aConstruction); - TDataStd_Name::Set(aSelLab, anInfinitiveName.c_str()); - std::dynamic_pointer_cast(owner()->document()) - ->addNamingName(aSelLab, anInfinitiveName.c_str()); - */ - } } else if (theContext->groupName() == ModelAPI_ResultPart::group()) { aSelLab.ForgetAllAttributes(true); TDataStd_UAttribute::Set(aSelLab, kPART_REF_ID); @@ -431,15 +418,18 @@ bool Model_AttributeSelection::isInitialized() if (selectionLabel().FindAttribute(TNaming_NamedShape::GetID(), aSelection)) { return !aSelection->Get().IsNull(); } else { // for simple construction element: just shape of this construction element - std::shared_ptr aConstr = - std::dynamic_pointer_cast(context()); - if (aConstr.get()) { - return true; - } - // for the whole feature, a feature object - FeaturePtr aFeat = contextFeature(); - if (aFeat.get()) + if (myRef.value().get()) return true; + // check that this is on open of document, so, results are not initialized yet + TDF_Label aRefLab = myRef.myRef->Get(); + if (aRefLab.IsNull() || !owner().get()) + return false; + std::shared_ptr aMyDoc = + std::dynamic_pointer_cast(owner()->document()); + if (!aMyDoc.get()) + return false; + // check at least the feature exists + return aMyDoc->featureByLab(aRefLab).get() != NULL; } } } @@ -460,7 +450,8 @@ void Model_AttributeSelection::setID(const std::string theID) ModelAPI_AttributeSelection::setID(theID); FeaturePtr aFeature = std::dynamic_pointer_cast(owner()); if (myParent) { - myIsGeometricalSelection = myParent->isGeometricalSelection(); + // to be able to select as geometrical selection and then - split + myIsGeometricalSelection = true; // myParent->isGeometricalSelection(); } else { myIsGeometricalSelection = ModelAPI_Session::get()->validators()->isGeometricalSelection(aFeature->getKind(), id()); @@ -605,8 +596,7 @@ bool Model_AttributeSelection::update() // shape type should not be changed: if shape becomes compound of such shapes, then split if (myParent && !anOldShape.IsNull() && !aNewShape.IsNull() && anOldShape.ShapeType() != aNewShape.ShapeType() && - (aNewShape.ShapeType() == TopAbs_COMPOUND || aNewShape.ShapeType() == TopAbs_COMPSOLID)) - { + aNewShape.ShapeType() == TopAbs_COMPOUND) { split(aContext, aNewShape, anOldShape.ShapeType()); } owner()->data()->sendAttributeUpdated(this); // send updated if shape is changed @@ -1032,39 +1022,6 @@ void Model_AttributeSelection::selectSubShape(const std::string& theType, } } -int Model_AttributeSelection::Id() -{ - int anID = 0; - std::shared_ptr aSelection = value(); - ResultPtr aContextRes = context(); - // support for compsolids: - while(ModelAPI_Tools::bodyOwner(aContextRes).get()) { - aContextRes = ModelAPI_Tools::bodyOwner(aContextRes); - } - std::shared_ptr aContext = aContextRes->shape(); - - - TopoDS_Shape aMainShape = aContext->impl(); - const TopoDS_Shape& aSubShape = aSelection->impl(); - // searching for the latest main shape - if (aSelection && !aSelection->isNull() && aContext && !aContext->isNull()) - { - std::shared_ptr aDoc = - std::dynamic_pointer_cast(context()->document()); - if (aDoc.get()) { - Handle(TNaming_NamedShape) aNS = TNaming_Tool::NamedShape(aMainShape, aDoc->generalLabel()); - if (!aNS.IsNull()) { - aMainShape = TNaming_Tool::CurrentShape(aNS); - } - } - - TopTools_IndexedMapOfShape aSubShapesMap; - TopExp::MapShapes(aMainShape, aSubShapesMap); - anID = aSubShapesMap.FindIndex(aSubShape); - } - return anID; -} - void Model_AttributeSelection::setId(int theID) { std::shared_ptr aSelection; @@ -1128,9 +1085,10 @@ void Model_AttributeSelection::computeValues( if (aWasWholeContext) { theValShape = theOldContext->shape()->impl(); } + TopAbs_ShapeEnum aValType = theValShape.ShapeType(); TopoDS_Shape aNewContShape = theNewContext->shape()->impl(); // if a new value is unchanged in the new context, do nothing: value is correct - TopExp_Explorer aSubExp(aNewContShape, theValShape.ShapeType()); + TopExp_Explorer aSubExp(aNewContShape, aValType); for(; aSubExp.More(); aSubExp.Next()) { if (aSubExp.Current().IsSame(theValShape)) { theShapes.Append(theValShape); @@ -1174,16 +1132,16 @@ void Model_AttributeSelection::computeValues( theShapes.Clear(); return; } - theShapes.Append(aPairIter.NewShape()); + // don't add edges generated from faces + if (aPairIter.NewShape().ShapeType() <= aValType) + theShapes.Append(aPairIter.NewShape()); } } else if (!aPairIter.OldShape().IsNull()) { // search shape that contains this sub - TopExp_Explorer anExp(aPairIter.OldShape(), theValShape.ShapeType()); + TopExp_Explorer anExp(aPairIter.OldShape(), aValType); for(; anExp.More(); anExp.Next()) { if (anExp.Current().IsSame(theValShape)) { // found a new container - if (aPairIter.NewShape().IsNull()) {// value was removed - theShapes.Clear(); - return; - } + if (aPairIter.NewShape().IsNull()) // skip removed high-level shape + continue; aNewToOld.Bind(aPairIter.NewShape(), aPairIter.OldShape()); anOlds.Add(aPairIter.OldShape()); break; @@ -1195,11 +1153,37 @@ void Model_AttributeSelection::computeValues( } } if (aToFindPart == 2 && !aNewToOld.IsEmpty()) { + // also iterate the whole old shape to find not-modified shapes that contain this old + TopoDS_Shape anOldContShape = theOldContext->shape()->impl(); + NCollection_Map aNewTypes; // types of shapes to iterate + TopTools_DataMapOfShapeShape::Iterator aNewTypeIter(aNewToOld); + for(; aNewTypeIter.More(); aNewTypeIter.Next()) { + if (aNewTypeIter.Key().ShapeType() != aValType) + aNewTypes.Add(aNewTypeIter.Key().ShapeType()); + } + NCollection_Map::Iterator aTypeIter(aNewTypes); + for(; aTypeIter.More(); aTypeIter.Next()) { + for(TopExp_Explorer anExp(anOldContShape, aTypeIter.Value()); anExp.More(); anExp.Next()) { + TopoDS_Shape anOld = anExp.Current(); + if (aNewToOld.IsBound(anOld) || anOlds.Contains(anOld)) // this was modified + continue; + TopExp_Explorer aValExp(anOld, aValType); + for(; aValExp.More(); aValExp.Next()) { + const TopoDS_Shape& anUnchanged = aValExp.Current(); + if (anUnchanged.IsSame(theValShape)) { + aNewToOld.Bind(anOld, anOld); + anOlds.Add(anOld); + break; + } + } + } + } + // map of sub-shapes -> number of occurrences of these shapes in containers NCollection_DataMap aSubs; TopTools_DataMapOfShapeShape::Iterator aContIter(aNewToOld); for(; aContIter.More(); aContIter.Next()) { - TopExp_Explorer aSubExp(aContIter.Key(), theValShape.ShapeType()); + TopExp_Explorer aSubExp(aContIter.Key(), aValType); for(; aSubExp.More(); aSubExp.Next()) { if (!aSubs.IsBound(aSubExp.Current())) { aSubs.Bind(aSubExp.Current(), TopTools_MapOfShape()); @@ -1214,12 +1198,51 @@ void Model_AttributeSelection::computeValues( aSubsIter(aSubs); for(; aSubsIter.More(); aSubsIter.Next()) { if (aSubsIter.Value().Size() == aCountInOld) { - theShapes.Append(aSubsIter.Key()); + TopoDS_Shape anOld = aSubsIter.Key(); + // check this exists in the new shape + TopExp_Explorer aNew(aNewContShape, anOld.ShapeType()); + for (; aNew.More(); aNew.Next()) { + if (aNew.Current().IsSame(anOld)) + break; + } + if (aNew.More()) + theShapes.Append(anOld); } } } if (theShapes.IsEmpty()) { // nothing was changed - theShapes.Append(aWasWholeContext ? TopoDS_Shape() : theValShape); + if (aWasWholeContext) + theShapes.Append(TopoDS_Shape()); + else { // if theValShape exists in new context, add it without changes, otherwise - nothing + for (TopExp_Explorer aNew(aNewContShape, aValType); aNew.More(); aNew.Next()){ + if (aNew.Current().IsSame(theValShape)) { + theShapes.Append(theValShape); + break; + } + } + } + } else if (theShapes.Size() > 1) { + // check it is possible to remove extra sub-shapes: + // keep only shapes with the same number of containers if possible + TopAbs_ShapeEnum anAncType = TopAbs_FACE; + if (aValType == TopAbs_VERTEX) + anAncType = TopAbs_EDGE; + TopoDS_Shape anOldContext = theOldContext->shape()->impl(); + TopTools_IndexedDataMapOfShapeListOfShape anOldMap; + TopExp::MapShapesAndUniqueAncestors(anOldContext, aValType, anAncType, anOldMap); + if (anOldMap.Contains(theValShape)) { + int aNumInOld = anOldMap.FindFromKey(theValShape).Extent(); + TopTools_IndexedDataMapOfShapeListOfShape aNewMap; + TopExp::MapShapesAndUniqueAncestors(aNewContShape, aValType, anAncType, aNewMap); + TopTools_ListOfShape aNewResults; + for(TopTools_ListOfShape::Iterator aNewSubs(theShapes); aNewSubs.More(); aNewSubs.Next()) { + TopoDS_Shape aCand = aNewSubs.Value(); + if (aNewMap.Contains(aCand) && aNewMap.FindFromKey(aCand).Extent() == aNumInOld) + aNewResults.Append(aCand); + } + if (!aNewResults.IsEmpty() && aNewResults.Size() < theShapes.Size()) + theShapes = aNewResults; + } } } @@ -1229,7 +1252,6 @@ bool Model_AttributeSelection::searchNewContext(std::shared_ptr std::list& theResults, TopTools_ListOfShape& theValShapes) { std::set aResults; // to avoid duplicates, new context, null if deleted - TopTools_ListOfShape aResContShapes; // iterate context and shape, but also if it is sub-shape of main shape, check also it TopTools_ListOfShape aContextList; aContextList.Append(theContShape); @@ -1266,7 +1288,6 @@ bool Model_AttributeSelection::searchNewContext(std::shared_ptr aModifIter.Label().FindAttribute(TNaming_NamedShape::GetID(), aNewNS); if (aNewNS->Evolution() == TNaming_MODIFY || aNewNS->Evolution() == TNaming_GENERATED) { aResults.insert(aModifierObj); - aResContShapes.Append(aModifierObj->shape()->impl()); } else if (aNewNS->Evolution() == TNaming_DELETE) { // a shape was deleted => result is empty aResults.insert(ResultPtr()); } else { // not-processed modification => don't support it @@ -1274,8 +1295,58 @@ bool Model_AttributeSelection::searchNewContext(std::shared_ptr } } } - if (aResults.empty()) + // if there exist context composite and sub-result(s), leave only sub(s) + for(std::set::iterator aResIter = aResults.begin(); aResIter != aResults.end();) { + ResultPtr aParent = ModelAPI_Tools::bodyOwner(*aResIter); + for(; aParent.get(); aParent = ModelAPI_Tools::bodyOwner(aParent)) + if (aResults.count(aParent)) + break; + if (aParent.get()) { // erase from set, so, restart iteration + aResults.erase(aParent); + aResIter = aResults.begin(); + } else aResIter++; + } + + if (aResults.empty()) { + // check the context become concealed by operation which is earlier than this selection + std::list allRes; + ResultPtr aRoot = ModelAPI_Tools::bodyOwner(theContext, true); + if (!aRoot.get()) + aRoot = theContext; + ResultBodyPtr aRootBody = std::dynamic_pointer_cast(aRoot); + if (aRootBody.get()) { + ModelAPI_Tools::allSubs(aRootBody, allRes); + allRes.push_back(aRootBody); + } else + allRes.push_back(aRoot); + + FeaturePtr aThisFeature = std::dynamic_pointer_cast(owner()); + for (std::list::iterator aSub = allRes.begin(); aSub != allRes.end(); aSub++) { + ResultPtr aResCont = *aSub; + const std::set& aRefs = aResCont->data()->refsToMe(); + std::set::const_iterator aRef = aRefs.begin(); + for (; aRef != aRefs.end(); aRef++) { + if (!aRef->get() || !(*aRef)->owner().get()) + continue; + // concealed attribute only + FeaturePtr aRefFeat = std::dynamic_pointer_cast((*aRef)->owner()); + if (aRefFeat == aThisFeature) + continue; + if (!ModelAPI_Session::get()->validators()->isConcealed( + aRefFeat->getKind(), (*aRef)->id())) + continue; + if (theDoc->isLaterByDep(aThisFeature, aRefFeat)) { + // for extrusion cut in python script the nested sketch reference may be concealed before + // it is nested, so, check this composite feature is valid + static ModelAPI_ValidatorsFactory* aFactory = ModelAPI_Session::get()->validators(); + // need to be validated to update the "Apply" state if not previewed + if (aFactory->validate(aRefFeat)) + return true; // feature conceals result, return true, so the context will be removed + } + } + } return false; // no modifications found, must stay the same + } // iterate all results to find further modifications std::set::iterator aResIter = aResults.begin(); for(; aResIter != aResults.end(); aResIter++) { @@ -1312,7 +1383,7 @@ bool Model_AttributeSelection::searchNewContext(std::shared_ptr return true; // theResults must be empty: everything is deleted } -void Model_AttributeSelection::updateInHistory() +void Model_AttributeSelection::updateInHistory(bool& theRemove) { ResultPtr aContext = std::dynamic_pointer_cast(myRef.value()); // only bodies and parts may be modified later in the history, don't do anything otherwise @@ -1346,7 +1417,7 @@ void Model_AttributeSelection::updateInHistory() continue; FeaturePtr aRefFeat = std::dynamic_pointer_cast((*aRef)->owner()); - if (aRefFeat.get() && aRefFeat != owner()) { + if (aRefFeat.get() && aRefFeat != owner() && aRefFeat->firstResult().get()) { FeaturePtr aThisFeature = std::dynamic_pointer_cast(owner()); if (!aDoc->isLaterByDep(aRefFeat, aThisFeature)) { // found better feature aFoundNewContext = true; @@ -1385,17 +1456,36 @@ void Model_AttributeSelection::updateInHistory() TopTools_ListOfShape aValShapes; if (searchNewContext(aDoc, aNewCShape, aContext, aValShape, aContLab, aNewContexts, aValShapes)) { + std::set allContexts, aSkippedContext; + std::list::iterator aNewContext = aNewContexts.begin(); + for(; aNewContext != aNewContexts.end(); aNewContext++) + allContexts.insert(*aNewContext); + + // if there exist context composite and sub-result(s), leave only sub(s) + std::set::iterator aResIter = allContexts.begin(); + for(; aResIter != allContexts.end(); aResIter++) { + ResultPtr aParent = ModelAPI_Tools::bodyOwner(*aResIter); + for(; aParent.get(); aParent = ModelAPI_Tools::bodyOwner(aParent)) + if (allContexts.count(aParent)) + aSkippedContext.insert(aParent); + } + GeomAPI_Shape::ShapeType aListShapeType = GeomAPI_Shape::SHAPE; if (myParent) { - if (myParent->selectionType() == "VERTEX") aListShapeType = GeomAPI_Shape::VERTEX; - else if (myParent->selectionType() == "EDGE") aListShapeType = GeomAPI_Shape::EDGE; - else if (myParent->selectionType() == "FACE") aListShapeType = GeomAPI_Shape::FACE; + if (myParent->selectionType() == "VERTEX" || myParent->selectionType() == "Vertices") + aListShapeType = GeomAPI_Shape::VERTEX; + else if (myParent->selectionType() == "EDGE" || myParent->selectionType() == "Edges") + aListShapeType = GeomAPI_Shape::EDGE; + else if (myParent->selectionType() == "FACE" || myParent->selectionType() == "Faces") + aListShapeType = GeomAPI_Shape::FACE; } std::list::iterator aNewCont = aNewContexts.begin(); TopTools_ListIteratorOfListOfShape aNewValues(aValShapes); bool aFirst = true; // first is set to this, next are appended to parent for(; aNewCont != aNewContexts.end(); aNewCont++, aNewValues.Next()) { + if (aSkippedContext.count(*aNewCont)) + continue; GeomShapePtr aValueShape; if (!aNewValues.Value().IsNull()) { @@ -1412,18 +1502,24 @@ void Model_AttributeSelection::updateInHistory() if (aListShapeType != GeomAPI_Shape::SHAPE && aListShapeType != aShapeShapeType) { continue; } + if (aFirst) { setValue(*aNewCont, aValueShape); aFirst = false; } else if (myParent) { - myParent->append(*aNewCont, aValueShape); + if (!myParent->isInList(*aNewCont, aValueShape)) // avoid addition of duplicates + myParent->append(*aNewCont, aValueShape); } } if (aFirst) { // nothing was added, all results were deleted - ResultPtr anEmptyContext; - std::shared_ptr anEmptyShape; - setValue(anEmptyContext, anEmptyShape); // nullify the selection - return; + if (myParent) { + theRemove = true; + } else { + ResultPtr anEmptyContext; + std::shared_ptr anEmptyShape; + setValue(anEmptyContext, anEmptyShape); // nullify the selection + return; + } } } } @@ -1559,18 +1655,6 @@ bool Model_AttributeSelection::restoreContext(std::string theName, return true; } -TDF_Label Model_AttributeSelection::newestContext(const TDF_Label theCurrentContext) { - std::shared_ptr aDoc = myRestoreDocument.get() ? myRestoreDocument : - std::dynamic_pointer_cast(owner()->document()); - ResultPtr aContext = aDoc->resultByLab(theCurrentContext); - if (aContext.get()) { - aContext = newestContext(aContext, GeomShapePtr(), true); - if (aContext.get()) - return std::dynamic_pointer_cast(aContext->data())->label(); - } - return theCurrentContext; // nothing is changed -} - bool Model_AttributeSelection::isLater( const TDF_Label theResult1, const TDF_Label theResult2) const { @@ -1586,7 +1670,7 @@ bool Model_AttributeSelection::isLater( } ResultPtr Model_AttributeSelection::newestContext( - const ResultPtr theCurrent, const GeomShapePtr theValue, const bool theAnyValue) + const ResultPtr theCurrent, const GeomShapePtr theValue) { ResultPtr aResult = theCurrent; GeomShapePtr aSelectedShape = theValue.get() ? theValue : theCurrent->shape(); @@ -1609,7 +1693,7 @@ ResultPtr Model_AttributeSelection::newestContext( TDF_Label aLab = aNS->Label(); ResultPtr aRes = aDoc->resultByLab(aLab); if (aRes.get()) { - if (theAnyValue || aRes->shape()->isSubShape(aSelectedShape)) { + if (aRes->shape()->isSubShape(aSelectedShape)) { aResult = aRes; aFindNewContext = true; continue; @@ -1618,47 +1702,6 @@ ResultPtr Model_AttributeSelection::newestContext( } } } - if (theAnyValue) { // only for neighbors for now - // try to find modification of sub-shapes: the best number of matches - std::map aMatches; // result -> number of matches of shapes to find the best - TDF_Label aResLab = std::dynamic_pointer_cast(aResult->data())->shapeLab(); - TDF_ChildIDIterator aModifIter(aResLab, TNaming_NamedShape::GetID()); - for(; aModifIter.More(); aModifIter.Next()) { - Handle(TNaming_NamedShape) aNS = Handle(TNaming_NamedShape)::DownCast(aModifIter.Value()); - if (aNS->Evolution() == TNaming_MODIFY || aNS->Evolution() == TNaming_GENERATED) { - for(TNaming_Iterator aNSIter(aNS); aNSIter.More(); aNSIter.Next()) { - TNaming_NewShapeIterator aNewIter(aNSIter.NewShape(), aNS->Label()); - for(; aNewIter.More(); aNewIter.Next()) { - TDF_Label aLab = aNewIter.Label(); - if (isLater(aLab, aNS->Label()) && isLater(selectionLabel(), aLab)) { - ResultPtr aRes = aDoc->resultByLab(aLab); - if (aRes.get()) { - if (aMatches.find(aRes) == aMatches.end()) - aMatches[aRes] = 0; - aMatches[aRes]++; // found result, add matches - } - } - } - } - } - } - // searching for the best result-candidate - int aBest = 0; - ResultPtr aBestResult; - std::map::iterator aMatchIter = aMatches.begin(); - for(; aMatchIter != aMatches.end(); aMatchIter++) { - if (aMatchIter->second > aBest) { - aBest = aMatchIter->second; - aBestResult = aMatchIter->first; - } - } - if (aBestResult.get()) { - aResult = aBestResult; - aFindNewContext = true; - continue; - } - } - // TestFillWireVertex.py - sketch constructions for wire may participate too //if (aResult->groupName() == ModelAPI_ResultBody::group()) { @@ -1704,43 +1747,15 @@ ResultPtr Model_AttributeSelection::newestContext( } std::list >::iterator aResIter = aResults.begin(); - if (theAnyValue) { // searching the best sub-result by maximum number of references to orig - int aReferencesCount = 0; - ResultPtr aBestResult; - for (; aResIter != aResults.end(); aResIter++) { - if (!aResIter->get() || !(*aResIter)->data()->isValid() || (*aResIter)->isDisabled()) - continue; - TDF_Label aCandidateLab = - std::dynamic_pointer_cast((*aResIter)->data())->shapeLab(); - Handle(TDF_Reference) aRef; - if (aCandidateLab.FindAttribute(TDF_Reference::GetID(), aRef)) { - TDF_Label aRefLab = aRef->Get(); - ResultPtr aRefRes = aDoc->resultByLab(aRefLab); - if (aRefRes.get() && aRefRes->shape().get() && - aRefRes->shape()->isEqual(aResult->shape())) {// it directly references to result - aResult = *aResIter; // found new context (produced from this) with same subshape - aFindNewContext = true; // continue searching further - break; - } - } else { - if (!aBestResult.get()) - aBestResult = *aResIter; - } - } - if (aBestResult.get() && !aFindNewContext) { // the first good result for now - aResult = aBestResult; // found new context - aFindNewContext = true; - } - } else { // searching by sub-shape - for (; aResIter != aResults.end(); aResIter++) { - if (!aResIter->get() || !(*aResIter)->data()->isValid() || (*aResIter)->isDisabled()) - continue; - GeomShapePtr aShape = (*aResIter)->shape(); - if (aShape.get() && (theAnyValue || aShape->isSubShape(aSelectedShape, false))) { - aResult = *aResIter; // found new context (produced from this) with same subshape - aFindNewContext = true; // continue searching further - break; - } + // searching by sub-shape + for (; aResIter != aResults.end(); aResIter++) { + if (!aResIter->get() || !(*aResIter)->data()->isValid() || (*aResIter)->isDisabled()) + continue; + GeomShapePtr aShape = (*aResIter)->shape(); + if (aShape.get() && aShape->isSubShape(aSelectedShape, false)) { + aResult = *aResIter; // found new context (produced from this) with same subshape + aFindNewContext = true; // continue searching further + break; } } } @@ -1755,7 +1770,7 @@ ResultPtr Model_AttributeSelection::newestContext( for (; aS != allSubs.end(); aS++) { ResultBodyPtr aSub = std::dynamic_pointer_cast(*aS); if (aSub && aSub->numberOfSubs() == 0 && aSub->shape().get() && - (theAnyValue || aSub->shape()->isSubShape(aSelectedShape))) { + aSub->shape()->isSubShape(aSelectedShape)) { aResult = aSub; break; }