Salome HOME
Placement algorithm takes into account the orientation of the edges since now
[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
20   owner()->data()->sendAttributeUpdated(this);
21 }
22
23 void Model_AttributeRefList::remove(ObjectPtr theObject)
24 {
25   std::shared_ptr<Model_Data> aData;
26   if (theObject.get() != NULL) {
27     aData = std::dynamic_pointer_cast<Model_Data>(theObject->data());
28     myRef->Remove(aData->label().Father());
29   }
30   else { // in case of empty object remove, the first empty object is removed from the list
31     std::shared_ptr<Model_Document> aDoc = std::dynamic_pointer_cast<Model_Document>(
32         owner()->document());
33     if (aDoc) {
34       const TDF_LabelList& aList = myRef->List();
35       for (TDF_ListIteratorOfLabelList aLIter(aList); aLIter.More(); aLIter.Next()) {
36         ObjectPtr anObj = aDoc->object(aLIter.Value());
37         if (anObj.get() == NULL) {
38           myRef->Remove(aLIter.Value());
39           break;
40         }
41       }
42     }
43   }
44   owner()->data()->sendAttributeUpdated(this);
45 }
46
47 int Model_AttributeRefList::size() const
48 {
49   return myRef->Extent();
50 }
51
52 list<ObjectPtr> Model_AttributeRefList::list()
53 {
54   std::list<ObjectPtr> aResult;
55   std::shared_ptr<Model_Document> aDoc = std::dynamic_pointer_cast<Model_Document>(
56       owner()->document());
57   if (aDoc) {
58     const TDF_LabelList& aList = myRef->List();
59     for (TDF_ListIteratorOfLabelList aLIter(aList); aLIter.More(); aLIter.Next()) {
60       ObjectPtr anObj = aDoc->object(aLIter.Value());
61       aResult.push_back(anObj);
62     }
63   }
64   return aResult;
65 }
66
67 ObjectPtr Model_AttributeRefList::object(const int theIndex) const
68 {
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     int anIndex = 0;
74     for (TDF_ListIteratorOfLabelList aLIter(aList); aLIter.More(); aLIter.Next(), anIndex++) {
75       if (anIndex == theIndex)
76         return aDoc->object(aLIter.Value());
77     }
78   }
79   return ObjectPtr();
80 }
81
82 Model_AttributeRefList::Model_AttributeRefList(TDF_Label& theLabel)
83 {
84   myIsInitialized = theLabel.FindAttribute(TDataStd_ReferenceList::GetID(), myRef) == Standard_True;
85   if (!myIsInitialized) {
86     myRef = TDataStd_ReferenceList::Set(theLabel);
87   }
88 }