mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-01-12 09:40:35 +05:00
0020452: EDF 1056 SMESH : 2D Projection Issue
use shape partnership (TopoDS_Shape::IsPartner()) for an easy projection
This commit is contained in:
parent
c9d6ead3f5
commit
4aab533cbd
@ -354,8 +354,103 @@ namespace {
|
|||||||
|
|
||||||
} // bool getBoundaryNodes()
|
} // bool getBoundaryNodes()
|
||||||
|
|
||||||
|
//================================================================================
|
||||||
|
/*!
|
||||||
|
* \brief Preform projection in case if tgtFace.IsPartner( srcFace )
|
||||||
|
* \param tgtFace - target face
|
||||||
|
* \param srcFace - source face
|
||||||
|
* \param tgtMesh - target mesh
|
||||||
|
* \param srcMesh - source mesh
|
||||||
|
* \retval bool - true if succeeded
|
||||||
|
*/
|
||||||
|
//================================================================================
|
||||||
|
|
||||||
|
bool projectPartner(const TopoDS_Face& tgtFace,
|
||||||
|
const TopoDS_Face& srcFace,
|
||||||
|
SMESH_Mesh * tgtMesh,
|
||||||
|
SMESH_Mesh * srcMesh,
|
||||||
|
const TAssocTool::TShapeShapeMap& shape2ShapeMap)
|
||||||
|
{
|
||||||
|
if ( !tgtFace.IsPartner( srcFace ))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Fill map of src to tgt nodes with nodes on edges
|
||||||
|
|
||||||
|
map<const SMDS_MeshNode* , const SMDS_MeshNode*> src2tgtNodes;
|
||||||
|
map<const SMDS_MeshNode* , const SMDS_MeshNode*>::iterator srcN_tgtN;
|
||||||
|
|
||||||
|
for ( TopExp_Explorer srcEdge( srcFace, TopAbs_EDGE); srcEdge.More(); srcEdge.Next() )
|
||||||
|
{
|
||||||
|
const TopoDS_Shape& tgtEdge = shape2ShapeMap( srcEdge.Current() );
|
||||||
|
if ( !tgtEdge.IsPartner( srcEdge.Current() ))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
map< double, const SMDS_MeshNode* > srcNodes, tgtNodes;
|
||||||
|
if ( !SMESH_Algo::GetSortedNodesOnEdge( srcMesh->GetMeshDS(),
|
||||||
|
TopoDS::Edge( srcEdge.Current() ),
|
||||||
|
/*ignoreMediumNodes = */true,
|
||||||
|
srcNodes )
|
||||||
|
||
|
||||||
|
!SMESH_Algo::GetSortedNodesOnEdge( tgtMesh->GetMeshDS(),
|
||||||
|
TopoDS::Edge( tgtEdge ),
|
||||||
|
/*ignoreMediumNodes = */true,
|
||||||
|
tgtNodes )
|
||||||
|
||
|
||||||
|
srcNodes.size() != tgtNodes.size())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
map< double, const SMDS_MeshNode* >::iterator u_tn = tgtNodes.begin();
|
||||||
|
map< double, const SMDS_MeshNode* >::iterator u_sn = srcNodes.begin();
|
||||||
|
for ( ; u_tn != tgtNodes.end(); ++u_tn, ++u_sn)
|
||||||
|
src2tgtNodes.insert( make_pair( u_sn->second, u_tn->second ));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make new faces
|
||||||
|
|
||||||
|
// transformation to get location of target nodes from source ones
|
||||||
|
gp_Trsf srcTrsf = srcFace.Location();
|
||||||
|
gp_Trsf tgtTrsf = tgtFace.Location();
|
||||||
|
gp_Trsf trsf = srcTrsf.Inverted() * tgtTrsf;
|
||||||
|
|
||||||
|
// prepare the helper adding quadratic elements if necessary
|
||||||
|
SMESH_MesherHelper helper( *tgtMesh );
|
||||||
|
helper.IsQuadraticSubMesh( tgtFace );
|
||||||
|
helper.SetElementsOnShape( true );
|
||||||
|
|
||||||
|
const SMDS_MeshNode* nullNode = 0;
|
||||||
|
|
||||||
|
SMESHDS_SubMesh* srcSubDS = srcMesh->GetMeshDS()->MeshElements( srcFace );
|
||||||
|
SMDS_ElemIteratorPtr elemIt = srcSubDS->GetElements();
|
||||||
|
while ( elemIt->more() ) // loop on all mesh faces on srcFace
|
||||||
|
{
|
||||||
|
const SMDS_MeshElement* elem = elemIt->next();
|
||||||
|
vector< const SMDS_MeshNode* > tgtFaceNodes;
|
||||||
|
tgtFaceNodes.reserve( elem->NbNodes() );
|
||||||
|
SMDS_ElemIteratorPtr nodeIt = elem->nodesIterator();
|
||||||
|
while ( nodeIt->more() ) // loop on nodes of the source element
|
||||||
|
{
|
||||||
|
const SMDS_MeshNode* srcNode = (const SMDS_MeshNode*) nodeIt->next();
|
||||||
|
srcN_tgtN = src2tgtNodes.insert( make_pair( srcNode, nullNode )).first;
|
||||||
|
if ( srcN_tgtN->second == nullNode )
|
||||||
|
{
|
||||||
|
// create a new node
|
||||||
|
gp_Pnt tgtP = gp_Pnt(srcNode->X(),srcNode->Y(),srcNode->Z()).Transformed( trsf );
|
||||||
|
srcN_tgtN->second = helper.AddNode( tgtP.X(), tgtP.Y(), tgtP.Z() );
|
||||||
|
}
|
||||||
|
tgtFaceNodes.push_back( srcN_tgtN->second );
|
||||||
|
}
|
||||||
|
// create a new face (with reversed orientation)
|
||||||
|
if ( tgtFaceNodes.size() == 3 )
|
||||||
|
helper.AddFace( tgtFaceNodes[0],tgtFaceNodes[2],tgtFaceNodes[1]);
|
||||||
|
else
|
||||||
|
helper.AddFace( tgtFaceNodes[0],tgtFaceNodes[3],tgtFaceNodes[2],tgtFaceNodes[1]);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : Compute
|
//function : Compute
|
||||||
//purpose :
|
//purpose :
|
||||||
@ -405,6 +500,10 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape&
|
|||||||
return error(COMPERR_BAD_INPUT_MESH,"Source mesh not computed");
|
return error(COMPERR_BAD_INPUT_MESH,"Source mesh not computed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// try to project from same face with different location
|
||||||
|
if ( projectPartner( tgtFace, srcFace, tgtMesh, srcMesh, shape2ShapeMap ))
|
||||||
|
return true;
|
||||||
|
|
||||||
// --------------------
|
// --------------------
|
||||||
// Prepare to mapping
|
// Prepare to mapping
|
||||||
// --------------------
|
// --------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user