mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-12-26 17:30:35 +05:00
SALOME Forum bug: http://www.salome-platform.org/forum/forum_10/967838025
Don't use BRep_Tool::Degenerated() which sometimes gives a wrong answer, use SMESH_Algo::isDegenerated() instead
This commit is contained in:
parent
b293f7af31
commit
3c53917e76
@ -310,10 +310,10 @@ SMESH_Algo::GetAppliedHypothesis(SMESH_Mesh & aMesh,
|
|||||||
double SMESH_Algo::EdgeLength(const TopoDS_Edge & E)
|
double SMESH_Algo::EdgeLength(const TopoDS_Edge & E)
|
||||||
{
|
{
|
||||||
double UMin = 0, UMax = 0;
|
double UMin = 0, UMax = 0;
|
||||||
if (BRep_Tool::Degenerated(E))
|
|
||||||
return 0;
|
|
||||||
TopLoc_Location L;
|
TopLoc_Location L;
|
||||||
Handle(Geom_Curve) C = BRep_Tool::Curve(E, L, UMin, UMax);
|
Handle(Geom_Curve) C = BRep_Tool::Curve(E, L, UMin, UMax);
|
||||||
|
if ( C.IsNull() )
|
||||||
|
return 0.;
|
||||||
GeomAdaptor_Curve AdaptCurve(C, UMin, UMax); //range is important for periodic curves
|
GeomAdaptor_Curve AdaptCurve(C, UMin, UMax); //range is important for periodic curves
|
||||||
double length = GCPnts_AbscissaPoint::Length(AdaptCurve, UMin, UMax);
|
double length = GCPnts_AbscissaPoint::Length(AdaptCurve, UMin, UMax);
|
||||||
return length;
|
return length;
|
||||||
@ -580,6 +580,20 @@ bool SMESH_Algo::isStraight( const TopoDS_Edge & E,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//================================================================================
|
||||||
|
/*!
|
||||||
|
* \brief Return true if an edge has no 3D curve
|
||||||
|
*/
|
||||||
|
//================================================================================
|
||||||
|
|
||||||
|
bool SMESH_Algo::isDegenerated( const TopoDS_Edge & E )
|
||||||
|
{
|
||||||
|
double f,l;
|
||||||
|
TopLoc_Location loc;
|
||||||
|
Handle(Geom_Curve) C = BRep_Tool::Curve( E, loc, f,l );
|
||||||
|
return C.IsNull();
|
||||||
|
}
|
||||||
|
|
||||||
//================================================================================
|
//================================================================================
|
||||||
/*!
|
/*!
|
||||||
* \brief Return the node built on a vertex
|
* \brief Return the node built on a vertex
|
||||||
|
@ -361,6 +361,10 @@ public:
|
|||||||
* \brief Return true if an edge can be considered straight
|
* \brief Return true if an edge can be considered straight
|
||||||
*/
|
*/
|
||||||
static bool isStraight( const TopoDS_Edge & E, const bool degenResult=false );
|
static bool isStraight( const TopoDS_Edge & E, const bool degenResult=false );
|
||||||
|
/*!
|
||||||
|
* \brief Return true if an edge has no 3D curve
|
||||||
|
*/
|
||||||
|
static bool isDegenerated( const TopoDS_Edge & E );
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Return the node built on a vertex
|
* \brief Return the node built on a vertex
|
||||||
|
@ -4976,7 +4976,7 @@ SMESH_MeshEditor::ExtrusionAlongTrack (TIDSortedElemSet & theElements,
|
|||||||
if( aS.ShapeType() == TopAbs_EDGE ) {
|
if( aS.ShapeType() == TopAbs_EDGE ) {
|
||||||
aTrackEdge = TopoDS::Edge( aS );
|
aTrackEdge = TopoDS::Edge( aS );
|
||||||
// the Edge must not be degenerated
|
// the Edge must not be degenerated
|
||||||
if ( BRep_Tool::Degenerated( aTrackEdge ) )
|
if ( SMESH_Algo::isDegenerated( aTrackEdge ) )
|
||||||
return EXTR_BAD_PATH_SHAPE;
|
return EXTR_BAD_PATH_SHAPE;
|
||||||
TopExp::Vertices( aTrackEdge, aV1, aV2 );
|
TopExp::Vertices( aTrackEdge, aV1, aV2 );
|
||||||
aItN = theTrack->GetFather()->GetSubMesh( aV1 )->GetSubMeshDS()->GetNodes();
|
aItN = theTrack->GetFather()->GetSubMesh( aV1 )->GetSubMeshDS()->GetNodes();
|
||||||
@ -5264,7 +5264,7 @@ SMESH_MeshEditor::ExtrusionAlongTrack (TIDSortedElemSet & theElements,
|
|||||||
else if( aS.ShapeType() == TopAbs_EDGE ) {
|
else if( aS.ShapeType() == TopAbs_EDGE ) {
|
||||||
aTrackEdge = TopoDS::Edge( aS );
|
aTrackEdge = TopoDS::Edge( aS );
|
||||||
// the Edge must not be degenerated
|
// the Edge must not be degenerated
|
||||||
if ( BRep_Tool::Degenerated( aTrackEdge ) )
|
if ( SMESH_Algo::isDegenerated( aTrackEdge ) )
|
||||||
return EXTR_BAD_PATH_SHAPE;
|
return EXTR_BAD_PATH_SHAPE;
|
||||||
TopExp::Vertices( aTrackEdge, aV1, aV2 );
|
TopExp::Vertices( aTrackEdge, aV1, aV2 );
|
||||||
const SMDS_MeshNode* aN1 = SMESH_Algo::VertexNode( aV1, pMeshDS );
|
const SMDS_MeshNode* aN1 = SMESH_Algo::VertexNode( aV1, pMeshDS );
|
||||||
@ -5290,7 +5290,7 @@ SMESH_MeshEditor::ExtrusionAlongTrack (TIDSortedElemSet & theElements,
|
|||||||
TopExp_Explorer eExp(aS, TopAbs_EDGE);
|
TopExp_Explorer eExp(aS, TopAbs_EDGE);
|
||||||
for(; eExp.More(); eExp.Next()) {
|
for(; eExp.More(); eExp.Next()) {
|
||||||
TopoDS_Edge E = TopoDS::Edge( eExp.Current() );
|
TopoDS_Edge E = TopoDS::Edge( eExp.Current() );
|
||||||
if( BRep_Tool::Degenerated(E) ) continue;
|
if( SMESH_Algo::isDegenerated(E) ) continue;
|
||||||
SMESH_subMesh* SM = theTrack->GetSubMesh(E);
|
SMESH_subMesh* SM = theTrack->GetSubMesh(E);
|
||||||
if(SM) {
|
if(SM) {
|
||||||
LSM.push_back(SM);
|
LSM.push_back(SM);
|
||||||
|
@ -281,7 +281,7 @@ void SMESH_MesherHelper::SetSubShape(const TopoDS_Shape& aSh)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// look for a degenerated edge
|
// look for a degenerated edge
|
||||||
if ( BRep_Tool::Degenerated( edge )) {
|
if ( SMESH_Algo::isDegenerated( edge )) {
|
||||||
myDegenShapeIds.insert( meshDS->ShapeToIndex( edge ));
|
myDegenShapeIds.insert( meshDS->ShapeToIndex( edge ));
|
||||||
for ( TopExp_Explorer v( edge, TopAbs_VERTEX ); v.More(); v.Next() )
|
for ( TopExp_Explorer v( edge, TopAbs_VERTEX ); v.More(); v.Next() )
|
||||||
myDegenShapeIds.insert( meshDS->ShapeToIndex( v.Current() ));
|
myDegenShapeIds.insert( meshDS->ShapeToIndex( v.Current() ));
|
||||||
@ -3825,7 +3825,7 @@ namespace { // Structures used by FixQuadraticElements()
|
|||||||
{
|
{
|
||||||
// check if the EDGE needs checking
|
// check if the EDGE needs checking
|
||||||
const TopoDS_Edge& edge = TopoDS::Edge( edgeIt.Current() );
|
const TopoDS_Edge& edge = TopoDS::Edge( edgeIt.Current() );
|
||||||
if ( BRep_Tool::Degenerated( edge ) )
|
if ( SMESH_Algo::isDegenerated( edge ) )
|
||||||
continue;
|
continue;
|
||||||
if ( theHelper.IsRealSeam( edge ) &&
|
if ( theHelper.IsRealSeam( edge ) &&
|
||||||
edge.Orientation() == TopAbs_REVERSED )
|
edge.Orientation() == TopAbs_REVERSED )
|
||||||
|
@ -1965,7 +1965,7 @@ bool SMESH_subMesh::checkComputeError(SMESH_Algo* theAlgo,
|
|||||||
if ( _computeState != COMPUTE_OK )
|
if ( _computeState != COMPUTE_OK )
|
||||||
{
|
{
|
||||||
if ( _subShape.ShapeType() == TopAbs_EDGE &&
|
if ( _subShape.ShapeType() == TopAbs_EDGE &&
|
||||||
BRep_Tool::Degenerated( TopoDS::Edge( _subShape )) )
|
SMESH_Algo::isDegenerated( TopoDS::Edge( _subShape )) )
|
||||||
_computeState = COMPUTE_OK;
|
_computeState = COMPUTE_OK;
|
||||||
else if ( theComputeOK )
|
else if ( theComputeOK )
|
||||||
_computeError = SMESH_ComputeError::New(COMPERR_NO_MESH_ON_SHAPE,"",theAlgo);
|
_computeError = SMESH_ComputeError::New(COMPERR_NO_MESH_ON_SHAPE,"",theAlgo);
|
||||||
|
@ -2088,7 +2088,7 @@ bool StdMeshers_Prism_3D::initPrism(Prism_3D::TPrismTopo& thePrism,
|
|||||||
if ( botSM ) {
|
if ( botSM ) {
|
||||||
if ( ! botSM->GetSubShape().IsSame( thePrism.myBottom )) {
|
if ( ! botSM->GetSubShape().IsSame( thePrism.myBottom )) {
|
||||||
std::swap( botSM, topSM );
|
std::swap( botSM, topSM );
|
||||||
if ( ! botSM->GetSubShape().IsSame( thePrism.myBottom ))
|
if ( !botSM || ! botSM->GetSubShape().IsSame( thePrism.myBottom ))
|
||||||
return toSM( error( COMPERR_BAD_INPUT_MESH,
|
return toSM( error( COMPERR_BAD_INPUT_MESH,
|
||||||
"Incompatible non-structured sub-meshes"));
|
"Incompatible non-structured sub-meshes"));
|
||||||
}
|
}
|
||||||
@ -2571,7 +2571,7 @@ bool StdMeshers_PrismAsBlock::GetLayersTransformation(vector<gp_Trsf> &
|
|||||||
list< TopoDS_Edge >::const_iterator edgeIt = prism.myBottomEdges.begin();
|
list< TopoDS_Edge >::const_iterator edgeIt = prism.myBottomEdges.begin();
|
||||||
for ( int iE = 0; iE < prism.myNbEdgesInWires.front(); ++iE, ++edgeIt )
|
for ( int iE = 0; iE < prism.myNbEdgesInWires.front(); ++iE, ++edgeIt )
|
||||||
{
|
{
|
||||||
if ( BRep_Tool::Degenerated( *edgeIt )) continue;
|
if ( SMESH_Algo::isDegenerated( *edgeIt )) continue;
|
||||||
const TParam2ColumnMap* u2colMap =
|
const TParam2ColumnMap* u2colMap =
|
||||||
GetParam2ColumnMap( MeshDS()->ShapeToIndex( *edgeIt ), isReverse );
|
GetParam2ColumnMap( MeshDS()->ShapeToIndex( *edgeIt ), isReverse );
|
||||||
if ( !u2colMap ) return false;
|
if ( !u2colMap ) return false;
|
||||||
|
@ -901,7 +901,7 @@ FaceQuadStruct::Ptr StdMeshers_Quadrangle_2D::CheckNbEdges(SMESH_Mesh &
|
|||||||
sideEdges.splice(sideEdges.begin(), edges, --edges.end());
|
sideEdges.splice(sideEdges.begin(), edges, --edges.end());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( sideEdges.size() == 1 && BRep_Tool::Degenerated( sideEdges.front() ))
|
if ( sideEdges.size() == 1 && SMESH_Algo::isDegenerated( sideEdges.front() ))
|
||||||
degenSides.push_back( nbSides );
|
degenSides.push_back( nbSides );
|
||||||
|
|
||||||
quad->side.push_back(new StdMeshers_FaceSide(F, sideEdges, &aMesh, nbSides < QUAD_TOP_SIDE,
|
quad->side.push_back(new StdMeshers_FaceSide(F, sideEdges, &aMesh, nbSides < QUAD_TOP_SIDE,
|
||||||
|
@ -786,7 +786,7 @@ namespace
|
|||||||
for ( ; eExp.More(); eExp.Next() )
|
for ( ; eExp.More(); eExp.Next() )
|
||||||
{
|
{
|
||||||
const TopoDS_Edge& E = TopoDS::Edge( eExp.Current() );
|
const TopoDS_Edge& E = TopoDS::Edge( eExp.Current() );
|
||||||
if ( BRep_Tool::Degenerated( E )) continue;
|
if ( SMESH_Algo::isDegenerated( E )) continue;
|
||||||
// check if 2D curve is concave
|
// check if 2D curve is concave
|
||||||
BRepAdaptor_Curve2d curve( E, F );
|
BRepAdaptor_Curve2d curve( E, F );
|
||||||
const int nbIntervals = curve.NbIntervals( GeomAbs_C2 );
|
const int nbIntervals = curve.NbIntervals( GeomAbs_C2 );
|
||||||
|
Loading…
Reference in New Issue
Block a user