Salome HOME
Dump to python corrected.
[modules/hydro.git] / src / HYDROData / HYDROData_ImmersibleZone.cxx
1
2 #include "HYDROData_ImmersibleZone.h"
3
4 #include "HYDROData_IAltitudeObject.h"
5 #include "HYDROData_Document.h"
6 #include "HYDROData_ShapesGroup.h"
7 #include "HYDROData_PolylineXY.h"
8 #include "HYDROData_ShapesTool.h"
9
10 #include <BRepBuilderAPI_MakeFace.hxx>
11
12 #include <TopoDS.hxx>
13 #include <TopoDS_Face.hxx>
14 #include <TopoDS_Wire.hxx>
15 #include <TopoDS_Compound.hxx>
16 #include <TopExp_Explorer.hxx>
17 #include <TopTools_ListIteratorOfListOfShape.hxx>
18
19 #include <BRep_Builder.hxx>
20 #include <BRepAlgo_FaceRestrictor.hxx>
21 #include <BRepCheck_Analyzer.hxx>
22
23 #include <ShapeAnalysis.hxx>
24
25 #include <QColor>
26 #include <QStringList>
27
28 //#define HYDRODATA_IMZONE_DEB 1
29
30 IMPLEMENT_STANDARD_HANDLE(HYDROData_ImmersibleZone,HYDROData_NaturalObject)
31 IMPLEMENT_STANDARD_RTTIEXT(HYDROData_ImmersibleZone,HYDROData_NaturalObject)
32
33
34 HYDROData_ImmersibleZone::HYDROData_ImmersibleZone()
35 : HYDROData_NaturalObject()
36 {
37 }
38
39 HYDROData_ImmersibleZone::~HYDROData_ImmersibleZone()
40 {
41 }
42
43 QStringList HYDROData_ImmersibleZone::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const
44 {
45   QStringList aResList = dumpObjectCreation( theTreatedObjects );
46   
47   QString aZoneName = GetObjPyName();
48
49   Handle(HYDROData_IAltitudeObject) aRefAltitude = GetAltitudeObject();
50   setPythonReferenceObject( theTreatedObjects, aResList, aRefAltitude, "SetAltitudeObject" );
51
52   Handle(HYDROData_PolylineXY) aRefPolyline = GetPolyline();
53   setPythonReferenceObject( theTreatedObjects, aResList, aRefPolyline, "SetPolyline" );
54
55   aResList << QString( "" );
56
57   aResList << QString( "%1.Update();" ).arg( aZoneName );
58   aResList << QString( "" );
59
60   return aResList;
61 }
62
63 HYDROData_SequenceOfObjects HYDROData_ImmersibleZone::GetAllReferenceObjects() const
64 {
65   HYDROData_SequenceOfObjects aResSeq = HYDROData_NaturalObject::GetAllReferenceObjects();
66
67   Handle(HYDROData_PolylineXY) aRefPolyline = GetPolyline();
68   if ( !aRefPolyline.IsNull() )
69     aResSeq.Append( aRefPolyline );
70
71   return aResSeq;
72 }
73
74 TopoDS_Shape HYDROData_ImmersibleZone::GetTopShape() const
75 {
76   return getTopShape();
77 }
78
79 void HYDROData_ImmersibleZone::Update()
80 {
81   HYDROData_NaturalObject::Update();
82   
83   TopoDS_Shape aResShape = generateTopShape();
84   SetTopShape( aResShape );
85
86   createGroupObjects();
87 }
88
89 TopoDS_Shape HYDROData_ImmersibleZone::generateTopShape() const
90 {
91   return generateTopShape( GetPolyline() );
92 }
93
94 TopoDS_Shape HYDROData_ImmersibleZone::generateTopShape( const Handle(HYDROData_PolylineXY)& aPolyline )
95 {
96   TopoDS_Face aResultFace = TopoDS_Face();
97
98   if( !aPolyline.IsNull() )
99   {
100     TopoDS_Shape aPolylineShape = aPolyline->GetShape();
101     TopTools_ListOfShape aWiresList;
102
103     if ( !aPolylineShape.IsNull() && 
104          aPolylineShape.ShapeType() == TopAbs_WIRE ) {
105       const TopoDS_Wire& aPolylineWire = TopoDS::Wire( aPolylineShape );
106       if ( !aPolylineWire.IsNull() ) {
107         BRepBuilderAPI_MakeFace aMakeFace( aPolylineWire, Standard_True );
108         aMakeFace.Build();
109         if( aMakeFace.IsDone() ) {
110           return aMakeFace.Face();
111         }
112       }
113     } else {
114       TopExp_Explorer anExp( aPolylineShape, TopAbs_WIRE );
115       for ( ; anExp.More(); anExp.Next() ) {
116         if(!anExp.Current().IsNull()) {
117           const TopoDS_Wire& aWire = TopoDS::Wire( anExp.Current() );
118           aWiresList.Append( aWire );
119         }
120       }
121       if(aWiresList.IsEmpty())
122          return aResultFace;
123
124       BRepAlgo_FaceRestrictor aFR;
125       TopoDS_Face aRefFace;      
126       TopoDS_Shape aS = aWiresList.First();
127       BRepBuilderAPI_MakeFace aMakeFace( TopoDS::Wire(aWiresList.First()), Standard_True );
128       aMakeFace.Build();
129       if( aMakeFace.IsDone() ) {
130         aRefFace = aMakeFace.Face();
131       }
132       if(aRefFace.IsNull())
133         return aResultFace;
134
135       aFR.Init(aRefFace,Standard_False, Standard_True);
136       TopTools_ListIteratorOfListOfShape anIt( aWiresList );
137       for ( ; anIt.More(); anIt.Next() ) {
138         TopoDS_Wire& aWire = TopoDS::Wire( anIt.Value() );
139         if ( aWire.IsNull() ) 
140             continue;
141         aFR.Add(aWire);
142       }
143       aFR.Perform();
144       if (aFR.IsDone()) {
145         for (; aFR.More(); aFR.Next()) {
146           aResultFace = aFR.Current();
147           break;
148         }
149       }
150     }
151   }
152
153   if( aResultFace.IsNull() )
154     return aResultFace;
155
156   BRepCheck_Analyzer anAnalyzer( aResultFace );
157   if( anAnalyzer.IsValid() && aResultFace.ShapeType()==TopAbs_FACE )
158     return aResultFace;
159   else
160     return TopoDS_Face();
161 }
162
163 void HYDROData_ImmersibleZone::createGroupObjects()
164 {
165   TopoDS_Shape aZoneShape = GetTopShape();
166   
167   // Temporary solution while the restriction for polylines is not implemented
168   // and shape for zone can be compound and not face only
169   if ( !aZoneShape.IsNull() && aZoneShape.ShapeType() != TopAbs_FACE )
170   {
171     TopExp_Explorer aZoneFaceExp( aZoneShape, TopAbs_FACE );
172     if ( aZoneFaceExp.More() )
173       aZoneShape = aZoneFaceExp.Current(); // Take only first face into account
174   }
175
176   if ( aZoneShape.IsNull() || aZoneShape.ShapeType() != TopAbs_FACE )
177     return;
178
179   TopoDS_Face aZoneFace = TopoDS::Face( aZoneShape );
180   
181   TopoDS_Wire aZoneOuterWire = ShapeAnalysis::OuterWire( aZoneFace );
182
183   // Create outer edges group
184   QString anOutWiresGroupName = GetName() + "_Outer";
185
186   Handle(HYDROData_ShapesGroup) anOutWiresGroup = createGroupObject();
187   anOutWiresGroup->SetName( anOutWiresGroupName );
188
189   TopTools_SequenceOfShape anOuterEdges;
190   HYDROData_ShapesTool::ExploreShapeToShapes( aZoneOuterWire, TopAbs_EDGE, anOuterEdges );
191   anOutWiresGroup->SetShapes( anOuterEdges );
192
193   int anInnerCounter = 1;
194   TopExp_Explorer aZoneFaceExp( aZoneFace, TopAbs_WIRE );
195   for ( ; aZoneFaceExp.More(); aZoneFaceExp.Next() )
196   {
197     TopoDS_Wire aZoneWire = TopoDS::Wire( aZoneFaceExp.Current() );
198     if ( aZoneWire.IsEqual( aZoneOuterWire ) )
199       continue; // Skip the outer wire
200
201     TopTools_SequenceOfShape anInnerEdges;
202     HYDROData_ShapesTool::ExploreShapeToShapes( aZoneWire, TopAbs_EDGE, anInnerEdges );
203     if ( anInnerEdges.IsEmpty() )
204       continue;
205
206     QString anInWiresGroupName = GetName() + "_Inner_" + QString::number( anInnerCounter++ );
207
208     Handle(HYDROData_ShapesGroup) anInWiresGroup = createGroupObject();
209     anInWiresGroup->SetName( anInWiresGroupName );
210
211     anInWiresGroup->SetShapes( anInnerEdges );
212   }  
213 }
214
215 TopoDS_Shape HYDROData_ImmersibleZone::GetShape3D() const
216 {
217   return getTopShape();
218 }
219
220 QColor HYDROData_ImmersibleZone::DefaultFillingColor()
221 {
222   return QColor( Qt::darkBlue );
223 }
224
225 QColor HYDROData_ImmersibleZone::DefaultBorderColor()
226 {
227   return QColor( Qt::transparent );
228 }
229
230 QColor HYDROData_ImmersibleZone::getDefaultFillingColor() const
231 {
232   return DefaultFillingColor();
233 }
234
235 QColor HYDROData_ImmersibleZone::getDefaultBorderColor() const
236 {
237   return DefaultBorderColor();
238 }
239
240 void HYDROData_ImmersibleZone::SetPolyline( const Handle(HYDROData_PolylineXY)& thePolyline )
241 {
242   SetReferenceObject( thePolyline, DataTag_Polyline );
243   SetToUpdate( true );
244 }
245
246 Handle(HYDROData_PolylineXY) HYDROData_ImmersibleZone::GetPolyline() const
247 {
248   return Handle(HYDROData_PolylineXY)::DownCast( 
249            GetReferenceObject( DataTag_Polyline ) );
250 }
251
252 void HYDROData_ImmersibleZone::RemovePolyline()
253 {
254   ClearReferenceObjects( DataTag_Polyline );
255   SetToUpdate( true );
256 }
257
258