1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
3 // File: ModelAPI_AttributeRefList.cxx
5 // Author: Mikhail PONIKAROV
7 #include "Model_AttributeRefList.h"
8 #include "Model_Application.h"
9 #include "Model_Data.h"
10 #include <ModelAPI_Feature.h>
11 #include <TDF_ListIteratorOfLabelList.hxx>
15 void Model_AttributeRefList::append(ObjectPtr theObject)
17 std::shared_ptr<Model_Data> aData = std::dynamic_pointer_cast<Model_Data>(theObject->data());
18 myRef->Append(aData->label().Father()); // store label of the object
19 // do it before the transaction finish to make just created/removed objects know dependencies
20 // and reference from composite feature is removed automatically
21 FeaturePtr anOwnerFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(owner());
22 if (anOwnerFeature.get()) {
23 aData->addBackReference(anOwnerFeature, id());
26 owner()->data()->sendAttributeUpdated(this);
29 void Model_AttributeRefList::remove(ObjectPtr theObject)
31 std::shared_ptr<Model_Data> aData;
32 if (theObject.get() != NULL) {
33 aData = std::dynamic_pointer_cast<Model_Data>(theObject->data());
34 myRef->Remove(aData->label().Father());
36 else { // in case of empty object remove, the first empty object is removed from the list
37 std::shared_ptr<Model_Document> aDoc = std::dynamic_pointer_cast<Model_Document>(
40 const TDF_LabelList& aList = myRef->List();
41 for (TDF_ListIteratorOfLabelList aLIter(aList); aLIter.More(); aLIter.Next()) {
42 ObjectPtr anObj = aDoc->object(aLIter.Value());
43 if (anObj.get() == NULL) {
44 myRef->Remove(aLIter.Value());
50 owner()->data()->sendAttributeUpdated(this);
53 int Model_AttributeRefList::size() const
55 return myRef->Extent();
58 list<ObjectPtr> Model_AttributeRefList::list()
60 std::list<ObjectPtr> aResult;
61 std::shared_ptr<Model_Document> aDoc = std::dynamic_pointer_cast<Model_Document>(
64 const TDF_LabelList& aList = myRef->List();
65 for (TDF_ListIteratorOfLabelList aLIter(aList); aLIter.More(); aLIter.Next()) {
66 ObjectPtr anObj = aDoc->object(aLIter.Value());
67 aResult.push_back(anObj);
73 ObjectPtr Model_AttributeRefList::object(const int theIndex) const
75 std::shared_ptr<Model_Document> aDoc = std::dynamic_pointer_cast<Model_Document>(
78 const TDF_LabelList& aList = myRef->List();
80 for (TDF_ListIteratorOfLabelList aLIter(aList); aLIter.More(); aLIter.Next(), anIndex++) {
81 if (anIndex == theIndex)
82 return aDoc->object(aLIter.Value());
88 Model_AttributeRefList::Model_AttributeRefList(TDF_Label& theLabel)
90 myIsInitialized = theLabel.FindAttribute(TDataStd_ReferenceList::GetID(), myRef) == Standard_True;
91 if (!myIsInitialized) {
92 myRef = TDataStd_ReferenceList::Set(theLabel);