bos #24368 EDF 23667 - Duplicates nodes

+  Suppress warnings
This commit is contained in:
eap 2021-07-06 16:17:33 +03:00
parent 53cfbcdd33
commit d5aa4efde2
4 changed files with 77 additions and 63 deletions

View File

@ -664,8 +664,7 @@ module SMESH
in boolean autoDimension) raises (SALOME::SALOME_Exception); in boolean autoDimension) raises (SALOME::SALOME_Exception);
long long ExportMEDCoupling(in boolean auto_groups, long long ExportMEDCoupling(in boolean auto_groups,
in boolean autoDimension in boolean autoDimension) raises (SALOME::SALOME_Exception);
) raises (SALOME::SALOME_Exception);
/*! /*!
* Export a [part of] Mesh into a MED file * Export a [part of] Mesh into a MED file

View File

@ -32,6 +32,7 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include <smIdType.hxx>
#ifdef WIN32 #ifdef WIN32
#if defined MESHDRIVER_EXPORTS || defined MeshDriver_EXPORTS #if defined MESHDRIVER_EXPORTS || defined MeshDriver_EXPORTS
@ -79,7 +80,7 @@ class MESHDRIVER_EXPORT Driver_Mesh
{ {
if ( sizeof( IDTYPE ) < sizeof( smIdType )) if ( sizeof( IDTYPE ) < sizeof( smIdType ))
{ {
const smIdType maxNB = std::numeric_limits< IDTYPE >::max(); const smIdType maxNB = ToSmIdType( std::numeric_limits< IDTYPE >::max() );
return (( checkIDs ? mesh->MaxNodeID() : mesh->NbNodes() ) > maxNB || return (( checkIDs ? mesh->MaxNodeID() : mesh->NbNodes() ) > maxNB ||
( checkIDs ? mesh->MaxElementID() : mesh->NbElements() > maxNB )); ( checkIDs ? mesh->MaxElementID() : mesh->NbElements() > maxNB ));
} }

View File

@ -76,7 +76,7 @@ Driver_Mesh::Status DriverDAT_R_SMDS_Mesh::Perform()
myMesh->AddNodeWithID(coordX, coordY, coordZ, intNumPoint); myMesh->AddNodeWithID(coordX, coordY, coordZ, intNumPoint);
} }
fprintf(stdout, "%ld noeuds\n", myMesh->NbNodes()); fprintf(stdout, "%ld noeuds\n", static_cast< long >( myMesh->NbNodes() ));
/**************************************************************************** /****************************************************************************
* LECTURE DES ELEMENTS * * LECTURE DES ELEMENTS *
****************************************************************************/ ****************************************************************************/

View File

@ -1004,14 +1004,14 @@ void SMDS_UnstructuredGrid::ModifyCellNodes(int vtkVolId, std::map<int, int> loc
*/ */
int SMDS_UnstructuredGrid::getOrderedNodesOfFace(int vtkVolId, int& dim, std::vector<vtkIdType>& orderedNodes) int SMDS_UnstructuredGrid::getOrderedNodesOfFace(int vtkVolId, int& dim, std::vector<vtkIdType>& orderedNodes)
{ {
int vtkType = this->GetCellType(vtkVolId); int vtkType = this->GetCellType( vtkVolId );
dim = SMDS_Downward::getCellDimension(vtkType); dim = SMDS_Downward::getCellDimension( vtkType );
if (dim == 3) if (dim == 3)
{ {
SMDS_Down3D *downvol = static_cast<SMDS_Down3D*> (_downArray[vtkType]); SMDS_Down3D *downvol = static_cast<SMDS_Down3D*> (_downArray[vtkType]);
int downVolId = this->_cellIdToDownId[vtkVolId]; int downVolId = this->_cellIdToDownId[ vtkVolId ];
downvol->getOrderedNodesOfFace(downVolId, orderedNodes); downvol->getOrderedNodesOfFace(downVolId, orderedNodes);
} }
// else nothing to do; // else nothing to do;
return orderedNodes.size(); return orderedNodes.size();
} }
@ -1090,74 +1090,88 @@ SMDS_UnstructuredGrid::extrudeVolumeFromFace(int vtkVolId,
break; break;
default: default:
isQuadratic = false; isQuadratic = false;
break; break;
} }
if (isQuadratic) if (isQuadratic)
{
long dom1 = domain1;
long dom2 = domain2;
long dom1_2; // for nodeQuadDomains
if (domain1 < domain2)
dom1_2 = dom1 + INT_MAX * dom2;
else
dom1_2 = dom2 + INT_MAX * dom1;
//cerr << "dom1=" << dom1 << " dom2=" << dom2 << " dom1_2=" << dom1_2 << endl;
int ima = orderedOriginals.size();
int mid = orderedOriginals.size() / 2;
//cerr << "ima=" << ima << " mid=" << mid << endl;
for (int i = 0; i < mid; i++)
orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain1]);
for (int i = 0; i < mid; i++)
orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain2]);
for (int i = mid; i < ima; i++)
orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain1]);
for (int i = mid; i < ima; i++)
orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain2]);
for (int i = 0; i < mid; i++)
{ {
long dom1 = domain1; int oldId = orderedOriginals[i];
long dom2 = domain2; int newId;
long dom1_2; // for nodeQuadDomains if (nodeQuadDomains.count(oldId) && nodeQuadDomains[oldId].count(dom1_2))
if (domain1 < domain2) newId = nodeQuadDomains[oldId][dom1_2];
dom1_2 = dom1 + INT_MAX * dom2;
else else
dom1_2 = dom2 + INT_MAX * dom1; {
//cerr << "dom1=" << dom1 << " dom2=" << dom2 << " dom1_2=" << dom1_2 << endl; double *coords = this->GetPoint(oldId);
int ima = orderedOriginals.size(); SMDS_MeshNode *newNode = _mesh->AddNode(coords[0], coords[1], coords[2]);
int mid = orderedOriginals.size() / 2; newId = newNode->GetVtkID();
//cerr << "ima=" << ima << " mid=" << mid << endl; if (! nodeQuadDomains.count(oldId))
for (int i = 0; i < mid; i++)
orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain1]);
for (int i = 0; i < mid; i++)
orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain2]);
for (int i = mid; i < ima; i++)
orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain1]);
for (int i = mid; i < ima; i++)
orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain2]);
for (int i = 0; i < mid; i++)
{ {
int oldId = orderedOriginals[i]; std::map<long, int> emptyMap;
int newId; nodeQuadDomains[oldId] = emptyMap;
if (nodeQuadDomains.count(oldId) && nodeQuadDomains[oldId].count(dom1_2))
newId = nodeQuadDomains[oldId][dom1_2];
else
{
double *coords = this->GetPoint(oldId);
SMDS_MeshNode *newNode = _mesh->AddNode(coords[0], coords[1], coords[2]);
newId = newNode->GetVtkID();
if (! nodeQuadDomains.count(oldId))
{
std::map<long, int> emptyMap;
nodeQuadDomains[oldId] = emptyMap;
}
nodeQuadDomains[oldId][dom1_2] = newId;
}
orderedNodes.push_back(newId);
} }
nodeQuadDomains[oldId][dom1_2] = newId;
}
orderedNodes.push_back(newId);
} }
}
else else
{ {
for (int i = 0; i < nbNodes; i++)
orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain1]);
if (dim == 3)
for (int i = 0; i < nbNodes; i++) for (int i = 0; i < nbNodes; i++)
orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain1]); orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain2]);
if (dim == 3) else
for (int i = 0; i < nbNodes; i++) for (int i = nbNodes-1; i >= 0; i--)
orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain2]); orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain2]);
else
for (int i = nbNodes-1; i >= 0; i--)
orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain2]);
} }
if (dim == 3) if (dim == 3)
{ {
SMDS_MeshVolume *vol = _mesh->AddVolumeFromVtkIds(orderedNodes); SMDS_MeshVolume *vol = _mesh->AddVolumeFromVtkIds(orderedNodes);
return vol; return vol;
} }
else if (dim == 2) else if (dim == 2)
{
// bos #24368
// orient face by the original one, as getOrderedNodesOfFace() not implemented for faces
const SMDS_MeshElement* origFace = _mesh->FindElementVtk( vtkVolId );
int i0 = origFace->GetNodeIndex( _mesh->FindNodeVtk( orderedNodes[0] ));
int i1 = origFace->GetNodeIndex( _mesh->FindNodeVtk( orderedNodes[1] ));
int diff = i0 - i1;
// order of nodes must be reverse in face and origFace
bool oriOk = ( diff == 1 ) || ( diff == -3 );
if ( !oriOk )
{ {
SMDS_MeshFace *face = _mesh->AddFaceFromVtkIds(orderedNodes); SMDSAbs_EntityType type = isQuadratic ? SMDSEntity_Quad_Quadrangle : SMDSEntity_Quadrangle;
return face; const std::vector<int>& interlace = SMDS_MeshCell::reverseSmdsOrder( type );
SMDS_MeshCell::applyInterlace( interlace, orderedNodes );
} }
SMDS_MeshFace *face = _mesh->AddFaceFromVtkIds(orderedNodes);
return face;
}
// TODO update sub-shape list of elements and nodes // TODO update sub-shape list of elements and nodes
return 0; return 0;