From c2a18a423efe58a6b74ae9c9cfd811c084bb3952 Mon Sep 17 00:00:00 2001 From: eap Date: Fri, 15 Nov 2013 11:59:48 +0000 Subject: [PATCH] Regression of SALOME_TESTS/Grids/smesh/bugs_13/N9 Fix association of SHELLs --- src/StdMeshers/StdMeshers_ProjectionUtils.cxx | 10 +-- src/StdMeshers/StdMeshers_RadialPrism_3D.cxx | 66 +++++++++++++------ 2 files changed, 53 insertions(+), 23 deletions(-) diff --git a/src/StdMeshers/StdMeshers_ProjectionUtils.cxx b/src/StdMeshers/StdMeshers_ProjectionUtils.cxx index de59b2654..4bb435214 100644 --- a/src/StdMeshers/StdMeshers_ProjectionUtils.cxx +++ b/src/StdMeshers/StdMeshers_ProjectionUtils.cxx @@ -438,8 +438,8 @@ bool StdMeshers_ProjectionUtils::FindSubShapeAssociation(const TopoDS_Shape& the TShapeShapeMap & theMap) { // Structure of this long function is following - // 1) Group->group projection: theShape1 is a group member, - // theShape2 is a group. We find a group theShape1 is in and recall self. + // 1) Group -> Group projection: theShape1 is a group member, + // theShape2 is another group. We find a group theShape1 is in and recall self. // 2) Accosiate same shapes with different location (partners). // 3) If vertex association is given, perform accosiation according to shape type: // switch ( ShapeType ) { @@ -622,7 +622,8 @@ bool StdMeshers_ProjectionUtils::FindSubShapeAssociation(const TopoDS_Shape& the TopTools_ListIteratorOfListOfShape ancestIt1( edgeToFace1.FindFromKey( edge1 )); for ( ; F1.IsNull() && ancestIt1.More(); ancestIt1.Next() ) if ( ancestIt1.Value().ShapeType() == TopAbs_FACE ) - F1 = ancestIt1.Value().Oriented( TopAbs_FORWARD ); + F1 = ancestIt1.Value().Oriented //( TopAbs_FORWARD ); + ( SMESH_MesherHelper::GetSubShapeOri( theShape1, ancestIt1.Value() )); if ( F1.IsNull() ) RETURN_BAD_RESULT(" Face1 not found"); @@ -630,7 +631,8 @@ bool StdMeshers_ProjectionUtils::FindSubShapeAssociation(const TopoDS_Shape& the TopTools_ListIteratorOfListOfShape ancestIt2( edgeToFace2.FindFromKey( edge2 )); for ( int i = 0; FF2[1].IsNull() && ancestIt2.More(); ancestIt2.Next() ) if ( ancestIt2.Value().ShapeType() == TopAbs_FACE ) - FF2[ i++ ] = ancestIt2.Value().Oriented( TopAbs_FORWARD ); + FF2[ i++ ] = ancestIt2.Value().Oriented // ( TopAbs_FORWARD ); + ( SMESH_MesherHelper::GetSubShapeOri( theShape2, ancestIt2.Value() )); // get oriented edge1 and edge2 from F1 and FF2[0] for ( exp.Init( F1, TopAbs_EDGE ); exp.More(); exp.Next() ) diff --git a/src/StdMeshers/StdMeshers_RadialPrism_3D.cxx b/src/StdMeshers/StdMeshers_RadialPrism_3D.cxx index 450dbb3c7..1814680af 100644 --- a/src/StdMeshers/StdMeshers_RadialPrism_3D.cxx +++ b/src/StdMeshers/StdMeshers_RadialPrism_3D.cxx @@ -48,26 +48,27 @@ #include #include -#if OCC_VERSION_LARGE > 0x06050400 -#include -#else -#include -#endif #include #include +#include +#include #include #include #include -#include #include #include +#if OCC_VERSION_LARGE > 0x06050400 +#include +#else +#include +#endif using namespace std; #define RETURN_BAD_RESULT(msg) { MESSAGE(")-: Error: " << msg); return false; } #define gpXYZ(n) gp_XYZ(n->X(),n->Y(),n->Z()) -namespace TAssocTool = StdMeshers_ProjectionUtils; +namespace ProjectionUtils = StdMeshers_ProjectionUtils; //======================================================================= //function : StdMeshers_RadialPrism_3D @@ -106,8 +107,8 @@ bool StdMeshers_RadialPrism_3D::CheckHypothesis(SMESH_Mesh& { // check aShape that must have 2 shells /* PAL16229 - if ( TAssocTool::Count( aShape, TopAbs_SOLID, 0 ) != 1 || - TAssocTool::Count( aShape, TopAbs_SHELL, 0 ) != 2 ) + if ( ProjectionUtils::Count( aShape, TopAbs_SOLID, 0 ) != 1 || + ProjectionUtils::Count( aShape, TopAbs_SHELL, 0 ) != 2 ) { aStatus = HYP_BAD_GEOMETRY; return false; @@ -185,12 +186,39 @@ bool StdMeshers_RadialPrism_3D::Compute(SMESH_Mesh& aMesh, const TopoDS_Shape& a // Associate sub-shapes of the shells // ---------------------------------- - TAssocTool::TShapeShapeMap shape2ShapeMap; - if ( !TAssocTool::FindSubShapeAssociation( innerShell, &aMesh, - outerShell, &aMesh, - shape2ShapeMap) ) + ProjectionUtils::TShapeShapeMap shape2ShapeMaps[2]; + if ( !ProjectionUtils::FindSubShapeAssociation( innerShell, &aMesh, + outerShell, &aMesh, + shape2ShapeMaps[0]) + && + !ProjectionUtils::FindSubShapeAssociation( innerShell.Reversed(), &aMesh, + outerShell, &aMesh, + shape2ShapeMaps[1])) return error(COMPERR_BAD_SHAPE,"Topology of inner and outer shells seems different" ); + int iMap; + if ( shape2ShapeMaps[0].Extent() == shape2ShapeMaps[1].Extent() ) + { + // choose an assiciation by shortest distance between VERTEXes + double dist1 = 0, dist2 = 0; + TopTools_DataMapIteratorOfDataMapOfShapeShape ssIt( shape2ShapeMaps[0]._map1to2 ); + for (; ssIt.More(); ssIt.Next() ) + { + if ( ssIt.Key().ShapeType() != TopAbs_VERTEX ) continue; + gp_Pnt pIn = BRep_Tool::Pnt( TopoDS::Vertex( ssIt.Key() )); + gp_Pnt pOut1 = BRep_Tool::Pnt( TopoDS::Vertex( ssIt.Value() )); + gp_Pnt pOut2 = BRep_Tool::Pnt( TopoDS::Vertex( shape2ShapeMaps[1]( ssIt.Key() ))); + dist1 += pIn.SquareDistance( pOut1 ); + dist2 += pIn.SquareDistance( pOut2 ); + } + iMap = ( dist1 < dist2 ) ? 0 : 1; + } + else + { + iMap = ( shape2ShapeMaps[0].Extent() > shape2ShapeMaps[1].Extent() ) ? 0 : 1; + } + ProjectionUtils::TShapeShapeMap& shape2ShapeMap = shape2ShapeMaps[iMap]; + // ------------------ // Make mesh // ------------------ @@ -212,8 +240,8 @@ bool StdMeshers_RadialPrism_3D::Compute(SMESH_Mesh& aMesh, const TopoDS_Shape& a // Find matching nodes of in and out faces TNodeNodeMap nodeIn2OutMap; - if ( ! TAssocTool::FindMatchingNodesOnFaces( inFace, &aMesh, outFace, &aMesh, - shape2ShapeMap, nodeIn2OutMap )) + if ( ! ProjectionUtils::FindMatchingNodesOnFaces( inFace, &aMesh, outFace, &aMesh, + shape2ShapeMap, nodeIn2OutMap )) return error(COMPERR_BAD_INPUT_MESH,SMESH_Comment("Mesh on faces #") << meshDS->ShapeToIndex( outFace ) << " and " << meshDS->ShapeToIndex( inFace ) << " seems different" ); @@ -432,10 +460,10 @@ bool StdMeshers_RadialPrism_3D::Evaluate(SMESH_Mesh& aMesh, } // Associate sub-shapes of the shells - TAssocTool::TShapeShapeMap shape2ShapeMap; - if ( !TAssocTool::FindSubShapeAssociation( outerShell, &aMesh, - innerShell, &aMesh, - shape2ShapeMap) ) { + ProjectionUtils::TShapeShapeMap shape2ShapeMap; + if ( !ProjectionUtils::FindSubShapeAssociation( outerShell, &aMesh, + innerShell, &aMesh, + shape2ShapeMap) ) { std::vector aResVec(SMDSEntity_Last); for(int i=SMDSEntity_Node; i