X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FStdMeshers%2FStdMeshers_Projection_2D.cxx;h=f0badf671c6961e45dff8278abeed0dd79fa56ca;hb=52a4f79f459f6e7fc5367ea83c1fe5fb9e42b4dd;hp=5e10f6d0779d5e92c1f41544d2913b594e0275c1;hpb=512916b107f163a97535d0326008d3edabf6c7ec;p=modules%2Fsmesh.git diff --git a/src/StdMeshers/StdMeshers_Projection_2D.cxx b/src/StdMeshers/StdMeshers_Projection_2D.cxx index 5e10f6d07..f0badf671 100644 --- a/src/StdMeshers/StdMeshers_Projection_2D.cxx +++ b/src/StdMeshers/StdMeshers_Projection_2D.cxx @@ -41,20 +41,21 @@ #include "SMESH_Pattern.hxx" #include "SMESH_subMesh.hxx" #include "SMESH_subMeshEventListener.hxx" +#include "SMESH_Comment.hxx" #include "SMDS_EdgePosition.hxx" #include "utilities.h" +#include #include -#include +#include #include -#include - +#include using namespace std; -#define RETURN_BAD_RESULT(msg) { MESSAGE(msg); return false; } +#define RETURN_BAD_RESULT(msg) { MESSAGE(")-: Error: " << msg); return false; } typedef StdMeshers_ProjectionUtils TAssocTool; @@ -133,31 +134,39 @@ bool StdMeshers_Projection_2D::CheckHypothesis(SMESH_Mesh& !TAssocTool::IsSubShape( edge, srcMesh ) || !TAssocTool::IsSubShape( edge, _sourceHypo->GetSourceFace() )) { + theStatus = HYP_BAD_PARAMETER; SCRUTE((edge.IsNull())); SCRUTE((TAssocTool::IsSubShape( edge, srcMesh ))); SCRUTE((TAssocTool::IsSubShape( edge, _sourceHypo->GetSourceFace() ))); - theStatus = HYP_BAD_PARAMETER; } else { // target vertices edge = TAssocTool::GetEdgeByVertices ( tgtMesh, _sourceHypo->GetTargetVertex(1), _sourceHypo->GetTargetVertex(2) ); - if ( edge.IsNull() || - !TAssocTool::IsSubShape( edge, tgtMesh ) || - !TAssocTool::IsSubShape( edge, theShape )) + if ( edge.IsNull() || !TAssocTool::IsSubShape( edge, tgtMesh )) { + theStatus = HYP_BAD_PARAMETER; SCRUTE((edge.IsNull())); SCRUTE((TAssocTool::IsSubShape( edge, tgtMesh ))); - SCRUTE((TAssocTool::IsSubShape( edge, theShape ))); + } + // PAL16203 + else if ( !_sourceHypo->IsCompoundSource() && + !TAssocTool::IsSubShape( edge, theShape )) + { theStatus = HYP_BAD_PARAMETER; + SCRUTE((TAssocTool::IsSubShape( edge, theShape ))); } } } // check a source face - if ( !TAssocTool::IsSubShape( _sourceHypo->GetSourceFace(), srcMesh )) { - MESSAGE("Bad source face"); + if ( !TAssocTool::IsSubShape( _sourceHypo->GetSourceFace(), srcMesh ) || + ( srcMesh == tgtMesh && theShape == _sourceHypo->GetSourceFace() )) + { theStatus = HYP_BAD_PARAMETER; + SCRUTE((TAssocTool::IsSubShape( _sourceHypo->GetSourceFace(), srcMesh ))); + SCRUTE((srcMesh == tgtMesh)); + SCRUTE(( theShape == _sourceHypo->GetSourceFace() )); } } else @@ -219,10 +228,9 @@ namespace { // do not break but iterate over DependsOn() } default: - const map< int, SMESH_subMesh * >& subSM = sm->DependsOn(); - map< int, SMESH_subMesh * >::const_iterator i_sm = subSM.begin(); - for ( ; i_sm != subSM.end(); ++i_sm ) - Clean( i_sm->second ); + SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator(false,false); + while ( smIt->more() ) + Clean( smIt->next() ); } } }; @@ -361,9 +369,6 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& if ( !_sourceHypo ) return false; - TopoDS_Face tgtFace = TopoDS::Face( theShape.Oriented(TopAbs_FORWARD)); - TopoDS_Face srcFace = TopoDS::Face( _sourceHypo->GetSourceFace().Oriented(TopAbs_FORWARD)); - SMESH_Mesh * srcMesh = _sourceHypo->GetSourceMesh(); SMESH_Mesh * tgtMesh = & theMesh; if ( !srcMesh ) @@ -371,18 +376,21 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& SMESHDS_Mesh * meshDS = theMesh.GetMeshDS(); - SMESH_MesherHelper helper( theMesh ); - helper.SetSubShape( tgtFace ); - // --------------------------- // Make subshapes association // --------------------------- + TopoDS_Face tgtFace = TopoDS::Face( theShape.Oriented(TopAbs_FORWARD)); + TopoDS_Shape srcShape = _sourceHypo->GetSourceFace().Oriented(TopAbs_FORWARD); + TAssocTool::TShapeShapeMap shape2ShapeMap; - TAssocTool::InitVertexAssociation( _sourceHypo, shape2ShapeMap ); - if ( !TAssocTool::FindSubShapeAssociation( tgtFace, tgtMesh, srcFace, srcMesh, - shape2ShapeMap) ) - RETURN_BAD_RESULT("FindSubShapeAssociation failed"); + TAssocTool::InitVertexAssociation( _sourceHypo, shape2ShapeMap, tgtFace ); + if ( !TAssocTool::FindSubShapeAssociation( tgtFace, tgtMesh, srcShape, srcMesh, + shape2ShapeMap) || + !shape2ShapeMap.IsBound( tgtFace )) + return error(COMPERR_BAD_SHAPE,"Topology of source and target faces seems different" ); + + TopoDS_Face srcFace = TopoDS::Face( shape2ShapeMap( tgtFace ).Oriented(TopAbs_FORWARD)); // ---------------------------------------------- // Assure that mesh on a source Face is computed @@ -393,11 +401,11 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& if ( tgtMesh == srcMesh ) { if ( !TAssocTool::MakeComputed( srcSubMesh )) - RETURN_BAD_RESULT("Impossible to compute the source mesh"); + return error(COMPERR_BAD_INPUT_MESH,"Source mesh not computed"); } else { if ( !srcSubMesh->IsMeshComputed() ) - RETURN_BAD_RESULT("Source mesh is not computed"); + return error(COMPERR_BAD_INPUT_MESH,"Source mesh not computed"); } // -------------------- @@ -408,7 +416,7 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& SMESH_Pattern mapper; mapper.Load( srcMesh, srcFace ); if ( mapper.GetErrorCode() != SMESH_Pattern::ERR_OK ) - RETURN_BAD_RESULT("SMESH_Pattern::Load() failed"); + return error(COMPERR_BAD_INPUT_MESH,"Can't load mesh pattern from the source face"); // Find the first target vertex corresponding to first vertex of the // and flag needed to call mapper.Apply() @@ -434,12 +442,8 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& if ( nbEdgesInWires.front() > 1 ) // possible to find out { TopoDS_Edge srcE1 = srcEdges.front(), tgtE1 = tgtEdges.front(); - reverse = ( ! srcE1.IsSame( shape2ShapeMap( tgtE1 ))); - if ( BRep_Tool::IsClosed( tgtE1, tgtFace )) { - reverse = ( srcE1.Orientation() == tgtE1.Orientation() ); - if ( _sourceHypo->GetSourceFace().Orientation() != theShape.Orientation() ) - reverse = !reverse; - } + TopoDS_Shape srcE1bis = shape2ShapeMap( tgtE1 ); + reverse = ( ! srcE1.IsSame( srcE1bis )); } else if ( nbEdgesInWires.front() == 1 ) { @@ -459,18 +463,18 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& mapper.Apply( tgtFace, tgtV1, reverse ); if ( mapper.GetErrorCode() != SMESH_Pattern::ERR_OK ) - RETURN_BAD_RESULT("SMESH_Pattern::Apply() failed"); + return error("Can't apply source mesh pattern to the face"); // Create the mesh const bool toCreatePolygons = false, toCreatePolyedrs = false; mapper.MakeMesh( tgtMesh, toCreatePolygons, toCreatePolyedrs ); if ( mapper.GetErrorCode() != SMESH_Pattern::ERR_OK ) - RETURN_BAD_RESULT("SMESH_Pattern::MakeMesh() failed"); + return error("Can't make mesh by source mesh pattern"); // it will remove mesh built by pattern mapper on edges and vertices // in failure case - MeshCleaner cleaner( tgtSubMesh ); + // MeshCleaner cleaner( tgtSubMesh ); // ------------------------------------------------------------------------- // mapper doesn't take care of nodes already existing on edges and vertices, @@ -480,21 +484,23 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& SMESH_MeshEditor editor( tgtMesh ); SMESH_MeshEditor::TListOfListOfNodes groupsOfNodes; + SMESH_MesherHelper helper( theMesh ); + helper.SetSubShape( tgtFace ); + // Make groups of nodes to merge // loop on edge and vertex submeshes of a target face - const map< int, SMESH_subMesh * >& subSM = tgtSubMesh->DependsOn(); - map< int, SMESH_subMesh * >::const_iterator i_subSM = subSM.begin(); - for ( ; i_subSM != subSM.end(); ++i_subSM ) + SMESH_subMeshIteratorPtr smIt = tgtSubMesh->getDependsOnIterator(false,false); + while ( smIt->more() ) { - SMESH_subMesh* sm = i_subSM->second; + SMESH_subMesh* sm = smIt->next(); SMESHDS_SubMesh* smDS = sm->GetSubMeshDS(); // Sort new and old nodes of a submesh separately bool isSeam = helper.IsSeamShape( sm->GetId() ); - enum { NEW_NODES, OLD_NODES }; + enum { NEW_NODES = 0, OLD_NODES }; map< double, const SMDS_MeshNode* > u2nodesMaps[2], u2nodesOnSeam; map< double, const SMDS_MeshNode* >::iterator u_oldNode, u_newNode, u_newOnSeam, newEnd; set< const SMDS_MeshNode* > seamNodes; @@ -515,7 +521,7 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& } // sort nodes on edges by its position - map< double, const SMDS_MeshNode* > & pos2nodes = u2nodesMaps[ isOld ]; + map< double, const SMDS_MeshNode* > & pos2nodes = u2nodesMaps[isOld ? OLD_NODES : NEW_NODES]; switch ( node->GetPosition()->GetTypeOfPosition() ) { case SMDS_TOP_VERTEX: { @@ -533,14 +539,22 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& node->GetPosition()->GetTypeOfPosition()); } } - if ( u2nodesMaps[ OLD_NODES ].size() != u2nodesMaps[ NEW_NODES ].size() ) - RETURN_BAD_RESULT("Different nb of old and new nodes " << + if ( u2nodesMaps[ NEW_NODES ].size() != u2nodesMaps[ OLD_NODES ].size() ) + { + if ( u2nodesMaps[ NEW_NODES ].size() == 0 && + sm->GetSubShape().ShapeType() == TopAbs_EDGE && + BRep_Tool::Degenerated( TopoDS::Edge( sm->GetSubShape() ))) + // NPAL15894 (tt88bis.py) - project mesh built by NETGEN_1d_2D that + // does not make segments/nodes on degenerated edges + continue; + RETURN_BAD_RESULT("Different nb of old and new nodes on shape #"<< sm->GetId() <<" "<< u2nodesMaps[ OLD_NODES ].size() << " != " << u2nodesMaps[ NEW_NODES ].size()); - if ( isSeam && u2nodesMaps[ OLD_NODES ].size() != u2nodesOnSeam.size() ) + } + if ( isSeam && u2nodesMaps[ OLD_NODES ].size() != u2nodesOnSeam.size() ) { RETURN_BAD_RESULT("Different nb of old and seam nodes " << u2nodesMaps[ OLD_NODES ].size() << " != " << u2nodesOnSeam.size()); - + } // Make groups of nodes to merge u_oldNode = u2nodesMaps[ OLD_NODES ].begin(); u_newNode = u2nodesMaps[ NEW_NODES ].begin(); @@ -603,7 +617,7 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& } } - cleaner.Release(); // do not remove mesh + //cleaner.Release(); // do not remove mesh return true; } @@ -622,17 +636,7 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& void StdMeshers_Projection_2D::SetEventListener(SMESH_subMesh* subMesh) { - if ( _sourceHypo && ! _sourceHypo->GetSourceFace().IsNull() ) - { - SMESH_Mesh* srcMesh = _sourceHypo->GetSourceMesh(); - if ( !srcMesh ) - srcMesh = subMesh->GetFather(); - - SMESH_subMesh* srcFaceSM = - srcMesh->GetSubMesh( _sourceHypo->GetSourceFace() ); - - subMesh->SetEventListener( new SMESH_subMeshEventListener(), - SMESH_subMeshEventListenerData::MakeData( subMesh ), - srcFaceSM ); - } + TAssocTool::SetEventListener( subMesh, + _sourceHypo->GetSourceFace(), + _sourceHypo->GetSourceMesh() ); }