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