mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-02-04 23:04:18 +05:00
Regression of 3D_mesh_Extrusion_00/B2
+ avoid failure because of different 'vertical' discretization
This commit is contained in:
parent
6f5fd35e49
commit
85b03c3643
@ -62,6 +62,7 @@
|
|||||||
#include <gp_Ax3.hxx>
|
#include <gp_Ax3.hxx>
|
||||||
|
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
#include <numeric>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
@ -977,7 +978,7 @@ bool StdMeshers_Prism_3D::getWallFaces( Prism_3D::TPrismTopo & thePrism,
|
|||||||
{
|
{
|
||||||
iE = 0;
|
iE = 0;
|
||||||
++nbE;
|
++nbE;
|
||||||
int nbQuadPrev = nbQuadsPerWire.empty() ? 0 : nbQuadsPerWire.back();
|
int nbQuadPrev = std::accumulate( nbQuadsPerWire.begin(), nbQuadsPerWire.end(), 0 );
|
||||||
nbQuadsPerWire.push_back( thePrism.myWallQuads.size() - nbQuadPrev );
|
nbQuadsPerWire.push_back( thePrism.myWallQuads.size() - nbQuadPrev );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1291,6 +1292,7 @@ bool StdMeshers_Prism_3D::compute(const Prism_3D::TPrismTopo& thePrism)
|
|||||||
if ( !smDS ) return toSM( error(COMPERR_BAD_INPUT_MESH, "Null submesh"));
|
if ( !smDS ) return toSM( error(COMPERR_BAD_INPUT_MESH, "Null submesh"));
|
||||||
|
|
||||||
// loop on bottom mesh faces
|
// loop on bottom mesh faces
|
||||||
|
vector< const TNodeColumn* > columns;
|
||||||
SMDS_ElemIteratorPtr faceIt = smDS->GetElements();
|
SMDS_ElemIteratorPtr faceIt = smDS->GetElements();
|
||||||
while ( faceIt->more() )
|
while ( faceIt->more() )
|
||||||
{
|
{
|
||||||
@ -1300,7 +1302,7 @@ bool StdMeshers_Prism_3D::compute(const Prism_3D::TPrismTopo& thePrism)
|
|||||||
|
|
||||||
// find node columns for each node
|
// find node columns for each node
|
||||||
int nbNodes = face->NbCornerNodes();
|
int nbNodes = face->NbCornerNodes();
|
||||||
vector< const TNodeColumn* > columns( nbNodes );
|
columns.resize( nbNodes );
|
||||||
for ( int i = 0; i < nbNodes; ++i )
|
for ( int i = 0; i < nbNodes; ++i )
|
||||||
{
|
{
|
||||||
const SMDS_MeshNode* n = face->GetNode( i );
|
const SMDS_MeshNode* n = face->GetNode( i );
|
||||||
@ -1317,7 +1319,8 @@ bool StdMeshers_Prism_3D::compute(const Prism_3D::TPrismTopo& thePrism)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// create prisms
|
// create prisms
|
||||||
AddPrisms( columns, myHelper );
|
if ( !AddPrisms( columns, myHelper ))
|
||||||
|
return toSM( error("Different 'vertical' discretization"));
|
||||||
|
|
||||||
} // loop on bottom mesh faces
|
} // loop on bottom mesh faces
|
||||||
|
|
||||||
@ -1815,17 +1818,20 @@ bool StdMeshers_Prism_3D::Evaluate(SMESH_Mesh& theMesh,
|
|||||||
*/
|
*/
|
||||||
//================================================================================
|
//================================================================================
|
||||||
|
|
||||||
void StdMeshers_Prism_3D::AddPrisms( vector<const TNodeColumn*> & columns,
|
bool StdMeshers_Prism_3D::AddPrisms( vector<const TNodeColumn*> & columns,
|
||||||
SMESH_MesherHelper* helper)
|
SMESH_MesherHelper* helper)
|
||||||
{
|
{
|
||||||
int nbNodes = columns.size();
|
size_t nbNodes = columns.size();
|
||||||
int nbZ = columns[0]->size();
|
size_t nbZ = columns[0]->size();
|
||||||
if ( nbZ < 2 ) return;
|
if ( nbZ < 2 ) return false;
|
||||||
|
for ( size_t i = 1; i < nbNodes; ++i )
|
||||||
|
if ( columns[i]->size() != nbZ )
|
||||||
|
return false;
|
||||||
|
|
||||||
// find out orientation
|
// find out orientation
|
||||||
bool isForward = true;
|
bool isForward = true;
|
||||||
SMDS_VolumeTool vTool;
|
SMDS_VolumeTool vTool;
|
||||||
int z = 1;
|
size_t z = 1;
|
||||||
switch ( nbNodes ) {
|
switch ( nbNodes ) {
|
||||||
case 3: {
|
case 3: {
|
||||||
SMDS_VolumeOfNodes tmpPenta ( (*columns[0])[z-1], // bottom
|
SMDS_VolumeOfNodes tmpPenta ( (*columns[0])[z-1], // bottom
|
||||||
@ -1911,7 +1917,7 @@ void StdMeshers_Prism_3D::AddPrisms( vector<const TNodeColumn*> & columns,
|
|||||||
vector<const SMDS_MeshNode*> nodes( 2*nbNodes + 4*nbNodes);
|
vector<const SMDS_MeshNode*> nodes( 2*nbNodes + 4*nbNodes);
|
||||||
for ( z = 1; z < nbZ; ++z )
|
for ( z = 1; z < nbZ; ++z )
|
||||||
{
|
{
|
||||||
for ( int i = 0; i < nbNodes; ++i ) {
|
for ( size_t i = 0; i < nbNodes; ++i ) {
|
||||||
nodes[ i ] = (*columns[ i ])[z+iBase1]; // bottom or top
|
nodes[ i ] = (*columns[ i ])[z+iBase1]; // bottom or top
|
||||||
nodes[ 2*nbNodes-i-1 ] = (*columns[ i ])[z+iBase2]; // top or bottom
|
nodes[ 2*nbNodes-i-1 ] = (*columns[ i ])[z+iBase2]; // top or bottom
|
||||||
// side
|
// side
|
||||||
@ -1925,6 +1931,8 @@ void StdMeshers_Prism_3D::AddPrisms( vector<const TNodeColumn*> & columns,
|
|||||||
}
|
}
|
||||||
|
|
||||||
} // switch ( nbNodes )
|
} // switch ( nbNodes )
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//================================================================================
|
//================================================================================
|
||||||
|
@ -472,7 +472,7 @@ public:
|
|||||||
* \param nodeColumns - columns of nodes generated from nodes of a mesh face
|
* \param nodeColumns - columns of nodes generated from nodes of a mesh face
|
||||||
* \param helper - helper initialized by mesh and shape to add prisms to
|
* \param helper - helper initialized by mesh and shape to add prisms to
|
||||||
*/
|
*/
|
||||||
static void AddPrisms( std::vector<const TNodeColumn*> & nodeColumns,
|
static bool AddPrisms( std::vector<const TNodeColumn*> & nodeColumns,
|
||||||
SMESH_MesherHelper* helper);
|
SMESH_MesherHelper* helper);
|
||||||
|
|
||||||
static bool IsApplicable(const TopoDS_Shape & aShape, bool toCheckAll);
|
static bool IsApplicable(const TopoDS_Shape & aShape, bool toCheckAll);
|
||||||
|
Loading…
Reference in New Issue
Block a user