Salome HOME
a4a2f12223900461c57f20b64497151a87eb3cb8
[modules/hydro.git] / src / HYDROData / HYDROData_Transform.cxx
1 #include <HYDROData_Transform.h>
2
3 #include <math.h>
4
5 #include <Bnd_Box.hxx>
6 #include <gp_Vec.hxx>
7
8 #include <TopoDS_Shape.hxx>
9 #include <TopoDS_Iterator.hxx>
10
11 #include <BRepBndLib.hxx>
12
13 #include <TopTools_ListIteratorOfListOfShape.hxx>
14
15 #include <BOPCol_ListOfShape.hxx>
16 #include <BOPCol_MapOfShape.hxx>
17
18 #include <BOPCol_ListOfShape.hxx>
19
20 #include <BOPAlgo_BuilderShape.hxx>
21 #include <BOPAlgo_PaveFiller.hxx>
22
23 //=======================================================================
24 //function : HYDROData_Transform
25 //purpose  : 
26 //=======================================================================
27 HYDROData_Transform::HYDROData_Transform()
28 :
29   BOPAlgo_BuilderShape()
30 {
31   myToTransform=Standard_False;
32   myTreshold=10000.;
33   myTransform1=NULL;
34   myTransform2=NULL;
35   myBuilder=NULL;
36 }
37 //=======================================================================
38 //function : ~
39 //purpose  : 
40 //=======================================================================
41 HYDROData_Transform::~HYDROData_Transform()
42 {
43   Clear();
44 }
45 //=======================================================================
46 //function : Clear
47 //purpose  : 
48 //=======================================================================
49 void HYDROData_Transform::Clear()
50 {
51   myTreshold=10000.;
52   //
53   if (myTransform1) {
54     delete myTransform1;
55     myTransform1=NULL;
56   }
57   if (myTransform2) {
58     delete myTransform2;
59     myTransform2=NULL;
60   }
61   if (myBuilder) {
62     delete myBuilder;
63     myBuilder=NULL;
64   }
65   //
66   BOPAlgo_BuilderShape::PrepareHistory();
67 }
68 //=======================================================================
69 //function : SetArgument
70 //purpose  : 
71 //=======================================================================
72 void HYDROData_Transform::SetArgument(const TopoDS_Shape& theShape)
73 {
74   myArgument=theShape;
75 }
76 //=======================================================================
77 //function : AddArgument
78 //purpose  : 
79 //=======================================================================
80 const TopoDS_Shape& HYDROData_Transform::Argument()const
81 {
82   return myArgument;
83 }
84 //=======================================================================
85 //function : SetTreshold
86 //purpose  : 
87 //=======================================================================
88 void HYDROData_Transform::SetTreshold(const Standard_Real theTreshold)
89 {
90   myTreshold=theTreshold;
91 }
92 //=======================================================================
93 //function : Treshold
94 //purpose  : 
95 //=======================================================================
96 Standard_Real HYDROData_Transform::Treshold()const 
97 {
98   return myTreshold;
99 }
100 //=======================================================================
101 //function : SetToTransform
102 //purpose  : 
103 //=======================================================================
104 void HYDROData_Transform::SetToTransform(const Standard_Boolean theFlag)
105 {
106   myToTransform=theFlag;
107 }
108 //=======================================================================
109 //function : ToTransform
110 //purpose  : 
111 //=======================================================================
112 Standard_Boolean HYDROData_Transform::ToTransform()const
113 {
114   return myToTransform;
115 }
116 //=======================================================================
117 //function : CheckData
118 //purpose  : 
119 //=======================================================================
120 void HYDROData_Transform::CheckData()
121 {
122   if(myArgument.IsNull()) {
123     myErrorStatus=10;
124   }
125 }
126 //=======================================================================
127 //function : Prepare
128 //purpose  : 
129 //=======================================================================
130 void HYDROData_Transform::Prepare()
131 {
132   TopoDS_Shape aSx;
133   //
134   myErrorStatus=0;
135   myWarningStatus=0;
136   myShape=aSx;
137 }
138 //=======================================================================
139 //function : Perform
140 //purpose  : 
141 //=======================================================================
142 void HYDROData_Transform::Perform()
143 {
144   Prepare();
145   //
146   CheckData();
147   if(myErrorStatus) {
148     return;
149   }
150   //
151   Clear();
152   if(myErrorStatus) {
153     return;
154   }
155   //
156   ComputeTrsf();
157   if(myErrorStatus) {
158     return;
159   }
160   //
161   Transform1();
162   if(myErrorStatus) {
163     return;
164   }
165   //
166   BuildFuse();
167   if(myErrorStatus) {
168     return;
169   }
170   //
171   Transform2();
172 }
173 //=======================================================================
174 //function : Detect
175 //purpose  : 
176 //=======================================================================
177 void HYDROData_Transform::Detect()
178 {
179   Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
180   Standard_Real aXc, aYc, aZc;
181   Bnd_Box aBox; 
182   gp_Vec aVec;
183   //
184   myErrorStatus=0;
185   //
186   BRepBndLib::Add(myArgument, aBox);
187   //
188   aBox.Get(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
189   //
190   aXc=0.5*(aXmin+aXmax);
191   aYc=0.5*(aYmin+aYmax);
192   aZc=0.5*(aZmin+aZmax);
193   printf(" aVc : { %lf %lf %lf }\n", aXc, aYc, aZc);
194   //
195   myToTransform=Standard_False;
196   if (fabs(aXc)>myTreshold || 
197       fabs(aYc)>myTreshold || 
198       fabs(aZc)>myTreshold) {
199     myToTransform=!myToTransform;
200   }  
201   //
202   aVec.SetCoord(-aXc, -aYc, -aZc);
203   myTrsf1.SetTranslation(aVec);
204   //
205   aVec.SetCoord(aXc, aYc, aZc);
206   myTrsf2.SetTranslation(aVec);
207 }
208 //=======================================================================
209 //function : ComputeTrsf
210 //purpose  : 
211 //=======================================================================
212 void HYDROData_Transform::ComputeTrsf()
213 {
214   if (!myToTransform) {
215     gp_Trsf aTrsf;
216     //
217     myTrsf1=aTrsf;
218     myTrsf2=aTrsf;
219   }
220 }
221 //=======================================================================
222 //function : Transform1
223 //purpose  : 
224 //=======================================================================
225 void HYDROData_Transform::Transform1()
226 {
227   Standard_Boolean bIsDone;
228   //
229   myErrorStatus=0;
230   //
231   myTransform1=new BRepBuilderAPI_Transform(myTrsf1);
232   //
233   myTransform1->Perform(myArgument);
234   bIsDone=myTransform1->IsDone();
235   if (!bIsDone) {
236     myErrorStatus=11;
237     return;
238   }
239 }
240 //=======================================================================
241 //function : BuildFuse
242 //purpose  : 
243 //=======================================================================
244 void HYDROData_Transform::BuildFuse()
245 {
246   Standard_Integer iErr;
247   TopoDS_Iterator aIt;
248   BOPCol_ListOfShape aLC;
249   BOPAlgo_PaveFiller aPF;
250   //
251   myErrorStatus=0;
252   //
253   const TopoDS_Shape& aS1=myTransform1->Shape();
254   //
255   aIt.Initialize(aS1);
256   for (; aIt.More(); aIt.Next()) {
257     const TopoDS_Shape& aS1x=aIt.Value();
258     aLC.Append(aS1x);
259   }
260   //
261   aPF.SetArguments(aLC);
262   //
263   aPF.Perform();
264   iErr=aPF.ErrorStatus();
265   if (iErr) {
266     myErrorStatus=20;
267     return;
268   }
269   //
270   myBuilder=new BOPAlgo_Builder;
271   //
272   aIt.Initialize(aS1);
273   for (; aIt.More(); aIt.Next()) {
274     const TopoDS_Shape& aS1x=aIt.Value();
275     myBuilder->AddArgument(aS1x);
276   }
277   //
278   myBuilder->PerformWithFiller(aPF);
279   iErr=myBuilder->ErrorStatus();
280   if (iErr) {
281     myErrorStatus=21;
282     return;
283   }
284 }
285 //=======================================================================
286 //function : Transform2
287 //purpose  : 
288 //=======================================================================
289 void HYDROData_Transform::Transform2()
290 {
291   Standard_Boolean bIsDone;
292   //
293   myErrorStatus=0;
294   //
295   const TopoDS_Shape& aR1=myBuilder->Shape();
296   //
297   myTransform2=new BRepBuilderAPI_Transform(myTrsf2);
298   //
299   myTransform2->Perform(aR1);
300   bIsDone=myTransform2->IsDone();
301   if (!bIsDone) {
302     myErrorStatus=12;
303     return;
304   }
305   //
306   const TopoDS_Shape& aR2=myTransform2->Shape();
307   //
308   myShape=aR2;
309 }
310 //
311 //=======================================================================
312 //function : Modified
313 //purpose  : 
314 //=======================================================================
315 const TopTools_ListOfShape& HYDROData_Transform::Modified
316   (const TopoDS_Shape& aS)
317 {
318   TopTools_ListOfShape* pHistShapes;
319   TopTools_ListIteratorOfListOfShape aItLS;
320   //
321   pHistShapes=(TopTools_ListOfShape*)&myHistShapes;
322   pHistShapes->Clear();
323   //
324   const TopTools_ListOfShape& aLS1=myTransform1->Modified(aS);
325   const TopoDS_Shape& aS1=aLS1.First();
326   //
327   const TopTools_ListOfShape& aLS1B=myBuilder->Modified(aS1);
328   aItLS.Initialize(aLS1B);
329   for (; aItLS.More(); aItLS.Next()) {
330     const TopoDS_Shape& aS1B=aItLS.Value();
331     const TopTools_ListOfShape& aLS2B=myTransform2->Modified(aS1B);
332     const TopoDS_Shape& aS2B=aLS2B.First();
333     pHistShapes->Append(aS2B);
334   }
335   //
336   return myHistShapes;
337 }
338 //=======================================================================
339 //function : Generated
340 //purpose  : 
341 //=======================================================================
342 const TopTools_ListOfShape& HYDROData_Transform::Generated
343   (const TopoDS_Shape& aS)
344 {
345   TopTools_ListOfShape* pHistShapes;
346   TopTools_ListIteratorOfListOfShape aItLS;
347   //
348   pHistShapes=(TopTools_ListOfShape*)&myHistShapes;
349   pHistShapes->Clear();
350   //
351   const TopTools_ListOfShape& aLS1=myTransform1->Modified(aS);
352   const TopoDS_Shape& aS1=aLS1.First();
353   //
354   const TopTools_ListOfShape& aLS1B=myBuilder->Generated(aS1);
355   aItLS.Initialize(aLS1B);
356   for (; aItLS.More(); aItLS.Next()) {
357     const TopoDS_Shape& aS1B=aItLS.Value();
358     const TopTools_ListOfShape& aLS2B=myTransform2->Modified(aS1B);
359     const TopoDS_Shape& aS2B=aLS2B.First();
360     pHistShapes->Append(aS2B);
361   }
362   //
363   return myHistShapes;
364 }
365 //=======================================================================
366 //function : IsDeleted
367 //purpose  : 
368 //=======================================================================
369 Standard_Boolean HYDROData_Transform::IsDeleted(const TopoDS_Shape& aS)
370 {
371   Standard_Boolean bIsDeleted;
372   //
373   const TopTools_ListOfShape& aLS1=myTransform1->Modified(aS);
374   const TopoDS_Shape& aS1=aLS1.First();
375   //
376   bIsDeleted=myBuilder->IsDeleted(aS1);
377   //
378   return bIsDeleted;
379 }
380 //=======================================================================
381 //function : HasDeleted
382 //purpose  : 
383 //=======================================================================
384 Standard_Boolean HYDROData_Transform::HasDeleted()
385 {
386   return myBuilder->HasDeleted();
387 }
388 //=======================================================================
389 //function : HasGenerated
390 //purpose  : 
391 //=======================================================================
392 Standard_Boolean HYDROData_Transform::HasGenerated()
393 {
394   return myBuilder->HasGenerated();
395 }
396 //=======================================================================
397 //function : HasModified
398 //purpose  : 
399 //=======================================================================
400 Standard_Boolean HYDROData_Transform::HasModified()
401 {
402   return myBuilder->HasModified();
403 }