From 0e7503b63eeacb2e1ee4c9e88927485364c254b3 Mon Sep 17 00:00:00 2001 From: szy Date: Wed, 29 Jan 2014 10:24:44 +0000 Subject: [PATCH] 29.01.2014. Fix bug with point classification. --- src/HYDROData/HYDROData_CalculationCase.cxx | 15 +++- src/HYDROData/HYDROData_SplitToZonesTool.cxx | 36 ++++++---- src/HYDROData/HYDROData_Tool.cxx | 76 +++++--------------- 3 files changed, 51 insertions(+), 76 deletions(-) diff --git a/src/HYDROData/HYDROData_CalculationCase.cxx b/src/HYDROData/HYDROData_CalculationCase.cxx index 8498732a..a9be2cce 100644 --- a/src/HYDROData/HYDROData_CalculationCase.cxx +++ b/src/HYDROData/HYDROData_CalculationCase.cxx @@ -42,6 +42,10 @@ #define CALCULATION_REGIONS_PREF GetName() + "_Reg" #define CALCULATION_ZONES_PREF GetName() + "_Zone" #define CALCULATION_GROUPS_PREF GetName() + "_" +//#define DEB_CLASS2D 1 +#ifdef DEB_CLASS2D +#include +#endif #define EXPORT_NAME "HYDRO_" + GetName() @@ -669,7 +673,16 @@ HYDROData_CalculationCase::PointClassification HYDROData_CalculationCase::GetPoi TopoDS_Face aZoneFace = TopoDS::Face( theZone->GetShape() ); if ( aZoneFace.IsNull() ) return aRes; - +#ifdef DEB_CLASS2D + TopoDS_Compound aCmp; + BRep_Builder aBB; + aBB.MakeCompound(aCmp); + aBB.Add(aCmp, aZoneFace); + gp_Pnt aPnt (thePoint.X(), thePoint.Y(), 0.); + BRepBuilderAPI_MakeVertex aMk(aPnt); + aBB.Add(aCmp, aMk.Vertex()); + BRepTools::Write(aCmp, "FCL2d.brep"); +#endif TopAbs_State State = HYDROData_Tool::ComputePointState(thePoint, aZoneFace); if (State == TopAbs_OUT) aRes = POINT_OUT; diff --git a/src/HYDROData/HYDROData_SplitToZonesTool.cxx b/src/HYDROData/HYDROData_SplitToZonesTool.cxx index d076706f..2205bc0b 100644 --- a/src/HYDROData/HYDROData_SplitToZonesTool.cxx +++ b/src/HYDROData/HYDROData_SplitToZonesTool.cxx @@ -24,7 +24,7 @@ #include //#define DEB_SPLIT_TO_ZONES 1 -//#define DEB_SPLIT_TO_ZONES_CHECK_PARTITION 1 +#define DEB_SPLIT_TO_ZONES_CHECK_PARTITION 1 #if (defined (DEB_SPLIT_TO_ZONES) || defined(DEB_SPLIT_TO_ZONES_CHECK_PARTITION)) #include static TCollection_AsciiString fileNameBefore("BeforeTranslation"); @@ -213,8 +213,10 @@ HYDROData_SplitToZonesTool::SplitDataList aDM3.Bind(aSh, anInputSplitDataList.at(i).ObjectNames); aLS.Append(aSh); aBB.Add(aCmp,aSh); +#ifdef DEB_SPLIT_TO_ZONES //TCollection_AsciiString aName = aNam + i + ".brep"; //BRepTools::Write(aSh, aName.ToCString()); +#endif } #ifdef DEB_SPLIT_TO_ZONES_CHECK_PARTITION TCollection_AsciiString aNameBefore = fileNameBefore + ".brep"; @@ -256,13 +258,15 @@ HYDROData_SplitToZonesTool::SplitDataList TopTools_ListIteratorOfListOfShape it(aListOfNew); for(;it.More();it.Next()) aList.Append(it.Value()); + /* // Bug in History: partition should give only modified entities! => temporary solution is used const TopTools_ListOfShape& aListOfGen = splitTool.Generated(anIt.Value()); - if(!aListOfGen.IsEmpty()) + if(!aListOfGen.IsEmpty()) { foundF = Standard_True; - it.Initialize(aListOfGen); - for(;it.More();it.Next()) - aList.Append(it.Value()); + it.Initialize(aListOfGen); + for(;it.More();it.Next()) + aList.Append(it.Value()); + }*/ if(!foundF) // face is not modified aList.Append (anIt.Value()); aDM1.Bind(anIt.Value(), aList); @@ -283,14 +287,16 @@ HYDROData_SplitToZonesTool::SplitDataList //aName = aNamM + i + j +k +".brep"; //BRepTools::Write(it.Value(),aName.ToCString()); } - const TopTools_ListOfShape& aListG = splitTool.Generated(exp.Current()); - if(aListG.Extent()) foundE = Standard_True; - it.Initialize(aListG); - for(int k=1;it.More();it.Next(),k++) { - aList.Append(it.Value()); + /* const TopTools_ListOfShape& aListG = splitTool.Generated(exp.Current()); + if(!aListG.IsEmpty()) { + foundE = Standard_True; + it.Initialize(aListG); + for(int k=1;it.More();it.Next(),k++) { + aList.Append(it.Value()); //aName = aNamG + i + j +k +".brep"; //BRepTools::Write(it.Value(),aName.ToCString()); - } + } + }*/ //cout << "NB_EDGE = " << aList.Extent() < #include -#define CLASS2D 1 -#ifdef CLASS2D #include #include #include @@ -31,8 +29,11 @@ #include #include #include -#undef _NCollection_MapHasher -#endif +#include +#include +#include +#include +#include static int aMaxNameId = std::numeric_limits::max(); void HYDROData_Tool::WriteStringsToFile( QFile& theFile, @@ -177,63 +178,18 @@ QString HYDROData_Tool::GenerateNameForPython( const MapOfTreatedObjects& theTre return aName; } //====================================================================================================== -// the Face to be: planer, whitout holes -#ifdef CLASS2D -TopAbs_State HYDROData_Tool::ComputePointState( const gp_XY& thePnt2d, const TopoDS_Face& theFace ) +TopAbs_State HYDROData_Tool::ComputePointState( const gp_XY& theXY, const TopoDS_Face& theFace ) { TopAbs_State aState(TopAbs_UNKNOWN); if(theFace.IsNull()) return aState; - -#ifdef CLASS2D - TopoDS_Wire aWire; int nb(0); - TopoDS_Iterator it(theFace); - for(;it.More();it.Next()) { - aWire = TopoDS::Wire(it.Value()); - nb++; - } - if(nb > 1 || aWire.IsNull()) return aState; - gp_Pln aPlane; - gp_Vec aNormal; - BRepBuilderAPI_FindPlane fndPlane (theFace, Precision::Confusion()); - if(fndPlane.Found()) - aPlane = fndPlane.Plane()->Pln(); - else - return aState; - aNormal = gp_Vec(aPlane.Axis().Direction()); - if(theFace.Orientation() == TopAbs_REVERSED) - aNormal.Reverse(); - gp_Pnt aPoint = gp_Pnt (thePnt2d.X(), thePnt2d.Y(), 0); - TColgp_SequenceOfVec aSeq; - TopTools_MapOfShape aMap; - it.Initialize(aWire); - for (;it.More(); it.Next()) { - const TopoDS_Vertex& aVx = TopExp::FirstVertex(TopoDS::Edge(it.Value()), Standard_True); - if(!aMap.Add(aVx)) - continue; - const gp_Pnt& aCurPnt = BRep_Tool::Pnt(TopoDS::Vertex(aVx)); - if(aPoint.IsEqual(aCurPnt,Precision::Confusion())) { - aState = TopAbs_ON; - return aState; - } - gp_Vec aVec (aPoint, aCurPnt); - aSeq.Append(aVec); - } - Standard_Real anAng(0.0); - for(int i = 1;i < aSeq.Length();i++) { - const gp_Vec& aV1 = aSeq.Value(i); - const gp_Vec& aV2 = aSeq.Value(i+1); - anAng += aV1.AngleWithRef(aV2, aNormal); - } - anAng += aSeq.Value(aSeq.Length()).AngleWithRef(aSeq.Value(1), aNormal); - if(abs(anAng) > Precision::Angular()) - aState = TopAbs_IN; - else - aState = TopAbs_OUT; - -#else - BRepTopAdaptor_FClass2d aClassifier( theFace, Precision::Confusion() ); - aState = aClassifier.Perform( gp_Pnt2d( thePoint ), Standard_False ); -#endif + Standard_Real aTol = BRep_Tool::Tolerance(theFace); + BRepAdaptor_Surface Ads ( theFace, Standard_False ); + Standard_Real toluv = Min ( Ads.UResolution(aTol), Ads.VResolution(aTol) ); + const gp_Pln& aPlane = Ads.Surface().Plane(); + gp_Pnt aPnt(theXY.X(), theXY.Y(), 0.); + Standard_Real aU1, aV1; + ElSLib::Parameters(aPlane,aPnt, aU1, aV1); + BRepTopAdaptor_FClass2d aClassifier( theFace, toluv ); + aState = aClassifier.Perform( gp_Pnt2d(aU1, aV1), Standard_False ); return aState; -} -#endif \ No newline at end of file +} \ No newline at end of file -- 2.39.2