X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_AttributeReference.cpp;h=beb04549cffe4a51c359d83158e386613ddb07e8;hb=ebf59abe16d4ccc81cd1eb506f1f897c06a41ccb;hp=91de64eb567de9f94889a6274c98f8ae8c6dcebc;hpb=a24b7e6f4d112d5e7889fd76f030298fc428cd01;p=modules%2Fshaper.git diff --git a/src/Model/Model_AttributeReference.cpp b/src/Model/Model_AttributeReference.cpp index 91de64eb5..beb04549c 100644 --- a/src/Model/Model_AttributeReference.cpp +++ b/src/Model/Model_AttributeReference.cpp @@ -8,6 +8,7 @@ #include "Model_Application.h" #include "Model_Events.h" #include "Model_Data.h" +#include "Model_Objects.h" #include #include @@ -19,18 +20,27 @@ using namespace std; void Model_AttributeReference::setValue(ObjectPtr theObject) { - if(!theObject) - return; - if (!myIsInitialized || value() != theObject) { - std::shared_ptr aData = std::dynamic_pointer_cast( - theObject->data()); - TDF_Label anObjLab = aData->label().Father(); // object label + // now allow to deselect in this attribute: extrusion from/to + //if(!theObject) + // return; + ObjectPtr aValue = value(); + if (!myIsInitialized || aValue != theObject) { + REMOVE_BACK_REF(aValue); - if (owner()->document() == theObject->document()) { // same document, use reference attribute + TDF_Label anObjLab; + if (theObject.get() && theObject->data()->isValid()) { + std::shared_ptr aData = std::dynamic_pointer_cast( + theObject->data()); + anObjLab = aData->label().Father(); // object label + } + // same document, use reference attribute + if (anObjLab.IsNull() || owner()->document() == theObject->document()) { - std::shared_ptr aDoc = - std::dynamic_pointer_cast(owner()->document()); - myRef->Set(anObjLab); // references to the object label + if (anObjLab.IsNull()) { + myRef->Set(myRef->Label()); + } else { + myRef->Set(anObjLab); // references to the object label + } // remove external link attributes (if any) myRef->Label().ForgetAttribute(TDataStd_Comment::GetID()); myRef->Label().ForgetAttribute(TDataStd_AsciiString::GetID()); @@ -43,10 +53,7 @@ void Model_AttributeReference::setValue(ObjectPtr theObject) } // do it before the transaction finish to make just created/removed objects know dependencies // and reference from composite feature is removed automatically - FeaturePtr anOwnerFeature = std::dynamic_pointer_cast(owner()); - if (anOwnerFeature.get()) { - aData->addBackReference(anOwnerFeature, id()); - } + ADD_BACK_REF(theObject); owner()->data()->sendAttributeUpdated(this); } @@ -54,7 +61,7 @@ void Model_AttributeReference::setValue(ObjectPtr theObject) ObjectPtr Model_AttributeReference::value() { - if (myIsInitialized) { + if (isInitialized()) { Handle(TDataStd_Comment) aDocID; if (myRef->Label().FindAttribute(TDataStd_Comment::GetID(), aDocID)) { // external ref DocumentPtr aRefDoc = @@ -64,9 +71,9 @@ ObjectPtr Model_AttributeReference::value() if (myRef->Label().FindAttribute(TDataStd_AsciiString::GetID(), anEntry)) { std::shared_ptr aDR = std::dynamic_pointer_cast(aRefDoc); TDF_Label aRefLab; - TDF_Tool::Label(aDR->featuresLabel().Data(), anEntry->Get().ToCString(), aRefLab); + TDF_Tool::Label(aDR->objects()->featuresLabel().Data(), anEntry->Get().ToCString(), aRefLab); if (!aRefLab.IsNull()) { - return aDR->object(aRefLab); + return aDR->objects()->object(aRefLab); } } } @@ -76,7 +83,7 @@ ObjectPtr Model_AttributeReference::value() if (aDoc) { TDF_Label aRefLab = myRef->Get(); if (!aRefLab.IsNull()) { // it may happen with old document, issue #285 - return aDoc->object(aRefLab); + return aDoc->objects()->object(aRefLab); } } } @@ -85,6 +92,15 @@ ObjectPtr Model_AttributeReference::value() return FeaturePtr(); } +bool Model_AttributeReference::isInitialized() +{ + if (myRef->Label() == myRef->Get() && !myRef->Label().IsAttribute(TDataStd_Comment::GetID())) { + // empty reference is not initialized + return false; + } + return ModelAPI_AttributeReference::isInitialized(); +} + Model_AttributeReference::Model_AttributeReference(TDF_Label& theLabel) { myIsInitialized = theLabel.FindAttribute(TDF_Reference::GetID(), myRef) == Standard_True;