X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FModel%2FModel_AttributeSelection.cpp;h=8391d72f551a6f083722c39e003b7b065145bcb6;hb=eee78431f08c89e0eb96e6516aca6980702658d3;hp=cf482e2df5b9ba2ea221c7234e61bedd9e7b803e;hpb=782ddee7ec183e10378487f5bdd27d4b00124f81;p=modules%2Fshaper.git diff --git a/src/Model/Model_AttributeSelection.cpp b/src/Model/Model_AttributeSelection.cpp index cf482e2df..8391d72f5 100644 --- a/src/Model/Model_AttributeSelection.cpp +++ b/src/Model/Model_AttributeSelection.cpp @@ -11,6 +11,7 @@ #include "Model_Document.h" #include "Model_SelectionNaming.h" #include +#include #include #include #include @@ -61,7 +62,6 @@ #include #include -using namespace std; //#define DEB_NAMING 1 #ifdef DEB_NAMING #include @@ -130,7 +130,7 @@ void Model_AttributeSelection::setValue(const ResultPtr& theContext, if (theContext->groupName() == ModelAPI_ResultBody::group()) { // do not select the whole shape for body:it is already must be in the data framework // equal and null selected objects mean the same: object is equal to context, - if (theContext->shape().get() && + if (theContext->shape().get() && (theContext->shape()->isEqual(theSubShape) || !theSubShape.get())) { aSelLab.ForgetAllAttributes(true); TDataStd_UAttribute::Set(aSelLab, kSIMPLE_REF_ID); @@ -142,14 +142,14 @@ void Model_AttributeSelection::setValue(const ResultPtr& theContext, // to sub, so the whole result is selected aSelLab.ForgetAllAttributes(true); TDataStd_UAttribute::Set(aSelLab, kCONSTUCTION_SIMPLE_REF_ID); - ResultConstructionPtr aConstruction = + ResultConstructionPtr aConstruction = std::dynamic_pointer_cast(theContext); 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(theContext->shape()->impl()); - std::shared_ptr aMyDoc = + std::shared_ptr aMyDoc = std::dynamic_pointer_cast(owner()->document()); //std::string aName = contextName(theContext); // for selection in different document, add the document name @@ -181,11 +181,20 @@ void Model_AttributeSelection::setValue(const ResultPtr& theContext, owner()->data()->sendAttributeUpdated(this); } +void Model_AttributeSelection::removeTemporaryValues() +{ + if (myTmpContext.get() || myTmpSubShape.get()) { + myTmpContext.reset(); + myTmpSubShape.reset(); + } +} + std::shared_ptr Model_AttributeSelection::value() { GeomShapePtr aResult; if (myTmpContext.get() || myTmpSubShape.get()) { - ResultConstructionPtr aResulConstruction = std::dynamic_pointer_cast(myTmpContext); + ResultConstructionPtr aResulConstruction = + std::dynamic_pointer_cast(myTmpContext); if(aResulConstruction.get()) { // it is just reference to construction. return myTmpSubShape; @@ -200,11 +209,12 @@ std::shared_ptr Model_AttributeSelection::value() if (myRef.isInitialized()) { if (aSelLab.IsAttribute(kSIMPLE_REF_ID)) { // it is just reference to shape, not sub-shape ResultPtr aContext = context(); - if (!aContext.get()) + if (!aContext.get()) return aResult; // empty result return aContext->shape(); } - if (aSelLab.IsAttribute(kCONSTUCTION_SIMPLE_REF_ID)) { // it is just reference to construction, nothing is in value + if (aSelLab.IsAttribute(kCONSTUCTION_SIMPLE_REF_ID)) { + // it is just reference to construction, nothing is in value return aResult; // empty result } if (aSelLab.IsAttribute(kPART_REF_ID)) { @@ -220,8 +230,8 @@ std::shared_ptr Model_AttributeSelection::value() 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); + if (aPartEnd != std::string::npos && aPartEnd != aSubShapeName.rfind('/')) { + std::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); @@ -237,7 +247,7 @@ std::shared_ptr Model_AttributeSelection::value() aResult = std::shared_ptr(new GeomAPI_Shape); aResult->setImpl(new TopoDS_Shape(aSelShape)); } else { // for simple construction element: just shape of this construction element - ResultConstructionPtr aConstr = + ResultConstructionPtr aConstr = std::dynamic_pointer_cast(context()); if (aConstr) { return aConstr->shape(); @@ -262,7 +272,8 @@ bool Model_AttributeSelection::isInitialized() ResultPtr aContext = context(); return aContext.get() != NULL; } - if (aSelLab.IsAttribute(kCONSTUCTION_SIMPLE_REF_ID)) { // it is just reference to construction, nothing is in value + if (aSelLab.IsAttribute(kCONSTUCTION_SIMPLE_REF_ID)) { + // it is just reference to construction, nothing is in value return true; } @@ -270,7 +281,7 @@ 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 - ResultConstructionPtr aConstr = + ResultConstructionPtr aConstr = std::dynamic_pointer_cast(context()); if (aConstr.get()) { return aConstr->shape().get() != NULL; @@ -285,6 +296,7 @@ Model_AttributeSelection::Model_AttributeSelection(TDF_Label& theLabel) : myRef(theLabel) { myIsInitialized = myRef.isInitialized(); + myParent = NULL; } void Model_AttributeSelection::setID(const std::string theID) @@ -332,7 +344,7 @@ TDF_LabelMap& Model_AttributeSelection::scope() std::list > allFeatures = aMyDoc->allFeatures(); std::list >::iterator aFIter = allFeatures.begin(); bool aMePassed = false; - CompositeFeaturePtr aComposite = + CompositeFeaturePtr aComposite = std::dynamic_pointer_cast(owner()); FeaturePtr aFeature = std::dynamic_pointer_cast(owner()); CompositeFeaturePtr aCompositeOwner, aCompositeOwnerOwner; @@ -351,7 +363,8 @@ TDF_LabelMap& Model_AttributeSelection::scope() } if (isGroup) aMePassed = false; bool isInScope = !aMePassed; - if (!isInScope && aComposite.get()) { // try to add sub-elements of composite if this is composite + if (!isInScope && aComposite.get()) { + // try to add sub-elements of composite if this is composite if (aComposite->isSub(*aFIter)) isInScope = true; } @@ -390,14 +403,15 @@ bool Model_AttributeSelection::update() { TDF_Label aSelLab = selectionLabel(); ResultPtr aContext = context(); - if (!aContext.get()) + if (!aContext.get()) return setInvalidIfFalse(aSelLab, false); if (aSelLab.IsAttribute(kSIMPLE_REF_ID)) { // it is just reference to shape, not sub-shape return setInvalidIfFalse(aSelLab, aContext->shape() && !aContext->shape()->isNull()); } - if (aSelLab.IsAttribute(kCONSTUCTION_SIMPLE_REF_ID)) { // it is just reference to construction, not sub-shape + if (aSelLab.IsAttribute(kCONSTUCTION_SIMPLE_REF_ID)) { + // it is just reference to construction, not sub-shape // if there is a sketch, the sketch-naming must be updated - ResultConstructionPtr aConstruction = + ResultConstructionPtr aConstruction = std::dynamic_pointer_cast(aContext); if (!aConstruction->isInfinite()) { BRep_Builder aCompoundBuilder; @@ -415,11 +429,8 @@ bool Model_AttributeSelection::update() // It seems sub-shapes are not needed: only this shape is (and can be ) selected. TNaming_Builder aBuilder(aSelLab); aBuilder.Generated(aContext->shape()->impl()); - std::shared_ptr aMyDoc = + std::shared_ptr aMyDoc = std::dynamic_pointer_cast(owner()->document()); - //std::string aName = contextName(aContext); - //aMyDoc->addNamingName(aSelLab, aName); - //TDataStd_Name::Set(aSelLab, aName.c_str()); } return setInvalidIfFalse(aSelLab, aContext->shape() && !aContext->shape()->isNull()); } @@ -442,23 +453,53 @@ bool Model_AttributeSelection::update() anOldShape = aSelector.NamedShape()->Get(); } bool aResult = aSelector.Solve(scope()) == Standard_True; - aResult = setInvalidIfFalse(aSelLab, aResult); // must be before sending of updated attribute (1556) + // must be before sending of updated attribute (1556) + aResult = setInvalidIfFalse(aSelLab, aResult); TopoDS_Shape aNewShape; if (!aSelector.NamedShape().IsNull()) { aNewShape = aSelector.NamedShape()->Get(); } if (anOldShape.IsNull() || aNewShape.IsNull() || - !anOldShape.IsEqual(aSelector.NamedShape()->Get())) // send updated if shape is changed - owner()->data()->sendAttributeUpdated(this); + !anOldShape.IsEqual(aSelector.NamedShape()->Get())) { + // shape type shoud not not changed: if shape becomes compound of such shapes, then split + if (myParent && !anOldShape.IsNull() && !aNewShape.IsNull() && + anOldShape.ShapeType() != aNewShape.ShapeType() && + aNewShape.ShapeType() == TopAbs_COMPOUND) { + TopTools_ListOfShape aSubs; + for(TopoDS_Iterator anExplorer(aNewShape); anExplorer.More(); anExplorer.Next()) { + if (!anExplorer.Value().IsNull() && + anExplorer.Value().ShapeType() == anOldShape.ShapeType()) { + aSubs.Append(anExplorer.Value()); + } else { // invalid case; bad result shape, so, impossible to split easily + aSubs.Clear(); + break; + } + } + if (aSubs.Extent() > 1) { // ok to split + TopTools_ListIteratorOfListOfShape aSub(aSubs); + GeomShapePtr aSubSh(new GeomAPI_Shape); + aSubSh->setImpl(new TopoDS_Shape(aSub.Value())); + setValue(aContext, aSubSh); + for(aSub.Next(); aSub.More(); aSub.Next()) { + GeomShapePtr aSubSh(new GeomAPI_Shape); + aSubSh->setImpl(new TopoDS_Shape(aSub.Value())); + myParent->append(aContext, aSubSh); + } + } + } + owner()->data()->sendAttributeUpdated(this); // send updated if shape is changed + } return aResult; - } else if (aContext->groupName() == ModelAPI_ResultConstruction::group()) { + } + + if (aContext->groupName() == ModelAPI_ResultConstruction::group()) { // construction: identification by the results indexes, recompute faces and // take the face that more close by the indexes - ResultConstructionPtr aConstructionContext = + ResultConstructionPtr aConstructionContext = std::dynamic_pointer_cast(aContext); FeaturePtr aContextFeature = aContext->document()->feature(aContext); // sketch sub-element - if (aConstructionContext && + if (aConstructionContext && std::dynamic_pointer_cast(aContextFeature).get()) { TDF_Label aLab = myRef.myRef->Label(); @@ -471,16 +512,17 @@ bool Model_AttributeSelection::update() // selected indexes will be needed in each "if" Handle(TDataStd_IntPackedMap) aSubIds; std::shared_ptr aNewSelected; - bool aNoIndexes = + bool aNoIndexes = !aLab.FindAttribute(TDataStd_IntPackedMap::GetID(), aSubIds) || aSubIds->Extent() == 0; // for now working only with composite features - CompositeFeaturePtr aComposite = + CompositeFeaturePtr aComposite = std::dynamic_pointer_cast(aContextFeature); if (!aComposite.get() || aComposite->numberOfSubs() == 0) { return setInvalidIfFalse(aSelLab, false); } - if (aShapeType == TopAbs_FACE || aShapeType == TopAbs_WIRE) { // compound is for the whole sketch selection + if (aShapeType == TopAbs_FACE || aShapeType == TopAbs_WIRE) { + // compound is for the whole sketch selection // If this is a wire with plane defined then it is a sketch-like object if (!aConstructionContext->facesNum()) // no faces, update can not work correctly return setInvalidIfFalse(aSelLab, false); @@ -490,7 +532,8 @@ bool Model_AttributeSelection::update() aNewSelected = aConstructionContext->face(0); } else { // searching for most looks-like initial face by the indexes // prepare edges of the current result for the fast searching - NCollection_DataMap allCurves; // curves and orientations of edges + // curves and orientations of edges + NCollection_DataMap allCurves; const int aSubNum = aComposite->numberOfSubs(); for(int a = 0; a < aSubNum; a++) { int aSubID = aComposite->subFeatureId(a); @@ -499,7 +542,7 @@ bool Model_AttributeSelection::update() const std::list >& aResults = aSub->results(); std::list >::const_iterator aRes; for(aRes = aResults.cbegin(); aRes != aResults.cend(); aRes++) { - ResultConstructionPtr aConstr = + ResultConstructionPtr aConstr = std::dynamic_pointer_cast(*aRes); if (aConstr->shape() && aConstr->shape()->isEdge()) { const TopoDS_Shape& aResShape = aConstr->shape()->impl(); @@ -527,7 +570,9 @@ bool Model_AttributeSelection::update() setInvalidIfFalse(aSelLab, true); owner()->data()->sendAttributeUpdated(this); return true; - } else { // if the selection is not found, put the empty shape: it's better to have disappeared shape, than the old, the lost one + } else { + // if the selection is not found, put the empty shape: + // it's better to have disappeared shape, than the old, the lost one TNaming_Builder anEmptyBuilder(selectionLabel()); return setInvalidIfFalse(aSelLab, false); } @@ -542,7 +587,7 @@ bool Model_AttributeSelection::update() std::list >::const_iterator aResIter = aFeature->results().cbegin(); for(;aResIter != aFeature->results().cend(); aResIter++) { - ResultConstructionPtr aRes = + ResultConstructionPtr aRes = std::dynamic_pointer_cast(*aResIter); if (aRes && aRes->shape() && aRes->shape()->isEdge()) { // found! selectConstruction(aContext, aRes->shape()); @@ -571,7 +616,7 @@ bool Model_AttributeSelection::update() std::list >::const_iterator aResIter = aFeature->results().cbegin(); for(;aResIter != aFeature->results().cend(); aResIter++) { - ResultConstructionPtr aRes = + ResultConstructionPtr aRes = std::dynamic_pointer_cast(*aResIter); if (aRes && aRes->shape()) { if (aRes->shape()->isVertex() && aVertexNum == 0) { // found! @@ -616,11 +661,11 @@ void Model_AttributeSelection::selectBody( TNaming_Selector aSel(selectionLabel()); TopoDS_Shape aContext; - ResultBodyPtr aBody = std::dynamic_pointer_cast(myRef.value()); + ResultBodyPtr aBody = std::dynamic_pointer_cast(theContext);//myRef.value() if (aBody) { aContext = aBody->shape()->impl(); } else { - ResultPtr aResult = + ResultPtr aResult = std::dynamic_pointer_cast(myRef.value()); if (aResult) { aContext = aResult->shape()->impl(); @@ -635,9 +680,11 @@ void Model_AttributeSelection::selectBody( TDF_Label aSelLab = selectionLabel(); TopoDS_Shape aNewContext = aContext; bool isUpdated = true; - while(!aNewContext.IsNull() && isUpdated) { // searching for the very last shape that was produced from this one + while(!aNewContext.IsNull() && isUpdated) { + // searching for the very last shape that was produced from this one isUpdated = false; - if (!TNaming_Tool::HasLabel(aSelLab, aNewContext)) // to avoid crash of TNaming_SameShapeIterator if pure shape does not exists + if (!TNaming_Tool::HasLabel(aSelLab, aNewContext)) + // to avoid crash of TNaming_SameShapeIterator if pure shape does not exists break; for(TNaming_SameShapeIterator anIter(aNewContext, aSelLab); anIter.More(); anIter.Next()) { TDF_Label aNSLab = anIter.Label(); @@ -675,31 +722,49 @@ void Model_AttributeSelection::selectBody( } } if (!isFound) { // sub-shape is not found in the up-to-date instance of the context shape + // if context is sub-result of compound/compsolid, selection of sub-shape better propagate to + // the main result (which is may be modified), case is in 1799 + ResultCompSolidPtr aMain = ModelAPI_Tools::compSolidOwner(theContext); + if (aMain.get()) { + selectBody(aMain, theSubShape); + return; + } setInvalidIfFalse(aSelLab, false); - Events_InfoMessage("Model_AttributeSelection", "Failed to select sub-shape already modified").send(); + Events_InfoMessage("Model_AttributeSelection", + "Failed to select sub-shape already modified").send(); return; } } - /// 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(); if (!aContext.IsNull()) { - aSel.Select(aNewSub, aNewContext); + FeaturePtr aFeatureOwner = std::dynamic_pointer_cast(owner()); + bool aEraseResults = false; + if (aFeatureOwner.get()) { + aEraseResults = !aFeatureOwner->results().empty(); + if (aEraseResults) // erase results without flash deleted and redisplay: do it after Select + aFeatureOwner->removeResults(0, false); + } + aSel.Select(aNewSub, aNewContext); + + if (aEraseResults) { // flash after Select : in Groups it makes selection with shift working + static Events_Loop* aLoop = Events_Loop::loop(); + static const Events_ID kDeletedEvent = aLoop->eventByName(EVENT_OBJECT_DELETED); + aLoop->flush(kDeletedEvent); + } } } /// registers the name of the shape in the label (theID == 0) of sub label (theID is a tag) -/// if theID is zero, +/// if theID is zero, /// theOrientation is additional information about the positioning of edge relatively to face -/// it is stored in the integer attribute of the edge sub-label: +/// it is stored in the integer attribute of the edge sub-label: /// -1 is out, 1 is in, 0 is not needed static void registerSubShape(TDF_Label theMainLabel, TopoDS_Shape theShape, const int theID, const FeaturePtr& theContextFeature, std::shared_ptr theDoc, std::map& theOrientations, - std::map& theSubNames, // name of sub-elements by ID to be exported instead of indexes + // name of sub-elements by ID to be exported instead of indexes + std::map& theSubNames, Handle(TDataStd_IntPackedMap) theRefs = Handle(TDataStd_IntPackedMap)(), const int theOrientation = 0) { @@ -746,10 +811,10 @@ static void registerSubShape(TDF_Label theMainLabel, TopoDS_Shape theShape, void Model_AttributeSelection::selectConstruction( const ResultPtr& theContext, const std::shared_ptr& theSubShape) { - std::shared_ptr aMyDoc = + std::shared_ptr aMyDoc = std::dynamic_pointer_cast(owner()->document()); FeaturePtr aContextFeature = theContext->document()->feature(theContext); - CompositeFeaturePtr aComposite = + CompositeFeaturePtr aComposite = std::dynamic_pointer_cast(aContextFeature); const TopoDS_Shape& aSubShape = theSubShape->impl(); if (!aComposite || aComposite->numberOfSubs() == 0) { @@ -771,7 +836,7 @@ void Model_AttributeSelection::selectConstruction( TColStd_MapOfTransient allCurves; if (aShapeType == TopAbs_VERTEX) { // compare positions aVertexPos = BRep_Tool::Pnt(TopoDS::Vertex(aSubShape)); - } else { + } else { for(TopExp_Explorer anEdgeExp(aSubShape, TopAbs_EDGE); anEdgeExp.More(); anEdgeExp.Next()) { TopoDS_Edge anEdge = TopoDS::Edge(anEdgeExp.Current()); Standard_Real aFirst, aLast; @@ -791,7 +856,7 @@ void Model_AttributeSelection::selectConstruction( std::list >::const_iterator aRes = aResults.cbegin(); // there may be many shapes (circle and center): register if at least one is in selection for(; aRes != aResults.cend(); aRes++) { - ResultConstructionPtr aConstr = + ResultConstructionPtr aConstr = std::dynamic_pointer_cast(*aRes); if (!aConstr->shape()) { continue; @@ -851,7 +916,7 @@ void Model_AttributeSelection::selectConstruction( for(; anEdgeExp.More(); anEdgeExp.Next(), aTagIndex += kSTART_VERTEX_DELTA) { TopoDS_Vertex aV = TopoDS::Vertex(anEdgeExp.Current()); - std::stringstream anAdditionalName; + std::stringstream anAdditionalName; registerSubShape( selectionLabel(), aV, aTagIndex, aContextFeature, aMyDoc, anOrientations, aSubNames); @@ -867,7 +932,7 @@ void Model_AttributeSelection::selectConstruction( TNaming_Builder aBuilder(selectionLabel()); aBuilder.Generated(aSubShape); registerSubShape( - selectionLabel(), aSubShape, 0, aContextFeature, aMyDoc, anOrientations, aSubNames, aRefs); + selectionLabel(), aSubShape, 0, aContextFeature, aMyDoc, anOrientations, aSubNames, aRefs); } bool Model_AttributeSelection::selectPart( @@ -879,7 +944,8 @@ bool Model_AttributeSelection::selectPart( return true; // postponed naming if (theUpdate) { Handle(TDataStd_Integer) anIndex; - if (selectionLabel().FindAttribute(TDataStd_Integer::GetID(), anIndex)) { // by internal selection + if (selectionLabel().FindAttribute(TDataStd_Integer::GetID(), anIndex)) { + // by internal selection if (anIndex->Get() > 0) { // update the selection by index return aPart->updateInPart(anIndex->Get()); @@ -934,12 +1000,12 @@ void Model_AttributeSelection::selectSubShape( // check this is Part-name: 2 delimiters in the name std::size_t aPartEnd = theSubShapeName.find('/'); - if (aPartEnd != string::npos && aPartEnd != theSubShapeName.rfind('/')) { + if (aPartEnd != std::string::npos && aPartEnd != theSubShapeName.rfind('/')) { std::string aPartName = theSubShapeName.substr(0, aPartEnd); ObjectPtr aFound = owner()->document()->objectByName(ModelAPI_ResultPart::group(), aPartName); if (aFound.get()) { // found such part, so asking it for the name ResultPartPtr aPart = std::dynamic_pointer_cast(aFound); - string aNameInPart = theSubShapeName.substr(aPartEnd + 1); + std::string aNameInPart = theSubShapeName.substr(aPartEnd + 1); int anIndex; std::shared_ptr aSelected = aPart->shapeInPart(aNameInPart, theType, anIndex); if (aSelected.get()) { @@ -951,12 +1017,12 @@ void Model_AttributeSelection::selectSubShape( } Model_SelectionNaming aSelNaming(selectionLabel()); - std::shared_ptr aDoc = + std::shared_ptr aDoc = std::dynamic_pointer_cast(owner()->document()); std::shared_ptr aShapeToBeSelected; ResultPtr aCont; if (aSelNaming.selectSubShape(theType, theSubShapeName, aDoc, aShapeToBeSelected, aCont)) { - // try to find the last context to find the up to dat shape + // try to find the last context to find the up to date shape if (aCont->shape().get() && !aCont->shape()->isNull() && aCont->groupName() == ModelAPI_ResultBody::group() && aDoc == owner()->document()) { const TopoDS_Shape aConShape = aCont->shape()->impl(); @@ -1082,7 +1148,7 @@ void Model_AttributeSelection::updateInHistory() Handle(TNaming_NamedShape) aContNS; if (!aContLab.FindAttribute(TNaming_NamedShape::GetID(), aContNS)) return; - std::shared_ptr aDoc = + std::shared_ptr aDoc = std::dynamic_pointer_cast(aContext->document()); FeaturePtr aThisFeature = std::dynamic_pointer_cast(owner()); FeaturePtr aCurrentModifierFeat = aDoc->feature(aContext); @@ -1110,7 +1176,8 @@ void Model_AttributeSelection::updateInHistory() break; if (aModifierFeat == aThisFeature || aDoc->objects()->isLater(aModifierFeat, aThisFeature)) continue; // the modifier feature is later than this, so, should not be used - if (aCurrentModifierFeat == aModifierFeat || aDoc->objects()->isLater(aCurrentModifierFeat, aModifierFeat)) + if (aCurrentModifierFeat == aModifierFeat || + aDoc->objects()->isLater(aCurrentModifierFeat, aModifierFeat)) continue; // the current modifier is later than the found, so, useless Handle(TNaming_NamedShape) aNewNS; aModifIter.Label().FindAttribute(TNaming_NamedShape::GetID(), aNewNS); @@ -1119,15 +1186,6 @@ void Model_AttributeSelection::updateInHistory() aCurrentModifierFeat = aModifierFeat; TNaming_Iterator aPairIter(aNewNS); aNewShape = aPairIter.NewShape(); - /* - // searching for sub-shape equivalent on the sub-label of the new context result - TDF_ChildIDIterator aNSIter(aNewNS->Label(), TNaming_NamedShape::GetID()); - for(; aNSIter.More(); aNSIter.Next()) { - TNaming_Iterator aPairsIter(aNSIter.Value()->Label()); - for(; aPairsIter.More(); aPairsIter.Next()) { - if (aSubShape->impl().IsEqual() - } - }*/ anIterate = true; break; } else if (aNewNS->Evolution() == TNaming_DELETE) { // a shape was deleted => result is null @@ -1139,36 +1197,6 @@ void Model_AttributeSelection::updateInHistory() continue; } } - - /* - TNaming_NewShapeIterator aModifIter(aPairIter.NewShape(), aContLab); - if (aModifIter.More()) aModifIter.Next(); // skip this shape result - for(; aModifIter.More(); aModifIter.Next()) { - ResultPtr aModifierObj = std::dynamic_pointer_cast - (aDoc->objects()->object(aModifIter.Label().Father())); - if (!aModifierObj.get()) - break; - FeaturePtr aModifierFeat = aDoc->feature(aModifierObj); - if (!aModifierFeat.get()) - break; - if (aModifierFeat == aThisFeature || aDoc->objects()->isLater(aModifierFeat, aThisFeature)) - break; // the modifier feature is later than this, so, should not be used - Handle(TNaming_NamedShape) aNewNS = aModifIter.NamedShape(); - if (aNewNS->Evolution() == TNaming_MODIFY || aNewNS->Evolution() == TNaming_GENERATED) { - aModifierResFound = aModifierObj; - } else if (aNewNS->Evolution() == TNaming_DELETE) { // a shape was deleted => result is null - ResultPtr anEmptyContext; - std::shared_ptr anEmptyShape; - setValue(anEmptyContext, anEmptyShape); // nullify the selection - return; - } else { // not-precessed modification => don't support it - break; - } - } - // already found what is needed, don't iterate the next pair since normally - if (aModifierResFound.get()) // there must be only one pair in the result-shape - break; - */ } if (aModifierResFound.get()) { // update scope to reset to a new one @@ -1176,38 +1204,9 @@ void Model_AttributeSelection::updateInHistory() myRef.setValue(aModifierResFound); update(); // it must recompute a new sub-shape automatically } - /* - if (aModifierResFound.get()) { - // update scope to reset to a new one - myScope.Clear(); - if (!aSubShape.get() || aSubShape->isNull()) { // no sub-shape, so, just update a context - setValue(aModifierResFound, aSubShape); - return; - } - // seaching for the same sub-shape: the old topology stays the same - TopoDS_Shape anOldShape = aSubShape->impl(); - TopAbs_ShapeEnum aSubType = anOldShape.ShapeType(); - TopoDS_Shape aNewContext = aModifierResFound->shape()->impl(); - TopExp_Explorer anExp(aNewContext, aSubType); - for(; anExp.More(); anExp.Next()) { - if (anExp.Current().IsEqual(anOldShape)) - break; - } - if (anExp.More()) { // found - setValue(aModifierResFound, aSubShape); - return; - } - // seaching for the same sub-shape: equal geometry - for(anExp.Init(aNewContext, aSubType); anExp.More(); anExp.Next()) { - if (aSubType == TopAbs_VERTEX) { - - } - } - }*/ - // if sub-shape selection exists, search also sub-shape new instance - /* - GeomShapePtr aSubShape = value(); - if (aSubShape.get() && aSubShape != aContext->shape()) { +} - }*/ +void Model_AttributeSelection::setParent(Model_AttributeSelectionList* theParent) +{ + myParent = theParent; }