From c3a1182d0afc0fcb0bb15f814b0b5819671209cd Mon Sep 17 00:00:00 2001 From: isn Date: Tue, 29 Nov 2016 16:03:34 +0300 Subject: [PATCH] first ver. (creating of new channel => calc case => export calc case works OK) --- src/HYDROData/HYDROData_DTM.cxx | 188 ++++++++++++++----- src/HYDROData/HYDROData_DTM.h | 8 +- src/HYDROData/HYDROData_SplitToZonesTool.cxx | 4 +- src/HYDROData/HYDROData_Stream.cxx | 51 ++++- 4 files changed, 189 insertions(+), 62 deletions(-) diff --git a/src/HYDROData/HYDROData_DTM.cxx b/src/HYDROData/HYDROData_DTM.cxx index 78313e36..df831b61 100644 --- a/src/HYDROData/HYDROData_DTM.cxx +++ b/src/HYDROData/HYDROData_DTM.cxx @@ -48,9 +48,13 @@ #include #include #include - +#include #include +#include +#include +#include +#include IMPLEMENT_STANDARD_HANDLE( HYDROData_DTM, HYDROData_Bathymetry ) IMPLEMENT_STANDARD_RTTIEXT( HYDROData_DTM, HYDROData_Bathymetry ) @@ -294,79 +298,167 @@ void HYDROData_DTM::CreateProfilesFromDTM (const HYDROData_SequenceOfObjects& In Out3dPres, Out2dPres, OutLeftB, OutRightB, OutInlet, OutOutlet, Create3dPres, Create2dPres, InvInd, WireIntersections ); } -void HYDROData_DTM::ProjWireOnPlane(const TopoDS_Wire& inpWire, const Handle_Geom_Plane& RefPlane, TopoDS_Wire& outWire) +void HYDROData_DTM::ProjWireOnPlane(const TopoDS_Shape& inpWire, const Handle_Geom_Plane& RefPlane, + TopTools_DataMapOfShapeListOfShape* E2PE) { - /*BRepTools_WireExplorer ex(TopoDS::Wire(inpWire.Oriented(TopAbs_FORWARD))); - BRepLib_MakeWire WM; - for (;ex.More();ex.Next()) - { - const TopoDS_Edge& CE = ex.Current(); - double f, l; - Handle(Geom_Curve) C3d = BRep_Tool::Curve(CE, f, l); - Handle(Geom_Curve) ProjectedCurve = GeomProjLib::ProjectOnPlane(new Geom_TrimmedCurve(C3d, f, l), RefPlane, RefPlane->Position().Direction(), Standard_True); - if (!ProjectedCurve.IsNull()) - { - TopoDS_Edge ProjEdge = BRepLib_MakeEdge(ProjectedCurve, f, l ); - if (!BRep_Tool::Degenerated(ProjEdge)) - WM.Add(ProjEdge); //auto sharing between edges if vertex is coincident - } - }*/ - BRep_Builder BB; + + //project shape (edges) on planar face TopoDS_Face F; BB.MakeFace(F, RefPlane, Precision::Confusion()); - BRepLib_MakeWire WM; - BRepAlgo_NormalProjection nproj(F); nproj.Add(inpWire); nproj.SetDefaultParams(); nproj.Build(); if(!nproj.IsDone()) return; - TopoDS_Shape projRes = nproj.Projection(); - TopExp_Explorer exp(projRes, TopAbs_EDGE); - TopTools_ListOfShape llE; - for (;exp.More();exp.Next()) - llE.Append(exp.Current()); - WM.Add(llE); - outWire = WM.Wire(); + TopoDS_Shape projRes = nproj.Projection(); - outWire.Orientation(inpWire.Orientation()); //take from the original wire + // unite all vertexes/edges from projected result + BOPAlgo_Builder anAlgo; + TopExp_Explorer exp(projRes, TopAbs_EDGE); + for (;exp.More(); exp.Next()) + { + const TopoDS_Edge& E = TopoDS::Edge(exp.Current()); + if (E.Orientation() != TopAbs_INTERNAL) + anAlgo.AddArgument(E); + } + anAlgo.Perform(); + int stat = anAlgo.ErrorStatus(); + TopoDS_Shape projResConn = anAlgo.Shape(); + + // make wire => vertexes and edges should be untouched after this operation! + exp.Init(projResConn, TopAbs_EDGE); + //TopTools_ListOfShape llE; + //TopoDS_Wire RW; + //BRepLib_MakeWire WM; + + //for (;exp.More();exp.Next()) + // llE.Append(exp.Current()); + // + //WM.Add(llE); + //outWire = WM.Wire(); + + //outWire.Orientation(inpWire.Orientation()); //take from the original wire + + //history mode: edge to projected edges + if (E2PE) + { + TopExp_Explorer ex(inpWire, TopAbs_EDGE); + for (;ex.More();ex.Next()) + { + const TopoDS_Edge& CE = TopoDS::Edge(ex.Current()); + TopTools_ListOfShape NEL; + const TopTools_ListOfShape& LS = nproj.Generated(CE); + TopTools_ListIteratorOfListOfShape it(LS); + for (;it.More();it.Next()) + { + const TopoDS_Shape& PCE = it.Value(); + TopTools_ListOfShape PLS = anAlgo.Modified(PCE); + if (PLS.IsEmpty()) + PLS.Append(PCE); + TopTools_ListIteratorOfListOfShape itp(PLS); + for (;itp.More();itp.Next()) + NEL.Append(itp.Value()); + } + + E2PE->Bind(CE, NEL); + } + } } - - -bool HYDROData_DTM::Get2dFaceFrom3dPres(const TopoDS_Compound& cmp, TopoDS_Face& outF ) +#include +bool HYDROData_DTM::Get2dFaceFrom3dPres(const TopoDS_Compound& cmp, TopoDS_Face& outF, + TopTools_SequenceOfShape* Boundr, std::set ind ) { + //ind : set of indices (starts with 0). index == number of boundary (inlet, outlet, etc..) + //in compound cmp. + //if Boundr is not null => this method will return sequence of boundary wires (inlet, outlet...) + Handle_Geom_Plane refpl = new Geom_Plane(gp_Pnt(0,0,0), gp_Dir(0,0,1)); - BRepLib_MakeWire WM; + TopTools_DataMapOfShapeListOfShape E2PE; + ProjWireOnPlane(cmp, refpl, &E2PE); + TopTools_ListOfShape ELL; + TopoDS_Iterator it(cmp); - //TopTools_IndexedMapOfShape IntW; + int i = 0; for (;it.More(); it.Next()) { const TopoDS_Wire& W = TopoDS::Wire(it.Value()); if (W.Orientation() != TopAbs_INTERNAL) { - //use list of edges to protect againts non-manifold cases. - //auto sharing between edges will be added automatically - TopTools_IndexedMapOfShape ME; - TopTools_ListOfShape LE; - TopExp::MapShapes(W, TopAbs_EDGE, ME); - for (int i = 1; i <= ME.Extent(); i++) - LE.Append(ME(i)); - WM.Add(LE); + TopoDS_Wire PW; + TopExp_Explorer ex(W, TopAbs_EDGE); + TopTools_ListOfShape LEpW; + TopTools_ListOfShape LEpWDummy; + for (;ex.More();ex.Next()) + { + const TopoDS_Edge& CE = TopoDS::Edge(ex.Current()); + TopTools_ListOfShape LS = E2PE.Find(CE); + LEpW.Append(LS); + } + + if (ind.count(i) != 0) + { + BRepLib_MakeWire WM; + WM.Add(LEpW); + const TopoDS_Wire& WMW = WM.Wire(); + //assume that wire is a straight line, + //take first and last vertex and make simple edge (RE) + TopoDS_Vertex VF, VL; + TopExp::Vertices(WMW, VF, VL); + TopoDS_Edge RE = BRepLib_MakeEdge(VF, VL).Edge(); + if (RE.IsNull()) + { + LEpWDummy = LEpW; //LEpW will be nullified after appending to ELL + ELL.Append(LEpW); + } + else + { + LEpWDummy.Append(RE); + ELL.Append(RE); + } + //TODO: in the new version of OCCT, USD can process separate wires + //ShapeUpgrade_UnifySameDomain USD(WMW, 1U, 0U, 1U); //concat bsplines + //USD.Build(); + //const TopoDS_Shape& RSU = USD.Shape(); + //TopExp_Explorer exp(RSU, TopAbs_EDGE); + //TopTools_ListOfShape DummyL; + //for (;it.More();it.Next()) + // DummyL.Append(it.Value()); + //if (DummyL.Extent() == 1) + // ELL.Append(DummyL.First()); //if one edge => accept this result + //else + // ELL.Append(LEpW); //else put 'as is' + } + else + { + LEpWDummy = LEpW; + ELL.Append(LEpW); + } + + if (Boundr) + { + //make inlet, outlet, left/tight banks [wires] + //shouldn't change topology of the edges + BRepLib_MakeWire IWM; + IWM.Add(LEpWDummy); + Boundr->Append(IWM.Wire()); + } } - //else - // IntW.Add(W); + i++; } - TopoDS_Wire outW; - ProjWireOnPlane(WM.Wire(), refpl, outW); - BRepBuilderAPI_MakeFace mf(refpl, outW, true); //check inside is true by def + //make primary wire + BRepLib_MakeWire WME; + WME.Add(ELL); + + const TopoDS_Wire& resW = WME.Wire(); + BRepBuilderAPI_MakeFace mf(refpl, resW, true); //check inside is true by def outF = mf.Face(); - ShapeAnalysis_Wire WA(outW, outF, Precision::Confusion()); - bool res = WA.CheckSelfIntersection(); + ShapeAnalysis_Wire WA(resW, outF, Precision::Confusion()); + bool res = WA.CheckSelfIntersection(); //TODO check that this return false if OK return res; ///!!! the internal wires cant be added with 'internal' ori. diff --git a/src/HYDROData/HYDROData_DTM.h b/src/HYDROData/HYDROData_DTM.h index 2a60f75a..0e4f746c 100644 --- a/src/HYDROData/HYDROData_DTM.h +++ b/src/HYDROData/HYDROData_DTM.h @@ -35,6 +35,8 @@ class TopoDS_Face; class TopoDS_Compound; class Handle_Geom_Plane; class TopTools_IndexedMapOfOrientedShape; +class TopTools_DataMapOfShapeListOfShape; +class TopTools_SequenceOfShape; DEFINE_STANDARD_HANDLE( HYDROData_DTM, HYDROData_Bathymetry ) @@ -155,7 +157,8 @@ protected: static void PointToWire(const AltitudePoints& pnts, TopoDS_Wire& W ); - static void ProjWireOnPlane(const TopoDS_Wire& inpWire, const Handle_Geom_Plane& RefPlane, TopoDS_Wire& outWire); + static void ProjWireOnPlane(const TopoDS_Shape& inpWire, const Handle_Geom_Plane& RefPlane, + TopTools_DataMapOfShapeListOfShape* E2PE); static TopTools_IndexedMapOfOrientedShape Create3DShape(const AltitudePoints& left, const AltitudePoints& right, @@ -179,7 +182,8 @@ protected: std::set& InvInd, bool& WireIntersections); - static bool Get2dFaceFrom3dPres(const TopoDS_Compound& cmp, TopoDS_Face& outF ); + static bool Get2dFaceFrom3dPres(const TopoDS_Compound& cmp, TopoDS_Face& outF, + TopTools_SequenceOfShape* Boundr = NULL, std::set ind = std::set() ); static int EstimateNbPoints( const std::vector& theProfiles, double theDDZ, double theSpatialStep ); diff --git a/src/HYDROData/HYDROData_SplitToZonesTool.cxx b/src/HYDROData/HYDROData_SplitToZonesTool.cxx index 2836229a..12548ef2 100644 --- a/src/HYDROData/HYDROData_SplitToZonesTool.cxx +++ b/src/HYDROData/HYDROData_SplitToZonesTool.cxx @@ -343,7 +343,7 @@ HYDROData_SplitToZonesTool::SplitDataList aList.Clear(); Standard_Boolean foundE(Standard_False); const TopTools_ListOfShape& aListM = splitTool.Modified(exp.Current()); -#ifdef NDEBUG +#ifndef NDEBUG DEBTRACE("NB_EDGE_M = " << aListM.Extent()); #endif if(aListM.Extent()) foundE = Standard_True; @@ -423,7 +423,7 @@ HYDROData_SplitToZonesTool::SplitDataList const TopoDS_Shape& aFace = exp.Current(); if(!aFace.IsNull()) { const TopTools_ListOfShape& aListOfNew = mkCom.Modified(aFace); -#ifdef NDEBUG +#ifndef NDEBUG DEBTRACE("Modified: " << aListOfNew.Extent()); #endif if(!aListOfNew.IsEmpty()) { diff --git a/src/HYDROData/HYDROData_Stream.cxx b/src/HYDROData/HYDROData_Stream.cxx index 022cc306..9ffb8596 100644 --- a/src/HYDROData/HYDROData_Stream.cxx +++ b/src/HYDROData/HYDROData_Stream.cxx @@ -77,6 +77,9 @@ #include #include +#include +#include +#include #include @@ -91,6 +94,8 @@ #include #endif +#include + typedef NCollection_DataMap HYDROData_DataMapOfRealOfHDProfile; IMPLEMENT_STANDARD_HANDLE(HYDROData_Stream,HYDROData_NaturalObject) @@ -1045,7 +1050,6 @@ void HYDROData_Stream::CopyTo( const Handle(HYDROData_Entity)& theDestination, } } } - void HYDROData_Stream::CreatePresentations( const Handle(TColgp_HArray1OfPnt) theArrayOfFPnt, const Handle(TColgp_HArray1OfPnt) theArrayOfLPnt, const Handle(TopTools_HArray1OfShape) theArrOfProfiles, @@ -1071,26 +1075,53 @@ void HYDROData_Stream::CreatePresentations( const Handle(TColgp_HArray1OfPnt) std::vector dummy; TopTools_IndexedMapOfOrientedShape ll = HYDROData_DTM::Create3DShape(left, right, dummy); + TopoDS_Shape LB, RB, IL, OL; + if (!ll.IsEmpty()) { - thePrs.myLeftBank = TopoDS::Wire(ll(1)); - thePrs.myRightBank = TopoDS::Wire(ll(2)); + LB = TopoDS::Wire(ll(1)); + RB = TopoDS::Wire(ll(2)); } - thePrs.myInlet = TopoDS::Wire(theArrOfProfiles->Value(theArrOfProfiles->Lower())); //TODO check that - thePrs.myOutlet = TopoDS::Wire(theArrOfProfiles->Value(theArrOfProfiles->Upper())); + IL = TopoDS::Wire(theArrOfProfiles->Value(theArrOfProfiles->Lower())); //TODO check that + OL = TopoDS::Wire(theArrOfProfiles->Value(theArrOfProfiles->Upper())); //make new compound so it's shapes will be in known order to build correct projection BRep_Builder BB; TopoDS_Compound newCmp; BB.MakeCompound(newCmp); - BB.Add(newCmp, thePrs.myLeftBank); - BB.Add(newCmp, thePrs.myInlet); - BB.Add(newCmp, thePrs.myOutlet); - BB.Add(newCmp, thePrs.myRightBank); + BB.Add(newCmp, LB); + BB.Add(newCmp, IL); + BB.Add(newCmp, OL); + BB.Add(newCmp, RB); thePrs.myPrs3D = newCmp; + std::set ind; + ind.insert(1); //inlet ind + ind.insert(2); //outlet ind + + TopTools_SequenceOfShape LS; + HYDROData_DTM::Get2dFaceFrom3dPres( newCmp, TopoDS::Face(thePrs.myPrs2D), &LS, ind ); + +#ifndef NDEBUG + TopTools_IndexedMapOfShape EE; + TopExp::MapShapes(thePrs.myPrs2D, TopAbs_EDGE, EE); + int noncontNb = 0; + for (int i = 1; i <= 4; i++) + { + TopoDS_Shape W = LS(i); + TopTools_IndexedMapOfShape EW; + TopExp::MapShapes(W, TopAbs_EDGE, EW); + for (int k = 1; k <= EW.Extent(); k++) + noncontNb += !EE.Contains(EW(k)); + } + //noncontNb > 0 => some problem with edge history + assert(noncontNb == 0); +#endif - HYDROData_DTM::Get2dFaceFrom3dPres( newCmp, TopoDS::Face(thePrs.myPrs2D) ); //__TODO + thePrs.myLeftBank = TopoDS::Wire(LS(1)); + thePrs.myInlet = TopoDS::Wire(LS(2)); + thePrs.myOutlet = TopoDS::Wire(LS(3)); + thePrs.myRightBank = TopoDS::Wire(LS(4)); } \ No newline at end of file -- 2.39.2