0024023: Revamp the OCCT Handle -- downcast (automatic)
[occt.git] / src / TDataXtd / TDataXtd_Constraint.cxx
1 // Created on: 2009-04-06
2 // Copyright (c) 2009-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #include <TDataXtd_Constraint.ixx>
16 #include <TDataStd.hxx>
17 #include <TDataXtd.hxx>
18 #include <TDF_ChildIterator.hxx>
19 #include <TDataXtd_ConstraintEnum.hxx>
20 #include <TopoDS_Shape.hxx>
21 #include <TNaming_NamedShape.hxx>
22 // for symmetry midpoint the third argument is the axis or the point
23
24
25 //=======================================================================
26 //function : GetID
27 //purpose  : 
28 //=======================================================================
29
30 const Standard_GUID& TDataXtd_Constraint::GetID () 
31
32   static Standard_GUID TDataXtd_ConstraintID("2a96b602-ec8b-11d0-bee7-080009dc3333");
33   return TDataXtd_ConstraintID; 
34 }
35
36
37 //=======================================================================
38 //function : Set
39 //purpose  : 
40 //=======================================================================
41
42 Handle(TDataXtd_Constraint) TDataXtd_Constraint::Set (const TDF_Label& L)
43 {
44   Handle (TDataXtd_Constraint) A;
45   if (!L.FindAttribute (TDataXtd_Constraint::GetID (), A)) {    
46     A = new TDataXtd_Constraint ();
47     L.AddAttribute(A);
48   }
49   return A;
50 }
51
52
53 //=======================================================================
54 //function : TDataXtd_Constraint
55 //purpose  : 
56 //=======================================================================
57
58 TDataXtd_Constraint::TDataXtd_Constraint()
59      : myType           (TDataXtd_RADIUS),
60        myIsReversed     (Standard_False),
61        myIsInverted     (Standard_False),
62        myIsVerified     (Standard_True)
63 {}
64
65  //=======================================================================
66  //function : Set
67  //purpose  : 
68  //=======================================================================
69
70  void TDataXtd_Constraint::Set(const TDataXtd_ConstraintEnum type,
71                               const Handle(TNaming_NamedShape)& G1) 
72  {
73    // OCC2932 correction
74    if(myType == type)
75    {
76      Handle(TNaming_NamedShape) aShape =
77        Handle(TNaming_NamedShape)::DownCast(myGeometries[0]);
78      if (aShape.IsNull() == Standard_False && G1.IsNull() == Standard_False)
79        if (aShape -> Get() == G1 -> Get()) 
80          return;
81    }
82
83    Backup();
84    myType = type;
85    myGeometries[0] = G1;
86  }
87
88 // =======================================================================
89  //function : Set
90  //purpose  : 
91  //=======================================================================
92
93  void TDataXtd_Constraint::Set(const TDataXtd_ConstraintEnum type,
94                                const Handle(TNaming_NamedShape)& G1,
95                                const Handle(TNaming_NamedShape)& G2) 
96  {   
97    // OCC2932 correction
98    if(myType == type)
99    {
100      Handle(TNaming_NamedShape) aShape1 =
101        Handle(TNaming_NamedShape)::DownCast(myGeometries[0]);
102      Handle(TNaming_NamedShape) aShape2 =
103        Handle(TNaming_NamedShape)::DownCast(myGeometries[1]);
104      if (aShape1.IsNull() == Standard_False && G1.IsNull() == Standard_False &&
105          aShape2.IsNull() == Standard_False && G2.IsNull() == Standard_False)
106        if (aShape1->Get() == G1->Get() && aShape2->Get() == G2->Get())
107          return;
108    }
109
110    Backup(); 
111    myType = type;
112    myGeometries[0] = G1; 
113    myGeometries[1] = G2;
114  }
115
116  //=======================================================================
117  //function : Set
118  //purpose  : 
119  //=======================================================================
120
121  void TDataXtd_Constraint::Set(const TDataXtd_ConstraintEnum type,
122                               const Handle(TNaming_NamedShape)& G1,
123                               const Handle(TNaming_NamedShape)& G2,
124                               const Handle(TNaming_NamedShape)& G3) 
125  {   
126    // OCC2932 correction
127    if (myType == type)
128    {
129      Handle(TNaming_NamedShape) aShape1 =
130        Handle(TNaming_NamedShape)::DownCast(myGeometries[0]);
131      Handle(TNaming_NamedShape) aShape2 =
132        Handle(TNaming_NamedShape)::DownCast(myGeometries[1]);
133      Handle(TNaming_NamedShape) aShape3 =
134        Handle(TNaming_NamedShape)::DownCast(myGeometries[2]);
135      if (aShape1.IsNull() == Standard_False && G1.IsNull() == Standard_False &&
136          aShape2.IsNull() == Standard_False && G2.IsNull() == Standard_False &&
137          aShape3.IsNull() == Standard_False && G3.IsNull() == Standard_False)
138        if (aShape1->Get() == G1->Get() &&
139            aShape2->Get() == G2->Get() &&
140            aShape3->Get() == G3->Get())
141          return;
142    }
143
144    Backup(); 
145    myType = type;
146    myGeometries[0] = G1; 
147    myGeometries[1] = G2;  
148    myGeometries[2] = G3;
149  }
150
151  //=======================================================================
152  //function : Set
153  //purpose  : 
154  //=======================================================================
155
156  void TDataXtd_Constraint::Set(const TDataXtd_ConstraintEnum type,
157                               const Handle(TNaming_NamedShape)& G1,
158                               const Handle(TNaming_NamedShape)& G2,
159                               const Handle(TNaming_NamedShape)& G3,
160                               const Handle(TNaming_NamedShape)& G4)
161  {   
162    // OCC2932 correction
163    if (myType == type)
164    {
165      Handle(TNaming_NamedShape) aShape1 =
166        Handle(TNaming_NamedShape)::DownCast(myGeometries[0]);
167      Handle(TNaming_NamedShape) aShape2 =
168        Handle(TNaming_NamedShape)::DownCast(myGeometries[1]);
169      Handle(TNaming_NamedShape) aShape3 =
170        Handle(TNaming_NamedShape)::DownCast(myGeometries[2]);
171      Handle(TNaming_NamedShape) aShape4 =
172        Handle(TNaming_NamedShape)::DownCast(myGeometries[3]);
173      if (aShape1.IsNull() == Standard_False && G1.IsNull() == Standard_False &&
174          aShape2.IsNull() == Standard_False && G2.IsNull() == Standard_False &&
175          aShape3.IsNull() == Standard_False && G3.IsNull() == Standard_False &&
176          aShape4.IsNull() == Standard_False && G4.IsNull() == Standard_False)
177        if (aShape1->Get() == G1->Get() &&
178            aShape2->Get() == G2->Get() &&
179            aShape3->Get() == G3->Get() &&
180            aShape3->Get() == G4->Get())
181          return;
182    }
183
184    Backup(); 
185    myType = type;
186    myGeometries[0] = G1; 
187    myGeometries[1] = G2;   
188    myGeometries[2] = G3;
189    myGeometries[3] = G4;  
190  }
191
192 //=======================================================================
193 //function : SetPlane
194 //purpose  : 
195 //=======================================================================
196 void TDataXtd_Constraint::SetPlane(const Handle(TNaming_NamedShape)& plane)
197 {
198   // OCC2932 correction
199   Handle(TNaming_NamedShape) aPlane =
200     Handle(TNaming_NamedShape)::DownCast(myPlane);
201   if (aPlane.IsNull() == Standard_False && plane.IsNull() == Standard_False)
202     if ( aPlane -> Get() == plane->Get())
203       return;
204
205   Backup();
206   myPlane = plane;
207 }
208
209 //=======================================================================
210 //function : Plane
211 //purpose  : 
212 //=======================================================================
213 const Handle(TNaming_NamedShape)&  TDataXtd_Constraint::GetPlane() const 
214 {
215   return Handle(TNaming_NamedShape)::DownCast (myPlane);
216 }
217
218 //=======================================================================
219 //function : SetType 
220 //purpose  : 
221 //=======================================================================
222
223 void TDataXtd_Constraint::SetType (const TDataXtd_ConstraintEnum CTR) 
224 {  
225   // OCC2932 correction
226   if(myType == CTR) return;
227
228   Backup();
229   myType = CTR;
230 }
231
232
233 //=======================================================================
234 //function : GetType
235 //purpose  : 
236 //=======================================================================
237
238 TDataXtd_ConstraintEnum TDataXtd_Constraint::GetType () const
239 {
240   return myType;
241 }
242
243
244 //=======================================================================
245 //function : ClearGeometries
246 //purpose  : 
247 //=======================================================================
248
249 void TDataXtd_Constraint::ClearGeometries () 
250 {   
251   // OCC2932 correction
252   if(myGeometries[0].IsNull() && myGeometries[1].IsNull() && 
253      myGeometries[2].IsNull() && myGeometries[3].IsNull()) 
254     return;
255
256
257   Backup();
258   (myGeometries [0]).Nullify ();
259   (myGeometries [1]).Nullify ();
260   (myGeometries [2]).Nullify ();
261   (myGeometries [3]).Nullify ();
262 }
263
264
265 //=======================================================================
266 //function : SetGeometry
267 //purpose  : 
268 //=======================================================================
269
270 void TDataXtd_Constraint::SetGeometry (const Standard_Integer Index, 
271                                        const Handle(TNaming_NamedShape)& G) 
272 {  
273   // OCC2932 correction
274   Handle(TNaming_NamedShape) aGeom =
275     Handle(TNaming_NamedShape)::DownCast(myGeometries[Index - 1]);
276   if (aGeom.IsNull() == Standard_False && G.IsNull() == Standard_False) 
277     if (aGeom -> Get() == G->Get())
278       return;
279
280   Backup();
281   myGeometries [Index-1] = G;
282 }
283
284
285 //=======================================================================
286 //function : GetGeometry
287 //purpose  : 
288 //=======================================================================
289
290 Handle(TNaming_NamedShape) TDataXtd_Constraint::GetGeometry
291                                         (const Standard_Integer Index) const
292 {
293   return Handle(TNaming_NamedShape)::DownCast (myGeometries [Index-1]);
294 }
295
296
297 //=======================================================================
298 //function : NbGeometries
299 //purpose  : 
300 //=======================================================================
301
302 Standard_Integer TDataXtd_Constraint::NbGeometries () const 
303 {
304   Standard_Integer num_geom = 0 ;
305   while (num_geom < 4 && ! myGeometries[num_geom].IsNull()) {
306       num_geom += 1 ;
307   }
308   return num_geom ;
309 }
310
311
312 //=======================================================================
313 //function : IsDimension
314 //purpose  : 
315 //=======================================================================
316 Standard_Boolean TDataXtd_Constraint::IsDimension () const 
317 {
318   return !myValue.IsNull();
319 }
320
321
322 //=======================================================================
323 //function : IsPlanar
324 //purpose  : 
325 //=======================================================================
326 Standard_Boolean TDataXtd_Constraint::IsPlanar () const 
327 {
328   return !myPlane.IsNull();
329 }
330
331 //=======================================================================
332 //function : SetValue
333 //purpose  : 
334 //=======================================================================
335
336 void TDataXtd_Constraint::SetValue (const Handle(TDataStd_Real)& V) 
337 {
338   // OCC2932 correction
339   if (myValue.IsNull() == Standard_False && V.IsNull() == Standard_False)
340     if(myValue->Get() == V->Get()) return;
341
342   Backup();
343   myValue = V;
344 }
345
346 //=======================================================================
347 //function : GetValue
348 //purpose  : 
349 //=======================================================================
350
351 const Handle(TDataStd_Real)& TDataXtd_Constraint::GetValue () const
352 {
353   return myValue;
354 }
355
356
357 //=======================================================================
358 //function : ID
359 //purpose  : 
360 //=======================================================================
361
362 const Standard_GUID& TDataXtd_Constraint::ID () const { return GetID(); }
363
364
365 //=======================================================================
366 //function : NewEmpty
367 //purpose  : 
368 //=======================================================================
369
370 Handle(TDF_Attribute) TDataXtd_Constraint::NewEmpty () const
371 {  
372   return new TDataXtd_Constraint (); 
373 }
374
375
376 //=======================================================================
377 //function : Restore
378 //purpose  : 
379 //=======================================================================
380
381 void TDataXtd_Constraint::Restore(const Handle(TDF_Attribute)& with) 
382 {
383   Handle(TDataXtd_Constraint) CTR =Handle(TDataXtd_Constraint)::DownCast(with); 
384   myGeometries [0] = CTR->GetGeometry (1);
385   myGeometries [1] = CTR->GetGeometry (2);
386   myGeometries [2] = CTR->GetGeometry (3);
387   myGeometries [3] = CTR->GetGeometry (4);
388   myType = CTR->GetType ();
389   myValue = CTR->GetValue ();
390   myIsVerified = CTR->Verified();
391   myIsInverted = CTR->Inverted();
392   myIsReversed = CTR->Reversed();
393   myPlane = CTR->GetPlane();
394 }
395
396
397
398 //=======================================================================
399 //function : Paste
400 //purpose  : 
401 //=======================================================================
402
403 void TDataXtd_Constraint::Paste (const Handle(TDF_Attribute)& into,
404                                  const Handle(TDF_RelocationTable)& RT) const
405 {  
406   Handle(TDataXtd_Constraint) CTR =Handle(TDataXtd_Constraint)::DownCast (into);
407   Handle(TNaming_NamedShape) G1, G2, G3, G4, plane;  
408   RT->HasRelocation (myGeometries[0], G1);
409   CTR->SetGeometry (1, G1);
410   RT->HasRelocation (myGeometries[1], G2);
411   CTR->SetGeometry (2, G2);
412   RT->HasRelocation (myGeometries[2], G3);
413   CTR->SetGeometry (3, G3);
414   RT->HasRelocation (myGeometries[3], G4);
415   CTR->SetGeometry (4, G4);
416
417   RT->HasRelocation (myPlane, plane);
418   CTR->SetPlane(plane);
419
420   Handle(TDataStd_Real) Value;
421   RT->HasRelocation (myValue,Value);
422   CTR->SetValue (Value);
423
424   CTR->SetType (myType);
425   CTR->Verified(Verified());
426   CTR->Inverted(Inverted());
427   CTR->Reversed(Reversed());
428 }    
429
430
431 //=======================================================================
432 //function : References
433 //purpose  : 
434 //=======================================================================
435
436 void TDataXtd_Constraint::References(const Handle(TDF_DataSet)& DS) const
437
438
439 //bidouille en attendant traitement des contraintes d assemblage en dehors de la part 
440 // l attribut placement devrait oriente vers les contraintes de placement en dehors
441   Standard_Integer Lim;
442   if (myType >= TDataXtd_MATE && myType<=TDataXtd_FACES_ANGLE)  Lim =1;
443   else Lim =3;
444
445   for (Standard_Integer i=0; i<=Lim; i++) {
446     if (!myGeometries [i].IsNull()) DS->AddAttribute (myGeometries[i]);
447   }
448
449   if (!myValue.IsNull()) DS->AddAttribute (myValue);
450   if (!myPlane.IsNull()) DS->AddAttribute (myPlane);
451 }
452
453 //=======================================================================
454 //function : Verified
455 //purpose  : 
456 //=======================================================================
457 void TDataXtd_Constraint::Verified(const Standard_Boolean status)
458 {
459   // OCC2932 correction
460   if(myIsVerified == status) return;
461
462   Backup();
463   myIsVerified = status;
464 }
465
466 //=======================================================================
467 //function : Verified
468 //purpose  : 
469 //=======================================================================
470 Standard_Boolean TDataXtd_Constraint::Verified() const 
471 {
472   return myIsVerified;
473 }
474
475 //=======================================================================
476 //function : Reversed
477 //purpose  : 
478 //=======================================================================
479 void TDataXtd_Constraint::Reversed(const Standard_Boolean status)
480 {
481   // OCC2932 correction
482   if(myIsReversed == status ) return;
483
484   Backup();
485   myIsReversed = status;
486 }
487
488 //=======================================================================
489 //function : Reversed
490 //purpose  : 
491 //=======================================================================
492 Standard_Boolean TDataXtd_Constraint::Reversed() const 
493 {
494   return myIsReversed;
495 }
496
497 //=======================================================================
498 //function : Inverted
499 //purpose  : 
500 //=======================================================================
501 void TDataXtd_Constraint::Inverted(const Standard_Boolean status)
502 {
503   // OCC2932 correction
504   if(myIsInverted == status) return;
505
506   Backup();
507   myIsInverted = status;
508 }
509
510 //=======================================================================
511 //function : Inverted
512 //purpose  : 
513 //=======================================================================
514 Standard_Boolean TDataXtd_Constraint::Inverted() const 
515 {
516   return myIsInverted;
517 }
518
519
520 //=======================================================================
521 //function : CollectChildConstraints
522 //purpose  : 
523 //=======================================================================
524
525 void TDataXtd_Constraint::CollectChildConstraints(const TDF_Label& aLabel,
526                                                   TDF_LabelList& LL)  
527 {
528   TDF_ChildIterator it(aLabel,Standard_True);
529   Handle(TDataXtd_Constraint) aConstraint;
530   for (; it.More(); it.Next()) {
531     if (it.Value().FindAttribute(TDataXtd_Constraint::GetID(), aConstraint)) {
532       LL.Append(it.Value());
533     }
534   }
535   
536 }
537
538
539 //=======================================================================
540 //function : Dump
541 //purpose  : 
542 //=======================================================================
543
544 Standard_OStream& TDataXtd_Constraint::Dump (Standard_OStream& anOS) const
545 {  
546   anOS << "Constraint ";
547   TDataXtd::Print(GetType(),anOS);
548   return anOS;
549 }
550