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