X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_Tool.cxx;h=b45c2970d3c220b85e956b9e578b388318c434c3;hb=b86ee42a0010ef6bde30373a8741dd865d557dd3;hp=def682d94cc6900d6cc1ad2aaccf967460f70edc;hpb=a72bc1fe339d74df864cfcbc765e2b62c2543d25;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_Tool.cxx b/src/HYDROData/HYDROData_Tool.cxx index def682d9..b45c2970 100644 --- a/src/HYDROData/HYDROData_Tool.cxx +++ b/src/HYDROData/HYDROData_Tool.cxx @@ -40,9 +40,21 @@ #include #include #include +#include -static int aMaxNameId = std::numeric_limits::max(); +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int aMaxNameId = INT_MAX; void HYDROData_Tool::WriteStringsToFile( QFile& theFile, const QStringList& theStrings, const QString& theSep ) @@ -55,7 +67,7 @@ void HYDROData_Tool::WriteStringsToFile( QFile& theFile, return; QTextStream anOutStream( &theFile ); - anOutStream << aWriteStr << theSep << theSep; + anOutStream << aWriteStr.toUtf8() << theSep << theSep; } QString HYDROData_Tool::GenerateObjectName( const Handle(HYDROData_Document)& theDoc, @@ -282,6 +294,145 @@ Quantity_Color HYDROData_Tool::toOccColor( const QColor& theColor ) return Quantity_Color( r, g, b, Quantity_TOC_RGB ); } +QColor HYDROData_Tool::toQtColor( const Quantity_Color& theColor ) +{ + int r = 255 * theColor.Red(); + int g = 255 * theColor.Green(); + int b = 255 * theColor.Blue(); + return QColor( r, g, b ); +} + +bool HYDROData_Tool::IsNan( double theValue ) +{ +#ifdef WIN32 + return _isnan( theValue ); +#else + return isnan( theValue ); +#endif +} + +bool HYDROData_Tool::IsInf( double theValue ) +{ +#ifdef WIN32 + return (!_finite( theValue ) ); +#else + return isinf( theValue ); +#endif +} + +static void MakeShellG(const NCollection_Map& FG, + TopoDS_Shape& outSh) +{ + BRep_Builder bb; + NCollection_Map::Iterator itFG(FG); + if (FG.Extent() > 1) + { + //face nb > 1 => make shell + TopoDS_Shell outShell; + bb.MakeShell(outShell); + for (;itFG.More();itFG.Next()) + bb.Add(outShell, itFG.Value()); + outSh = outShell; + } + else if (FG.Extent() == 1) + { + outSh = itFG.Value(); //one face + } +} + +TopoDS_Shape HYDROData_Tool::RebuildCmp(const TopoDS_Shape& in) +{ + TopTools_IndexedDataMapOfShapeListOfShape mE2LF; + TopExp::MapShapesAndAncestors(in, TopAbs_EDGE, TopAbs_FACE, mE2LF); + if (mE2LF.IsEmpty()) + return TopoDS_Shape(); + NCollection_Map dfm; + //TopExp::MapShapes(aFuseShape, TopAbs_FACE, dfm); + TopExp_Explorer expf(in, TopAbs_FACE); + for (;expf.More(); expf.Next()) + dfm.Add(TopoDS::Face(expf.Current())); + + int nbF = dfm.Extent(); + TopExp_Explorer exp_f(in, TopAbs_FACE); + const TopoDS_Face& FF = TopoDS::Face(exp_f.Current()); + NCollection_List CurrFS; + NCollection_List NeighFS; + NCollection_Map PrF; + CurrFS.Append(FF); + NCollection_List> GL_F; + NCollection_Map OneGr; + bool end = false; + while (!end) + { + NCollection_List::Iterator it_currfs(CurrFS); + NeighFS.Clear(); + for (;it_currfs.More();it_currfs.Next()) + { + const TopoDS_Face& CF = it_currfs.Value(); + TopExp_Explorer exp_edge(CF, TopAbs_EDGE); + for (;exp_edge.More();exp_edge.Next()) + { + const TopoDS_Shape& CE = exp_edge.Current(); + const TopTools_ListOfShape& lsf = mE2LF.FindFromKey(CE); + TopTools_ListIteratorOfListOfShape ls_it(lsf); //always one face (since all faces are planar) + for (;ls_it.More();ls_it.Next()) + { + const TopoDS_Face& F = TopoDS::Face(ls_it.Value()); + if (F.IsSame(CF)) + continue; + if (!PrF.Contains(F)) + { + OneGr.Add(F); + NeighFS.Append(F); + PrF.Add(F); + } + } + } + OneGr.Add(CF); + PrF.Add(CF); + } + if (NeighFS.IsEmpty()) + { + GL_F.Append(OneGr); + OneGr.Clear(); + dfm.Subtract(PrF); + if (dfm.IsEmpty()) + end = true; + else + { + NCollection_Map::Iterator itDm(dfm); + const TopoDS_Face& nsh = itDm.Key(); + NeighFS.Append(nsh); + } + } + CurrFS = NeighFS; + } + + TopoDS_Shape sh; + + if (GL_F.Extent() > 1) + { + TopoDS_Compound cmp; + NCollection_List>::Iterator itGL_F(GL_F); + BRep_Builder bb; + bb.MakeCompound(cmp); + for (;itGL_F.More();itGL_F.Next()) + { + MakeShellG(itGL_F.Value(), sh); + if (!sh.IsNull()) + bb.Add(cmp, sh); + } + return cmp; + } + else if (GL_F.Extent() == 1) + { + MakeShellG(GL_F.First(), sh); + return sh; + } + +} + + std::ostream& operator<<( std::ostream& theStream, const QString& theText ) { theStream << theText.toStdString(); @@ -306,3 +457,17 @@ std::ostream& operator<<( std::ostream& theStream, const TopoDS_Face& theFace ) return theStream; } +std::ostream& operator<<( std::ostream& theStream, const gp_XY& theXY ) +{ + theStream << "(" << theXY.X() << "; " << theXY.Y() << ")"; + return theStream; +} + +bool operator == ( const gp_XY& thePoint1, const gp_XY& thePoint2 ) +{ + const double EPS = 1E-3; + return + fabs( thePoint1.X() - thePoint2.X() ) < EPS && + fabs( thePoint1.Y() - thePoint2.Y() ) < EPS; + +}