2 #include "HYDROData_ImmersibleZone.h"
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"
10 #include <BRepBuilderAPI_MakeFace.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>
19 #include <BRep_Builder.hxx>
20 #include <BRepAlgo_FaceRestrictor.hxx>
21 #include <BRepCheck_Analyzer.hxx>
23 #include <ShapeAnalysis.hxx>
26 #include <QStringList>
28 //#define HYDRODATA_IMZONE_DEB 1
30 IMPLEMENT_STANDARD_HANDLE(HYDROData_ImmersibleZone,HYDROData_NaturalObject)
31 IMPLEMENT_STANDARD_RTTIEXT(HYDROData_ImmersibleZone,HYDROData_NaturalObject)
34 HYDROData_ImmersibleZone::HYDROData_ImmersibleZone()
35 : HYDROData_NaturalObject()
39 HYDROData_ImmersibleZone::~HYDROData_ImmersibleZone()
43 QStringList HYDROData_ImmersibleZone::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const
45 QStringList aResList = dumpObjectCreation( theTreatedObjects );
47 QString aZoneName = GetObjPyName();
49 Handle(HYDROData_IAltitudeObject) aRefAltitude = GetAltitudeObject();
50 setPythonReferenceObject( theTreatedObjects, aResList, aRefAltitude, "SetAltitudeObject" );
52 Handle(HYDROData_PolylineXY) aRefPolyline = GetPolyline();
53 setPythonReferenceObject( theTreatedObjects, aResList, aRefPolyline, "SetPolyline" );
55 aResList << QString( "" );
57 aResList << QString( "%1.Update();" ).arg( aZoneName );
58 aResList << QString( "" );
63 HYDROData_SequenceOfObjects HYDROData_ImmersibleZone::GetAllReferenceObjects() const
65 HYDROData_SequenceOfObjects aResSeq = HYDROData_NaturalObject::GetAllReferenceObjects();
67 Handle(HYDROData_PolylineXY) aRefPolyline = GetPolyline();
68 if ( !aRefPolyline.IsNull() )
69 aResSeq.Append( aRefPolyline );
74 TopoDS_Shape HYDROData_ImmersibleZone::GetTopShape() const
79 void HYDROData_ImmersibleZone::Update()
81 HYDROData_NaturalObject::Update();
83 TopoDS_Shape aResShape = generateTopShape();
84 SetTopShape( aResShape );
89 TopoDS_Shape HYDROData_ImmersibleZone::generateTopShape() const
91 return generateTopShape( GetPolyline() );
94 TopoDS_Shape HYDROData_ImmersibleZone::generateTopShape( const Handle(HYDROData_PolylineXY)& aPolyline )
96 TopoDS_Face aResultFace = TopoDS_Face();
98 if( !aPolyline.IsNull() )
100 TopoDS_Shape aPolylineShape = aPolyline->GetShape();
101 TopTools_ListOfShape aWiresList;
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 );
109 if( aMakeFace.IsDone() ) {
110 return aMakeFace.Face();
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 );
121 if(aWiresList.IsEmpty())
124 BRepAlgo_FaceRestrictor aFR;
125 TopoDS_Face aRefFace;
126 TopoDS_Shape aS = aWiresList.First();
127 BRepBuilderAPI_MakeFace aMakeFace( TopoDS::Wire(aWiresList.First()), Standard_True );
129 if( aMakeFace.IsDone() ) {
130 aRefFace = aMakeFace.Face();
132 if(aRefFace.IsNull())
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() )
145 for (; aFR.More(); aFR.Next()) {
146 aResultFace = aFR.Current();
153 if( aResultFace.IsNull() )
156 BRepCheck_Analyzer anAnalyzer( aResultFace );
157 if( anAnalyzer.IsValid() && aResultFace.ShapeType()==TopAbs_FACE )
160 return TopoDS_Face();
163 void HYDROData_ImmersibleZone::createGroupObjects()
165 TopoDS_Shape aZoneShape = GetTopShape();
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 )
171 TopExp_Explorer aZoneFaceExp( aZoneShape, TopAbs_FACE );
172 if ( aZoneFaceExp.More() )
173 aZoneShape = aZoneFaceExp.Current(); // Take only first face into account
176 if ( aZoneShape.IsNull() || aZoneShape.ShapeType() != TopAbs_FACE )
179 TopoDS_Face aZoneFace = TopoDS::Face( aZoneShape );
181 TopoDS_Wire aZoneOuterWire = ShapeAnalysis::OuterWire( aZoneFace );
183 // Create outer edges group
184 QString anOutWiresGroupName = GetName() + "_Outer";
186 Handle(HYDROData_ShapesGroup) anOutWiresGroup = createGroupObject();
187 anOutWiresGroup->SetName( anOutWiresGroupName );
189 TopTools_SequenceOfShape anOuterEdges;
190 HYDROData_ShapesTool::ExploreShapeToShapes( aZoneOuterWire, TopAbs_EDGE, anOuterEdges );
191 anOutWiresGroup->SetShapes( anOuterEdges );
193 int anInnerCounter = 1;
194 TopExp_Explorer aZoneFaceExp( aZoneFace, TopAbs_WIRE );
195 for ( ; aZoneFaceExp.More(); aZoneFaceExp.Next() )
197 TopoDS_Wire aZoneWire = TopoDS::Wire( aZoneFaceExp.Current() );
198 if ( aZoneWire.IsEqual( aZoneOuterWire ) )
199 continue; // Skip the outer wire
201 TopTools_SequenceOfShape anInnerEdges;
202 HYDROData_ShapesTool::ExploreShapeToShapes( aZoneWire, TopAbs_EDGE, anInnerEdges );
203 if ( anInnerEdges.IsEmpty() )
206 QString anInWiresGroupName = GetName() + "_Inner_" + QString::number( anInnerCounter++ );
208 Handle(HYDROData_ShapesGroup) anInWiresGroup = createGroupObject();
209 anInWiresGroup->SetName( anInWiresGroupName );
211 anInWiresGroup->SetShapes( anInnerEdges );
215 TopoDS_Shape HYDROData_ImmersibleZone::GetShape3D() const
217 return getTopShape();
220 QColor HYDROData_ImmersibleZone::DefaultFillingColor()
222 return QColor( Qt::darkBlue );
225 QColor HYDROData_ImmersibleZone::DefaultBorderColor()
227 return QColor( Qt::transparent );
230 QColor HYDROData_ImmersibleZone::getDefaultFillingColor() const
232 return DefaultFillingColor();
235 QColor HYDROData_ImmersibleZone::getDefaultBorderColor() const
237 return DefaultBorderColor();
240 void HYDROData_ImmersibleZone::SetPolyline( const Handle(HYDROData_PolylineXY)& thePolyline )
242 SetReferenceObject( thePolyline, DataTag_Polyline );
246 Handle(HYDROData_PolylineXY) HYDROData_ImmersibleZone::GetPolyline() const
248 return Handle(HYDROData_PolylineXY)::DownCast(
249 GetReferenceObject( DataTag_Polyline ) );
252 void HYDROData_ImmersibleZone::RemovePolyline()
254 ClearReferenceObjects( DataTag_Polyline );