-// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2012 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
// find corresponding point on target shape
pOK = false;
gp_Pnt tgtP;
- const TopoDS_Shape& tgtShape = shape2ShapeMap( srcSM->GetSubShape() );
+ const TopoDS_Shape& tgtShape = shape2ShapeMap( srcSM->GetSubShape(), /*isSrc=*/true );
if ( tgtShape.ShapeType() == TopAbs_VERTEX )
{
tgtP = BRep_Tool::Pnt( TopoDS::Vertex( tgtShape ));
for ( TopExp_Explorer srcEdge( srcFace, TopAbs_EDGE); srcEdge.More(); srcEdge.Next() )
{
- const TopoDS_Shape& tgtEdge = shape2ShapeMap( srcEdge.Current() );
+ const TopoDS_Shape& tgtEdge = shape2ShapeMap( srcEdge.Current(), /*isSrc=*/true );
map< double, const SMDS_MeshNode* > srcNodes, tgtNodes;
if ( !SMESH_Algo::GetSortedNodesOnEdge( srcMesh->GetMeshDS(),
{
list< TopoDS_Edge > tgtEdges;
StdMeshers_FaceSidePtr srcWire = srcWires[iW];
+ TopTools_IndexedMapOfShape edgeMap; // to detect seam edges
for ( int iE = 0; iE < srcWire->NbEdges(); ++iE )
- tgtEdges.push_back( TopoDS::Edge( shape2ShapeMap( srcWire->Edge( iE ))));
-
+ {
+ tgtEdges.push_back( TopoDS::Edge( shape2ShapeMap( srcWire->Edge( iE ), /*isSrc=*/true)));
+ // reverse a seam edge encountered for the second time
+ const int oldExtent = edgeMap.Extent();
+ edgeMap.Add( tgtEdges.back() );
+ if ( oldExtent == edgeMap.Extent() )
+ tgtEdges.back().Reverse();
+ }
tgtWires[ iW ].reset( new StdMeshers_FaceSide( tgtFace, tgtEdges, tgtMesh,
/*theIsForward = */ true,
/*theIgnoreMediumNodes = */false));
}
case SMDS_TOP_EDGE: {
TopoDS_Shape srcEdge = srcHelper.GetSubShapeByNode( srcNode, srcHelper.GetMeshDS() );
- TopoDS_Shape tgtEdge = shape2ShapeMap( srcEdge );
+ TopoDS_Shape tgtEdge = shape2ShapeMap( srcEdge, /*isSrc=*/true );
double U = srcHelper.GetNodeU( TopoDS::Edge( srcEdge ), srcNode );
tgtMeshDS->SetNodeOnEdge( n, TopoDS::Edge( tgtEdge ), U);
break;
}
case SMDS_TOP_VERTEX: {
TopoDS_Shape srcV = srcHelper.GetSubShapeByNode( srcNode, srcHelper.GetMeshDS() );
- TopoDS_Shape tgtV = shape2ShapeMap( srcV );
+ TopoDS_Shape tgtV = shape2ShapeMap( srcV, /*isSrc=*/true );
tgtMeshDS->SetNodeOnVertex( n, TopoDS::Vertex( tgtV ));
break;
}
TopoDS_Shape srcShape = _sourceHypo->GetSourceFace().Oriented(TopAbs_FORWARD);
TAssocTool::TShapeShapeMap shape2ShapeMap;
- TAssocTool::InitVertexAssociation( _sourceHypo, shape2ShapeMap, tgtFace );
+ TAssocTool::InitVertexAssociation( _sourceHypo, shape2ShapeMap );
if ( !TAssocTool::FindSubShapeAssociation( tgtFace, tgtMesh, srcShape, srcMesh,
shape2ShapeMap) ||
!shape2ShapeMap.IsBound( tgtFace ))
return error(COMPERR_BAD_INPUT_MESH,"Source mesh not computed");
}
- // --------------------------
- // Simple cases of projection
- // --------------------------
+ // ===========
+ // Projection
+ // ===========
// find out if EDGEs are meshed or not
bool is1DComputed = false;
is1DComputed = sm->IsMeshComputed();
}
- // try to project from same face with different location
- if ( projectPartner( tgtFace, srcFace, tgtMesh, srcMesh, shape2ShapeMap ))
- return true;
+ bool done = false;
- if ( projectBy2DSimilarity( tgtFace, srcFace, tgtMesh, srcMesh, shape2ShapeMap, is1DComputed ))
- return true;
-
- // --------------------
- // Prepare to mapping
- // --------------------
-
- SMESH_MesherHelper helper( theMesh );
- helper.SetSubShape( tgtFace );
-
- // Check if node projection to a face is needed
- Bnd_B2d uvBox;
- SMDS_ElemIteratorPtr faceIt = srcSubMesh->GetSubMeshDS()->GetElements();
- int nbFaceNodes = 0;
- for ( ; nbFaceNodes < 3 && faceIt->more(); ) {
- const SMDS_MeshElement* face = faceIt->next();
- SMDS_ElemIteratorPtr nodeIt = face->nodesIterator();
- while ( nodeIt->more() ) {
- const SMDS_MeshNode* node = static_cast<const SMDS_MeshNode*>( nodeIt->next() );
- if ( node->GetPosition()->GetTypeOfPosition() == SMDS_TOP_FACE ) {
- nbFaceNodes++;
- uvBox.Add( helper.GetNodeUV( srcFace, node ));
- }
- }
- }
- const bool toProjectNodes =
- ( nbFaceNodes > 0 && ( uvBox.IsVoid() || uvBox.SquareExtent() < DBL_MIN ));
-
- // Load pattern from the source face
- SMESH_Pattern mapper;
- mapper.Load( srcMesh, srcFace, toProjectNodes );
- if ( mapper.GetErrorCode() != SMESH_Pattern::ERR_OK )
- 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 <mapper>
- // and <theReverse> flag needed to call mapper.Apply()
-
- TopoDS_Vertex srcV1 = TopoDS::Vertex( mapper.GetSubShape( 1 ));
- if ( srcV1.IsNull() )
- RETURN_BAD_RESULT("Mesh is not bound to the face");
- if ( !shape2ShapeMap.IsBound( srcV1 ))
- RETURN_BAD_RESULT("Not associated vertices, srcV1 " << srcV1.TShape().operator->() );
- TopoDS_Vertex tgtV1 = TopoDS::Vertex( shape2ShapeMap( srcV1 ));
-
- if ( !SMESH_MesherHelper::IsSubShape( srcV1, srcFace ))
- RETURN_BAD_RESULT("Wrong srcV1 " << srcV1.TShape().operator->());
- if ( !SMESH_MesherHelper::IsSubShape( tgtV1, tgtFace ))
- RETURN_BAD_RESULT("Wrong tgtV1 " << tgtV1.TShape().operator->());
-
- // try to find out orientation by order of edges
- bool reverse = false;
- list< TopoDS_Edge > tgtEdges, srcEdges;
- list< int > nbEdgesInWires;
- SMESH_Block::GetOrderedEdges( tgtFace, tgtV1, tgtEdges, nbEdgesInWires);
- SMESH_Block::GetOrderedEdges( srcFace, srcV1, srcEdges, nbEdgesInWires);
- if ( nbEdgesInWires.front() > 1 ) // possible to find out
+ if ( !done )
{
- TopoDS_Edge srcE1 = srcEdges.front(), tgtE1 = tgtEdges.front();
- TopoDS_Shape srcE1bis = shape2ShapeMap( tgtE1 );
- reverse = ( ! srcE1.IsSame( srcE1bis ));
+ // try to project from the same face with different location
+ done = projectPartner( tgtFace, srcFace, tgtMesh, srcMesh, shape2ShapeMap );
}
- else if ( nbEdgesInWires.front() == 1 )
+ if ( !done )
{
- // TODO::Compare orientation of curves in a sole edge
- //RETURN_BAD_RESULT("Not implemented case");
+ // projection in case if the faces are similar in 2D space
+ done = projectBy2DSimilarity( tgtFace, srcFace, tgtMesh, srcMesh, shape2ShapeMap, is1DComputed);
}
- else
+
+ if ( !done )
{
- RETURN_BAD_RESULT("Bad result from SMESH_Block::GetOrderedEdges()");
- }
+ // --------------------
+ // Prepare to mapping
+ // --------------------
- // --------------------
- // Perform 2D mapping
- // --------------------
+ SMESH_MesherHelper helper( theMesh );
+ helper.SetSubShape( tgtFace );
- // Compute mesh on a target face
+ // Check if node projection to a face is needed
+ Bnd_B2d uvBox;
+ SMDS_ElemIteratorPtr faceIt = srcSubMesh->GetSubMeshDS()->GetElements();
+ int nbFaceNodes = 0;
+ for ( ; nbFaceNodes < 3 && faceIt->more(); ) {
+ const SMDS_MeshElement* face = faceIt->next();
+ SMDS_ElemIteratorPtr nodeIt = face->nodesIterator();
+ while ( nodeIt->more() ) {
+ const SMDS_MeshNode* node = static_cast<const SMDS_MeshNode*>( nodeIt->next() );
+ if ( node->GetPosition()->GetTypeOfPosition() == SMDS_TOP_FACE ) {
+ nbFaceNodes++;
+ uvBox.Add( helper.GetNodeUV( srcFace, node ));
+ }
+ }
+ }
+ const bool toProjectNodes =
+ ( nbFaceNodes > 0 && ( uvBox.IsVoid() || uvBox.SquareExtent() < DBL_MIN ));
+
+ // Load pattern from the source face
+ SMESH_Pattern mapper;
+ mapper.Load( srcMesh, srcFace, toProjectNodes );
+ if ( mapper.GetErrorCode() != SMESH_Pattern::ERR_OK )
+ 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 <mapper>
+ // and <theReverse> flag needed to call mapper.Apply()
+
+ TopoDS_Vertex srcV1 = TopoDS::Vertex( mapper.GetSubShape( 1 ));
+ if ( srcV1.IsNull() )
+ RETURN_BAD_RESULT("Mesh is not bound to the face");
+ if ( !shape2ShapeMap.IsBound( srcV1, /*isSrc=*/true ))
+ RETURN_BAD_RESULT("Not associated vertices, srcV1 " << srcV1.TShape().operator->() );
+ TopoDS_Vertex tgtV1 = TopoDS::Vertex( shape2ShapeMap( srcV1, /*isSrc=*/true ));
+
+ if ( !SMESH_MesherHelper::IsSubShape( srcV1, srcFace ))
+ RETURN_BAD_RESULT("Wrong srcV1 " << srcV1.TShape().operator->());
+ if ( !SMESH_MesherHelper::IsSubShape( tgtV1, tgtFace ))
+ RETURN_BAD_RESULT("Wrong tgtV1 " << tgtV1.TShape().operator->());
+
+ // try to find out orientation by order of edges
+ bool reverse = false;
+ list< TopoDS_Edge > tgtEdges, srcEdges;
+ list< int > nbEdgesInWires;
+ SMESH_Block::GetOrderedEdges( tgtFace, tgtV1, tgtEdges, nbEdgesInWires);
+ SMESH_Block::GetOrderedEdges( srcFace, srcV1, srcEdges, nbEdgesInWires);
+ if ( nbEdgesInWires.front() > 1 ) // possible to find out
+ {
+ TopoDS_Edge srcE1 = srcEdges.front(), tgtE1 = tgtEdges.front();
+ TopoDS_Shape srcE1bis = shape2ShapeMap( tgtE1 );
+ reverse = ( ! srcE1.IsSame( srcE1bis ));
+ }
+ else if ( nbEdgesInWires.front() == 1 )
+ {
+ // TODO::Compare orientation of curves in a sole edge
+ //RETURN_BAD_RESULT("Not implemented case");
+ }
+ else
+ {
+ RETURN_BAD_RESULT("Bad result from SMESH_Block::GetOrderedEdges()");
+ }
- mapper.Apply( tgtFace, tgtV1, reverse );
- if ( mapper.GetErrorCode() != SMESH_Pattern::ERR_OK )
- return error("Can't apply source mesh pattern to the face");
+ // --------------------
+ // Perform 2D mapping
+ // --------------------
- // Create the mesh
+ // Compute mesh on a target face
- const bool toCreatePolygons = false, toCreatePolyedrs = false;
- mapper.MakeMesh( tgtMesh, toCreatePolygons, toCreatePolyedrs );
- if ( mapper.GetErrorCode() != SMESH_Pattern::ERR_OK )
- return error("Can't make mesh by source mesh pattern");
+ mapper.Apply( tgtFace, tgtV1, reverse );
+ if ( mapper.GetErrorCode() != SMESH_Pattern::ERR_OK )
+ return error("Can't apply source mesh pattern to the face");
- // it will remove mesh built by pattern mapper on edges and vertices
- // in failure case
- MeshCleaner cleaner( tgtSubMesh );
+ // Create the mesh
- SMESH_MeshEditor editor( tgtMesh );
+ const bool toCreatePolygons = false, toCreatePolyedrs = false;
+ mapper.MakeMesh( tgtMesh, toCreatePolygons, toCreatePolyedrs );
+ if ( mapper.GetErrorCode() != SMESH_Pattern::ERR_OK )
+ return error("Can't make mesh by source mesh pattern");
- // -------------------------------------------------------------------------
- // mapper doesn't take care of nodes already existing on edges and vertices,
- // so we must merge nodes created by it with existing ones
- // -------------------------------------------------------------------------
+ // it will remove mesh built by pattern mapper on edges and vertices
+ // in failure case
+ MeshCleaner cleaner( tgtSubMesh );
- SMESH_MeshEditor::TListOfListOfNodes groupsOfNodes;
+ // -------------------------------------------------------------------------
+ // mapper doesn't take care of nodes already existing on edges and vertices,
+ // so we must merge nodes created by it with existing ones
+ // -------------------------------------------------------------------------
- // Make groups of nodes to merge
+ SMESH_MeshEditor::TListOfListOfNodes groupsOfNodes;
- // loop on edge and vertex submeshes of a target face
- smIt = tgtSubMesh->getDependsOnIterator(/*includeSelf=*/false,/*complexShapeFirst=*/false);
- while ( smIt->more() )
- {
- SMESH_subMesh* sm = smIt->next();
- SMESHDS_SubMesh* smDS = sm->GetSubMeshDS();
- if ( !sm->IsMeshComputed() )
- break;
- //if ( !is1DComputed && sm->GetSubShape().ShapeType() == TopAbs_EDGE )
- //break;
+ // Make groups of nodes to merge
+
+ // loop on edge and vertex submeshes of a target face
+ smIt = tgtSubMesh->getDependsOnIterator(/*includeSelf=*/false,/*complexShapeFirst=*/false);
+ while ( smIt->more() )
+ {
+ SMESH_subMesh* sm = smIt->next();
+ SMESHDS_SubMesh* smDS = sm->GetSubMeshDS();
+ if ( !smDS || smDS->NbNodes() == 0 )
+ continue;
+ //if ( !is1DComputed && sm->GetSubShape().ShapeType() == TopAbs_EDGE )
+ //break;
- // Sort new and old nodes of a submesh separately
+ // Sort new and old nodes of a submesh separately
- bool isSeam = helper.IsRealSeam( sm->GetId() );
+ bool isSeam = helper.IsRealSeam( sm->GetId() );
- 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;
+ 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;
- // mapper puts on a seam edge nodes from 2 edges
- if ( isSeam && ! getBoundaryNodes ( sm, tgtFace, u2nodesOnSeam, seamNodes ))
- RETURN_BAD_RESULT("getBoundaryNodes() failed");
+ // mapper puts on a seam edge nodes from 2 edges
+ if ( isSeam && ! getBoundaryNodes ( sm, tgtFace, u2nodesOnSeam, seamNodes ))
+ RETURN_BAD_RESULT("getBoundaryNodes() failed");
- SMDS_NodeIteratorPtr nIt = smDS->GetNodes();
- while ( nIt->more() )
- {
- const SMDS_MeshNode* node = nIt->next();
- bool isOld = isOldNode( node );
+ SMDS_NodeIteratorPtr nIt = smDS->GetNodes();
+ while ( nIt->more() )
+ {
+ const SMDS_MeshNode* node = nIt->next();
+ bool isOld = isOldNode( node );
- if ( !isOld && isSeam ) { // new node on a seam edge
- if ( seamNodes.find( node ) != seamNodes.end())
- continue; // node is already in the map
+ if ( !isOld && isSeam ) { // new node on a seam edge
+ if ( seamNodes.count( node ) )
+ continue; // node is already in the map
+ }
+
+ // sort nodes on edges by their position
+ map< double, const SMDS_MeshNode* > & pos2nodes = u2nodesMaps[isOld ? OLD_NODES : NEW_NODES];
+ switch ( node->GetPosition()->GetTypeOfPosition() )
+ {
+ case SMDS_TOP_VERTEX: {
+ if ( !is1DComputed && !pos2nodes.empty() )
+ u2nodesMaps[isOld ? NEW_NODES : OLD_NODES].insert( make_pair( 0, node ));
+ else
+ pos2nodes.insert( make_pair( 0, node ));
+ break;
+ }
+ case SMDS_TOP_EDGE: {
+ const SMDS_EdgePosition* pos =
+ static_cast<const SMDS_EdgePosition*>(node->GetPosition());
+ pos2nodes.insert( make_pair( pos->GetUParameter(), node ));
+ break;
+ }
+ default:
+ RETURN_BAD_RESULT("Wrong node position type: "<<
+ node->GetPosition()->GetTypeOfPosition());
+ }
}
+ const bool mergeNewToOld =
+ ( u2nodesMaps[ NEW_NODES ].size() == u2nodesMaps[ OLD_NODES ].size() );
+ const bool mergeSeamToNew =
+ ( u2nodesMaps[ NEW_NODES ].size() == u2nodesOnSeam.size() );
- // sort nodes on edges by their position
- map< double, const SMDS_MeshNode* > & pos2nodes = u2nodesMaps[isOld ? OLD_NODES : NEW_NODES];
- switch ( node->GetPosition()->GetTypeOfPosition() )
+ if ( !mergeNewToOld )
{
- case SMDS_TOP_VERTEX: {
- if ( !is1DComputed && !pos2nodes.empty() )
- u2nodesMaps[isOld ? NEW_NODES : OLD_NODES].insert( make_pair( 0, node ));
- else
- pos2nodes.insert( make_pair( 0, node ));
- break;
- }
- case SMDS_TOP_EDGE: {
- const SMDS_EdgePosition* pos =
- static_cast<const SMDS_EdgePosition*>(node->GetPosition());
- pos2nodes.insert( make_pair( pos->GetUParameter(), node ));
- break;
+ // if ( u2nodesMaps[ NEW_NODES ].size() == 0 &&
+ // sm->GetSubShape().ShapeType() == TopAbs_EDGE &&
+ // helper.IsDegenShape( sm->GetId() ) )
+ // // NPAL15894 (tt88bis.py) - project mesh built by NETGEN_1d_2D that
+ // // does not make segments/nodes on degenerated edges
+ // continue;
+
+ // if ( u2nodesMaps[ OLD_NODES ].size() == 0 &&
+ // sm->GetSubShape().ShapeType() == TopAbs_VERTEX )
+ // // old nodes are optional on vertices in the case of 1D-2D projection
+ // continue;
+
+ //RETURN_BAD_RESULT
+ MESSAGE("Different nb of old and new nodes on shape #"<< sm->GetId() <<" "<<
+ u2nodesMaps[ OLD_NODES ].size() << " != " <<
+ u2nodesMaps[ NEW_NODES ].size());
}
- default:
- RETURN_BAD_RESULT("Wrong node position type: "<<
- node->GetPosition()->GetTypeOfPosition());
+ if ( isSeam && !mergeSeamToNew ) {
+ //RETURN_BAD_RESULT
+ MESSAGE("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();
+ newEnd = u2nodesMaps[ NEW_NODES ].end();
+ u_newOnSeam = u2nodesOnSeam.begin();
+ if ( mergeNewToOld )
+ for ( ; u_newNode != newEnd; ++u_newNode, ++u_oldNode )
+ {
+ groupsOfNodes.push_back( list< const SMDS_MeshNode* >() );
+ groupsOfNodes.back().push_back( u_oldNode->second );
+ groupsOfNodes.back().push_back( u_newNode->second );
+ if ( mergeSeamToNew )
+ groupsOfNodes.back().push_back( (u_newOnSeam++)->second );
+ }
+ else if ( mergeSeamToNew )
+ for ( ; u_newNode != newEnd; ++u_newNode, ++u_newOnSeam )
+ {
+ groupsOfNodes.push_back( list< const SMDS_MeshNode* >() );
+ groupsOfNodes.back().push_back( u_newNode->second );
+ groupsOfNodes.back().push_back( u_newOnSeam->second );
+ }
}
- if ( u2nodesMaps[ NEW_NODES ].size() != u2nodesMaps[ OLD_NODES ].size() )
- {
- if ( u2nodesMaps[ NEW_NODES ].size() == 0 &&
- sm->GetSubShape().ShapeType() == TopAbs_EDGE &&
- helper.IsDegenShape( sm->GetId() ) )
- // NPAL15894 (tt88bis.py) - project mesh built by NETGEN_1d_2D that
- // does not make segments/nodes on degenerated edges
- continue;
- if ( u2nodesMaps[ OLD_NODES ].size() == 0 &&
- sm->GetSubShape().ShapeType() == TopAbs_VERTEX )
- // old nodes are optional on vertices in the case of 1D-2D projection
- continue;
+ // Merge
- 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() ) {
- 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();
- newEnd = u2nodesMaps[ NEW_NODES ].end();
- u_newOnSeam = u2nodesOnSeam.begin();
- for ( ; u_newNode != newEnd; ++u_newNode, ++u_oldNode ) {
- groupsOfNodes.push_back( list< const SMDS_MeshNode* >() );
- groupsOfNodes.back().push_back( u_oldNode->second );
- groupsOfNodes.back().push_back( u_newNode->second );
- if ( isSeam )
- groupsOfNodes.back().push_back( (u_newOnSeam++)->second );
- }
- }
+ SMESH_MeshEditor editor( tgtMesh );
+ int nbFaceBeforeMerge = tgtSubMesh->GetSubMeshDS()->NbElements();
+ editor.MergeNodes( groupsOfNodes );
+ int nbFaceAtferMerge = tgtSubMesh->GetSubMeshDS()->NbElements();
+ if ( nbFaceBeforeMerge != nbFaceAtferMerge )
+ return error(COMPERR_BAD_INPUT_MESH, "Probably invalid node parameters on geom faces");
- // Merge
+ // ----------------------------------------------------------------
+ // The mapper can't create quadratic elements, so convert if needed
+ // ----------------------------------------------------------------
+
+ faceIt = srcSubMesh->GetSubMeshDS()->GetElements();
+ bool srcIsQuad = faceIt->next()->IsQuadratic();
+ faceIt = tgtSubMesh->GetSubMeshDS()->GetElements();
+ bool tgtIsQuad = faceIt->next()->IsQuadratic();
+ if ( srcIsQuad && !tgtIsQuad )
+ {
+ TIDSortedElemSet tgtFaces;
+ faceIt = tgtSubMesh->GetSubMeshDS()->GetElements();
+ while ( faceIt->more() )
+ tgtFaces.insert( tgtFaces.end(), faceIt->next() );
- int nbFaceBeforeMerge = tgtSubMesh->GetSubMeshDS()->NbElements();
- editor.MergeNodes( groupsOfNodes );
- int nbFaceAtferMerge = tgtSubMesh->GetSubMeshDS()->NbElements();
- if ( nbFaceBeforeMerge != nbFaceAtferMerge )
- return error(COMPERR_BAD_INPUT_MESH, "Probably invalid node parameters on geom faces");
+ editor.ConvertToQuadratic(/*theForce3d=*/false, tgtFaces);
+ }
- // ----------------------------------------------------------------
- // The mapper can't create quadratic elements, so convert if needed
- // ----------------------------------------------------------------
+ cleaner.Release(); // not to remove mesh
- faceIt = srcSubMesh->GetSubMeshDS()->GetElements();
- bool srcIsQuad = faceIt->next()->IsQuadratic();
- faceIt = tgtSubMesh->GetSubMeshDS()->GetElements();
- bool tgtIsQuad = faceIt->next()->IsQuadratic();
- if ( srcIsQuad && !tgtIsQuad )
- {
- TIDSortedElemSet tgtFaces;
- faceIt = tgtSubMesh->GetSubMeshDS()->GetElements();
- while ( faceIt->more() )
- tgtFaces.insert( tgtFaces.end(), faceIt->next() );
+ } // end of projection using Pattern mapping
- editor.ConvertToQuadratic(/*theForce3d=*/false, tgtFaces);
- }
// ---------------------------
// Check elements orientation
// ---------------------------
- TopoDS_Face face = tgtFace;
+ TopoDS_Face face = TopoDS::Face( theShape );
if ( !theMesh.IsMainShape( tgtFace ))
{
// find the main shape
// Fix orientation
if ( SMESH_Algo::IsReversedSubMesh( face, meshDS ))
{
+ SMESH_MeshEditor editor( tgtMesh );
SMDS_ElemIteratorPtr eIt = meshDS->MeshElements( face )->GetElements();
while ( eIt->more() ) {
const SMDS_MeshElement* e = eIt->next();
}
}
- cleaner.Release(); // do not remove mesh
-
return true;
}
TopoDS_Shape srcShape = _sourceHypo->GetSourceFace().Oriented(TopAbs_FORWARD);
TAssocTool::TShapeShapeMap shape2ShapeMap;
- TAssocTool::InitVertexAssociation( _sourceHypo, shape2ShapeMap, tgtFace );
+ TAssocTool::InitVertexAssociation( _sourceHypo, shape2ShapeMap );
if ( !TAssocTool::FindSubShapeAssociation( tgtFace, tgtMesh, srcShape, srcMesh,
shape2ShapeMap) ||
!shape2ShapeMap.IsBound( tgtFace ))