// Created : Fri Oct 27 10:24:28 2006
// Author : Edward AGAPOV (eap)
-using namespace std;
-
#include "StdMeshers_ProjectionUtils.hxx"
#include "StdMeshers_ProjectionSource1D.hxx"
#include <TopTools_DataMapIteratorOfDataMapOfShapeShape.hxx>
#include <TopTools_DataMapIteratorOfDataMapOfShapeListOfShape.hxx>
+using namespace std;
+
#define RETURN_BAD_RESULT(msg) { MESSAGE(")-: Error: " << msg); return false; }
#define SHOW_VERTEX(v,msg) // { \
break; // try by vertex closeness
}
case TopAbs_COMPOUND: {
+ // ----------------------------------------------------------------------
if ( IsPropagationPossible( theMesh1, theMesh2 )) {
- // find boundary(for theShape1) edge
+ // 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() );
}
if(NbFacesFromShape1==1) break;
}
- // find association for vertices from edge E
+ // 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(!FromShape1) {
- // it is an edge between theShape1 and theShape2
+ // 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() );
}
- InsertAssociation( V1, V2, theMap, bidirect);
- break;
+ 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
+ }
}
}
}
- return FindSubShapeAssociation( theShape1, theMesh1, theShape2, theMesh2, theMap);
+ 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
}
}
if ( nodesOfFaces )
{
- if ( BRep_Tool::IsClosed( e2, face2 )) {
+ if ( helper2.IsRealSeam( e2 )) {
seam1 = e1; seam2 = e2;
}
else {
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() );
}
// 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];
SMESH_Gen* gen = mesh->GetGen();
SMESH_Algo* algo = gen->GetAlgo( *mesh, sm->GetSubShape() );
if ( !algo )
- RETURN_BAD_RESULT("No algo assigned to submesh " << sm->GetId());
+ {
+ if ( sm->GetSubShape().ShapeType() != TopAbs_COMPOUND )
+ RETURN_BAD_RESULT("No algo assigned to submesh " << sm->GetId());
+ // group
+ bool computed = true;
+ for ( TopoDS_Iterator grMember( sm->GetSubShape() ); grMember.More(); grMember.Next())
+ if ( SMESH_subMesh* grSub = mesh->GetSubMesh( grMember.Value() ))
+ if ( !MakeComputed( grSub, iterationNb + 1 ))
+ computed = false;
+ return computed;
+ }
string algoType = algo->GetName();
if ( algoType.substr(0, 11) != "Projection_")
if ( !srcMesh )
srcMesh = mesh;
- return MakeComputed( srcMesh->GetSubMesh( srcShape ), iterationNb + 1 );
+ if ( MakeComputed( srcMesh->GetSubMesh( srcShape ), iterationNb + 1 ))
+ return gen->Compute( *mesh, sm->GetSubShape() );
+
+ return false;
}
//================================================================================