mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-02-28 14:25:37 +05:00
23036: [CEA 1459] Regression projection 1D2D
+ Fix Pb: SIGSEGV in StdMeshers_Prism_3D::IsApplicable() on the shape of 23036 + Fix Pb: "Projection 3D" algo is available in Create mesh dlg on the shape of 23036 + Add debug trace in case of exceptions in IsApplicable() + Fix 52667: SIGSEGV at attempt to create mesh without Geometry when setting hypothesis
This commit is contained in:
parent
627b77ffd2
commit
80e28740d3
@ -5140,8 +5140,7 @@ CORBA::Boolean SMESH_Gen_i::IsApplicable ( const char* theAlgoType,
|
||||
if (aCreator)
|
||||
{
|
||||
TopoDS_Shape shape = GeomObjectToShape( theGeomObject );
|
||||
if ( !shape.IsNull() )
|
||||
return aCreator->IsApplicable( shape, toCheckAll );
|
||||
return shape.IsNull() || aCreator->IsApplicable( shape, toCheckAll );
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -5149,6 +5148,10 @@ CORBA::Boolean SMESH_Gen_i::IsApplicable ( const char* theAlgoType,
|
||||
}
|
||||
|
||||
SMESH_CATCH( SMESH::doNothing );
|
||||
|
||||
#ifdef _DEBUG_
|
||||
cout << "SMESH_Gen_i::IsApplicable(): exception in " << ( theAlgoType ? theAlgoType : "") << endl;
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -55,7 +55,8 @@ public:
|
||||
MapShapeNbElems& aResMap);
|
||||
|
||||
static bool IsApplicable(const TopoDS_Shape & aShape, bool toCheckAll);
|
||||
protected:
|
||||
|
||||
protected:
|
||||
|
||||
const StdMeshers_ViscousLayers* _viscousLayersHyp;
|
||||
};
|
||||
|
@ -2549,7 +2549,7 @@ namespace // utils used by StdMeshers_Prism_3D::IsApplicable()
|
||||
for ( iE = 0; iE < *nbE; ++e, ++iE )
|
||||
if ( SMESH_Algo::isDegenerated( *e ))
|
||||
{
|
||||
ee.erase( e );
|
||||
e = --ee.erase( e );
|
||||
--(*nbE);
|
||||
--iE;
|
||||
}
|
||||
|
@ -756,6 +756,10 @@ bool StdMeshers_ProjectionUtils::FindSubShapeAssociation(const TopoDS_Shape& the
|
||||
TopoDS_Face nextFace1 = GetNextFace( edgeToFace1, *eIt1, face1 );
|
||||
TopoDS_Face nextFace2 = GetNextFace( edgeToFace2, *eIt2, face2 );
|
||||
if ( !nextFace1.IsNull() && !nextFace2.IsNull() ) {
|
||||
if ( SMESH_MesherHelper::GetSubShapeOri( nextFace1, *eIt1 ) == eIt1->Orientation() )
|
||||
nextFace1.Reverse();
|
||||
if ( SMESH_MesherHelper::GetSubShapeOri( nextFace2, *eIt2 ) == eIt2->Orientation() )
|
||||
nextFace2.Reverse();
|
||||
FE1.push_back( make_pair( nextFace1, *eIt1 ));
|
||||
FE2.push_back( make_pair( nextFace2, *eIt2 ));
|
||||
}
|
||||
@ -1170,11 +1174,11 @@ bool StdMeshers_ProjectionUtils::FindSubShapeAssociation(const TopoDS_Shape& the
|
||||
if ( !VV1[1].IsNull() ) {
|
||||
InsertAssociation( VV1[0], VV2[0], theMap );
|
||||
InsertAssociation( VV1[1], VV2[1], theMap );
|
||||
TShapeShapeMap::EAssocType asType = theMap._assocType;
|
||||
theMap.SetAssocType( TShapeShapeMap::PROPAGATION );
|
||||
if ( FindSubShapeAssociation( theShape1, theMesh1, theShape2, theMesh2, theMap ))
|
||||
{
|
||||
theMap.SetAssocType( TShapeShapeMap::PROPAGATION );
|
||||
return true;
|
||||
}
|
||||
theMap._assocType = asType;
|
||||
}
|
||||
}
|
||||
break; // try by vertex closeness
|
||||
@ -1230,11 +1234,11 @@ bool StdMeshers_ProjectionUtils::FindSubShapeAssociation(const TopoDS_Shape& the
|
||||
{
|
||||
InsertAssociation( VV1[0], VV1[0], theMap );
|
||||
InsertAssociation( VV1[1], VV1[1], theMap );
|
||||
if (FindSubShapeAssociation( theShape1, theMesh1, theShape2, theMesh2, theMap ))
|
||||
{
|
||||
theMap.SetAssocType( TShapeShapeMap::COMMON_VERTEX );
|
||||
TShapeShapeMap::EAssocType asType = theMap._assocType;
|
||||
theMap.SetAssocType( TShapeShapeMap::COMMON_VERTEX );
|
||||
if ( FindSubShapeAssociation( theShape1, theMesh1, theShape2, theMesh2, theMap ))
|
||||
return true;
|
||||
}
|
||||
theMap._assocType = asType;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1593,20 +1597,21 @@ int StdMeshers_ProjectionUtils::FindFaceAssociation(const TopoDS_Face& face1,
|
||||
// reverse edges2 if needed
|
||||
if ( SMESH_MesherHelper::IsClosedEdge( *edge1Beg ))
|
||||
{
|
||||
double f,l;
|
||||
Handle(Geom2d_Curve) c1 = BRep_Tool::CurveOnSurface( *edge1Beg, face1,f,l );
|
||||
if ( edge1Beg->Orientation() == TopAbs_REVERSED )
|
||||
std::swap( f,l );
|
||||
gp_Pnt2d uv1 = dUV + c1->Value( f * 0.8 + l * 0.2 ).XY();
|
||||
// Commented (so far?) as it's not checked if orientation must be same or reversed
|
||||
// double f,l;
|
||||
// Handle(Geom2d_Curve) c1 = BRep_Tool::CurveOnSurface( *edge1Beg, face1,f,l );
|
||||
// if ( edge1Beg->Orientation() == TopAbs_REVERSED )
|
||||
// std::swap( f,l );
|
||||
// gp_Pnt2d uv1 = dUV + c1->Value( f * 0.8 + l * 0.2 ).XY();
|
||||
|
||||
Handle(Geom2d_Curve) c2 = BRep_Tool::CurveOnSurface( *edge2Beg, face2,f,l );
|
||||
if ( edge2Beg->Orientation() == TopAbs_REVERSED )
|
||||
std::swap( f,l );
|
||||
gp_Pnt2d uv2 = c2->Value( f * 0.8 + l * 0.2 );
|
||||
gp_Pnt2d uv3 = c2->Value( l * 0.8 + f * 0.2 );
|
||||
// Handle(Geom2d_Curve) c2 = BRep_Tool::CurveOnSurface( *edge2Beg, face2,f,l );
|
||||
// if ( edge2Beg->Orientation() == TopAbs_REVERSED )
|
||||
// std::swap( f,l );
|
||||
// gp_Pnt2d uv2 = c2->Value( f * 0.8 + l * 0.2 );
|
||||
// gp_Pnt2d uv3 = c2->Value( l * 0.8 + f * 0.2 );
|
||||
|
||||
if ( uv1.SquareDistance( uv2 ) > uv1.SquareDistance( uv3 ))
|
||||
edge2Beg->Reverse();
|
||||
// if ( uv1.SquareDistance( uv2 ) > uv1.SquareDistance( uv3 ))
|
||||
// edge2Beg->Reverse();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -427,15 +427,44 @@ namespace {
|
||||
// get ordered src EDGEs
|
||||
TError err;
|
||||
srcWires = StdMeshers_FaceSide::GetFaceWires( srcFace, *srcMesh,/*skipMediumNodes=*/0, err);
|
||||
if ( err && !err->IsOK() )
|
||||
if ( err && !err->IsOK() || srcWires.empty() )
|
||||
return err;
|
||||
|
||||
SMESH_MesherHelper srcHelper( *srcMesh );
|
||||
srcHelper.SetSubShape( srcFace );
|
||||
|
||||
// make corresponding sequence of tgt EDGEs
|
||||
tgtWires.resize( srcWires.size() );
|
||||
for ( size_t iW = 0; iW < srcWires.size(); ++iW )
|
||||
{
|
||||
list< TopoDS_Edge > tgtEdges;
|
||||
// check ori
|
||||
bool reverse = false;
|
||||
StdMeshers_FaceSidePtr srcWire = srcWires[iW];
|
||||
// for ( int iE = 0; iE < srcWire->NbEdges(); ++iE )
|
||||
// {
|
||||
// if ( srcHelper.IsRealSeam( srcWire->EdgeID( iE )))
|
||||
// continue;
|
||||
// TopoDS_Shape srcE = srcWire->Edge( iE );
|
||||
// TopoDS_Shape tgtE = shape2ShapeMap( srcE, /*isSrc=*/true);
|
||||
// if ( shape2ShapeMap._assocType == TShapeShapeMap::PROPAGATION ||
|
||||
// shape2ShapeMap._assocType == TShapeShapeMap::PROPAGATION)
|
||||
// {
|
||||
// reverse = false;
|
||||
// }
|
||||
// else if ( tgtMesh == srcMesh )
|
||||
// {
|
||||
// reverse = (( srcE.Orientation() == srcHelper.GetSubShapeOri( srcFace, srcE )) !=
|
||||
// ( tgtE.Orientation() == srcHelper.GetSubShapeOri( tgtFace, tgtE )));
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// TopoDS_Shape srcEbis = shape2ShapeMap( tgtE, /*isSrc=*/false );
|
||||
// reverse = ( srcE.Orientation() != srcEbis.Orientation() );
|
||||
// }
|
||||
// break;
|
||||
// }
|
||||
|
||||
list< TopoDS_Edge > tgtEdges;
|
||||
TopTools_IndexedMapOfShape edgeMap; // to detect seam edges
|
||||
for ( int iE = 0; iE < srcWire->NbEdges(); ++iE )
|
||||
{
|
||||
@ -443,6 +472,7 @@ namespace {
|
||||
TopoDS_Edge tgtE = TopoDS::Edge( shape2ShapeMap( srcE, /*isSrc=*/true));
|
||||
TopoDS_Shape srcEbis = shape2ShapeMap( tgtE, /*isSrc=*/false );
|
||||
if ( srcE.Orientation() != srcEbis.Orientation() )
|
||||
//if ( reverse )
|
||||
tgtE.Reverse();
|
||||
// reverse a seam edge encountered for the second time
|
||||
const int index = edgeMap.Add( tgtE );
|
||||
@ -999,6 +1029,7 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape&
|
||||
srcMesh = tgtMesh;
|
||||
|
||||
SMESHDS_Mesh * meshDS = theMesh.GetMeshDS();
|
||||
SMESH_MesherHelper helper( theMesh );
|
||||
|
||||
// ---------------------------
|
||||
// Make sub-shapes association
|
||||
@ -1015,8 +1046,8 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape&
|
||||
{
|
||||
if ( srcShape.ShapeType() == TopAbs_FACE )
|
||||
{
|
||||
int nbE1 = SMESH_MesherHelper::Count( tgtFace, TopAbs_EDGE, /*ignoreSame=*/true );
|
||||
int nbE2 = SMESH_MesherHelper::Count( srcShape, TopAbs_EDGE, /*ignoreSame=*/true );
|
||||
int nbE1 = helper.Count( tgtFace, TopAbs_EDGE, /*ignoreSame=*/true );
|
||||
int nbE2 = helper.Count( srcShape, TopAbs_EDGE, /*ignoreSame=*/true );
|
||||
if ( nbE1 != nbE2 )
|
||||
return error(COMPERR_BAD_SHAPE,
|
||||
SMESH_Comment("Different number of edges in source and target faces: ")
|
||||
@ -1026,6 +1057,23 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape&
|
||||
}
|
||||
TopoDS_Face srcFace = TopoDS::Face( shape2ShapeMap( tgtFace ).Oriented(TopAbs_FORWARD));
|
||||
|
||||
// orient faces
|
||||
// if ( srcMesh == tgtMesh )
|
||||
// {
|
||||
// TopoDS_Shape solid =
|
||||
// helper.GetCommonAncestor( srcFace, tgtFace, *tgtMesh, TopAbs_SOLID );
|
||||
// if ( !solid.IsNull() )
|
||||
// {
|
||||
// srcFace.Orientation( helper.GetSubShapeOri( solid, srcFace ));
|
||||
// tgtFace.Orientation( helper.GetSubShapeOri( solid, tgtFace ));
|
||||
// }
|
||||
// else if ( helper.NbAncestors( srcFace, *tgtMesh, TopAbs_SOLID ) == 1 &&
|
||||
// helper.NbAncestors( tgtFace, *tgtMesh, TopAbs_SOLID ) == 1 )
|
||||
// {
|
||||
// srcFace.Orientation( helper.GetSubShapeOri( tgtMesh->GetShapeToMesh(), srcFace ));
|
||||
// tgtFace.Orientation( helper.GetSubShapeOri( tgtMesh->GetShapeToMesh(), tgtFace ));
|
||||
// }
|
||||
// }
|
||||
// ----------------------------------------------
|
||||
// Assure that mesh on a source Face is computed
|
||||
// ----------------------------------------------
|
||||
@ -1072,7 +1120,6 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape&
|
||||
shape2ShapeMap, _src2tgtNodes, is1DComputed);
|
||||
}
|
||||
|
||||
SMESH_MesherHelper helper( theMesh );
|
||||
helper.SetSubShape( tgtFace );
|
||||
|
||||
// it will remove mesh built on edges and vertices in failure case
|
||||
@ -1308,8 +1355,8 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape&
|
||||
u2nodesOnSeam.size() > 0 &&
|
||||
seam.ShapeType() == TopAbs_EDGE )
|
||||
{
|
||||
int nbE1 = SMESH_MesherHelper::Count( tgtFace, TopAbs_EDGE, /*ignoreSame=*/true );
|
||||
int nbE2 = SMESH_MesherHelper::Count( srcFace, TopAbs_EDGE, /*ignoreSame=*/true );
|
||||
int nbE1 = helper.Count( tgtFace, TopAbs_EDGE, /*ignoreSame=*/true );
|
||||
int nbE2 = helper.Count( srcFace, TopAbs_EDGE, /*ignoreSame=*/true );
|
||||
if ( nbE1 != nbE2 ) // 2 EDGEs are mapped to a seam EDGE
|
||||
{
|
||||
// find the 2 EDGEs of srcFace
|
||||
|
@ -541,3 +541,39 @@ void StdMeshers_Projection_3D::SetEventListener(SMESH_subMesh* subMesh)
|
||||
_sourceHypo->GetSourceMesh() );
|
||||
}
|
||||
|
||||
//================================================================================
|
||||
/*!
|
||||
* \brief Return true if the algorithm can mesh this shape
|
||||
* \param [in] aShape - shape to check
|
||||
* \param [in] toCheckAll - if true, this check returns OK if all shapes are OK,
|
||||
* else, returns OK if at least one shape is OK
|
||||
*/
|
||||
//================================================================================
|
||||
|
||||
bool StdMeshers_Projection_3D::IsApplicable(const TopoDS_Shape & aShape, bool toCheckAll)
|
||||
{
|
||||
TopExp_Explorer exp0( aShape, TopAbs_SOLID );
|
||||
if ( !exp0.More() ) return false;
|
||||
|
||||
TopTools_IndexedMapOfOrientedShape blockShapes;
|
||||
TopoDS_Vertex v;
|
||||
TopoDS_Shell shell;
|
||||
for ( ; exp0.More(); exp0.Next() )
|
||||
{
|
||||
int nbFoundShells = 0;
|
||||
TopExp_Explorer exp1( exp0.Current(), TopAbs_SHELL );
|
||||
for ( ; exp1.More(); exp1.Next(), ++nbFoundShells )
|
||||
{
|
||||
shell = TopoDS::Shell( exp1.Current() );
|
||||
if ( nbFoundShells == 2 ) break;
|
||||
}
|
||||
if ( nbFoundShells != 1 ) {
|
||||
if ( toCheckAll ) return false;
|
||||
continue;
|
||||
}
|
||||
bool isBlock = SMESH_Block::FindBlockShapes( shell, v, v, blockShapes );
|
||||
if ( toCheckAll && !isBlock ) return false;
|
||||
if ( !toCheckAll && isBlock ) return true;
|
||||
}
|
||||
return toCheckAll;
|
||||
}
|
||||
|
@ -57,7 +57,9 @@ public:
|
||||
*/
|
||||
virtual void SetEventListener(SMESH_subMesh* whenSetToSubMesh);
|
||||
|
||||
protected:
|
||||
static bool IsApplicable(const TopoDS_Shape & aShape, bool toCheckAll);
|
||||
|
||||
protected:
|
||||
|
||||
const StdMeshers_ProjectionSource3D* _sourceHypo;
|
||||
|
||||
|
@ -223,6 +223,7 @@ QFrame* StdMeshersGUI_NbSegmentsCreator::buildFrame()
|
||||
lay->setStretchFactor( GroupC1, 1);
|
||||
lay->setStretchFactor( myReversedEdgesBox, 1);
|
||||
|
||||
myReversedEdgesHelper = 0;
|
||||
if ( !aGeomEntry.isEmpty() || !aMainEntry.isEmpty() )
|
||||
{
|
||||
myReversedEdgesHelper = new StdMeshersGUI_PropagationHelperWdg( myDirectionWidget, fr, false );
|
||||
|
@ -66,6 +66,17 @@ StdMeshers_Projection_3D_i::~StdMeshers_Projection_3D_i()
|
||||
return ( ::StdMeshers_Projection_3D* )myBaseImpl;
|
||||
}
|
||||
|
||||
//================================================================================
|
||||
/*!
|
||||
* \brief Return true if the algorithm is applicable to a shape
|
||||
*/
|
||||
//================================================================================
|
||||
|
||||
CORBA::Boolean StdMeshers_Projection_3D_i::IsApplicable(const TopoDS_Shape &S,
|
||||
CORBA::Boolean toCheckAll)
|
||||
{
|
||||
return ::StdMeshers_Projection_3D::IsApplicable( S, toCheckAll );
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
/*!
|
||||
|
@ -37,6 +37,7 @@
|
||||
#include "StdMeshers_Projection_3D.hxx"
|
||||
|
||||
class SMESH_Gen;
|
||||
class TopoDS_Shape;
|
||||
|
||||
// ======================================================
|
||||
// Projection 3D algorithm
|
||||
@ -57,6 +58,9 @@ public:
|
||||
|
||||
// Get implementation
|
||||
::StdMeshers_Projection_3D* GetImpl();
|
||||
|
||||
// Return true if the algorithm is applicable to a shape
|
||||
static CORBA::Boolean IsApplicable(const TopoDS_Shape &S, CORBA::Boolean toCheckAll);
|
||||
};
|
||||
|
||||
// ======================================================
|
||||
|
@ -225,7 +225,7 @@ STDMESHERS_I_EXPORT
|
||||
else if (strcmp(aHypName, "Projection_2D") == 0)
|
||||
aCreator = new StdHypothesisCreator_i<StdMeshers_Projection_2D_i>;
|
||||
else if (strcmp(aHypName, "Projection_3D") == 0)
|
||||
aCreator = new StdHypothesisCreator_i<StdMeshers_Projection_3D_i, StdMeshers_Hexa_3D_i>;
|
||||
aCreator = new StdHypothesisCreator_i<StdMeshers_Projection_3D_i, StdMeshers_Projection_3D_i>;
|
||||
else if (strcmp(aHypName, "Prism_3D") == 0)
|
||||
aCreator = new StdHypothesisCreator_i<StdMeshers_Prism_3D_i, StdMeshers_Prism_3D_i>;
|
||||
else if (strcmp(aHypName, "RadialPrism_3D") == 0)
|
||||
|
Loading…
Reference in New Issue
Block a user