Salome HOME
Merge branch 'Dev_1.1.0' of newgeom:newgeom into Dev_1.1.0
[modules/shaper.git] / src / Model / Model_AttributeRefList.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 // File:        ModelAPI_AttributeRefList.cxx
4 // Created:     8 May 2014
5 // Author:      Mikhail PONIKAROV
6
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>
12
13 using namespace std;
14
15 void Model_AttributeRefList::append(ObjectPtr theObject)
16 {
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());
24   }
25
26   owner()->data()->sendAttributeUpdated(this);
27 }
28
29 void Model_AttributeRefList::remove(ObjectPtr theObject)
30 {
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());
35   }
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>(
38         owner()->document());
39     if (aDoc) {
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());
45           break;
46         }
47       }
48     }
49   }
50   owner()->data()->sendAttributeUpdated(this);
51 }
52
53 int Model_AttributeRefList::size() const
54 {
55   return myRef->Extent();
56 }
57
58 list<ObjectPtr> Model_AttributeRefList::list()
59 {
60   std::list<ObjectPtr> aResult;
61   std::shared_ptr<Model_Document> aDoc = std::dynamic_pointer_cast<Model_Document>(
62       owner()->document());
63   if (aDoc) {
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);
68     }
69   }
70   return aResult;
71 }
72
73 ObjectPtr Model_AttributeRefList::object(const int theIndex) const
74 {
75   std::shared_ptr<Model_Document> aDoc = std::dynamic_pointer_cast<Model_Document>(
76       owner()->document());
77   if (aDoc) {
78     const TDF_LabelList& aList = myRef->List();
79     int anIndex = 0;
80     for (TDF_ListIteratorOfLabelList aLIter(aList); aLIter.More(); aLIter.Next(), anIndex++) {
81       if (anIndex == theIndex)
82         return aDoc->object(aLIter.Value());
83     }
84   }
85   return ObjectPtr();
86 }
87
88 Model_AttributeRefList::Model_AttributeRefList(TDF_Label& theLabel)
89 {
90   myIsInitialized = theLabel.FindAttribute(TDataStd_ReferenceList::GetID(), myRef) == Standard_True;
91   if (!myIsInitialized) {
92     myRef = TDataStd_ReferenceList::Set(theLabel);
93   }
94 }