X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FStdMeshers%2FStdMeshers_Projection_2D.cxx;h=f350692e3050ad618004a691dc8b46c94ac69ac7;hp=648510c94af2315add439def074434488040267a;hb=d0d20593a799433aba8f5fa9f56c36f4accc33f2;hpb=a695ce3aeecb27a023e248ccb9433d62916308cd diff --git a/src/StdMeshers/StdMeshers_Projection_2D.cxx b/src/StdMeshers/StdMeshers_Projection_2D.cxx index 648510c94..f350692e3 100644 --- a/src/StdMeshers/StdMeshers_Projection_2D.cxx +++ b/src/StdMeshers/StdMeshers_Projection_2D.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -1147,6 +1147,51 @@ namespace { return true; } + //======================================================================= + /* + * Set initial association of VERTEXes for the case of projection + * from a quadrangle FACE to a closed FACE, where opposite src EDGEs + * have different nb of segments + */ + //======================================================================= + + void initAssoc4Quad2Closed(const TopoDS_Shape& tgtFace, + SMESH_MesherHelper& tgtHelper, + const TopoDS_Shape& srcFace, + SMESH_Mesh* srcMesh, + TAssocTool::TShapeShapeMap & assocMap) + { + if ( !tgtHelper.HasRealSeam() ) + return; // no seam edge + list< TopoDS_Edge > tgtEdges, srcEdges; + list< int > tgtNbEW, srcNbEW; + int tgtNbW = SMESH_Block::GetOrderedEdges( TopoDS::Face( tgtFace ), tgtEdges, tgtNbEW ); + int srcNbW = SMESH_Block::GetOrderedEdges( TopoDS::Face( srcFace ), srcEdges, srcNbEW ); + if ( tgtNbW != 1 || srcNbW != 1 || + tgtNbEW.front() != 4 || srcNbEW.front() != 4 ) + return; // not quads + + int srcNbSeg[4]; + list< TopoDS_Edge >::iterator edgeS = srcEdges.begin(), edgeT = tgtEdges.begin(); + for ( int i = 0; edgeS != srcEdges.end(); ++i, ++edgeS ) + if ( SMESHDS_SubMesh* sm = srcMesh->GetMeshDS()->MeshElements( *edgeS )) + srcNbSeg[ i ] = sm->NbNodes(); + else + return; // not meshed + if ( srcNbSeg[0] == srcNbSeg[2] && srcNbSeg[1] == srcNbSeg[3] ) + return; // same nb segments + if ( srcNbSeg[0] != srcNbSeg[2] && srcNbSeg[1] != srcNbSeg[3] ) + return; // all different nb segments + + edgeS = srcEdges.begin(); + if ( srcNbSeg[0] != srcNbSeg[2] ) + ++edgeS; + TAssocTool::InsertAssociation( tgtHelper.IthVertex( 0,*edgeT ), + tgtHelper.IthVertex( 0,*edgeS ), assocMap ); + TAssocTool::InsertAssociation( tgtHelper.IthVertex( 1,*edgeT ), + tgtHelper.IthVertex( 1,*edgeS ), assocMap ); + } + } // namespace @@ -1159,7 +1204,6 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& { _src2tgtNodes.clear(); - MESSAGE("Projection_2D Compute"); if ( !_sourceHypo ) return false; @@ -1178,8 +1222,12 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& TopoDS_Face tgtFace = TopoDS::Face( theShape.Oriented(TopAbs_FORWARD)); TopoDS_Shape srcShape = _sourceHypo->GetSourceFace().Oriented(TopAbs_FORWARD); + helper.SetSubShape( tgtFace ); + TAssocTool::TShapeShapeMap shape2ShapeMap; TAssocTool::InitVertexAssociation( _sourceHypo, shape2ShapeMap ); + if ( shape2ShapeMap.IsEmpty() ) + initAssoc4Quad2Closed( tgtFace, helper, srcShape, srcMesh, shape2ShapeMap ); if ( !TAssocTool::FindSubShapeAssociation( tgtFace, tgtMesh, srcShape, srcMesh, shape2ShapeMap) || !shape2ShapeMap.IsBound( tgtFace )) @@ -1257,7 +1305,7 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& { // projection in case if the faces are similar in 2D space projDone = projectBy2DSimilarity( tgtFace, srcFace, tgtWires, srcWires, - shape2ShapeMap, _src2tgtNodes, is1DComputed); + shape2ShapeMap, _src2tgtNodes, is1DComputed ); } if ( !projDone ) { @@ -1266,8 +1314,6 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& // shape2ShapeMap, _src2tgtNodes, is1DComputed); } - helper.SetSubShape( tgtFace ); - // it will remove mesh built on edges and vertices in failure case MeshCleaner cleaner( tgtSubMesh ); @@ -1437,6 +1483,9 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& if ( mapper.GetErrorCode() != SMESH_Pattern::ERR_OK ) return error("Can't make mesh by source mesh pattern"); + } // end of projection using Pattern mapping + + { // ------------------------------------------------------------------------- // mapper doesn't take care of nodes already existing on edges and vertices, // so we must merge nodes created by it with existing ones @@ -1476,7 +1525,7 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& continue; // do not treat sm of degen VERTEX } - // Sort new and old nodes of a submesh separately + // Sort new and old nodes of a sub-mesh separately bool isSeam = helper.IsRealSeam( sm->GetId() ); @@ -1600,6 +1649,7 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& // The mapper can't create quadratic elements, so convert if needed // ---------------------------------------------------------------- + SMDS_ElemIteratorPtr faceIt; faceIt = srcSubMesh->GetSubMeshDS()->GetElements(); bool srcIsQuad = faceIt->next()->IsQuadratic(); faceIt = tgtSubMesh->GetSubMeshDS()->GetElements(); @@ -1613,8 +1663,7 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& editor.ConvertToQuadratic(/*theForce3d=*/false, tgtFaces, false); } - - } // end of projection using Pattern mapping + } // end of coincident nodes and quadratic elements treatment if ( !projDone || is1DComputed )