X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_AttributeReference.cpp;h=43bbabe658fff74259890026c982b1302d55670c;hb=fc8500ea0a95bcdd8a811b30fc5330d23a2d3618;hp=4e14efc0af9c9c79dfb6575bc1b4c9075fb195c5;hpb=32d1a4d19ab1a5d7c172e9660130fcf8ecb1e520;p=modules%2Fshaper.git diff --git a/src/Model/Model_AttributeReference.cpp b/src/Model/Model_AttributeReference.cpp index 4e14efc0a..43bbabe65 100644 --- a/src/Model/Model_AttributeReference.cpp +++ b/src/Model/Model_AttributeReference.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + // File: ModelAPI_AttributeReference.cxx // Created: 2 Apr 2014 // Author: Mikhail PONIKAROV @@ -7,6 +9,11 @@ #include "Model_Events.h" #include "Model_Data.h" #include +#include + +#include +#include +#include using namespace std; @@ -15,14 +22,25 @@ void Model_AttributeReference::setValue(ObjectPtr theObject) if(!theObject) return; if (!myIsInitialized || value() != theObject) { - boost::shared_ptr aData = boost::dynamic_pointer_cast( - theObject->data()); + std::shared_ptr aData = std::dynamic_pointer_cast( + theObject->data()); + TDF_Label anObjLab = aData->label().Father(); // object label - boost::shared_ptr aDoc = - boost::dynamic_pointer_cast(owner()->document()); - if (aDoc) aDoc->objectIsNotReferenced(aDoc->object(myRef->Label())); - myRef->Set(aData->label().Father()); // references to the feature label - boost::shared_dynamic_cast(owner()->document())->objectIsReferenced(theObject); + if (owner()->document() == theObject->document()) { // same document, use reference attribute + + std::shared_ptr aDoc = + std::dynamic_pointer_cast(owner()->document()); + 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()); + } else { // different document: store the document name (comment) and entry (string): external + // if these attributes exist, the link is external: keep reference to access the label + TDataStd_Comment::Set(myRef->Label(), theObject->document()->id().c_str()); + TCollection_AsciiString anEntry; + TDF_Tool::Entry(anObjLab, anEntry); + TDataStd_AsciiString::Set(myRef->Label(), anEntry); + } owner()->data()->sendAttributeUpdated(this); } @@ -31,11 +49,30 @@ void Model_AttributeReference::setValue(ObjectPtr theObject) ObjectPtr Model_AttributeReference::value() { if (myIsInitialized) { - boost::shared_ptr aDoc = boost::dynamic_pointer_cast( - owner()->document()); - if (aDoc) { - TDF_Label aRefLab = myRef->Get(); - return aDoc->object(aRefLab); + Handle(TDataStd_Comment) aDocID; + if (myRef->Label().FindAttribute(TDataStd_Comment::GetID(), aDocID)) { // external ref + DocumentPtr aRefDoc = + ModelAPI_Session::get()->document(TCollection_AsciiString(aDocID->Get()).ToCString()); + if (aRefDoc) { + Handle(TDataStd_AsciiString) anEntry; + 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); + if (!aRefLab.IsNull()) { + return aDR->object(aRefLab); + } + } + } + } else { // internal ref + std::shared_ptr aDoc = std::dynamic_pointer_cast( + owner()->document()); + if (aDoc) { + TDF_Label aRefLab = myRef->Get(); + if (!aRefLab.IsNull()) { // it may happen with old document, issue #285 + return aDoc->object(aRefLab); + } + } } } // not initialized @@ -48,15 +85,25 @@ Model_AttributeReference::Model_AttributeReference(TDF_Label& theLabel) if (!myIsInitialized) { myRef = TDF_Reference::Set(theLabel, theLabel); // not initialized references to itself } else { - boost::shared_ptr aDoc = - boost::dynamic_pointer_cast(owner()->document()); - if (aDoc) aDoc->objectIsReferenced(aDoc->object(myRef->Label())); + if (owner()) { + std::shared_ptr aDoc = + std::dynamic_pointer_cast(owner()->document()); + } + } +} + +void Model_AttributeReference::setObject(const std::shared_ptr& theObject) +{ + if (owner() != theObject) { + ModelAPI_AttributeReference::setObject(theObject); + std::shared_ptr aDoc = + std::dynamic_pointer_cast(owner()->document()); } } Model_AttributeReference::~Model_AttributeReference() { - boost::shared_ptr aDoc = - boost::dynamic_pointer_cast(owner()->document()); - if (aDoc) aDoc->objectIsNotReferenced(aDoc->object(myRef->Label())); + std::shared_ptr aDoc = + std::dynamic_pointer_cast(owner()->document()); + TDF_Label aLab = myRef->Get(); }