X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FStdMeshers%2FStdMeshers_ProjectionUtils.cxx;h=550ecb2e598b8aa8f3958c68e77b486b29522d10;hb=c6130fee7bd3a8aa436e5c7dfbc9bf35b562f722;hp=3b69a201f4612ce648f92389c883be8da7489828;hpb=79b1ac2b6df9117f16f11d444b1f165d477a1813;p=modules%2Fsmesh.git diff --git a/src/StdMeshers/StdMeshers_ProjectionUtils.cxx b/src/StdMeshers/StdMeshers_ProjectionUtils.cxx index 3b69a201f..550ecb2e5 100644 --- a/src/StdMeshers/StdMeshers_ProjectionUtils.cxx +++ b/src/StdMeshers/StdMeshers_ProjectionUtils.cxx @@ -25,8 +25,6 @@ // Created : Fri Oct 27 10:24:28 2006 // Author : Edward AGAPOV (eap) -using namespace std; - #include "StdMeshers_ProjectionUtils.hxx" #include "StdMeshers_ProjectionSource1D.hxx" @@ -66,6 +64,8 @@ using namespace std; #include #include +using namespace std; + #define RETURN_BAD_RESULT(msg) { MESSAGE(")-: Error: " << msg); return false; } #define SHOW_VERTEX(v,msg) // { \ @@ -773,6 +773,79 @@ bool StdMeshers_ProjectionUtils::FindSubShapeAssociation(const TopoDS_Shape& the } break; // try by vertex closeness } + case TopAbs_COMPOUND: { + // ---------------------------------------------------------------------- + if ( IsPropagationPossible( theMesh1, theMesh2 )) { + // find a boundary edge for theShape1 + TopoDS_Edge E; + for(TopExp_Explorer exp(theShape1, TopAbs_EDGE); exp.More(); exp.Next() ) { + E = TopoDS::Edge( exp.Current() ); + int NbFacesFromShape1 = 0; + const TopTools_ListOfShape& EAncestors = theMesh1->GetAncestors(E); + TopTools_ListIteratorOfListOfShape itea(EAncestors); + for(; itea.More(); itea.Next()) { + if( itea.Value().ShapeType() != TopAbs_FACE ) continue; + TopoDS_Face face = TopoDS::Face(itea.Value()); + for(TopExp_Explorer expf(theShape1, TopAbs_FACE); expf.More(); expf.Next() ) { + if(face.IsSame(expf.Current())) { + NbFacesFromShape1++; + break; + } + } + } + if(NbFacesFromShape1==1) break; + } + // find association for vertices of edge E + TopoDS_Vertex VV1[2], VV2[2]; + for(TopExp_Explorer eexp(E, TopAbs_VERTEX); eexp.More(); eexp.Next()) { + TopoDS_Vertex V1 = TopoDS::Vertex( eexp.Current() ); + // look for an edge ending in E whose one vertex is in theShape1 + // and the other, in theShape2 + const TopTools_ListOfShape& Ancestors = theMesh1->GetAncestors(V1); + TopTools_ListIteratorOfListOfShape ita(Ancestors); + for(; ita.More(); ita.Next()) { + if( ita.Value().ShapeType() != TopAbs_EDGE ) continue; + TopoDS_Edge edge = TopoDS::Edge(ita.Value()); + bool FromShape1 = false; + for(TopExp_Explorer expe(theShape1, TopAbs_EDGE); expe.More(); expe.Next() ) { + if(edge.IsSame(expe.Current())) { + FromShape1 = true; + break; + } + } + if(!FromShape1) { + // is it an edge between theShape1 and theShape2? + TopExp_Explorer expv(edge, TopAbs_VERTEX); + TopoDS_Vertex V2 = TopoDS::Vertex( expv.Current() ); + if(V2.IsSame(V1)) { + expv.Next(); + V2 = TopoDS::Vertex( expv.Current() ); + } + bool FromShape2 = false; + for ( expv.Init( theShape2, TopAbs_VERTEX ); expv.More(); expv.Next()) { + if ( V2.IsSame( expv.Current() )) { + FromShape2 = true; + break; + } + } + if ( FromShape2 ) { + if ( VV1[0].IsNull() ) + VV1[0] = V1, VV2[0] = V2; + else + VV1[1] = V1, VV2[1] = V2; + break; // from loop on ancestors of V1 + } + } + } + } + if ( !VV1[1].IsNull() ) { + InsertAssociation( VV1[0], VV2[0], theMap, bidirect); + InsertAssociation( VV1[1], VV2[1], theMap, bidirect); + return FindSubShapeAssociation( theShape1, theMesh1, theShape2, theMesh2, theMap); + } + } + break; // try by vertex closeness + } default:; } @@ -1285,7 +1358,7 @@ FindMatchingNodesOnFaces( const TopoDS_Face& face1, } if ( nodesOfFaces ) { - if ( BRep_Tool::IsClosed( e2, face2 )) { + if ( helper2.IsRealSeam( e2 )) { seam1 = e1; seam2 = e2; } else { @@ -1357,7 +1430,7 @@ FindMatchingNodesOnFaces( const TopoDS_Face& face1, const TopoDS_Face & face = is2 ? face2 : face1; SMDS_ElemIteratorPtr eIt = sm->GetElements(); - if ( !helper->IsSeamShape( is2 ? edge2 : edge1 )) + if ( !helper->IsRealSeam( is2 ? edge2 : edge1 )) { while ( eIt->more() ) elems.insert( eIt->next() ); } @@ -1442,7 +1515,7 @@ FindMatchingNodesOnFaces( const TopoDS_Face& face1, // On a sphere, add matching nodes on the edge - if ( helper1.IsSeamShape( edge1 )) + if ( helper1.IsRealSeam( edge1 )) { // sort nodes on edges by param on edge map< double, const SMDS_MeshNode* > u2nodesMaps[2];