X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_Pattern.cxx;h=182a67ca1063f296b075e74cabe6f6412a866882;hp=c317869bc546c079aec808ccd951790a3d054784;hb=6d32f944a0a115b6419184c50b57bf7c4eef5786;hpb=c6ab650a79d62f8c25b11ea98207969bc6a989f3 diff --git a/src/SMESH/SMESH_Pattern.cxx b/src/SMESH/SMESH_Pattern.cxx index c317869bc..182a67ca1 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-2019 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,8 +76,6 @@ #include #include -#include - #include #include "utilities.h" @@ -256,7 +255,7 @@ int loadVE( const list< TopoDS_Edge > & eList, //purpose : //======================================================================= -SMESH_Pattern::SMESH_Pattern () +SMESH_Pattern::SMESH_Pattern (): myToKeepNodes(false) { } @@ -267,8 +266,6 @@ SMESH_Pattern::SMESH_Pattern () bool SMESH_Pattern::Load (const char* theFileContents) { - MESSAGE("Load( file ) "); - Kernel_Utils::Localizer loc; // file structure: @@ -276,7 +273,7 @@ bool SMESH_Pattern::Load (const char* theFileContents) // ! This is a comment // NB_POINTS ! 1 integer - the number of points in the pattern. // X1 Y1 [Z1] ! 2 or 3 reals - nodes coordinates within 2D or 3D domain: - // X2 Y2 [Z2] ! the pattern dimention is defined by the number of coordinates + // X2 Y2 [Z2] ! the pattern dimension is defined by the number of coordinates // ... // [ ID1 ID2 ... IDn ] ! Indices of key-points for a 2D pattern (only). // ! elements description goes after all @@ -299,7 +296,7 @@ bool SMESH_Pattern::Load (const char* theFileContents) // X1 Y1 [Z1] ! 2 or 3 reals - nodes coordinates within 2D or 3D domain: - // read the first point coordinates to define pattern dimention + // read the first point coordinates to define pattern dimension int dim = readLine( fields, lineBeg, clearFields ); if ( dim == 2 ) myIs2D = true; @@ -413,8 +410,6 @@ bool SMESH_Pattern::Load (const char* theFileContents) bool SMESH_Pattern::Save (ostream& theFile) { - MESSAGE(" ::Save(file) " ); - Kernel_Utils::Localizer loc; if ( !IsLoaded() ) { @@ -565,11 +560,12 @@ static bool isMeshBoundToShape(SMESHDS_Mesh * aMeshDS, bool SMESH_Pattern::Load (SMESH_Mesh* theMesh, const TopoDS_Face& theFace, bool theProject, - TopoDS_Vertex the1stVertex) + TopoDS_Vertex the1stVertex, + bool theKeepNodes) { - MESSAGE(" ::Load(face) " ); Clear(); myIs2D = true; + myToKeepNodes = theKeepNodes; SMESHDS_Mesh * aMeshDS = theMesh->GetMeshDS(); SMESHDS_SubMesh * fSubMesh = aMeshDS->MeshElements( theFace ); @@ -605,8 +601,7 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh, Extrema_GenExtPS projector; GeomAdaptor_Surface aSurface( BRep_Tool::Surface( face )); - if ( theProject || needProject ) - projector.Initialize( aSurface, 20,20, 1e-5,1e-5 ); + projector.Initialize( aSurface, 20,20, 1e-5,1e-5 ); int iPoint = 0; TNodePointIDMap nodePointIDMap; @@ -614,7 +609,6 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh, if ( needProject ) { - MESSAGE("Project the submesh"); // --------------------------------------------------------------- // The case where the submesh is projected to theFace // --------------------------------------------------------------- @@ -694,8 +688,28 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh, myPoints.resize( nbNodes ); + // care of INTERNAL VERTEXes + TopExp_Explorer vExp( face, TopAbs_VERTEX, TopAbs_EDGE ); + for ( ; vExp.More(); vExp.Next() ) + { + const SMDS_MeshNode* node = + SMESH_Algo::VertexNode( TopoDS::Vertex( vExp.Current()), aMeshDS ); + if ( !node || node->NbInverseElements( SMDSAbs_Face ) == 0 ) + continue; + myPoints.resize( ++nbNodes ); + list< TPoint* > & fPoints = getShapePoints( face ); + nodePointIDMap.insert( make_pair( node, iPoint )); + TPoint* p = &myPoints[ iPoint++ ]; + fPoints.push_back( p ); + gp_XY uv = helper.GetNodeUV( face, node ); + p->myInitUV.SetCoord( uv.X(), uv.Y() ); + p->myInitXYZ.SetCoord( p->myInitUV.X(), p->myInitUV.Y(), 0 ); + } + // Load U of points on edges + Bnd_Box2d edgesUVBox; + list::iterator nbEinW = myNbKeyPntInBoundary.begin(); int iE = 0; vector< TopoDS_Edge > eVec; @@ -766,6 +780,7 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh, else keyPoint->myInitUV = C2d->Value( isForward ? f : l ).XY(); keyPoint->myInitXYZ.SetCoord (keyPoint->myInitUV.X(), keyPoint->myInitUV.Y(), 0); + edgesUVBox.Add( gp_Pnt2d( keyPoint->myInitUV )); } } if ( !vPoint->empty() ) @@ -787,12 +802,11 @@ 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 )); } - if ((int) paramNodeMap.size() != eSubMesh->NbNodes() ) { + if ((int) paramNodeMap.size() != eSubMesh->NbNodes() - nbMeduimNodes ) { // wrong U on edge, project Extrema_ExtPC proj; BRepAdaptor_Curve aCurve( edge ); @@ -845,6 +859,7 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh, p->myInitUV = C2d->Value( u ).XY(); } p->myInitXYZ.SetCoord( p->myInitUV.X(), p->myInitUV.Y(), 0 ); + edgesUVBox.Add( gp_Pnt2d( p->myInitUV )); unIt++; unRIt++; iPoint++; } @@ -870,6 +885,7 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh, else keyPoint->myInitUV = C2d->Value( isForward ? l : f ).XY(); keyPoint->myInitXYZ.SetCoord( keyPoint->myInitUV.X(), keyPoint->myInitUV.Y(), 0 ); + edgesUVBox.Add( gp_Pnt2d( keyPoint->myInitUV )); } } if ( !vPoint->empty() ) @@ -910,11 +926,10 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh, nodePointIDMap.insert( make_pair( node, iPoint )); TPoint* p = &myPoints[ iPoint++ ]; fPoints.push_back( p ); - if ( theProject ) + 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 ); @@ -966,6 +981,19 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh, myIsBoundaryPointsFound = true; } + if ( myToKeepNodes ) + { + myInNodes.resize( nodePointIDMap.size() + closeNodePointIDMap.size() ); + + TNodePointIDMap::iterator nIdIt = nodePointIDMap.begin(); + for ( ; nIdIt != nodePointIDMap.end(); nIdIt++ ) + myInNodes[ nIdIt->second ] = smdsNode( nIdIt->first ); + + nIdIt = closeNodePointIDMap.begin(); + for ( ; nIdIt != closeNodePointIDMap.end(); nIdIt++ ) + myInNodes[ nIdIt->second ] = smdsNode( nIdIt->first ); + } + // Assure that U range is proportional to V range Bnd_Box2d bndBox; @@ -1089,10 +1117,10 @@ static bool intersectIsolines(const gp_XY& uv11, const gp_XY& uv12, const double // resUV /= 2.; // } - if ( isDeformed ) { - MESSAGE("intersectIsolines(), d1 = " << d1 << ", d2 = " << d2 << ", delta = " << delta << - ", " << (loc1 - loc2).SquareModulus() << " > " << delta * delta); - } + // if ( isDeformed ) { + // MESSAGE("intersectIsolines(), d1 = " << d1 << ", d2 = " << d2 << ", delta = " << delta << + // ", " << (loc1 - loc2).SquareModulus() << " > " << delta * delta); + // } return true; } @@ -1185,7 +1213,7 @@ bool SMESH_Pattern::compUVByIsoIntersection (const list< list< TPoint* > >& theB } if ( !intersectIsolines( uv1[0], uv2[0], ratio[0], uv1[1], uv2[1], ratio[1], theUV, theIsDeformed )) { - MESSAGE(" Cant intersect isolines for a point "< internNodes; bool needIteration = true; if ( startNodes.empty() ) { - MESSAGE( " Starting UV by compUVByIsoIntersection()"); + //MESSAGE( " Starting UV by compUVByIsoIntersection()"); needIteration = false; map < double, TIsoLine >& isos = isoMap[ 0 ]; map < double, TIsoLine >::iterator isoIt = isos.begin(); @@ -2107,7 +2135,7 @@ bool SMESH_Pattern:: #endif } while ( maxMove > 1e-8 && nbIter++ < maxNbIter ); - MESSAGE( "compUVByElasticIsolines(): Nb iterations " << nbIter << " dist: " << sqrt( maxMove )); + //MESSAGE( "compUVByElasticIsolines(): Nb iterations " << nbIter << " dist: " << sqrt( maxMove )); if ( nbIter >= maxNbIter && sqrt(maxMove) > minUvSize * 0.05 ) { MESSAGE( "compUVByElasticIsolines() failed: "<"< & ePoints = getShapePoints( eID++ ); TPoint* p = ePoints.front(); if ( !compUVByIsoIntersection( theEdgesPointsList, p->myInitUV, p->myUV, aBool )) { - MESSAGE("cant sortSameSizeWires()"); + MESSAGE("can't sortSameSizeWires()"); return false; } gcVec[iW] += p->myUV; @@ -2392,7 +2420,6 @@ bool SMESH_Pattern::Apply (const TopoDS_Face& theFace, const TopoDS_Vertex& theVertexOnKeyPoint1, const bool theReverse) { - MESSAGE(" ::Apply(face) " ); TopoDS_Face face = theReverse ? TopoDS::Face( theFace.Reversed() ) : theFace; if ( !setShapeToMesh( face )) return false; @@ -2453,11 +2480,11 @@ 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 if ( nbWires > 1 ) { // compute UV of inner edge-points using the method for in-face points - // and devide eList into a list of separate wires + // and divide eList into a list of separate wires bool aBool; list< list< TopoDS_Edge > > wireList; list::iterator eIt = elIt; @@ -2474,7 +2501,7 @@ bool SMESH_Pattern::Apply (const TopoDS_Face& theFace, for ( pIt++; pIt != ePoints.end(); pIt++ ) { TPoint* p = (*pIt); if ( !compUVByIsoIntersection( edgesPointsList, p->myInitUV, p->myUV, aBool )) { - MESSAGE("cant Apply(face)"); + MESSAGE("can't Apply(face)"); return false; } // keep the computed UV to compare against by setFirstEdge() @@ -2593,7 +2620,7 @@ bool SMESH_Pattern::Apply (const TopoDS_Face& theFace, for ( pIt = fPoints.begin(); !isDeformed && pIt != fPoints.end(); pIt++ ) if ( !compUVByIsoIntersection( edgesPointsList, (*pIt)->myInitUV, (*pIt)->myUV, isDeformed )) { - MESSAGE("cant Apply(face)"); + MESSAGE("can't Apply(face)"); return false; } // try to use a complex algo if it is a difficult case @@ -2602,7 +2629,7 @@ bool SMESH_Pattern::Apply (const TopoDS_Face& theFace, for ( ; pIt != fPoints.end(); pIt++ ) // continue with the simple algo if ( !compUVByIsoIntersection( edgesPointsList, (*pIt)->myInitUV, (*pIt)->myUV, isDeformed )) { - MESSAGE("cant Apply(face)"); + MESSAGE("can't Apply(face)"); return false; } } @@ -2742,7 +2769,7 @@ bool SMESH_Pattern::Apply (const SMDS_MeshFace* theFace, for ( pIt = fPoints.begin(); !isDeformed && pIt != fPoints.end(); pIt++ ) if ( !compUVByIsoIntersection( edgesPointsList, (*pIt)->myInitUV, (*pIt)->myUV, isDeformed )) { - MESSAGE("cant Apply(face)"); + MESSAGE("can't Apply(face)"); return false; } // try to use a complex algo if it is a difficult case @@ -2751,7 +2778,7 @@ bool SMESH_Pattern::Apply (const SMDS_MeshFace* theFace, for ( ; pIt != fPoints.end(); pIt++ ) // continue with the simple algo if ( !compUVByIsoIntersection( edgesPointsList, (*pIt)->myInitUV, (*pIt)->myUV, isDeformed )) { - MESSAGE("cant Apply(face)"); + MESSAGE("can't Apply(face)"); return false; } } @@ -2895,7 +2922,7 @@ bool SMESH_Pattern::Apply (SMESH_Mesh* theMesh, for ( pIt = fPoints.begin(); !isDeformed && pIt != fPoints.end(); pIt++ ) if ( !compUVByIsoIntersection( edgesPointsList, (*pIt)->myInitUV, (*pIt)->myUV, isDeformed )) { - MESSAGE("cant Apply(face)"); + MESSAGE("can't Apply(face)"); return false; } // try to use a complex algo if it is a difficult case @@ -2904,7 +2931,7 @@ bool SMESH_Pattern::Apply (SMESH_Mesh* theMesh, for ( ; pIt != fPoints.end(); pIt++ ) // continue with the simple algo if ( !compUVByIsoIntersection( edgesPointsList, (*pIt)->myInitUV, (*pIt)->myUV, isDeformed )) { - MESSAGE("cant Apply(face)"); + MESSAGE("can't Apply(face)"); return false; } } @@ -3075,8 +3102,6 @@ bool SMESH_Pattern::Apply (std::set & theVolumes, const int theNode000Index, const int theNode001Index) { - MESSAGE(" ::Apply(set) " ); - if ( !IsLoaded() ) { MESSAGE( "Pattern not loaded" ); return setErrorCode( ERR_APPL_NOT_LOADED ); @@ -3181,11 +3206,12 @@ bool SMESH_Pattern::Apply (std::set & theVolumes, //======================================================================= bool SMESH_Pattern::Load (SMESH_Mesh* theMesh, - const TopoDS_Shell& theBlock) + const TopoDS_Shell& theBlock, + bool theKeepNodes) { - MESSAGE(" ::Load(volume) " ); Clear(); myIs2D = false; + myToKeepNodes = theKeepNodes; SMESHDS_SubMesh * aSubMesh; const bool isQuadMesh = theMesh->NbVolumes( ORDER_QUADRATIC ); @@ -3219,7 +3245,7 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh, SMDS_NodeIteratorPtr nIt = aSubMesh->GetNodes(); if ( !nIt->more() ) continue; - // store a node and a point + // store a node and a point while ( nIt->more() ) { const SMDS_MeshNode* node = smdsNode( nIt->next() ); if ( isQuadMesh && SMESH_MeshEditor::IsMedium( node, SMDSAbs_Volume )) @@ -3261,8 +3287,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 ); } @@ -3297,6 +3322,14 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh, myIsBoundaryPointsFound = true; + if ( myToKeepNodes ) + { + myInNodes.resize( nodePointIDMap.size() ); + TNodePointIDMap::iterator nIdIt = nodePointIDMap.begin(); + for ( ; nIdIt != nodePointIDMap.end(); nIdIt++ ) + myInNodes[ nIdIt->second ] = smdsNode( nIdIt->first ); + } + return setErrorCode( ERR_OK ); } @@ -3338,8 +3371,6 @@ bool SMESH_Pattern::Apply (const TopoDS_Shell& theBlock, const TopoDS_Vertex& theVertex000, const TopoDS_Vertex& theVertex001) { - MESSAGE(" ::Apply(volume) " ); - if (!findBoundaryPoints() || // bind ID to points !setShapeToMesh( theBlock )) // check theBlock is a suitable shape return false; @@ -3399,8 +3430,6 @@ bool SMESH_Pattern::Apply (const SMDS_MeshVolume* theVolume, const int theNode000Index, const int theNode001Index) { - //MESSAGE(" ::Apply(MeshVolume) " ); - if (!findBoundaryPoints()) // bind ID to points return false; @@ -3991,7 +4020,6 @@ bool SMESH_Pattern::MakeMesh(SMESH_Mesh* theMesh, const bool toCreatePolygons, const bool toCreatePolyedrs) { - MESSAGE(" ::MakeMesh() " ); if ( !myIsComputed ) return setErrorCode( ERR_MAKEM_NOT_COMPUTED ); @@ -4142,7 +4170,11 @@ bool SMESH_Pattern::MakeMesh(SMESH_Mesh* theMesh, createElements( theMesh, nodesVector, myElemPointIDs, myElements ); } - aMeshDS->compactMesh(); + aMeshDS->Modified(); + aMeshDS->CompactMesh(); + + if ( myToKeepNodes ) + myOutNodes.swap( nodesVector ); // const map& sm = aMeshDS->SubMeshes(); // map::const_iterator i_sm = sm.begin(); @@ -4524,8 +4556,6 @@ bool SMESH_Pattern::findBoundaryPoints() { if ( myIsBoundaryPointsFound ) return true; - MESSAGE(" findBoundaryPoints() "); - myNbKeyPntInBoundary.clear(); if ( myIs2D ) @@ -4767,7 +4797,7 @@ bool SMESH_Pattern::setShapeToMesh(const TopoDS_Shape& theShape) TopAbs_ShapeEnum aType = theShape.ShapeType(); bool dimOk = ( myIs2D ? aType == TopAbs_FACE : aType == TopAbs_SHELL ); if ( !dimOk ) { - MESSAGE( "Pattern dimention mismatch" ); + MESSAGE( "Pattern dimension mismatch" ); return setErrorCode( ERR_APPL_BAD_DIMENTION ); }