-// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2019 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
-// SMESH SMESH : implementaion of SMESH idl descriptions
+// SMESH SMESH : implementation of SMESH idl descriptions
// File : StdMeshers_Hexa_3D.cxx
// Moved here from SMESH_Hexa_3D.cxx
// Author : Paul RASCLE, EDF
_shapeType = (1 << TopAbs_SHELL) | (1 << TopAbs_SOLID); // 1 bit /shape type
_requireShape = false;
_compatibleHypothesis.push_back("ViscousLayers");
+ _quadAlgo = new StdMeshers_Quadrangle_2D( gen->GetANewId(), _gen );
}
//=============================================================================
StdMeshers_Hexa_3D::~StdMeshers_Hexa_3D()
{
+ delete _quadAlgo;
+ _quadAlgo = 0;
}
//=============================================================================
// map of (node parameter on EDGE) to (column (vector) of nodes)
TParam2ColumnMap _u2nodesMap;
- // node column's taken form _u2nodesMap taking into account sub-shape orientation
+ // node column's taken from _u2nodesMap taking into account sub-shape orientation
vector<TNodeColumn> _columns;
// columns of normalized parameters of nodes within the unitary cube
//================================================================================
/*!
- * \brief Convertor of a pair of integers to a sole index
+ * \brief Converter of a pair of integers to a sole index
*/
struct _Indexer
{
for ( int i = 1; i < 6; ++i )
{
if ( !quad[i] ) continue;
- for ( unsigned iS = 0; iS < quad[i]->side.size(); ++iS )
+ for ( size_t iS = 0; iS < quad[i]->side.size(); ++iS )
{
const StdMeshers_FaceSidePtr side2 = quad[i]->side[iS];
if (( side->FirstVertex().IsSame( side2->FirstVertex() ) ||
if ( iS != Q_BOTTOM )
{
vector< FaceQuadStruct::Side > newSides;
- for ( unsigned j = iS; j < quad[i]->side.size(); ++j )
+ for ( size_t j = iS; j < quad[i]->side.size(); ++j )
newSides.push_back( quad[i]->side[j] );
- for ( unsigned j = 0; j < iS; ++j )
+ for ( size_t j = 0; j < iS; ++j )
newSides.push_back( quad[i]->side[j] );
quad[i]->side.swap( newSides );
}
if ( exp.Next(), exp.More() )
return error(COMPERR_BAD_SHAPE, "More than one SHELL in the geometry");
- TopTools_IndexedMapOfShape FF;
+ TopTools_IndexedMapOfShape FF, EE;
TopExp::MapShapes( aShape, TopAbs_FACE, FF);
if ( FF.Extent() != 6)
{
// Find sides of a cube
// ---------------------
-
+
+ // tool creating quadratic elements if needed
+ SMESH_MesherHelper helper (aMesh);
+ _quadraticMesh = helper.IsQuadraticSubMesh(aShape);
+
+ TopExp::MapShapes( aShape, TopAbs_EDGE, EE );
+ SMESH_MesherHelper* faceHelper = ( EE.Size() == 12 ) ? 0 : &helper;
+
FaceQuadStructPtr quad[ 6 ];
- StdMeshers_Quadrangle_2D quadAlgo( _gen->GetANewId(), _gen);
for ( int i = 0; i < 6; ++i )
{
- if ( !( quad[i] = FaceQuadStructPtr( quadAlgo.CheckNbEdges( aMesh, FF( i+1 ),
- /*considerMesh=*/true))))
- return error( quadAlgo.GetComputeError() );
+ if ( faceHelper )
+ faceHelper->SetSubShape( FF( i+1 ));
+ if ( !( quad[i] = FaceQuadStructPtr( _quadAlgo->CheckNbEdges( aMesh, FF( i+1 ),
+ /*considerMesh=*/true,
+ faceHelper))))
+ return error( _quadAlgo->GetComputeError() );
if ( quad[i]->side.size() != 4 )
return error( COMPERR_BAD_SHAPE, "Not a quadrangular box side" );
}
// Check presence of regular grid mesh on FACEs of the cube
// ------------------------------------------------------------
- // tool creating quadratic elements if needed
- SMESH_MesherHelper helper (aMesh);
- _quadraticMesh = helper.IsQuadraticSubMesh(aShape);
-
for ( int i = 0; i < 6; ++i )
{
const TopoDS_Face& F = aCubeSide[i]._quad->face;
if ( proxymesh )
for ( int i = 0; i < 6; ++i )
- for ( unsigned j = 0; j < aCubeSide[i]._columns.size(); ++j)
- for ( unsigned k = 0; k < aCubeSide[i]._columns[j].size(); ++k)
+ for ( size_t j = 0; j < aCubeSide[i]._columns.size(); ++j)
+ for ( size_t k = 0; k < aCubeSide[i]._columns[j].size(); ++k)
{
const SMDS_MeshNode* & n = aCubeSide[i]._columns[j][k];
n = proxymesh->GetProxyNode( n );
_FaceGrid* fFront = & aCubeSide[ B_FRONT ];
_FaceGrid* fBack = & aCubeSide[ B_BACK ];
- // compute normalized parameters of nodes on sides (PAL23189)
- computeIJK( *fBottom, COO_X, COO_Y, /*z=*/0. );
- computeIJK( *fRight, COO_Y, COO_Z, /*x=*/1. );
- computeIJK( *fTop, COO_X, COO_Y, /*z=*/1. );
- computeIJK( *fLeft, COO_Y, COO_Z, /*x=*/0. );
- computeIJK( *fFront, COO_X, COO_Z, /*y=*/0. );
- computeIJK( *fBack, COO_X, COO_Z, /*y=*/1. );
-
// cube size measured in nb of nodes
- int x, xSize = fBottom->_columns.size() , X = xSize - 1;
- int y, ySize = fLeft->_columns.size() , Y = ySize - 1;
- int z, zSize = fLeft->_columns[0].size(), Z = zSize - 1;
+ size_t x, xSize = fBottom->_columns.size() , X = xSize - 1;
+ size_t y, ySize = fLeft->_columns.size() , Y = ySize - 1;
+ size_t z, zSize = fLeft->_columns[0].size(), Z = zSize - 1;
+
+ // check sharing of FACEs (IPAL54417)
+ if ( fFront ->_columns.size() != xSize ||
+ fBack ->_columns.size() != xSize ||
+ fTop ->_columns.size() != xSize ||
+
+ fRight ->_columns.size() != ySize ||
+ fTop ->_columns[0].size() != ySize ||
+ fBottom->_columns[0].size() != ySize ||
+
+ fRight ->_columns[0].size() != zSize ||
+ fFront ->_columns[0].size() != zSize ||
+ fBack ->_columns[0].size() != zSize )
+ return error( COMPERR_BAD_SHAPE, "Not sewed faces" );
// columns of internal nodes "rising" from nodes of fBottom
_Indexer colIndex( xSize, ySize );
}
}
+ // compute normalized parameters of nodes on sides (PAL23189)
+ computeIJK( *fBottom, COO_X, COO_Y, /*z=*/0. );
+ computeIJK( *fRight, COO_Y, COO_Z, /*x=*/1. );
+ computeIJK( *fTop, COO_X, COO_Y, /*z=*/1. );
+ computeIJK( *fLeft, COO_Y, COO_Z, /*x=*/0. );
+ computeIJK( *fFront, COO_X, COO_Z, /*y=*/0. );
+ computeIJK( *fBack, COO_X, COO_Z, /*y=*/1. );
+
// projection points of the internal node on cube sub-shapes by which
// coordinates of the internal node are computed
vector<gp_XYZ> pointsOnShapes( SMESH_Block::ID_Shell );