X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FStdMeshers%2FStdMeshers_HexaFromSkin_3D.cxx;h=4e471253f584f84995ad44916ffdd11b5460453e;hb=253807f5b360eb4b76675270840ed53602fa3edb;hp=2516de0848f44709e8680ebc5c087e7be3e6d09f;hpb=e3409934a4fb5496d8d687026fc7f1ee2d40c735;p=modules%2Fsmesh.git diff --git a/src/StdMeshers/StdMeshers_HexaFromSkin_3D.cxx b/src/StdMeshers/StdMeshers_HexaFromSkin_3D.cxx index 2516de084..4e471253f 100644 --- a/src/StdMeshers/StdMeshers_HexaFromSkin_3D.cxx +++ b/src/StdMeshers/StdMeshers_HexaFromSkin_3D.cxx @@ -1,26 +1,25 @@ -// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE // -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. // -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // File : StdMeshers_HexaFromSkin_3D.cxx // Created : Wed Jan 27 12:28:07 2010 // Author : Edward AGAPOV (eap) -// + #include "StdMeshers_HexaFromSkin_3D.hxx" #include "SMDS_VolumeOfNodes.hxx" @@ -33,19 +32,24 @@ //#include "utilities.h" #include -// Define error message +// Define error message and _MYDEBUG_ if needed #ifdef _DEBUG_ #define BAD_MESH_ERR \ error(SMESH_Comment("Can't detect block-wise structure of the input 2D mesh.\n" \ __FILE__ ":" )<<__LINE__) +//#define _MYDEBUG_ #else #define BAD_MESH_ERR \ error(SMESH_Comment("Can't detect block-wise structure of the input 2D mesh")) #endif -// Debug output -#define _DUMP_(msg) //cout << msg << endl +// Debug output +#ifdef _MYDEBUG_ +#define _DUMP_(msg) cout << msg << endl +#else +#define _DUMP_(msg) +#endif namespace @@ -54,10 +58,12 @@ namespace { B_BOTTOM=0, B_RIGHT, B_TOP, B_LEFT, B_FRONT, B_BACK, NB_BLOCK_SIDES }; -// const char* SBoxSides[] = //!< names of block sides -- needed for DEBUG only -// { -// "BOTTOM", "RIGHT", "TOP", "LEFT", "FRONT", "BACK", "UNDEFINED" -// }; +#ifdef _MYDEBUG_ + const char* SBoxSides[] = //!< names of block sides -- needed for DEBUG only + { + "BOTTOM", "RIGHT", "TOP", "LEFT", "FRONT", "BACK", "UNDEFINED" + }; +#endif enum EQuadEdge //!< edges of quadrangle side { Q_BOTTOM = 0, Q_RIGHT, Q_TOP, Q_LEFT, NB_QUAD_SIDES @@ -85,37 +91,6 @@ namespace return true; } - //================================================================================ - /*! - * \brief Description of node used to detect corner nodes - */ - struct _NodeDescriptor - { - int nbInverseFaces, nbNodesInInverseFaces; - - _NodeDescriptor(const SMDS_MeshNode* n): nbInverseFaces(0), nbNodesInInverseFaces(0) - { - if ( n ) - { - set nodes; - SMDS_ElemIteratorPtr fIt = n->GetInverseElementIterator(SMDSAbs_Face ); - while ( fIt->more() ) - { - const SMDS_MeshElement* face = fIt->next(); - nodes.insert( face->begin_nodes(), face->end_nodes() ); - nbInverseFaces++; - } - nbNodesInInverseFaces = nodes.size(); - } - } - bool operator==(const _NodeDescriptor& other) const - { - return - nbInverseFaces == other.nbInverseFaces && - nbNodesInInverseFaces == other.nbNodesInInverseFaces; - } - }; - //================================================================================ /*! * \brief return true if a node is at block corner @@ -126,7 +101,19 @@ namespace bool isCornerNode( const SMDS_MeshNode* n ) { - return n && n->NbInverseElements( SMDSAbs_Face ) % 2; + int nbF = n ? n->NbInverseElements( SMDSAbs_Face ) : 1; + if ( nbF % 2 ) + return true; + + set nodesInInverseFaces; + SMDS_ElemIteratorPtr fIt = n->GetInverseElementIterator(SMDSAbs_Face ); + while ( fIt->more() ) + { + const SMDS_MeshElement* face = fIt->next(); + nodesInInverseFaces.insert( face->begin_nodes(), face->end_nodes() ); + } + + return nodesInInverseFaces.size() != ( 6 + (nbF/2-1)*3 ); } //================================================================================ @@ -761,7 +748,7 @@ namespace // compute angle of (sideIDir projection to pln) and (X dir of pln) gp_Vec2d sideIDirProj( sideIDir * pln.XDirection(), sideIDir * pln.YDirection()); double angle = sideIDirProj.Angle( gp::DX2d() ); - if ( angle < 0 ) angle += 2 * PI; // angle [0-2*PI] + if ( angle < 0 ) angle += 2. * M_PI; // angle [0-2*PI] angleOfSide.insert( make_pair( angle, sideI )); _DUMP_(" "<< sideI << " - side dir (" << sideIDir.X() << ", " << sideIDir.Y() << ", " << sideIDir.Z() << ")" @@ -770,8 +757,8 @@ namespace if ( nbLoadedSides == 1 ) { double angF = angleOfSide.begin()->first, angL = angleOfSide.rbegin()->first; - if ( angF > PI ) angF = 2*PI - angF; - if ( angL > PI ) angL = 2*PI - angL; + if ( angF > M_PI ) angF = 2.*M_PI - angF; + if ( angL > M_PI ) angL = 2.*M_PI - angL; foundSide = angF < angL ? angleOfSide.begin()->second : angleOfSide.rbegin()->second; } else @@ -849,14 +836,12 @@ namespace row2.push_back( n1 = oppositeNode( quad, i1 )); } - _NodeDescriptor nDesc( row1[1] ); - if ( nDesc == _NodeDescriptor( row1[0] )) - return true; // row of 2 nodes + if ( isCornerNode( row1[1] )) + return true; // Find the rest nodes TIDSortedElemSet emptySet, avoidSet; - //while ( !isCornerNode( n2 )) - while ( nDesc == _NodeDescriptor( n2 )) + while ( !isCornerNode( n2 ) ) { avoidSet.clear(); avoidSet.insert( quad ); quad = SMESH_MeshEditor::FindFaceInSet( n1, n2, emptySet, avoidSet, &i1, &i2 ); @@ -1009,7 +994,7 @@ bool StdMeshers_HexaFromSkin_3D::Compute(SMESH_Mesh & aMesh, SMESH_MesherHelper* // ---------------------------- // Add internal nodes of a box // ---------------------------- - // projection points of internal nodes on box subshapes by which + // projection points of internal nodes on box sub-shapes by which // coordinates of internal nodes are computed vector pointOnShape( SMESH_Block::ID_Shell ); @@ -1218,4 +1203,3 @@ bool StdMeshers_HexaFromSkin_3D::Compute(SMESH_Mesh&, const TopoDS_Shape&) { return error("Algorithm can't work with geometrical shapes"); } -