-// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
-
-// File: ModelAPI_AttributeRefAttrList.cxx
-// Created: 8 May 2014
-// Author: Mikhail PONIKAROV
+// Copyright (C) 2014-2023 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_AttributeRefAttrList.h"
#include "Model_Application.h"
#include <TDF_ListIteratorOfLabelList.hxx>
#include <TDataStd_ListIteratorOfListOfExtendedString.hxx>
-using namespace std;
-
void Model_AttributeRefAttrList::append(ObjectPtr theObject)
{
- std::shared_ptr<Model_Data> aData = std::dynamic_pointer_cast<Model_Data>(theObject->data());
- myRef->Append(aData->label().Father()); // store label of the object
+ TDF_Label aLabel;
+ if (theObject) {
+ std::shared_ptr<Model_Data> aData = std::dynamic_pointer_cast<Model_Data>(theObject->data());
+ aLabel = aData->label().Father();
+ }
+
+ myRef->Append(aLabel); // store label of the object
myIDs->Append(""); // for the object store an empty string
// do it before the transaction finish to make just created/removed objects know dependencies
// and reference from composite feature is removed automatically
void Model_AttributeRefAttrList::append(AttributePtr theAttr)
{
- std::shared_ptr<Model_Data> aData =
+ std::shared_ptr<Model_Data> aData =
std::dynamic_pointer_cast<Model_Data>(theAttr->owner()->data());
myRef->Append(aData->label().Father()); // store label of the object
myIDs->Append(theAttr->id().c_str()); // store the ID of the referenced attribute
if (theObject.get() != NULL) {
aTheObjLab = std::dynamic_pointer_cast<Model_Data>(theObject->data())->label().Father();
}
- std::shared_ptr<Model_Document> aDoc =
+ std::shared_ptr<Model_Document> aDoc =
std::dynamic_pointer_cast<Model_Document>(owner()->document());
// remove from the both lists by clearing the list and then appending one by one
// TODO: in OCCT 7.0 there are methods for removing by index, seems will be more optimal
if (theAttr->owner().get() != NULL) {
aTheObjLab = std::dynamic_pointer_cast<Model_Data>(theAttr->owner()->data())->label().Father();
}
- std::shared_ptr<Model_Document> aDoc =
+ std::shared_ptr<Model_Document> aDoc =
std::dynamic_pointer_cast<Model_Document>(owner()->document());
// remove from the both lists by clearing the list and then appending one by one
// TODO: in OCCT 7.0 there are methods for removing by index, seems will be more optimal
TDF_ListIteratorOfLabelList aRefIter(aRefList);
TDataStd_ListIteratorOfListOfExtendedString anIDIter(anIDList);
for (; aRefIter.More(); aRefIter.Next(), anIDIter.Next()) {
- if (aOneisDeleted || anIDIter.Value() != theAttr->id().c_str() || // append now only not removed
+ if (aOneisDeleted || anIDIter.Value() != theAttr->id().c_str() ||
+ // append now only not removed
aRefIter.Value() != aTheObjLab || // append now only not removed
(aTheObjLab.IsNull() && aDoc->objects()->object(aRefIter.Value()) != NULL)) {
myRef->Append(aRefIter.Value());
ObjectPtr anObj;
if (!aLIter.Value().IsNull()) {
anObj = aDoc->objects()->object(aLIter.Value());
- aResult.push_back(std::pair<ObjectPtr, AttributePtr>(anObj,
+ aResult.push_back(std::pair<ObjectPtr, AttributePtr>(anObj,
anObj->data()->attribute(TCollection_AsciiString(anIDIter.Value()).ToCString())));
} else {
aResult.push_back(std::pair<ObjectPtr, AttributePtr>(ObjectPtr(), AttributePtr()));
std::shared_ptr<Model_Document> aDoc = std::dynamic_pointer_cast<Model_Document>(
owner()->document());
if (aDoc) {
- std::shared_ptr<Model_Data> aData =
+ std::shared_ptr<Model_Data> aData =
std::dynamic_pointer_cast<Model_Data>(theAttr->owner()->data());
if (aData.get() && aData->isValid()) {
TDF_Label anObjLab = aData->label().Father();
myIDs->Append(anIDIter.Value());
} else { // found, so need to update the dependencies
aOneisDeleted = true;
- ObjectPtr anObj = aDoc->objects()->object(aRefIter.Value());
+ ObjectPtr anObj;
+ if (!aRefIter.Value().IsNull())
+ anObj = aDoc->objects()->object(aRefIter.Value());
if (anObj.get()) {
REMOVE_BACK_REF(anObj);
}
Model_AttributeRefAttrList::Model_AttributeRefAttrList(TDF_Label& theLabel)
{
- myIsInitialized = theLabel.FindAttribute(TDataStd_ReferenceList::GetID(), myRef) == Standard_True;
+ myLab = theLabel;
+ reinit();
+}
+
+void Model_AttributeRefAttrList::reinit()
+{
+ myIsInitialized = myLab.FindAttribute(TDataStd_ReferenceList::GetID(), myRef) == Standard_True;
if (!myIsInitialized) {
- myRef = TDataStd_ReferenceList::Set(theLabel);
- myIDs = TDataStd_ExtStringList::Set(theLabel);
+ myRef = TDataStd_ReferenceList::Set(myLab);
+ myIDs = TDataStd_ExtStringList::Set(myLab);
} else {
- theLabel.FindAttribute(TDataStd_ExtStringList::GetID(), myIDs);
+ myLab.FindAttribute(TDataStd_ExtStringList::GetID(), myIDs);
}
}