X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FModel%2FModel_AttributeReference.cpp;h=cc8dc2f0908ef5ebfadae551a52b9966766abad1;hb=77ce6d35ac8d2f0fdaecb4f23e0870bf74e36103;hp=105639b742fdda4b3b8b17887361e436875b2ff3;hpb=65350bc1b9ac17e42959fb98d650a7791b3cdf06;p=modules%2Fshaper.git diff --git a/src/Model/Model_AttributeReference.cpp b/src/Model/Model_AttributeReference.cpp index 105639b74..cc8dc2f09 100644 --- a/src/Model/Model_AttributeReference.cpp +++ b/src/Model/Model_AttributeReference.cpp @@ -1,53 +1,149 @@ -// File: ModelAPI_AttributeReference.cxx -// Created: 2 Apr 2014 -// Author: Mikhail PONIKAROV +// Copyright (C) 2014-2024 CEA, EDF +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// 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 +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include "Model_AttributeReference.h" #include "Model_Application.h" #include "Model_Events.h" #include "Model_Data.h" +#include "Model_Objects.h" #include -#include +#include -using namespace std; +#include +#include +#include -void Model_AttributeReference::setValue(boost::shared_ptr theFeature) +void Model_AttributeReference::setValue(ObjectPtr theObject) { - if (value() != theFeature) { - boost::shared_ptr aData = - boost::dynamic_pointer_cast(theFeature->data()); - if (myRef.IsNull()) { - boost::shared_ptr aMyData = - boost::dynamic_pointer_cast(owner()->data()); - TDF_Reference::Set(aMyData->label(), aData->label()); - } else { - myRef->Set(aData->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); + + 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()) { + + 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()); + } 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 + std::ostringstream anIdString; // string with document Id + anIdString<document()->id(); + TDataStd_Comment::Set(myRef->Label(), anIdString.str().c_str()); + TCollection_AsciiString anEntry; + TDF_Tool::Entry(anObjLab, anEntry); + TDataStd_AsciiString::Set(myRef->Label(), anEntry); } + // do it before the transaction finish to make just created/removed objects know dependencies + // and reference from composite feature is removed automatically + ADD_BACK_REF(theObject); - static Events_ID anEvent = Events_Loop::eventByName(EVENT_FEATURE_UPDATED); - Model_FeatureUpdatedMessage aMsg(owner(), anEvent); - Events_Loop::loop()->send(aMsg); + owner()->data()->sendAttributeUpdated(this); } } -boost::shared_ptr Model_AttributeReference::value() +ObjectPtr Model_AttributeReference::value() { - if (!myRef.IsNull()) { - boost::shared_ptr aDoc = - boost::dynamic_pointer_cast(owner()->document()); - if (aDoc) { - TDF_Label aRefLab = myRef->Get(); - return aDoc->feature(aRefLab); + Handle(TDataStd_Comment) aDocID; + if (myRef->Label().FindAttribute(TDataStd_Comment::GetID(), aDocID)) { // external ref + int anID = atoi(TCollection_AsciiString(aDocID->Get()).ToCString()); + DocumentPtr aRefDoc = Model_Application::getApplication()->document(anID); + if (aRefDoc.get()) { + Handle(TDataStd_AsciiString) anEntry; + if (myRef->Label().FindAttribute(TDataStd_AsciiString::GetID(), anEntry)) { + std::shared_ptr aDR = std::dynamic_pointer_cast(aRefDoc); + if (aDR.get() && aDR->objects()) { + TDF_Label aRefLab; + TDF_Tool::Label(aDR->objects()->featuresLabel().Data(), + anEntry->Get().ToCString(), aRefLab); + if (!aRefLab.IsNull()) { + return aDR->objects()->object(aRefLab); + } + } + } + } + } else { // internal ref + if (owner().get()) { + 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->objects()->object(aRefLab); + } + } } } - // not initialized - return boost::shared_ptr(); + 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) { - // check the attribute could be already presented in this doc (after load document) - if (!theLabel.FindAttribute(TDF_Reference::GetID(), myRef)) { - // create attribute: not initialized by value yet: attribute is not set to the label! + myLab = theLabel; + reinit(); +} + +void Model_AttributeReference::reinit() +{ + myIsInitialized = myLab.FindAttribute(TDF_Reference::GetID(), myRef) == Standard_True; + if (!myIsInitialized) { + myRef = TDF_Reference::Set(myLab, myLab); // not initialized references to itself + myIsInitialized = true; + } else { + 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() +{}