0022943: Bug TDataXtd_PatternStd
[occt.git] / src / TDataXtd / TDataXtd_PatternStd.cxx
1 // File:        TDataXtd_PatternStd.cxx
2 // Created:     Mon Apr  6 18:05:31 2009
3 // Author:      Sergey ZARITCHNY
4 //              <sergey.zaritchny@opencascade.com>
5 //Copyright:    Open CasCade SA 2009
6
7
8 #include <TDataXtd_PatternStd.ixx>
9 #include <TDataStd.hxx>
10 #include <TDataXtd_Geometry.hxx>
11 #include <TDF_Label.hxx>
12 #include <gp_Vec.hxx>
13 #include <gp_Lin.hxx>
14 #include <gp_Trsf.hxx>
15 #include <gp_Pln.hxx>
16 #include <gp_Ax1.hxx>
17 #include <TopoDS_Shape.hxx>
18
19
20 //=======================================================================
21 //function : GetPatternID
22 //purpose  : 
23 //=======================================================================
24
25 const Standard_GUID& TDataXtd_PatternStd::GetPatternID() 
26 {
27   static Standard_GUID TDataXtd_PatternStdID("2a96b61b-ec8b-11d0-bee7-080009dc3333");
28   return TDataXtd_PatternStdID;
29 }
30
31
32 //=======================================================================
33 //function : Set
34 //purpose  : 
35 //=======================================================================
36
37 Handle(TDataXtd_PatternStd) TDataXtd_PatternStd::Set (const TDF_Label& L)
38
39   Handle(TDataXtd_PatternStd) A; 
40   if (!L.FindAttribute(TDataXtd_Pattern::GetID(), A)) {
41     A = new TDataXtd_PatternStd(); 
42     L.AddAttribute(A);
43   }
44   return A;
45 }
46
47 //=======================================================================
48 //function : TDataXtd_PatternStd
49 //purpose  : 
50 //=======================================================================
51
52 TDataXtd_PatternStd::TDataXtd_PatternStd()
53      : mySignature      (0),
54        myAxis1Reversed  (Standard_False),
55        myAxis2Reversed  (Standard_False)
56 {}
57
58 //=======================================================================
59 //function : Signature
60 //purpose  : 
61 //=======================================================================
62
63 void TDataXtd_PatternStd::Signature(const Standard_Integer signature) 
64 {
65   // OCC2932 correction
66   if(mySignature == signature) return;
67
68   Backup();
69   mySignature = signature;
70 }
71
72 //=======================================================================
73 //function : Axis1
74 //purpose  : 
75 //=======================================================================
76
77 void TDataXtd_PatternStd::Axis1(const Handle(TNaming_NamedShape)& Axis1) 
78 {
79   // OCC2932 correction
80   if(!myAxis1.IsNull())
81     if(myAxis1->Get() == Axis1->Get())
82       return;
83
84   Backup();
85   myAxis1 = Axis1;
86 }
87
88 //=======================================================================
89 //function : Axis2
90 //purpose  : 
91 //=======================================================================
92
93 void TDataXtd_PatternStd::Axis2(const Handle(TNaming_NamedShape)& Axis2) 
94 {
95   // OCC2932 correction
96   if(!myAxis2.IsNull())
97     if(myAxis2->Get() == Axis2->Get())
98       return;
99
100
101   Backup();
102   myAxis2 = Axis2;
103 }
104
105 //=======================================================================
106 //function : Axis1Reversed
107 //purpose  : 
108 //=======================================================================
109
110 void TDataXtd_PatternStd::Axis1Reversed(const Standard_Boolean Axis1Reversed) 
111 {
112   // OCC2932 correction
113   if(myAxis1Reversed == Axis1Reversed) return;
114
115   Backup();
116   myAxis1Reversed = Axis1Reversed;
117 }
118
119 //=======================================================================
120 //function : Axis2Reversed
121 //purpose  : 
122 //=======================================================================
123
124 void TDataXtd_PatternStd::Axis2Reversed(const Standard_Boolean Axis2Reversed) 
125 {
126   // OCC2932 correction
127   if(myAxis2Reversed == Axis2Reversed) return;
128
129   Backup();
130   myAxis2Reversed = Axis2Reversed;
131 }
132
133 //=======================================================================
134 //function : Value1
135 //purpose  : 
136 //=======================================================================
137
138 void TDataXtd_PatternStd::Value1(const Handle(TDataStd_Real)& value)
139 {
140   // OCC2932 correction
141   if(!myValue1.IsNull())
142     if(myValue1->Get() == value->Get())
143       return;
144
145   Backup();
146   myValue1 = value;
147 }
148
149
150 //=======================================================================
151 //function : Value2
152 //purpose  : 
153 //=======================================================================
154
155 void TDataXtd_PatternStd::Value2(const Handle(TDataStd_Real)& value)
156 {
157   // OCC2932 correction
158   if(!myValue2.IsNull())
159     if(myValue2->Get() == value->Get())
160       return;
161
162   Backup();
163   myValue2 = value;
164 }
165
166
167 //=======================================================================
168 //function : NbInstances1
169 //purpose  : 
170 //=======================================================================
171
172 void TDataXtd_PatternStd::NbInstances1(const Handle(TDataStd_Integer)& NbInstances1) 
173 {
174   // OCC2932 correction
175   if(!myNb1.IsNull())
176     if(myNb1->Get() == NbInstances1->Get())
177       return;
178
179   Backup();
180   myNb1 = NbInstances1;
181 }
182
183 //=======================================================================
184 //function : NbInstances2
185 //purpose  : 
186 //=======================================================================
187
188 void TDataXtd_PatternStd::NbInstances2(const Handle(TDataStd_Integer)& NbInstances2) 
189 {
190   // OCC2932 correction
191   if(!myNb2.IsNull())
192     if(myNb2->Get() == NbInstances2->Get())
193       return;
194
195   Backup();
196   myNb2 = NbInstances2;
197 }
198
199 //=======================================================================
200 //function : Mirror
201 //purpose  : 
202 //=======================================================================
203
204 void TDataXtd_PatternStd::Mirror(const Handle(TNaming_NamedShape)& plane)
205 {
206   // OCC2932 correction
207   if(!myMirror.IsNull()) {
208     if(myMirror->Get() == plane->Get())
209       return;
210   }
211
212   Backup();
213   myMirror = plane;
214 }
215
216 //=======================================================================
217 //function : NbTrsfs
218 //purpose  : 
219 //=======================================================================
220
221 Standard_Integer TDataXtd_PatternStd::NbTrsfs() const
222 {
223   Standard_Integer nb = 1;
224   if (mySignature < 5) {
225     if (!myNb1.IsNull()) nb = myNb1->Get();
226     if (!myNb2.IsNull()) nb = nb*myNb2->Get();
227     nb--;
228   }
229   return nb;
230 }
231
232
233 //=======================================================================
234 //function : ComputeTrsfs
235 //purpose  : 
236 //=======================================================================
237
238 void TDataXtd_PatternStd::ComputeTrsfs(TDataXtd_Array1OfTrsf& Trsfs) const
239 {
240   Standard_Integer nb = 0;
241   gp_Trsf trsf;
242
243   if (mySignature < 5) {
244
245     // recover direction and step
246     gp_Ax1 axis1;
247     TDataXtd_Geometry::Axis(myAxis1, axis1);
248     if (myAxis1Reversed) axis1.Reverse();
249     
250     Standard_Real value1 = myValue1->Get();
251     
252     for (Standard_Integer i=2; i<=myNb1->Get(); i++) {
253       if (mySignature != 2) {
254         gp_Vec vec(axis1.Direction());
255         vec *= (value1*(i-1));
256         trsf.SetTranslation(vec);
257       }
258       else {
259         trsf.SetRotation(axis1, value1*(i-1));
260       }
261       Trsfs(++nb) = trsf;
262     }
263     
264     if (mySignature == 3 || mySignature == 4) {
265       // recover direction and step
266       gp_Ax1 axis2;
267       TDataXtd_Geometry::Axis(myAxis2, axis2);
268       if (myAxis2Reversed) axis2.Reverse();
269       
270       Standard_Real value2 = myValue2->Get();
271       
272       for (Standard_Integer j=2; j<=myNb2->Get(); j++) {
273         gp_Trsf trsf2;
274         if (mySignature ==3) {
275           gp_Vec vec(axis2.Direction());
276           vec *= (value2*(j-1));
277           trsf2.SetTranslation(vec);
278         }
279         else {
280           trsf2.SetRotation(axis2, value2*(j-1));
281         }
282         
283         Trsfs(++nb) = trsf2;    
284         for (Standard_Integer i=2; i<=myNb1->Get(); i++) {
285           trsf = trsf2;
286           trsf.Multiply(Trsfs(i-1));
287           Trsfs(++nb) = trsf;
288         }
289       }
290     }  
291   }
292   else {
293     gp_Pln pln;
294     TDataXtd_Geometry::Plane(myMirror, pln);
295     trsf.SetMirror(pln.Position().Ax2());
296     Trsfs(++nb) = trsf;
297   }
298 }
299
300 //=======================================================================
301 //function : PatternID
302 //purpose  : 
303 //=======================================================================
304
305 const Standard_GUID& TDataXtd_PatternStd::PatternID() const
306 {
307   return GetPatternID ();
308 }
309
310
311 //=======================================================================
312 //function : Restore
313 //purpose  : 
314 //=======================================================================
315
316 void TDataXtd_PatternStd::Restore(const Handle(TDF_Attribute)& With) 
317 {
318   Handle(TDataXtd_PatternStd) PatternStd = Handle(TDataXtd_PatternStd)::DownCast(With);
319
320   mySignature = PatternStd->Signature();
321   myAxis1Reversed = PatternStd->Axis1Reversed();
322   myAxis2Reversed = PatternStd->Axis2Reversed();
323   
324   myAxis1 = PatternStd->Axis1();
325   myAxis2 = PatternStd->Axis2();
326   myValue1 = PatternStd->Value1();
327   myValue2 = PatternStd->Value2();
328   myNb1 = PatternStd->NbInstances1();
329   myNb2 = PatternStd->NbInstances2();
330   myMirror = PatternStd->Mirror();
331 }
332
333 //=======================================================================
334 //function : NewEmpty
335 //purpose  : 
336 //=======================================================================
337
338 Handle(TDF_Attribute) TDataXtd_PatternStd::NewEmpty() const
339 {
340   return new TDataXtd_PatternStd();
341 }
342
343 //=======================================================================
344 //function : Paste
345 //purpose  : 
346 //=======================================================================
347
348 void TDataXtd_PatternStd::Paste(const Handle(TDF_Attribute)& Into,
349                                 const Handle(TDF_RelocationTable)& RT) const
350 {
351   Handle(TDataXtd_PatternStd) intof = Handle(TDataXtd_PatternStd)::DownCast(Into);
352
353   intof->Signature(mySignature);
354   intof->Axis1Reversed(myAxis1Reversed);
355   intof->Axis2Reversed(myAxis2Reversed);
356     
357   if (mySignature < 5) {
358     Handle(TNaming_NamedShape) axis;
359     Handle(TDataStd_Real) value;
360     Handle(TDataStd_Integer) nb;
361
362     RT->HasRelocation(myAxis1, axis);
363     intof->Axis1(axis);
364     RT->HasRelocation(myValue1, value);
365     intof->Value1(value);
366     RT->HasRelocation(myNb1, nb);
367     intof->NbInstances1(nb);
368
369     if (mySignature > 2) {
370       RT->HasRelocation(myAxis2, axis);
371       intof->Axis2(axis);    
372       RT->HasRelocation(myValue2, value);
373       intof->Value2(value);
374       RT->HasRelocation(myNb2, nb);
375       intof->NbInstances2(nb);
376     }
377   }
378   else {
379     Handle(TNaming_NamedShape) plane;
380     RT->HasRelocation(myMirror, plane);
381     intof->Mirror(plane);
382   }
383 }
384
385 //=======================================================================
386 //function : References
387 //purpose  : 
388 //=======================================================================
389
390 void TDataXtd_PatternStd::References(const Handle(TDF_DataSet)& aDataSet) const
391 {
392   if (mySignature < 5) {
393     aDataSet->AddAttribute(myAxis1);
394     aDataSet->AddAttribute(myValue1);
395     aDataSet->AddAttribute(myNb1);
396     if (mySignature > 2) {
397       aDataSet->AddAttribute(myAxis2);
398       aDataSet->AddAttribute(myValue2);
399       aDataSet->AddAttribute(myNb2);
400     }
401   }
402   else {
403     aDataSet->AddAttribute(myMirror);
404   }
405 }
406
407 //=======================================================================
408 //function : Dump
409 //purpose  : 
410 //=======================================================================
411
412 Standard_OStream& TDataXtd_PatternStd::Dump(Standard_OStream& anOS) const
413 {
414   anOS << "TDataXtd_PatternStd";
415   return anOS;
416 }
417
418
419