X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_AttributeReference.cpp;h=cc8dc2f0908ef5ebfadae551a52b9966766abad1;hb=77ce6d35ac8d2f0fdaecb4f23e0870bf74e36103;hp=beb04549cffe4a51c359d83158e386613ddb07e8;hpb=4af82842098757e6e7f4f28e2eb744d184bb2b3e;p=modules%2Fshaper.git diff --git a/src/Model/Model_AttributeReference.cpp b/src/Model/Model_AttributeReference.cpp index beb04549c..cc8dc2f09 100644 --- a/src/Model/Model_AttributeReference.cpp +++ b/src/Model/Model_AttributeReference.cpp @@ -1,8 +1,21 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// 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" @@ -16,8 +29,6 @@ #include #include -using namespace std; - void Model_AttributeReference::setValue(ObjectPtr theObject) { // now allow to deselect in this attribute: extrusion from/to @@ -46,7 +57,9 @@ void Model_AttributeReference::setValue(ObjectPtr theObject) 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()); + 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); @@ -61,23 +74,26 @@ void Model_AttributeReference::setValue(ObjectPtr theObject) ObjectPtr Model_AttributeReference::value() { - if (isInitialized()) { - 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); + 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); + TDF_Tool::Label(aDR->objects()->featuresLabel().Data(), + anEntry->Get().ToCString(), aRefLab); if (!aRefLab.IsNull()) { return aDR->objects()->object(aRefLab); } } } - } else { // internal ref + } + } else { // internal ref + if (owner().get()) { std::shared_ptr aDoc = std::dynamic_pointer_cast( owner()->document()); if (aDoc) { @@ -88,7 +104,6 @@ ObjectPtr Model_AttributeReference::value() } } } - // not initialized return FeaturePtr(); } @@ -103,9 +118,16 @@ bool Model_AttributeReference::isInitialized() Model_AttributeReference::Model_AttributeReference(TDF_Label& theLabel) { - myIsInitialized = theLabel.FindAttribute(TDF_Reference::GetID(), myRef) == Standard_True; + myLab = theLabel; + reinit(); +} + +void Model_AttributeReference::reinit() +{ + myIsInitialized = myLab.FindAttribute(TDF_Reference::GetID(), myRef) == Standard_True; if (!myIsInitialized) { - myRef = TDF_Reference::Set(theLabel, theLabel); // not initialized references to itself + myRef = TDF_Reference::Set(myLab, myLab); // not initialized references to itself + myIsInitialized = true; } else { if (owner()) { std::shared_ptr aDoc = @@ -118,14 +140,10 @@ void Model_AttributeReference::setObject(const std::shared_ptr& { if (owner() != theObject) { ModelAPI_AttributeReference::setObject(theObject); - std::shared_ptr aDoc = - std::dynamic_pointer_cast(owner()->document()); + //std::shared_ptr aDoc = + // std::dynamic_pointer_cast(owner()->document()); } } Model_AttributeReference::~Model_AttributeReference() -{ - std::shared_ptr aDoc = - std::dynamic_pointer_cast(owner()->document()); - TDF_Label aLab = myRef->Get(); -} +{}