X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FStdMeshers%2FStdMeshers_Import_1D2D.cxx;h=e54a2bf7e038a18bc42c4cc94281b0e885c22795;hp=17b5b5a9d0ae0f6194e3b016ee9d2fe1ecbd6850;hb=efbf393dc4a81161ddfeab879b2db6e17aeceb8b;hpb=066f625a46b60642f228a0c10fc6c2dcdc20d304 diff --git a/src/StdMeshers/StdMeshers_Import_1D2D.cxx b/src/StdMeshers/StdMeshers_Import_1D2D.cxx index 17b5b5a9d..e54a2bf7e 100644 --- a/src/StdMeshers/StdMeshers_Import_1D2D.cxx +++ b/src/StdMeshers/StdMeshers_Import_1D2D.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 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 @@ -44,11 +44,13 @@ #include "Utils_SALOME_Exception.hxx" #include "utilities.h" +#include #include #include #include #include #include +#include #include #include #include @@ -190,13 +192,16 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & const int shapeID = tgtMesh->ShapeToIndex( geomFace ); const bool toCheckOri = (helper.NbAncestors( geomFace, theMesh, TopAbs_SOLID ) == 1 ); + Handle(Geom_Surface) surface = BRep_Tool::Surface( geomFace ); - const bool reverse = + const bool reverse = ( helper.GetSubShapeOri( tgtMesh->ShapeToMesh(), geomFace ) == TopAbs_REVERSED ); gp_Pnt p; gp_Vec du, dv; + // BRepClass_FaceClassifier is most time consuming, so minimize its usage BRepClass_FaceClassifier classifier; Bnd_B2d bndBox2d; + Bnd_Box bndBox3d; { Standard_Real umin,umax,vmin,vmax; BRepTools::UVBounds(geomFace,umin,umax,vmin,vmax); @@ -212,6 +217,9 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & bndBox2d.Add( pmax ); } bndBox2d.Enlarge( 1e-2 * Sqrt( bndBox2d.SquareExtent() )); + + BRepBndLib::Add( geomFace, bndBox3d ); + bndBox3d.Enlarge( 1e-2 * sqrt( bndBox3d.SquareExtent() )); } set subShapeIDs; @@ -271,6 +279,7 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & vector nodeState; vector newNodes; // of a face set bndNodes; // nodes classified ON + vector isNodeIn; // nodes classified IN, by node ID for ( size_t iG = 0; iG < srcGroups.size(); ++iG ) { @@ -284,9 +293,10 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & const double groupTol = 0.5 * sqrt( getMinElemSize2( srcGroup )); minGroupTol = std::min( groupTol, minGroupTol ); - GeomAdaptor_Surface S( surface ); - const double clsfTol = Min( S.UResolution( 0.1 * groupTol ), - S.VResolution( 0.1 * groupTol )); + //GeomAdaptor_Surface S( surface ); + // const double clsfTol = Min( S.UResolution( 0.1 * groupTol ), -- issue 0023092 + // S.VResolution( 0.1 * groupTol )); + const double clsfTol = BRep_Tool::Tolerance( geomFace ); StdMeshers_Import_1D::TNodeNodeMap::iterator n2nIt; pair< StdMeshers_Import_1D::TNodeNodeMap::iterator, bool > it_isnew; @@ -296,17 +306,21 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & { const SMDS_MeshElement* face = srcElems->next(); + SMDS_MeshElement::iterator node = face->begin_nodes(); + if ( bndBox3d.IsOut( SMESH_TNodeXYZ( *node ))) + continue; + // find or create nodes of a new face nodeState.resize( face->NbNodes() ); newNodes.resize( nodeState.size() ); newNodes.back() = 0; int nbCreatedNodes = 0; bool isOut = false, isIn = false; // if at least one node isIn - do not classify other nodes - SMDS_MeshElement::iterator node = face->begin_nodes(); for ( size_t i = 0; i < newNodes.size(); ++i, ++node ) { SMESH_TNodeXYZ nXYZ = *node; nodeState[ i ] = TopAbs_UNKNOWN; + newNodes [ i ] = 0; it_isnew = n2n->insert( make_pair( *node, (SMDS_MeshNode*)0 )); n2nIt = it_isnew.first; @@ -319,6 +333,9 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & { if ( !subShapeIDs.count( newNode->getshapeId() )) break; // node is Imported onto other FACE + if ( newNode->GetID() < (int) isNodeIn.size() && + isNodeIn[ newNode->GetID() ]) + isIn = true; if ( !isIn && bndNodes.count( *node )) nodeState[ i ] = TopAbs_ON; } @@ -351,10 +368,15 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & newNode = tgtMesh->AddNode( nXYZ.X(), nXYZ.Y(), nXYZ.Z()); tgtMesh->SetNodeOnFace( newNode, shapeID, uv.X(), uv.Y() ); nbCreatedNodes++; + if ( newNode->GetID() >= (int) isNodeIn.size() ) + { + isNodeIn.push_back( false ); // allow allocate more than newNode->GetID() + isNodeIn.resize( newNode->GetID() + 1, false ); + } if ( nodeState[i] == TopAbs_ON ) bndNodes.insert( *node ); else - isIn = true; + isNodeIn[ newNode->GetID() ] = isIn = true; } } if ( !(newNodes[i] = newNode ) || isOut ) @@ -432,7 +454,7 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & if ( geomNorm * meshNorm < 0 ) SMDS_MeshCell::applyInterlace - ( SMDS_MeshCell::reverseSmdsOrder( face->GetEntityType() ), newNodes ); + ( SMDS_MeshCell::reverseSmdsOrder( face->GetEntityType(), newNodes.size() ), newNodes ); } // make a new face @@ -679,7 +701,7 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & seamHelper.SetSubShape( edges[ iE ]); seamHelper.SetElementsOnShape( true ); - if ( (*checkedFaces.begin())->IsQuadratic() ) + if ( !checkedFaces.empty() && (*checkedFaces.begin())->IsQuadratic() ) for ( set< const SMDS_MeshElement* >::iterator fIt = checkedFaces.begin(); fIt != checkedFaces.end(); ++fIt ) seamHelper.AddTLinks( static_cast( *fIt )); @@ -708,8 +730,7 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & // sm->SetIsAlwaysComputed( true ); sm->ComputeStateEngine(SMESH_subMesh::CHECK_COMPUTE_STATE); if ( sm->GetComputeState() != SMESH_subMesh::COMPUTE_OK ) - return error(SMESH_Comment("Failed to create segments on the edge ") - << tgtMesh->ShapeToIndex( edges[iE ])); + return error(SMESH_Comment("Failed to create segments on the edge #") << sm->GetId()); } // ============ @@ -803,7 +824,7 @@ bool StdMeshers_Import_1D2D::Evaluate(SMESH_Mesh & theMesh, set allNodes; gp_XY uv; double minGroupTol = 1e100; - for ( int iG = 0; iG < srcGroups.size(); ++iG ) + for ( size_t iG = 0; iG < srcGroups.size(); ++iG ) { const SMESHDS_GroupBase* srcGroup = srcGroups[iG]->GetGroupDS(); const double groupTol = 0.5 * sqrt( getMinElemSize2( srcGroup ));