-// 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
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
{
_src2tgtNodes.clear();
- MESSAGE("Projection_2D Compute");
if ( !_sourceHypo )
return false;
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 ))
{
// 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 )
{
// shape2ShapeMap, _src2tgtNodes, is1DComputed);
}
- helper.SetSubShape( tgtFace );
-
// it will remove mesh built on edges and vertices in failure case
MeshCleaner cleaner( tgtSubMesh );
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
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() );
// 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();
editor.ConvertToQuadratic(/*theForce3d=*/false, tgtFaces, false);
}
-
- } // end of projection using Pattern mapping
+ } // end of coincident nodes and quadratic elements treatment
if ( !projDone || is1DComputed )