X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FControls%2FSMESH_Controls.cxx;h=9333e702377047a93173cfb392bf6288967740da;hb=ca5275c924507e615246cc4ceed8267c9dddc0a7;hp=6e80cc77ad1a53324ea380b885c3cc6eb78c1a8b;hpb=e74c29b7867ca230102fc580d831dda6b81b3b4c;p=modules%2Fsmesh.git diff --git a/src/Controls/SMESH_Controls.cxx b/src/Controls/SMESH_Controls.cxx index 6e80cc77a..9333e7023 100644 --- a/src/Controls/SMESH_Controls.cxx +++ b/src/Controls/SMESH_Controls.cxx @@ -616,7 +616,8 @@ double MaxElementLength3D::GetValue( long theElementId ) aVal = Max(aVal,Max(L7,L8)); break; } - case SMDSEntity_Quad_Penta: { // quadratic pentas + case SMDSEntity_Quad_Penta: + case SMDSEntity_BiQuad_Penta: { // quadratic pentas double L1 = getDistance(P( 1 ),P( 7 )) + getDistance(P( 7 ),P( 2 )); double L2 = getDistance(P( 2 ),P( 8 )) + getDistance(P( 8 ),P( 3 )); double L3 = getDistance(P( 3 ),P( 9 )) + getDistance(P( 9 ),P( 1 )); @@ -1619,7 +1620,7 @@ double Length2D::GetValue( long theElementId ) } break; case SMDSEntity_Pyramid: - if (len == 5){ // piramids + if (len == 5){ // pyramid double L1 = getDistance(P( 1 ),P( 2 )); double L2 = getDistance(P( 2 ),P( 3 )); double L3 = getDistance(P( 3 ),P( 4 )); @@ -1634,7 +1635,7 @@ double Length2D::GetValue( long theElementId ) } break; case SMDSEntity_Penta: - if (len == 6) { // pentaidres + if (len == 6) { // pentahedron double L1 = getDistance(P( 1 ),P( 2 )); double L2 = getDistance(P( 2 ),P( 3 )); double L3 = getDistance(P( 3 ),P( 1 )); @@ -1670,7 +1671,7 @@ double Length2D::GetValue( long theElementId ) } break; case SMDSEntity_Quad_Tetra: - if (len == 10){ // quadratic tetraidrs + if (len == 10){ // quadratic tetrahedron double L1 = getDistance(P( 1 ),P( 5 )) + getDistance(P( 5 ),P( 2 )); double L2 = getDistance(P( 2 ),P( 6 )) + getDistance(P( 6 ),P( 3 )); double L3 = getDistance(P( 3 ),P( 7 )) + getDistance(P( 7 ),P( 1 )); @@ -1681,7 +1682,7 @@ double Length2D::GetValue( long theElementId ) } break; case SMDSEntity_Quad_Pyramid: - if (len == 13){ // quadratic piramids + if (len == 13){ // quadratic pyramid double L1 = getDistance(P( 1 ),P( 6 )) + getDistance(P( 6 ),P( 2 )); double L2 = getDistance(P( 2 ),P( 7 )) + getDistance(P( 7 ),P( 3 )); double L3 = getDistance(P( 3 ),P( 8 )) + getDistance(P( 8 ),P( 4 )); @@ -1695,7 +1696,8 @@ double Length2D::GetValue( long theElementId ) } break; case SMDSEntity_Quad_Penta: - if (len == 15){ // quadratic pentaidres + case SMDSEntity_BiQuad_Penta: + if (len >= 15){ // quadratic pentahedron double L1 = getDistance(P( 1 ),P( 7 )) + getDistance(P( 7 ),P( 2 )); double L2 = getDistance(P( 2 ),P( 8 )) + getDistance(P( 8 ),P( 3 )); double L3 = getDistance(P( 3 ),P( 9 )) + getDistance(P( 9 ),P( 1 )); @@ -1711,7 +1713,7 @@ double Length2D::GetValue( long theElementId ) break; case SMDSEntity_Quad_Hexa: case SMDSEntity_TriQuad_Hexa: - if (len >= 20) { // quadratic hexaider + if (len >= 20) { // quadratic hexahedron double L1 = getDistance(P( 1 ),P( 9 )) + getDistance(P( 9 ),P( 2 )); double L2 = getDistance(P( 2 ),P( 10 )) + getDistance(P( 10 ),P( 3 )); double L3 = getDistance(P( 3 ),P( 11 )) + getDistance(P( 11 ),P( 4 )); @@ -4287,6 +4289,7 @@ void ElementsOnShape::SetShape (const TopoDS_Shape& theShape, if ( shapeChanges ) { + // find most complex shapes TopTools_IndexedMapOfShape shapesMap; TopAbs_ShapeEnum shapeTypes[4] = { TopAbs_SOLID, TopAbs_FACE, TopAbs_EDGE, TopAbs_VERTEX }; TopExp_Explorer sub; @@ -4329,10 +4332,18 @@ void ElementsOnShape::clearClassifiers() bool ElementsOnShape::IsSatisfy( long elemId ) { - const SMDS_Mesh* mesh = myMeshModifTracer.GetMesh(); - const SMDS_MeshElement* elem = - ( myType == SMDSAbs_Node ? mesh->FindNode( elemId ) : mesh->FindElement( elemId )); - if ( !elem || myClassifiers.empty() ) + if ( myClassifiers.empty() ) + return false; + + const SMDS_Mesh* mesh = myMeshModifTracer.GetMesh(); + if ( myType == SMDSAbs_Node ) + return IsSatisfy( mesh->FindNode( elemId )); + return IsSatisfy( mesh->FindElement( elemId )); +} + +bool ElementsOnShape::IsSatisfy (const SMDS_MeshElement* elem) +{ + if ( !elem ) return false; bool isSatisfy = myAllNodesFlag, isNodeOut; @@ -4396,6 +4407,60 @@ bool ElementsOnShape::IsSatisfy( long elemId ) return isSatisfy; } +bool ElementsOnShape::IsSatisfy (const SMDS_MeshNode* node, + TopoDS_Shape* okShape) +{ + if ( !node ) + return false; + + if ( !myOctree && myClassifiers.size() > 5 ) + { + myWorkClassifiers.resize( myClassifiers.size() ); + for ( size_t i = 0; i < myClassifiers.size(); ++i ) + myWorkClassifiers[ i ] = & myClassifiers[ i ]; + myOctree = new OctreeClassifier( myWorkClassifiers ); + } + + bool isNodeOut = true; + + if ( okShape || !getNodeIsOut( node, isNodeOut )) + { + SMESH_NodeXYZ aPnt = node; + if ( myOctree ) + { + myWorkClassifiers.clear(); + myOctree->GetClassifiersAtPoint( aPnt, myWorkClassifiers ); + + for ( size_t i = 0; i < myWorkClassifiers.size(); ++i ) + myWorkClassifiers[i]->SetChecked( false ); + + for ( size_t i = 0; i < myWorkClassifiers.size(); ++i ) + if ( !myWorkClassifiers[i]->IsChecked() && + !myWorkClassifiers[i]->IsOut( aPnt )) + { + isNodeOut = false; + if ( okShape ) + *okShape = myWorkClassifiers[i]->Shape(); + break; + } + } + else + { + for ( size_t i = 0; i < myClassifiers.size(); ++i ) + if ( !myClassifiers[i].IsOut( aPnt )) + { + isNodeOut = false; + if ( okShape ) + *okShape = myWorkClassifiers[i]->Shape(); + break; + } + } + setNodeIsOut( node, isNodeOut ); + } + + return !isNodeOut; +} + void ElementsOnShape::Classifier::Init( const TopoDS_Shape& theShape, double theTol, const Bnd_B3d* theBox ) @@ -4493,7 +4558,7 @@ bool ElementsOnShape::Classifier::isOutOfFace (const gp_Pnt& p) if ( myProjFace.IsDone() && myProjFace.LowerDistance() <= myTol ) { // check relatively to the face - Quantity_Parameter u, v; + Standard_Real u, v; myProjFace.LowerDistanceParameters(u, v); gp_Pnt2d aProjPnt (u, v); BRepClass_FaceClassifier aClsf ( TopoDS::Face( myShape ), aProjPnt, myTol );