3e7a07a50bc7f88d8e42ce985d94bb2b1a602dae
[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_ChildIterator.hxx>
21 #include <TDF_RelocationTable.hxx>
22 #include <XCAFDoc_Datum.hxx>
23 #include <TDataStd_AsciiString.hxx>
24 #include <TDataStd_IntegerArray.hxx>
25 #include <TDataStd_RealArray.hxx>
26 #include <TDataStd_Integer.hxx>
27 #include <TDataStd_Real.hxx>
28 #include <TNaming_NamedShape.hxx>
29 #include <TNaming_Builder.hxx>
30
31
32 #include <XCAFDimTolObjects_DatumObject.hxx>
33
34 enum ChildLab
35 {
36   ChildLab_Name = 1,
37   ChildLab_Modifiers,
38   ChildLab_ModifierWithValue,
39   ChildLab_IsDTarget,
40   ChildLab_DTargetType,
41   ChildLab_AxisLoc,
42   ChildLab_AxisN,
43   ChildLab_AxisRef,
44   ChildLab_DTargetLength,
45   ChildLab_DTargetWidth,
46   ChildLab_DatumTarget,
47 };
48
49 //=======================================================================
50 //function : XCAFDoc_Datum
51 //purpose  : 
52 //=======================================================================
53 XCAFDoc_Datum::XCAFDoc_Datum()
54 {
55 }
56
57
58 //=======================================================================
59 //function : GetID
60 //purpose  : 
61 //=======================================================================
62
63 const Standard_GUID& XCAFDoc_Datum::GetID() 
64 {
65   static Standard_GUID DID("58ed092e-44de-11d8-8776-001083004c77");
66   //static Standard_GUID ID("efd212e2-6dfd-11d4-b9c8-0060b0ee281b");
67   return DID;
68   //return ID;
69 }
70
71
72 //=======================================================================
73 //function : Set
74 //purpose  : 
75 //=======================================================================
76
77 Handle(XCAFDoc_Datum) XCAFDoc_Datum::Set(const TDF_Label& theLabel,
78                                          const Handle(TCollection_HAsciiString)& theName,
79                                          const Handle(TCollection_HAsciiString)& theDescription,
80                                          const Handle(TCollection_HAsciiString)& theIdentification) 
81 {
82   Handle(XCAFDoc_Datum) aDatum;
83   if (!theLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum)) {
84     aDatum = new XCAFDoc_Datum();
85     theLabel.AddAttribute(aDatum);
86   }
87   aDatum->Set(theName,theDescription,theIdentification); 
88   return aDatum;
89 }
90
91 //=======================================================================
92 //function : Set
93 //purpose  : 
94 //=======================================================================
95
96 Handle(XCAFDoc_Datum) XCAFDoc_Datum::Set(const TDF_Label& theLabel) 
97 {
98   Handle(XCAFDoc_Datum) aDatum;
99   if (!theLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum)) {
100     aDatum = new XCAFDoc_Datum();
101     theLabel.AddAttribute(aDatum);
102   }
103   return aDatum;
104 }
105
106
107 //=======================================================================
108 //function : Set
109 //purpose  : 
110 //=======================================================================
111
112 void XCAFDoc_Datum::Set(const Handle(TCollection_HAsciiString)& theName,
113                         const Handle(TCollection_HAsciiString)& theDescription,
114                         const Handle(TCollection_HAsciiString)& theIdentification) 
115 {
116   Backup();
117   myName = theName;
118   myDescription = theDescription;
119   myIdentification = theIdentification;
120 }
121
122
123 //=======================================================================
124 //function : GetName
125 //purpose  : 
126 //=======================================================================
127
128 Handle(TCollection_HAsciiString) XCAFDoc_Datum::GetName() const
129 {
130   if(myName.IsNull())
131     return new TCollection_HAsciiString();
132   return myName;
133 }
134
135 //=======================================================================
136 //function : GetDescriptio7n
137 //purpose  : 
138 //=======================================================================
139
140 Handle(TCollection_HAsciiString) XCAFDoc_Datum::GetDescription() const
141 {
142   return myDescription;
143 }
144
145
146 //=======================================================================
147 //function : GetIdentification
148 //purpose  : 
149 //=======================================================================
150
151 Handle(TCollection_HAsciiString) XCAFDoc_Datum::GetIdentification() const
152 {
153   return myIdentification;
154 }
155
156 //=======================================================================
157 //function : SetObject
158 //purpose  : 
159 //=======================================================================
160
161 void XCAFDoc_Datum::SetObject(const Handle(XCAFDimTolObjects_DatumObject)& theObject)
162 {
163   Backup();
164   TDF_ChildIterator anIter(Label());
165   for(;anIter.More(); anIter.Next())
166   {
167     anIter.Value().ForgetAllAttributes();
168   }
169   if (!theObject->GetName().IsNull() && !theObject->GetName()->IsEmpty())
170   {
171     Handle(TDataStd_AsciiString) anAttName;
172     if(!Label().FindChild(ChildLab_Name).FindAttribute(TDataStd_AsciiString::GetID(), anAttName))
173     {
174       anAttName = new TDataStd_AsciiString();
175       Label().FindChild(ChildLab_Name).AddAttribute(anAttName);
176     }
177     anAttName->Set(theObject->GetName()->String());
178   }
179
180   if(theObject->GetModifiers().Length() > 0)
181   {
182     Handle(TDataStd_IntegerArray) aModifiers;
183     if(!Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), aModifiers))
184     {
185       aModifiers = new TDataStd_IntegerArray();
186       Label().FindChild(ChildLab_Modifiers).AddAttribute(aModifiers);
187     }
188     Handle(TColStd_HArray1OfInteger) anArr = new TColStd_HArray1OfInteger(1,theObject->GetModifiers().Length());
189     for(Standard_Integer i = 1; i <= theObject->GetModifiers().Length(); i++)
190       anArr->SetValue(i,theObject->GetModifiers().Value(i));
191     aModifiers->ChangeArray(anArr);
192   }
193
194   XCAFDimTolObjects_DatumModifWithValue aM;
195   Standard_Real aV;
196   theObject->GetModifierWithValue(aM, aV);
197   if(aM != XCAFDimTolObjects_DatumModifWithValue_None)
198   {
199     Handle(TDataStd_Integer) aModifierWithValueM;
200     if(!Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Integer::GetID(), aModifierWithValueM))
201     {
202       aModifierWithValueM = new TDataStd_Integer();
203       Label().FindChild(ChildLab_ModifierWithValue).AddAttribute(aModifierWithValueM);
204     }
205     Handle(TDataStd_Real) aModifierWithValueV;
206     if(!Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Real::GetID(), aModifierWithValueV))
207     {
208       aModifierWithValueV = new TDataStd_Real();
209       Label().FindChild(ChildLab_ModifierWithValue).AddAttribute(aModifierWithValueV);
210     }
211     aModifierWithValueM->Set(aM);
212     aModifierWithValueV->Set(aV);
213   }
214
215   Handle(TDataStd_Integer) aIsTarget = new TDataStd_Integer();
216   aIsTarget->Set(theObject->IsDatumTarget());
217   Label().FindChild(ChildLab_IsDTarget).AddAttribute(aIsTarget);
218
219   if(theObject->IsDatumTarget())
220   {
221     Handle(TDataStd_Integer) aType = new TDataStd_Integer();
222     aType->Set(theObject->GetDatumTargetType());
223     Label().FindChild(ChildLab_DTargetType).AddAttribute(aType);
224
225     if(theObject->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Area)
226     {
227       if(!theObject->GetDatumTarget().IsNull())
228       {
229         TNaming_Builder tnBuild(Label().FindChild(ChildLab_DatumTarget));
230         tnBuild.Generated(theObject->GetDatumTarget());
231       }
232     }
233     else
234     {
235       Handle(TDataStd_RealArray) aLoc = new TDataStd_RealArray();
236       Handle(TDataStd_RealArray) aN = new TDataStd_RealArray();
237       Handle(TDataStd_RealArray) aR = new TDataStd_RealArray();
238       gp_Ax2 anAx = theObject->GetDatumTargetAxis();
239       aLoc->SetValue(aLoc->Upper(),anAx.Location().X());
240       aLoc->SetValue(aLoc->Upper()+1,anAx.Location().Y());
241       aLoc->SetValue(aLoc->Upper()+2,anAx.Location().Z());
242
243       aN->SetValue(aN->Upper(),anAx.Axis().Direction().X());
244       aN->SetValue(aN->Upper(),anAx.Axis().Direction().X());
245       aN->SetValue(aN->Upper(),anAx.Axis().Direction().X());
246
247       aR->SetValue(aR->Upper(),anAx.Direction().X());
248       aR->SetValue(aR->Upper(),anAx.Direction().X());
249       aR->SetValue(aR->Upper(),anAx.Direction().X());
250
251       Label().FindChild(ChildLab_AxisLoc).AddAttribute(aLoc);
252       Label().FindChild(ChildLab_AxisN).AddAttribute(aN);
253       Label().FindChild(ChildLab_AxisRef).AddAttribute(aR);
254
255       if(theObject->GetDatumTargetType() != XCAFDimTolObjects_DatumTargetType_Point)
256       {
257         Handle(TDataStd_Real) aLen = new TDataStd_Real();
258         aLen->Set(theObject->GetDatumTargetLength());
259         Label().FindChild(ChildLab_DTargetLength).AddAttribute(aLen);
260         if(theObject->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Rectangle)
261         {
262           Handle(TDataStd_Real) aWidth = new TDataStd_Real();
263           aWidth->Set(theObject->GetDatumTargetWidth());
264           Label().FindChild(ChildLab_DTargetWidth).AddAttribute(aWidth);
265         }
266       }
267     }
268   }
269 }
270
271 //=======================================================================
272 //function : GetObject
273 //purpose  : 
274 //=======================================================================
275
276 Handle(XCAFDimTolObjects_DatumObject) XCAFDoc_Datum::GetObject() const
277 {
278   Handle(XCAFDimTolObjects_DatumObject) anObj = new XCAFDimTolObjects_DatumObject();
279
280   Handle(TDataStd_AsciiString) anAttName;
281   if(Label().FindChild(ChildLab_Name).FindAttribute(TDataStd_AsciiString::GetID(), anAttName))
282   {
283     Handle(TCollection_HAsciiString) aStr = new TCollection_HAsciiString(anAttName->Get());
284     anObj->SetName(aStr);
285   }
286
287   Handle(TDataStd_IntegerArray) anArr;
288   if(Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), anArr)
289      && !anArr->Array().IsNull())
290   {
291     XCAFDimTolObjects_DatumModifiersSequence aModifiers;
292     for(Standard_Integer i = 1; i <= anArr->Length(); i++)
293       aModifiers.Append((XCAFDimTolObjects_DatumSingleModif)anArr->Value(i));
294     anObj->SetModifiers(aModifiers);
295   }
296
297   Handle(TDataStd_Integer) aModifierWithValueM;
298   if(Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Integer::GetID(), aModifierWithValueM))
299   {
300     Handle(TDataStd_Real) aModifierWithValueV;
301     if(Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Real::GetID(), aModifierWithValueV))
302     {
303       anObj->SetModifierWithValue((XCAFDimTolObjects_DatumModifWithValue)aModifierWithValueM->Get(),aModifierWithValueV->Get());
304     }
305   }
306
307   Handle(TDataStd_Integer) aIsDTarget;
308   if(Label().FindChild(ChildLab_IsDTarget).FindAttribute(TDataStd_Integer::GetID(), aIsDTarget))
309   {
310     anObj->IsDatumTarget((aIsDTarget->Get() != 0));
311   }
312   else
313   {
314     return anObj;
315   }
316
317   if (aIsDTarget->Get() != 0)
318   {
319     Handle(TDataStd_Integer) aDTargetType;
320     if(Label().FindChild(ChildLab_DTargetType).FindAttribute(TDataStd_Integer::GetID(), aDTargetType))
321     {
322       anObj->SetDatumTargetType((XCAFDimTolObjects_DatumTargetType)aDTargetType->Get());
323       if(anObj->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Area)
324       {
325         Handle(TNaming_NamedShape) aDatumTarget;
326         if(Label().FindChild(ChildLab_DatumTarget).FindAttribute(TNaming_NamedShape::GetID(), aDatumTarget))
327         {
328           anObj->SetDatumTarget(aDatumTarget->Get());
329         }
330       }
331       else
332       {
333         Handle(TDataStd_RealArray) aLoc;
334         Handle(TDataStd_RealArray) aN;
335         Handle(TDataStd_RealArray) aR;
336         if(Label().FindChild(ChildLab_AxisLoc).FindAttribute(TDataStd_RealArray::GetID(), aLoc) && aLoc->Length() == 3 &&
337           Label().FindChild(ChildLab_AxisN).FindAttribute(TDataStd_RealArray::GetID(), aN) && aN->Length() == 3 &&
338           Label().FindChild(ChildLab_AxisRef).FindAttribute(TDataStd_RealArray::GetID(), aR) && aR->Length() == 3 )
339         {
340           gp_Pnt aL(aLoc->Value(aLoc->Upper()), aLoc->Value(aLoc->Upper()+1), aLoc->Value(aLoc->Upper()+2));
341           gp_Dir aD(aN->Value(aN->Upper()), aN->Value(aN->Upper()+1), aN->Value(aN->Upper()+2));
342           gp_Dir aDR(aR->Value(aR->Upper()), aR->Value(aR->Upper()+1), aR->Value(aR->Upper()+2));
343           gp_Ax2 anAx(aL, aD, aDR);
344           anObj->SetDatumTargetAxis(anAx);
345         }
346
347         if(anObj->GetDatumTargetType() != XCAFDimTolObjects_DatumTargetType_Point)
348         {
349           Handle(TDataStd_Real) aLen;
350           if(Label().FindChild(ChildLab_DTargetLength).FindAttribute(TDataStd_Integer::GetID(), aLen))
351           {
352             anObj->SetDatumTargetLength(aLen->Get());
353           }
354           if(anObj->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Rectangle)
355           {
356             Handle(TDataStd_Real) aWidth;
357             if(Label().FindChild(ChildLab_DTargetWidth).FindAttribute(TDataStd_Integer::GetID(), aWidth))
358             {
359               anObj->SetDatumTargetWidth(aWidth->Get());
360             }
361           }
362         }
363       }
364     }
365   }
366
367   return anObj;
368 }
369
370 //=======================================================================
371 //function : ID
372 //purpose  : 
373 //=======================================================================
374
375 const Standard_GUID& XCAFDoc_Datum::ID() const
376 {
377   return GetID();
378 }
379
380
381 //=======================================================================
382 //function : Restore
383 //purpose  : 
384 //=======================================================================
385
386 void XCAFDoc_Datum::Restore(const Handle(TDF_Attribute)& theWith) 
387 {
388   myName = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetName();
389   myDescription = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetDescription();
390   myIdentification = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetIdentification();
391 }
392
393
394 //=======================================================================
395 //function : NewEmpty
396 //purpose  : 
397 //=======================================================================
398
399 Handle(TDF_Attribute) XCAFDoc_Datum::NewEmpty() const
400 {
401   return new XCAFDoc_Datum();
402 }
403
404
405 //=======================================================================
406 //function : Paste
407 //purpose  : 
408 //=======================================================================
409
410 void XCAFDoc_Datum::Paste(const Handle(TDF_Attribute)& theInto,
411                           const Handle(TDF_RelocationTable)& /*RT*/) const
412 {
413   Handle(XCAFDoc_Datum)::DownCast(theInto)->Set(myName,myDescription,myIdentification);
414 }
415