mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-01-24 11:50:33 +05:00
parent
53cfbcdd33
commit
d5aa4efde2
@ -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
|
||||||
|
@ -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 ));
|
||||||
}
|
}
|
||||||
|
@ -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 *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user