X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_ImmersibleZone.cxx;h=c456c8c9ce85f6629307e9871af9959abc47eadb;hb=f9d37ee66fa46871478d806faa54de237225d3c6;hp=f3c5467998e8856aab51eec0e77e7d4231fda73e;hpb=e744ba34fd38d6744d11b54cd15b6f86350695b2;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_ImmersibleZone.cxx b/src/HYDROData/HYDROData_ImmersibleZone.cxx index f3c54679..c456c8c9 100644 --- a/src/HYDROData/HYDROData_ImmersibleZone.cxx +++ b/src/HYDROData/HYDROData_ImmersibleZone.cxx @@ -32,16 +32,23 @@ #include #include #include +#include #include #include #include #include +#include #include #include +#define DEB_IMZ +#include +#define _DEVDEBUG_ +#include "HYDRO_trace.hxx" + //#define HYDRODATA_IMZONE_DEB 1 IMPLEMENT_STANDARD_HANDLE(HYDROData_ImmersibleZone,HYDROData_NaturalObject) @@ -57,21 +64,27 @@ HYDROData_ImmersibleZone::~HYDROData_ImmersibleZone() { } -QStringList HYDROData_ImmersibleZone::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const +QStringList HYDROData_ImmersibleZone::DumpToPython( const QString& thePyScriptPath, + MapOfTreatedObjects& theTreatedObjects ) const { QStringList aResList = dumpObjectCreation( theTreatedObjects ); QString aZoneName = GetObjPyName(); Handle(HYDROData_IAltitudeObject) aRefAltitude = GetAltitudeObject(); - setPythonReferenceObject( theTreatedObjects, aResList, aRefAltitude, "SetAltitudeObject" ); + setPythonReferenceObject( thePyScriptPath, theTreatedObjects, aResList, aRefAltitude, "SetAltitudeObject" ); Handle(HYDROData_PolylineXY) aRefPolyline = GetPolyline(); - setPythonReferenceObject( theTreatedObjects, aResList, aRefPolyline, "SetPolyline" ); + setPythonReferenceObject( thePyScriptPath, theTreatedObjects, aResList, aRefPolyline, "SetPolyline" ); + + if (!this->IsSubmersible()) + { + aResList << QString( "%1.SetIsSubmersible(False)" ).arg( aZoneName ); + } aResList << QString( "" ); - aResList << QString( "%1.Update();" ).arg( aZoneName ); + aResList << QString( "%1.Update()" ).arg( aZoneName ); aResList << QString( "" ); return aResList; @@ -110,71 +123,132 @@ TopoDS_Shape HYDROData_ImmersibleZone::generateTopShape() const TopoDS_Shape HYDROData_ImmersibleZone::generateTopShape( const Handle(HYDROData_PolylineXY)& aPolyline ) { - TopoDS_Face aResultFace = TopoDS_Face(); - - if( !aPolyline.IsNull() ) - { - TopoDS_Shape aPolylineShape = aPolyline->GetShape(); - TopTools_ListOfShape aWiresList; - - if ( !aPolylineShape.IsNull() && - aPolylineShape.ShapeType() == TopAbs_WIRE ) { - const TopoDS_Wire& aPolylineWire = TopoDS::Wire( aPolylineShape ); - if ( !aPolylineWire.IsNull() ) { - BRepBuilderAPI_MakeFace aMakeFace( aPolylineWire, Standard_True ); - aMakeFace.Build(); - if( aMakeFace.IsDone() ) { - aResultFace = aMakeFace.Face(); + DEBTRACE("generateTopShape"); + TopoDS_Face aResultFace = TopoDS_Face(); // --- result: default = null face + + if (!aPolyline.IsNull()) + { + TopoDS_Shape aPolylineShape = aPolyline->GetShape(); +#ifdef DEB_IMZ + std::string brepName = "imz.brep"; + BRepTools::Write(aPolylineShape, brepName.c_str()); +#endif + TopTools_ListOfShape aWiresList; + + if (!aPolylineShape.IsNull() && aPolylineShape.ShapeType() == TopAbs_WIRE) + { + // --- only one wire: try to make a face + DEBTRACE("one wire: try to build a face"); + const TopoDS_Wire& aPolylineWire = TopoDS::Wire(aPolylineShape); + if (!aPolylineWire.IsNull()) + { + BRepBuilderAPI_MakeFace aMakeFace(aPolylineWire, Standard_True); + aMakeFace.Build(); + if (aMakeFace.IsDone()) + { + DEBTRACE(" a face with the only wire given"); + aResultFace = aMakeFace.Face(); + } + } } - } - } else { - TopExp_Explorer anExp( aPolylineShape, TopAbs_WIRE ); - for ( ; anExp.More(); anExp.Next() ) { - if(!anExp.Current().IsNull()) { - const TopoDS_Wire& aWire = TopoDS::Wire( anExp.Current() ); - aWiresList.Append( aWire ); + else + { + // --- a list of wires ? inventory of wires and edges + Handle(TopTools_HSequenceOfShape) aSeqWires = new TopTools_HSequenceOfShape; + Handle(TopTools_HSequenceOfShape) aSeqEdges = new TopTools_HSequenceOfShape; + TopExp_Explorer anExp(aPolylineShape, TopAbs_WIRE); + DEBTRACE("list of wires ?"); + for (; anExp.More(); anExp.Next()) + { + if (!anExp.Current().IsNull()) + { + const TopoDS_Wire& aWire = TopoDS::Wire(anExp.Current()); + aWiresList.Append(aWire); + DEBTRACE(" append wire"); + TopExp_Explorer it2(aWire, TopAbs_EDGE); + for (; it2.More(); it2.Next()) + aSeqEdges->Append(it2.Current()); + } + } + if (aWiresList.IsEmpty()) + return aResultFace; // --- no wires: null result + + if (aSeqEdges->Length() > 1) + { + DEBTRACE("try to connect all the edges together, build a unique wire and a face"); + // --- try to create one wire by connecting edges with a distance tolerance (no necessity of sharing points) + ShapeAnalysis_FreeBounds::ConnectEdgesToWires(aSeqEdges, 1E-5, Standard_False, aSeqWires); + + if (aSeqWires->Length() == 1) + { + // --- one wire: try to make a face + const TopoDS_Wire& aPolylineWire = TopoDS::Wire(aSeqWires->Value(1)); + if (!aPolylineWire.IsNull()) + { + BRepBuilderAPI_MakeFace aMakeFace(aPolylineWire, Standard_True); + aMakeFace.Build(); + if (aMakeFace.IsDone()) + { + DEBTRACE(" a face from all the wires connected"); + aResultFace = aMakeFace.Face(); + } + } + } + } + + if (aResultFace.IsNull()) + { + DEBTRACE("try to make a face with the first wire of the list and other wires as restrictions"); + // --- try to make a face with the first wire of the list and other wires as restrictions + BRepAlgo_FaceRestrictor aFR; + TopoDS_Face aRefFace; + TopoDS_Shape aS = aWiresList.First(); + BRepBuilderAPI_MakeFace aMakeFace(TopoDS::Wire(aWiresList.First()), Standard_True); + aMakeFace.Build(); + if (aMakeFace.IsDone()) + { + DEBTRACE(" a face with first wire"); + aRefFace = aMakeFace.Face(); + } + if (!aRefFace.IsNull()) + { + aFR.Init(aRefFace, Standard_False, Standard_True); + TopTools_ListIteratorOfListOfShape anIt(aWiresList); + for (; anIt.More(); anIt.Next()) + { + TopoDS_Wire& aWire = TopoDS::Wire(anIt.Value()); + if (aWire.IsNull()) + continue; + aFR.Add(aWire); + } + aFR.Perform(); + if (aFR.IsDone()) + { + for (; aFR.More(); aFR.Next()) + { + DEBTRACE(" a restricted face"); + aResultFace = aFR.Current(); + break; + } + } + } + } } - } - if(aWiresList.IsEmpty()) - return aResultFace; - - BRepAlgo_FaceRestrictor aFR; - TopoDS_Face aRefFace; - TopoDS_Shape aS = aWiresList.First(); - BRepBuilderAPI_MakeFace aMakeFace( TopoDS::Wire(aWiresList.First()), Standard_True ); - aMakeFace.Build(); - if( aMakeFace.IsDone() ) { - aRefFace = aMakeFace.Face(); - } - if(aRefFace.IsNull()) - return aResultFace; - - aFR.Init(aRefFace,Standard_False, Standard_True); - TopTools_ListIteratorOfListOfShape anIt( aWiresList ); - for ( ; anIt.More(); anIt.Next() ) { - TopoDS_Wire& aWire = TopoDS::Wire( anIt.Value() ); - if ( aWire.IsNull() ) - continue; - aFR.Add(aWire); - } - aFR.Perform(); - if (aFR.IsDone()) { - for (; aFR.More(); aFR.Next()) { - aResultFace = aFR.Current(); - break; - } - } } - } - if( aResultFace.IsNull() ) + if (aResultFace.IsNull()) return aResultFace; - BRepCheck_Analyzer anAnalyzer( aResultFace ); - if( anAnalyzer.IsValid() && aResultFace.ShapeType()==TopAbs_FACE ) - return aResultFace; + DEBTRACE("check the face"); + BRepCheck_Analyzer anAnalyzer(aResultFace); + if (anAnalyzer.IsValid() && aResultFace.ShapeType() == TopAbs_FACE) + { + DEBTRACE("face OK"); + return aResultFace; + } else - return TopoDS_Face(); + DEBTRACE("bad face"); + return TopoDS_Face(); } void HYDROData_ImmersibleZone::createGroupObjects()