X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_Pattern.cxx;h=f605a90e65d4b405d09b1ea143b1c8fe7cb8593c;hp=db6e60e8ca629adbb489633dcffe0758783b0583;hb=b09372829929f8f561495d6c16527134971a1909;hpb=3dcb8f1e04a352d7001ef4eb447939d695fcab62 diff --git a/src/SMESH/SMESH_Pattern.cxx b/src/SMESH/SMESH_Pattern.cxx index db6e60e8c..f605a90e6 100644 --- a/src/SMESH/SMESH_Pattern.cxx +++ b/src/SMESH/SMESH_Pattern.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2021 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -38,6 +38,7 @@ #include "SMESH_Block.hxx" #include "SMESH_Mesh.hxx" #include "SMESH_MeshAlgos.hxx" +#include "SMESH_MeshEditor.hxx" #include "SMESH_MesherHelper.hxx" #include "SMESH_subMesh.hxx" @@ -75,14 +76,13 @@ #include #include -#include - #include #include "utilities.h" using namespace std; -typedef map< const SMDS_MeshElement*, int > TNodePointIDMap; +typedef std::map< const SMDS_MeshElement*, int > TNodePointIDMap; +typedef std::list< TopoDS_Edge > TWire; #define smdsNode( elem ) static_cast( elem ) @@ -177,7 +177,7 @@ int readLine (list & theFields, case '-': // real number case '+': case '.': - isNumber = true; + isNumber = true; // fall through default: // data isNumber = isNumber || ( *theLineBeg >= '0' && *theLineBeg <= '9' ); if ( isNumber ) { @@ -574,8 +574,8 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh, SMESH_MesherHelper helper( *theMesh ); helper.SetSubShape( theFace ); - int nbNodes = ( !fSubMesh ? 0 : fSubMesh->NbNodes() ); - int nbElems = ( !fSubMesh ? 0 : fSubMesh->NbElements() ); + smIdType nbNodes = ( !fSubMesh ? 0 : fSubMesh->NbNodes() ); + smIdType nbElems = ( !fSubMesh ? 0 : fSubMesh->NbElements() ); if ( nbElems == 0 && aMeshDS->NbFaces() == 0 ) { MESSAGE( "No elements bound to the face"); @@ -803,8 +803,7 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh, ++nbMeduimNodes; continue; } - const SMDS_EdgePosition* epos = - static_cast(node->GetPosition()); + SMDS_EdgePositionPtr epos = node->GetPosition(); double u = epos->GetUParameter(); paramNodeMap.insert( make_pair( u, node )); } @@ -931,8 +930,7 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh, if ( theProject || edgesUVBox.IsOut( p->myInitUV ) ) p->myInitUV = project( node, projector ); else { - const SMDS_FacePosition* pos = - static_cast(node->GetPosition()); + SMDS_FacePositionPtr pos = node->GetPosition(); p->myInitUV.SetCoord( pos->GetUParameter(), pos->GetVParameter() ); } p->myInitXYZ.SetCoord( p->myInitUV.X(), p->myInitUV.Y(), 0 ); @@ -2483,20 +2481,21 @@ bool SMESH_Pattern::Apply (const TopoDS_Face& theFace, // If there are several wires, define the order of edges of inner wires: // compute UV of inner edge-points using 2 methods: the one for in-face points // and the one for on-edge points and then choose the best edge order - // by the best correspondance of the 2 results + // by the best correspondence of the 2 results. + // The wires are sorted by number of edges to correspond to wires of the pattern if ( nbWires > 1 ) { // compute UV of inner edge-points using the method for in-face points // and divide eList into a list of separate wires bool aBool; - list< list< TopoDS_Edge > > wireList; + list< TWire > wireList; list::iterator eIt = elIt; list::iterator nbEIt = nbVertexInWires.begin(); for ( nbEIt++; nbEIt != nbVertexInWires.end(); nbEIt++ ) { int nbEdges = *nbEIt; wireList.push_back( list< TopoDS_Edge >() ); - list< TopoDS_Edge > & wire = wireList.back(); + TWire & wire = wireList.back(); for ( iE = 0 ; iE < nbEdges; eIt++, iE++ ) { list< TPoint* > & ePoints = getShapePoints( *eIt ); @@ -2527,13 +2526,13 @@ bool SMESH_Pattern::Apply (const TopoDS_Face& theFace, // find points - edge correspondence for wires of unique size, // edge order within a wire should be defined only - list< list< TopoDS_Edge > >::iterator wlIt = wireList.begin(); + list< TWire >::iterator wlIt = wireList.begin(); while ( wlIt != wireList.end() ) { - list< TopoDS_Edge >& wire = (*wlIt); + TWire& wire = (*wlIt); size_t nbEdges = wire.size(); wlIt++; - if ( wlIt != wireList.end() && (*wlIt).size() != nbEdges ) // a unique size wire + if ( wlIt == wireList.end() || (*wlIt).size() != nbEdges ) // a unique size wire { // choose the best first edge of a wire setFirstEdge( wire, id1 ); @@ -2549,6 +2548,12 @@ bool SMESH_Pattern::Apply (const TopoDS_Face& theFace, edgesPoints->insert( edgesPoints->end(), ePoints.begin(), (--ePoints.end())); } } + else + { + // skip same size wires + while ( wlIt != wireList.end() && (*wlIt).size() == nbEdges ) + wlIt++; + } id1 += nbEdges; } @@ -2559,7 +2564,7 @@ bool SMESH_Pattern::Apply (const TopoDS_Face& theFace, while ( wlIt != wireList.end() ) { size_t nbSameSize = 0, nbEdges = (*wlIt).size(); - list< list< TopoDS_Edge > >::iterator wlIt2 = wlIt; + list< TWire >::iterator wlIt2 = wlIt; wlIt2++; while ( wlIt2 != wireList.end() && (*wlIt2).size() == nbEdges ) { // a same size wire nbSameSize++; @@ -2576,7 +2581,7 @@ bool SMESH_Pattern::Apply (const TopoDS_Face& theFace, for ( wlIt = wireList.begin(); wlIt != wireList.end(); wlIt++ ) { - list< TopoDS_Edge >& wire = (*wlIt); + TWire& wire = (*wlIt); eList.splice( eList.end(), wire, wire.begin(), wire.end() ); } @@ -3226,7 +3231,7 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh, return setErrorCode( ERR_LOADV_BAD_SHAPE ); // count nodes - int nbNodes = 0, shapeID; + smIdType nbNodes = 0; int shapeID; for ( shapeID = 1; shapeID <= myShapeIDMap.Extent(); shapeID++ ) { const TopoDS_Shape& S = myShapeIDMap( shapeID ); @@ -3290,8 +3295,7 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh, const SMDS_MeshNode* node = nIt->next(); if ( isQuadMesh && SMESH_MeshEditor::IsMedium( node, SMDSAbs_Edge )) continue; - const SMDS_EdgePosition* epos = - static_cast(node->GetPosition()); + SMDS_EdgePositionPtr epos = node->GetPosition(); double u = ( epos->GetUParameter() - f ) / ( l - f ); (*pIt)->myInitXYZ.SetCoord( iCoord, isForward ? u : 1 - u ); } @@ -4174,7 +4178,8 @@ bool SMESH_Pattern::MakeMesh(SMESH_Mesh* theMesh, createElements( theMesh, nodesVector, myElemPointIDs, myElements ); } - aMeshDS->compactMesh(); + aMeshDS->Modified(); + aMeshDS->CompactMesh(); if ( myToKeepNodes ) myOutNodes.swap( nodesVector ); @@ -4284,11 +4289,13 @@ void SMESH_Pattern::createElements(SMESH_Mesh* theMes elem = aMeshDS->AddFace (nodes[0], nodes[1], nodes[2], nodes[3], nodes[4], nodes[5] ); break; } // else do not break but create a polygon + // fall through case 8: if ( !onMeshElements ) {// create a quadratic face elem = aMeshDS->AddFace (nodes[0], nodes[1], nodes[2], nodes[3], nodes[4], nodes[5], nodes[6], nodes[7] ); break; } // else do not break but create a polygon + // fall through default: elem = aMeshDS->AddPolygonalFace( nodes ); } @@ -4359,7 +4366,7 @@ void SMESH_Pattern::createElements(SMESH_Mesh* theMes subMesh->ComputeStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE ); } if ( onMeshElements ) { - list< int > elemIDs; + list< smIdType > elemIDs; for ( size_t i = 0; i < theElements.size(); i++ ) { subMesh = theMesh->GetSubMeshContaining( shapeIDs[ i ] ); @@ -4933,12 +4940,12 @@ void SMESH_Pattern::DumpPoints() const SMESH_Pattern::TPoint::TPoint() { #ifdef _DEBUG_ - myInitXYZ.SetCoord(0,0,0); - myInitUV.SetCoord(0.,0.); - myInitU = 0; - myXYZ.SetCoord(0,0,0); - myUV.SetCoord(0.,0.); - myU = 0; + myInitXYZ.SetCoord(7,7,7); + myInitUV.SetCoord(7.,7.); + myInitU = 7; + myXYZ.SetCoord(7,7,7); + myUV.SetCoord(7.,7.); + myU = 7; #endif }