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