0026411: Necessary to improve XCAF to store and querying GD&T data.
[occt.git] / src / XCAFDoc / XCAFDoc_Datum.cxx
1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14
15 #include <Standard_GUID.hxx>
16 #include <Standard_Type.hxx>
17 #include <TCollection_HAsciiString.hxx>
18 #include <TDF_Attribute.hxx>
19 #include <TDF_Label.hxx>
20 #include <TDF_RelocationTable.hxx>
21 #include <XCAFDoc_Datum.hxx>
22 #include <TDataStd_AsciiString.hxx>
23 #include <TDataStd_IntegerArray.hxx>
24 #include <TDataStd_Integer.hxx>
25 #include <TDataStd_Real.hxx>
26 #include <TNaming_NamedShape.hxx>
27 #include <TNaming_Builder.hxx>
28
29
30 #include <XCAFDimTolObjects_DatumObject.hxx>
31
32 enum ChildLab
33 {
34   ChildLab_Name = 1,
35   ChildLab_Modifiers,
36   ChildLab_ModifierWithValue,
37   ChildLab_DatumTarget
38 };
39
40 //=======================================================================
41 //function : XCAFDoc_Datum
42 //purpose  : 
43 //=======================================================================
44 XCAFDoc_Datum::XCAFDoc_Datum()
45 {
46 }
47
48
49 //=======================================================================
50 //function : GetID
51 //purpose  : 
52 //=======================================================================
53
54 const Standard_GUID& XCAFDoc_Datum::GetID() 
55 {
56   static Standard_GUID DID("58ed092e-44de-11d8-8776-001083004c77");
57   //static Standard_GUID ID("efd212e2-6dfd-11d4-b9c8-0060b0ee281b");
58   return DID;
59   //return ID;
60 }
61
62
63 //=======================================================================
64 //function : Set
65 //purpose  : 
66 //=======================================================================
67
68 Handle(XCAFDoc_Datum) XCAFDoc_Datum::Set(const TDF_Label& theLabel,
69                                          const Handle(TCollection_HAsciiString)& theName,
70                                          const Handle(TCollection_HAsciiString)& theDescription,
71                                          const Handle(TCollection_HAsciiString)& theIdentification) 
72 {
73   Handle(XCAFDoc_Datum) aDatum;
74   if (!theLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum)) {
75     aDatum = new XCAFDoc_Datum();
76     theLabel.AddAttribute(aDatum);
77   }
78   aDatum->Set(theName,theDescription,theIdentification); 
79   return aDatum;
80 }
81
82 //=======================================================================
83 //function : Set
84 //purpose  : 
85 //=======================================================================
86
87 Handle(XCAFDoc_Datum) XCAFDoc_Datum::Set(const TDF_Label& theLabel) 
88 {
89   Handle(XCAFDoc_Datum) aDatum;
90   if (!theLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum)) {
91     aDatum = new XCAFDoc_Datum();
92     theLabel.AddAttribute(aDatum);
93   }
94   return aDatum;
95 }
96
97
98 //=======================================================================
99 //function : Set
100 //purpose  : 
101 //=======================================================================
102
103 void XCAFDoc_Datum::Set(const Handle(TCollection_HAsciiString)& theName,
104                         const Handle(TCollection_HAsciiString)& theDescription,
105                         const Handle(TCollection_HAsciiString)& theIdentification) 
106 {
107   Backup();
108   myName = theName;
109   myDescription = theDescription;
110   myIdentification = theIdentification;
111 }
112
113
114 //=======================================================================
115 //function : GetName
116 //purpose  : 
117 //=======================================================================
118
119 Handle(TCollection_HAsciiString) XCAFDoc_Datum::GetName() const
120 {
121   if(myName.IsNull())
122     return new TCollection_HAsciiString();
123   return myName;
124 }
125
126 //=======================================================================
127 //function : GetDescriptio7n
128 //purpose  : 
129 //=======================================================================
130
131 Handle(TCollection_HAsciiString) XCAFDoc_Datum::GetDescription() const
132 {
133   return myDescription;
134 }
135
136
137 //=======================================================================
138 //function : GetIdentification
139 //purpose  : 
140 //=======================================================================
141
142 Handle(TCollection_HAsciiString) XCAFDoc_Datum::GetIdentification() const
143 {
144   return myIdentification;
145 }
146
147 //=======================================================================
148 //function : SetObject
149 //purpose  : 
150 //=======================================================================
151
152 void XCAFDoc_Datum::SetObject(const Handle(XCAFDimTolObjects_DatumObject)& theObject)
153 {
154   Backup();
155   if (!theObject->GetName().IsNull())
156   {
157     Handle(TDataStd_AsciiString) anAttName;
158     if(!Label().FindChild(ChildLab_Name).FindAttribute(TDataStd_AsciiString::GetID(), anAttName))
159     {
160       anAttName = new TDataStd_AsciiString();
161       Label().FindChild(ChildLab_Name).AddAttribute(anAttName);
162     }
163     anAttName->Set(theObject->GetName()->String());
164   }
165   else
166   {
167     Label().FindChild(ChildLab_Name).ForgetAllAttributes();
168   }
169
170   if(theObject->GetModifiers().Length() == 0)
171   {
172     Label().FindChild(ChildLab_Modifiers).ForgetAllAttributes();
173   }
174   else
175   {
176     Handle(TDataStd_IntegerArray) aModifiers;
177     if(!Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), aModifiers))
178     {
179       aModifiers = new TDataStd_IntegerArray();
180       Label().FindChild(ChildLab_Modifiers).AddAttribute(aModifiers);
181     }
182     Handle(TColStd_HArray1OfInteger) anArr = new TColStd_HArray1OfInteger(1,theObject->GetModifiers().Length());
183     for(Standard_Integer i = 1; i <= theObject->GetModifiers().Length(); i++)
184       anArr->SetValue(i,theObject->GetModifiers().Value(i));
185     aModifiers->ChangeArray(anArr);
186   }
187
188   XCAFDimTolObjects_DatumModifWithValue aM;
189   Standard_Real aV;
190   theObject->GetModifierWithValue(aM, aV);
191   if(aM != XCAFDimTolObjects_DatumModifWithValue_None)
192   {
193     Handle(TDataStd_Integer) aModifierWithValueM;
194     if(!Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Integer::GetID(), aModifierWithValueM))
195     {
196       aModifierWithValueM = new TDataStd_Integer();
197       Label().FindChild(ChildLab_ModifierWithValue).AddAttribute(aModifierWithValueM);
198     }
199     Handle(TDataStd_Real) aModifierWithValueV;
200     if(!Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Real::GetID(), aModifierWithValueV))
201     {
202       aModifierWithValueV = new TDataStd_Real();
203       Label().FindChild(ChildLab_ModifierWithValue).AddAttribute(aModifierWithValueV);
204     }
205     aModifierWithValueM->Set(aM);
206     aModifierWithValueV->Set(aV);
207   }
208   else
209   {
210     Label().FindChild(ChildLab_ModifierWithValue).ForgetAllAttributes();
211   }
212
213   if(!theObject->GetDatumTarget().IsNull())
214   {
215     TNaming_Builder tnBuild(Label().FindChild(ChildLab_DatumTarget));
216     tnBuild.Generated(theObject->GetDatumTarget());
217   }
218   else
219   {
220     Label().FindChild(ChildLab_DatumTarget).ForgetAllAttributes();
221   }
222 }
223
224 //=======================================================================
225 //function : GetObject
226 //purpose  : 
227 //=======================================================================
228
229 Handle(XCAFDimTolObjects_DatumObject) XCAFDoc_Datum::GetObject() const
230 {
231   Handle(XCAFDimTolObjects_DatumObject) anObj = new XCAFDimTolObjects_DatumObject();
232
233   Handle(TDataStd_AsciiString) anAttName;
234   if(Label().FindChild(ChildLab_Name).FindAttribute(TDataStd_AsciiString::GetID(), anAttName))
235   {
236     Handle(TCollection_HAsciiString) aStr = new TCollection_HAsciiString(anAttName->Get());
237     anObj->SetName(aStr);
238   }
239
240   Handle(TDataStd_IntegerArray) anArr;
241   if(Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), anArr)
242      && !anArr->Array().IsNull())
243   {
244     XCAFDimTolObjects_DatumModifiersSequence aModifiers;
245     for(Standard_Integer i = 1; i <= anArr->Length(); i++)
246       aModifiers.Append((XCAFDimTolObjects_DatumSingleModif)anArr->Value(i));
247     anObj->SetModifiers(aModifiers);
248   }
249
250   Handle(TDataStd_Integer) aModifierWithValueM;
251   if(Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Integer::GetID(), aModifierWithValueM))
252   {
253     Handle(TDataStd_Real) aModifierWithValueV;
254     if(Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Real::GetID(), aModifierWithValueV))
255     {
256       anObj->SetModifierWithValue((XCAFDimTolObjects_DatumModifWithValue)aModifierWithValueM->Get(),aModifierWithValueV->Get());
257     }
258   }
259
260   Handle(TNaming_NamedShape) aDatumTarget;
261   if(Label().FindChild(ChildLab_DatumTarget).FindAttribute(TNaming_NamedShape::GetID(), aDatumTarget))
262   {
263     anObj->SetDatumTarget(aDatumTarget->Get());
264   }
265
266   return anObj;
267 }
268
269 //=======================================================================
270 //function : ID
271 //purpose  : 
272 //=======================================================================
273
274 const Standard_GUID& XCAFDoc_Datum::ID() const
275 {
276   return GetID();
277 }
278
279
280 //=======================================================================
281 //function : Restore
282 //purpose  : 
283 //=======================================================================
284
285 void XCAFDoc_Datum::Restore(const Handle(TDF_Attribute)& theWith) 
286 {
287   myName = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetName();
288   myDescription = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetDescription();
289   myIdentification = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetIdentification();
290 }
291
292
293 //=======================================================================
294 //function : NewEmpty
295 //purpose  : 
296 //=======================================================================
297
298 Handle(TDF_Attribute) XCAFDoc_Datum::NewEmpty() const
299 {
300   return new XCAFDoc_Datum();
301 }
302
303
304 //=======================================================================
305 //function : Paste
306 //purpose  : 
307 //=======================================================================
308
309 void XCAFDoc_Datum::Paste(const Handle(TDF_Attribute)& theInto,
310                           const Handle(TDF_RelocationTable)& /*RT*/) const
311 {
312   Handle(XCAFDoc_Datum)::DownCast(theInto)->Set(myName,myDescription,myIdentification);
313 }
314