X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_AttributeRefAttr.cpp;h=0c24fe3e1b762cfa047e634473aca9408b288c2c;hb=283433d9c2f39fbd332d6eba691b6a0cd875e29d;hp=2d900eb142221d089617a372e714d182ebf54aa2;hpb=149dcd65a901bded64e17047cd5bf91921fa8bba;p=modules%2Fshaper.git diff --git a/src/Model/Model_AttributeRefAttr.cpp b/src/Model/Model_AttributeRefAttr.cpp index 2d900eb14..0c24fe3e1 100644 --- a/src/Model/Model_AttributeRefAttr.cpp +++ b/src/Model/Model_AttributeRefAttr.cpp @@ -7,6 +7,7 @@ #include "Model_AttributeRefAttr.h" #include "Model_Application.h" #include "Model_Data.h" +#include "Model_Objects.h" #include using namespace std; @@ -23,8 +24,10 @@ void Model_AttributeRefAttr::setAttr(std::shared_ptr theAttr string anID = aData->id(theAttr); if (myIsInitialized && object() == theAttr->owner() && myID->Get().IsEqual(anID.c_str())) return; // nothing is changed + REMOVE_BACK_REF(theAttr->owner()); myRef->Set(aData->label().Father()); myID->Set(aData->id(theAttr).c_str()); + ADD_BACK_REF(theAttr->owner()); owner()->data()->sendAttributeUpdated(this); } @@ -43,16 +46,9 @@ void Model_AttributeRefAttr::setObject(ObjectPtr theObject) { // the back reference from the previous object to the attribute should be removed ObjectPtr anObject = object(); - if (anObject.get() && anObject != theObject) { - FeaturePtr anOwnerFeature = std::dynamic_pointer_cast(owner()); - if (anOwnerFeature.get()) { - std::shared_ptr aData = std::dynamic_pointer_cast( - anObject->data()); - aData->removeBackReference(anOwnerFeature, id()); - } - } + if (theObject.get() && (!myIsInitialized || myID->Get().Length() != 0 || object() != theObject)) { + REMOVE_BACK_REF(anObject); - if (theObject && (!myIsInitialized || myID->Get().Length() != 0 || object() != theObject)) { std::shared_ptr aData = std::dynamic_pointer_cast( theObject->data()); myRef->Set(aData->label().Father()); @@ -64,8 +60,10 @@ void Model_AttributeRefAttr::setObject(ObjectPtr theObject) if (anOwnerFeature.get()) { aData->addBackReference(anOwnerFeature, id(), false); } + ADD_BACK_REF(theObject); owner()->data()->sendAttributeUpdated(this); } else if (theObject.get() == NULL) { + REMOVE_BACK_REF(anObject); myRef->Set(myRef->Label()); // reference to itself means that object is null myID->Set(""); // feature is identified by the empty ID owner()->data()->sendAttributeUpdated(this); @@ -79,13 +77,21 @@ ObjectPtr Model_AttributeRefAttr::object() owner()->document()); if (aDoc) { TDF_Label aRefLab = myRef->Get(); - return aDoc->object(aRefLab); + return aDoc->objects()->object(aRefLab); } } // not initialized return ObjectPtr(); } +bool Model_AttributeRefAttr::isInitialized() +{ + if (myRef->Get() == myRef->Label()) { // empty is not initialized: sketch parallelity + return false; + } + return ModelAPI_AttributeRefAttr::isInitialized(); +} + Model_AttributeRefAttr::Model_AttributeRefAttr(TDF_Label& theLabel) { myIsInitialized = theLabel.FindAttribute(TDataStd_Comment::GetID(), myID) == Standard_True;