mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-11-13 17:18:35 +05:00
23239: [CEA 1739] Regression : crash trying to create mesh
(StdMesher_Prism_3D.cxx) + minor changes
This commit is contained in:
parent
920fe932b1
commit
04b68235aa
@ -344,7 +344,7 @@ class SMESH_EXPORT SMESH_Mesh
|
|||||||
bool IsOrderOK( const SMESH_subMesh* smBefore,
|
bool IsOrderOK( const SMESH_subMesh* smBefore,
|
||||||
const SMESH_subMesh* smAfter ) const;
|
const SMESH_subMesh* smAfter ) const;
|
||||||
|
|
||||||
ostream& Dump(ostream & save);
|
std::ostream& Dump(ostream & save);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@
|
|||||||
#include <TopoDS_Wire.hxx>
|
#include <TopoDS_Wire.hxx>
|
||||||
|
|
||||||
#ifdef _DEBUG_
|
#ifdef _DEBUG_
|
||||||
#define _MYDEBUG_
|
//#define _MYDEBUG_
|
||||||
#include "SMESH_File.hxx"
|
#include "SMESH_File.hxx"
|
||||||
#include "SMESH_Comment.hxx"
|
#include "SMESH_Comment.hxx"
|
||||||
#endif
|
#endif
|
||||||
@ -162,6 +162,8 @@ namespace
|
|||||||
if ( inSegments.size() > 1000 )
|
if ( inSegments.size() > 1000 )
|
||||||
return;
|
return;
|
||||||
const char* fileName = "/misc/dn25/salome/eap/salome/misc/Code/C++/MAdebug.txt";
|
const char* fileName = "/misc/dn25/salome/eap/salome/misc/Code/C++/MAdebug.txt";
|
||||||
|
const char* user = getenv("USER");
|
||||||
|
if ( !user || strcmp( user, "eap" )) return;
|
||||||
SMESH_File file(fileName, false );
|
SMESH_File file(fileName, false );
|
||||||
file.remove();
|
file.remove();
|
||||||
file.openForWriting();
|
file.openForWriting();
|
||||||
@ -1518,9 +1520,9 @@ Adaptor3d_Curve* SMESH_MAT2d::MedialAxis::make3DCurve(const Branch& branch) cons
|
|||||||
*/
|
*/
|
||||||
//================================================================================
|
//================================================================================
|
||||||
|
|
||||||
void SMESH_MAT2d::Branch::init( vector<const TVDEdge*>& maEdges,
|
void SMESH_MAT2d::Branch::init( vector<const TVDEdge*>& maEdges,
|
||||||
const Boundary* boundary,
|
const Boundary* boundary,
|
||||||
map< const TVDVertex*, BranchEndType > endType )
|
map< const TVDVertex*, BranchEndType >& endType )
|
||||||
{
|
{
|
||||||
if ( maEdges.empty() ) return;
|
if ( maEdges.empty() ) return;
|
||||||
|
|
||||||
|
@ -120,9 +120,9 @@ namespace SMESH_MAT2d
|
|||||||
|
|
||||||
public: // internal: construction
|
public: // internal: construction
|
||||||
|
|
||||||
void init( std::vector<const TVDEdge*>& maEdges,
|
void init( std::vector<const TVDEdge*>& maEdges,
|
||||||
const Boundary* boundary,
|
const Boundary* boundary,
|
||||||
std::map< const TVDVertex*, BranchEndType > endType);
|
std::map< const TVDVertex*, BranchEndType >& endType);
|
||||||
void setBranchesToEnds( const std::vector< Branch >& branches);
|
void setBranchesToEnds( const std::vector< Branch >& branches);
|
||||||
BranchPoint getPoint( const TVDVertex* vertex ) const;
|
BranchPoint getPoint( const TVDVertex* vertex ) const;
|
||||||
void setRemoved( const BranchPoint& proxyPoint );
|
void setRemoved( const BranchPoint& proxyPoint );
|
||||||
|
@ -2512,16 +2512,17 @@ namespace // utils used by StdMeshers_Prism_3D::IsApplicable()
|
|||||||
}
|
}
|
||||||
EdgeWithNeighbors() {}
|
EdgeWithNeighbors() {}
|
||||||
};
|
};
|
||||||
struct PrismSide
|
// PrismSide contains all FACEs linking a bottom EDGE with a top one.
|
||||||
|
struct PrismSide
|
||||||
{
|
{
|
||||||
TopoDS_Face _face;
|
TopoDS_Face _face; // a currently treated upper FACE
|
||||||
TopTools_IndexedMapOfShape *_faces; // pointer because its copy constructor is private
|
TopTools_IndexedMapOfShape *_faces; // all FACEs (pointer because of a private copy constructor)
|
||||||
TopoDS_Edge _topEdge;
|
TopoDS_Edge _topEdge; // a current top EDGE
|
||||||
vector< EdgeWithNeighbors >*_edges;
|
vector< EdgeWithNeighbors >*_edges; // all EDGEs of _face
|
||||||
int _iBotEdge;
|
int _iBotEdge; // index of _topEdge within _edges
|
||||||
vector< bool > _isCheckedEdge;
|
vector< bool > _isCheckedEdge; // mark EDGEs whose two owner FACEs found
|
||||||
int _nbCheckedEdges; // nb of EDGEs whose location is defined
|
int _nbCheckedEdges; // nb of EDGEs whose location is defined
|
||||||
PrismSide *_leftSide;
|
PrismSide *_leftSide; // neighbor sides
|
||||||
PrismSide *_rightSide;
|
PrismSide *_rightSide;
|
||||||
void SetExcluded() { _leftSide = _rightSide = NULL; }
|
void SetExcluded() { _leftSide = _rightSide = NULL; }
|
||||||
bool IsExcluded() const { return !_leftSide; }
|
bool IsExcluded() const { return !_leftSide; }
|
||||||
@ -2679,7 +2680,7 @@ bool StdMeshers_Prism_3D::IsApplicable(const TopoDS_Shape & shape, bool toCheckA
|
|||||||
|
|
||||||
typedef vector< EdgeWithNeighbors > TEdgeWithNeighborsVec;
|
typedef vector< EdgeWithNeighbors > TEdgeWithNeighborsVec;
|
||||||
vector< TEdgeWithNeighborsVec > faceEdgesVec( allFaces.Extent() + 1 );
|
vector< TEdgeWithNeighborsVec > faceEdgesVec( allFaces.Extent() + 1 );
|
||||||
const size_t nbEdgesMax = facesOfEdge.Extent() * 2; // there can be seam EDGES
|
const size_t nbEdgesMax = facesOfEdge.Extent() * 2; // there can be seam EDGEs
|
||||||
TopTools_IndexedMapOfShape* facesOfSide = new TopTools_IndexedMapOfShape[ nbEdgesMax ];
|
TopTools_IndexedMapOfShape* facesOfSide = new TopTools_IndexedMapOfShape[ nbEdgesMax ];
|
||||||
SMESHUtils::ArrayDeleter<TopTools_IndexedMapOfShape> delFacesOfSide( facesOfSide );
|
SMESHUtils::ArrayDeleter<TopTools_IndexedMapOfShape> delFacesOfSide( facesOfSide );
|
||||||
|
|
||||||
@ -2815,6 +2816,10 @@ bool StdMeshers_Prism_3D::IsApplicable(const TopoDS_Shape & shape, bool toCheckA
|
|||||||
side._isCheckedEdge[ side._iBotEdge ] = true;
|
side._isCheckedEdge[ side._iBotEdge ] = true;
|
||||||
side._nbCheckedEdges = 1; // bottom EDGE is known
|
side._nbCheckedEdges = 1; // bottom EDGE is known
|
||||||
}
|
}
|
||||||
|
else // probably a triangular top face found
|
||||||
|
{
|
||||||
|
side._face.Nullify();
|
||||||
|
}
|
||||||
side._topEdge.Nullify();
|
side._topEdge.Nullify();
|
||||||
isOK = ( !side._edges->empty() || side._faces->Extent() > 1 );
|
isOK = ( !side._edges->empty() || side._faces->Extent() > 1 );
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user