Use SetSubShape() in IsQuadraticSubMesh(). Fix SIGSEGV in AddFace() on sphere and cone.

This commit is contained in:
eap 2006-05-02 09:57:12 +00:00
parent 44a4764fcf
commit ae30e9e9e0
2 changed files with 52 additions and 36 deletions

View File

@ -7,7 +7,7 @@
#include "SMESH_MesherHelper.hxx" #include "SMESH_MesherHelper.hxx"
#include "SMDS_FacePosition.hxx" #include "SMDS_FacePosition.hxx"
#include "SMDS_EdgePosition.hxx".cxx #include "SMDS_EdgePosition.hxx"
#include "SMESH_MeshEditor.hxx" #include "SMESH_MeshEditor.hxx"
#include <BRepAdaptor_Surface.hxx> #include <BRepAdaptor_Surface.hxx>
@ -77,41 +77,58 @@ bool SMESH_MesherHelper::IsQuadraticSubMesh(const TopoDS_Shape& aSh)
myNLinkNodeMap.clear(); myNLinkNodeMap.clear();
} }
else { else {
// treatment of periodic faces SetSubShape( aSh );
if ( aSh.ShapeType() == TopAbs_FACE ) { }
const TopoDS_Face& face = TopoDS::Face( aSh ); return myCreateQuadratic;
BRepAdaptor_Surface surface( face ); }
if ( surface.IsUPeriodic() || surface.IsVPeriodic() ) {
// look for a seam edge //================================================================================
for ( exp.Init( face, TopAbs_EDGE ); exp.More(); exp.Next()) { /*!
const TopoDS_Edge& edge = TopoDS::Edge( exp.Current() ); * \brief Set geomerty to make elements on
if ( BRep_Tool::IsClosed( edge, face )) { * \param aSh - geomertic shape
// initialize myPar1, myPar2 and myParIndex */
if ( mySeamShapeIds.empty() ) { //================================================================================
gp_Pnt2d uv1, uv2;
BRep_Tool::UVPoints( edge, face, uv1, uv2 ); void SMESH_MesherHelper::SetSubShape(const TopoDS_Shape& aSh)
if ( Abs( uv1.Coord(1) - uv2.Coord(1) ) < Abs( uv1.Coord(2) - uv2.Coord(2) )) {
{ myShape = aSh;
myParIndex = 1; // U periodic
myPar1 = surface.FirstUParameter(); // treatment of periodic faces
myPar2 = surface.LastUParameter(); if ( aSh.ShapeType() == TopAbs_FACE )
} {
else { const TopoDS_Face& face = TopoDS::Face( aSh );
myParIndex = 2; // V periodic BRepAdaptor_Surface surface( face );
myPar1 = surface.FirstVParameter(); if ( surface.IsUPeriodic() || surface.IsVPeriodic() )
myPar2 = surface.LastVParameter(); {
} SMESHDS_Mesh* meshDS = GetMesh()->GetMeshDS();
// look for a seam edge
for ( TopExp_Explorer exp( face, TopAbs_EDGE ); exp.More(); exp.Next()) {
const TopoDS_Edge& edge = TopoDS::Edge( exp.Current() );
if ( BRep_Tool::IsClosed( edge, face )) {
// initialize myPar1, myPar2 and myParIndex
if ( mySeamShapeIds.empty() ) {
gp_Pnt2d uv1, uv2;
BRep_Tool::UVPoints( edge, face, uv1, uv2 );
if ( Abs( uv1.Coord(1) - uv2.Coord(1) ) < Abs( uv1.Coord(2) - uv2.Coord(2) ))
{
myParIndex = 1; // U periodic
myPar1 = surface.FirstUParameter();
myPar2 = surface.LastUParameter();
}
else {
myParIndex = 2; // V periodic
myPar1 = surface.FirstVParameter();
myPar2 = surface.LastVParameter();
} }
// store shapes indices
mySeamShapeIds.insert( meshDS->ShapeToIndex( exp.Current() ));
for ( TopExp_Explorer v( exp.Current(), TopAbs_VERTEX ); v.More(); v.Next() )
mySeamShapeIds.insert( meshDS->ShapeToIndex( v.Current() ));
} }
// store shapes indices
mySeamShapeIds.insert( meshDS->ShapeToIndex( exp.Current() ));
for ( TopExp_Explorer v( exp.Current(), TopAbs_VERTEX ); v.More(); v.Next() )
mySeamShapeIds.insert( meshDS->ShapeToIndex( v.Current() ));
} }
} }
} }
} }
return myCreateQuadratic;
} }
@ -257,8 +274,8 @@ const SMDS_MeshNode* SMESH_MesherHelper::GetMediumNode(const SMDS_MeshNode* n1,
const SMDS_MeshNode* n2, const SMDS_MeshNode* n2,
bool force3d) bool force3d)
{ {
//cout<<"n1: "<<n1; TopAbs_ShapeEnum shapeType = myShape.IsNull() ? TopAbs_SHAPE : myShape.ShapeType();
//cout<<"n2: "<<n2;
NLink link(( n1 < n2 ? n1 : n2 ), ( n1 < n2 ? n2 : n1 )); NLink link(( n1 < n2 ? n1 : n2 ), ( n1 < n2 ? n2 : n1 ));
ItNLinkNode itLN = myNLinkNodeMap.find( link ); ItNLinkNode itLN = myNLinkNodeMap.find( link );
if ( itLN != myNLinkNodeMap.end() ) { if ( itLN != myNLinkNodeMap.end() ) {
@ -292,7 +309,7 @@ const SMDS_MeshNode* SMESH_MesherHelper::GetMediumNode(const SMDS_MeshNode* n1,
if(!force3d) { if(!force3d) {
// we try to create medium node using UV parameters of // we try to create medium node using UV parameters of
// nodes, else - medium between corresponding 3d points // nodes, else - medium between corresponding 3d points
if(faceID>-1 || myShape.ShapeType() == TopAbs_FACE) { if(faceID>-1 || shapeType == TopAbs_FACE) {
// obtaining a face and 2d points for nodes // obtaining a face and 2d points for nodes
TopoDS_Face F; TopoDS_Face F;
if( myShape.IsNull() ) if( myShape.IsNull() )
@ -335,7 +352,7 @@ const SMDS_MeshNode* SMESH_MesherHelper::GetMediumNode(const SMDS_MeshNode* n1,
myNLinkNodeMap.insert(NLinkNodeMap::value_type(link,n12)); myNLinkNodeMap.insert(NLinkNodeMap::value_type(link,n12));
return n12; return n12;
} }
if (edgeID>-1 || myShape.ShapeType() == TopAbs_EDGE) { if (edgeID>-1 || shapeType == TopAbs_EDGE) {
TopoDS_Edge E; TopoDS_Edge E;
if( myShape.IsNull() ) if( myShape.IsNull() )

View File

@ -182,8 +182,7 @@ class SMESH_MesherHelper
void SetKeyIsQuadratic(const bool theKey) void SetKeyIsQuadratic(const bool theKey)
{myCreateQuadratic = theKey;}; {myCreateQuadratic = theKey;};
void SetSubShape(const TopoDS_Shape& subShape) void SetSubShape(const TopoDS_Shape& subShape);
{myShape = subShape;};
protected: protected: