Salome HOME
Merge branch 'Dev_1.1.1' of newgeom:newgeom into Dev_1.2.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 "Model_Objects.h"
11 #include <ModelAPI_Feature.h>
12 #include <TDF_ListIteratorOfLabelList.hxx>
13
14 using namespace std;
15
16 void Model_AttributeRefList::append(ObjectPtr theObject)
17 {
18   std::shared_ptr<Model_Data> aData = std::dynamic_pointer_cast<Model_Data>(theObject->data());
19   myRef->Append(aData->label().Father());  // store label of the object
20   // do it before the transaction finish to make just created/removed objects know dependencies
21   // and reference from composite feature is removed automatically
22   ADD_BACK_REF(theObject);
23
24   owner()->data()->sendAttributeUpdated(this);
25 }
26
27 void Model_AttributeRefList::remove(ObjectPtr theObject)
28 {
29   std::shared_ptr<Model_Data> aData;
30   if (theObject.get() != NULL) {
31     aData = std::dynamic_pointer_cast<Model_Data>(theObject->data());
32     myRef->Remove(aData->label().Father());
33     REMOVE_BACK_REF(theObject);
34   }
35   else { // in case of empty object remove, the first empty object is removed from the list
36     std::shared_ptr<Model_Document> aDoc = std::dynamic_pointer_cast<Model_Document>(
37         owner()->document());
38     if (aDoc) {
39       const TDF_LabelList& aList = myRef->List();
40       for (TDF_ListIteratorOfLabelList aLIter(aList); aLIter.More(); aLIter.Next()) {
41         ObjectPtr anObj = aDoc->objects()->object(aLIter.Value());
42         if (anObj.get() == NULL) {
43           myRef->Remove(aLIter.Value());
44           REMOVE_BACK_REF(theObject);
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 bool Model_AttributeRefList::isInitialized()
59 {
60   if (size() == 0) { // empty list is not initialized list: sketch will be not valid after add/undo
61     return false;
62   }
63   return ModelAPI_AttributeRefList::isInitialized();
64 }
65
66 list<ObjectPtr> Model_AttributeRefList::list()
67 {
68   std::list<ObjectPtr> aResult;
69   std::shared_ptr<Model_Document> aDoc = std::dynamic_pointer_cast<Model_Document>(
70       owner()->document());
71   if (aDoc) {
72     const TDF_LabelList& aList = myRef->List();
73     for (TDF_ListIteratorOfLabelList aLIter(aList); aLIter.More(); aLIter.Next()) {
74       ObjectPtr anObj = aDoc->objects()->object(aLIter.Value());
75       aResult.push_back(anObj);
76     }
77   }
78   return aResult;
79 }
80
81 ObjectPtr Model_AttributeRefList::object(const int theIndex) const
82 {
83   std::shared_ptr<Model_Document> aDoc = std::dynamic_pointer_cast<Model_Document>(
84       owner()->document());
85   if (aDoc) {
86     const TDF_LabelList& aList = myRef->List();
87     int anIndex = 0;
88     for (TDF_ListIteratorOfLabelList aLIter(aList); aLIter.More(); aLIter.Next(), anIndex++) {
89       if (anIndex == theIndex)
90         return aDoc->objects()->object(aLIter.Value());
91     }
92   }
93   return ObjectPtr();
94 }
95
96 Model_AttributeRefList::Model_AttributeRefList(TDF_Label& theLabel)
97 {
98   myIsInitialized = theLabel.FindAttribute(TDataStd_ReferenceList::GetID(), myRef) == Standard_True;
99   if (!myIsInitialized) {
100     myRef = TDataStd_ReferenceList::Set(theLabel);
101   }
102 }