X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH%2FSMESH_Pattern.cxx;h=c1694cb248214c9888251a5136c2235213003bb4;hb=8fc0f4f35550ae93bf28140d364757453acd42b8;hp=f08831acd341ae80ffd05961a73e798127c94a6b;hpb=41b3e4433388f439856c3b0bb3725e9c81179c24;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_Pattern.cxx b/src/SMESH/SMESH_Pattern.cxx index f08831acd..c1694cb24 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,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 ) @@ -274,7 +274,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 @@ -297,7 +297,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; @@ -602,8 +602,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; @@ -690,8 +689,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; @@ -762,6 +781,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() ) @@ -783,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 )); } @@ -841,6 +860,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++; } @@ -866,6 +886,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() ) @@ -906,11 +927,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 ); @@ -1194,7 +1214,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 "< & 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; @@ -2461,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 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< 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 ); @@ -2482,7 +2503,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() @@ -2505,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 ); @@ -2527,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; } @@ -2537,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++; @@ -2554,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() ); } @@ -2601,7 +2628,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 @@ -2610,7 +2637,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; } } @@ -2750,7 +2777,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 @@ -2759,7 +2786,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; } } @@ -2903,7 +2930,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 @@ -2912,7 +2939,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; } } @@ -3268,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 ); } @@ -4152,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 ); @@ -4778,7 +4805,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 ); } @@ -4911,12 +4938,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 }