mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-03-04 09:45:38 +05:00
PAL12398. Fix "walls" creation when sweeping both 1D + 2D elements
This commit is contained in:
parent
45bfff6b5d
commit
0d350bc878
@ -2938,15 +2938,21 @@ static void makeWalls (SMESHDS_Mesh* aMesh,
|
|||||||
static_cast<const SMDS_MeshNode*>( nList->first );
|
static_cast<const SMDS_MeshNode*>( nList->first );
|
||||||
SMDS_ElemIteratorPtr eIt = node->GetInverseElementIterator();
|
SMDS_ElemIteratorPtr eIt = node->GetInverseElementIterator();
|
||||||
int nbInitElems = 0;
|
int nbInitElems = 0;
|
||||||
const SMDS_MeshElement* el;
|
const SMDS_MeshElement* el = 0;
|
||||||
|
SMDSAbs_ElementType highType = SMDSAbs_Edge; // count most complex elements only
|
||||||
while ( eIt->more() && nbInitElems < 2 ) {
|
while ( eIt->more() && nbInitElems < 2 ) {
|
||||||
el = eIt->next();
|
el = eIt->next();
|
||||||
//if ( elemSet.find( eIt->next() ) != elemSet.end() )
|
SMDSAbs_ElementType type = el->GetType();
|
||||||
|
if ( type == SMDSAbs_Volume || type < highType ) continue;
|
||||||
|
if ( type > highType ) {
|
||||||
|
nbInitElems = 0;
|
||||||
|
highType = type;
|
||||||
|
}
|
||||||
if ( elemSet.find(el->GetID()) != elemSet.end() )
|
if ( elemSet.find(el->GetID()) != elemSet.end() )
|
||||||
nbInitElems++;
|
nbInitElems++;
|
||||||
}
|
}
|
||||||
if ( nbInitElems < 2 ) {
|
if ( nbInitElems < 2 ) {
|
||||||
bool NotCreateEdge = el->IsQuadratic() && el->IsMediumNode(node);
|
bool NotCreateEdge = el && el->IsQuadratic() && el->IsMediumNode(node);
|
||||||
if(!NotCreateEdge) {
|
if(!NotCreateEdge) {
|
||||||
vector<TNodeOfNodeListMapItr> newNodesItVec( 1, nList );
|
vector<TNodeOfNodeListMapItr> newNodesItVec( 1, nList );
|
||||||
list<const SMDS_MeshElement*> newEdges;
|
list<const SMDS_MeshElement*> newEdges;
|
||||||
@ -2965,16 +2971,20 @@ static void makeWalls (SMESHDS_Mesh* aMesh,
|
|||||||
vector<TNodeOfNodeListMapItr>& vecNewNodes = itElemNodes->second;
|
vector<TNodeOfNodeListMapItr>& vecNewNodes = itElemNodes->second;
|
||||||
|
|
||||||
if ( elem->GetType() == SMDSAbs_Edge ) {
|
if ( elem->GetType() == SMDSAbs_Edge ) {
|
||||||
if(!elem->IsQuadratic()) {
|
// create a ceiling edge
|
||||||
// create a ceiling edge
|
if (!elem->IsQuadratic()) {
|
||||||
myLastCreatedElems.Append(aMesh->AddEdge(vecNewNodes[ 0 ]->second.back(),
|
if ( !aMesh->FindEdge( vecNewNodes[ 0 ]->second.back(),
|
||||||
vecNewNodes[ 1 ]->second.back()));
|
vecNewNodes[ 1 ]->second.back()))
|
||||||
|
myLastCreatedElems.Append(aMesh->AddEdge(vecNewNodes[ 0 ]->second.back(),
|
||||||
|
vecNewNodes[ 1 ]->second.back()));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// create a ceiling edge
|
if ( !aMesh->FindEdge( vecNewNodes[ 0 ]->second.back(),
|
||||||
myLastCreatedElems.Append(aMesh->AddEdge(vecNewNodes[ 0 ]->second.back(),
|
vecNewNodes[ 1 ]->second.back(),
|
||||||
vecNewNodes[ 1 ]->second.back(),
|
vecNewNodes[ 2 ]->second.back()))
|
||||||
vecNewNodes[ 2 ]->second.back()));
|
myLastCreatedElems.Append(aMesh->AddEdge(vecNewNodes[ 0 ]->second.back(),
|
||||||
|
vecNewNodes[ 1 ]->second.back(),
|
||||||
|
vecNewNodes[ 2 ]->second.back()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( elem->GetType() != SMDSAbs_Face )
|
if ( elem->GetType() != SMDSAbs_Face )
|
||||||
@ -2990,10 +3000,10 @@ static void makeWalls (SMESHDS_Mesh* aMesh,
|
|||||||
set<const SMDS_MeshNode*> aFaceLastNodes;
|
set<const SMDS_MeshNode*> aFaceLastNodes;
|
||||||
int iNode, nbNodes = vecNewNodes.size();
|
int iNode, nbNodes = vecNewNodes.size();
|
||||||
if(!elem->IsQuadratic()) {
|
if(!elem->IsQuadratic()) {
|
||||||
// loop on a face nodes
|
// loop on the face nodes
|
||||||
for ( iNode = 0; iNode < nbNodes; iNode++ ) {
|
for ( iNode = 0; iNode < nbNodes; iNode++ ) {
|
||||||
aFaceLastNodes.insert( vecNewNodes[ iNode ]->second.back() );
|
aFaceLastNodes.insert( vecNewNodes[ iNode ]->second.back() );
|
||||||
// look for free links of a face
|
// look for free links of the face
|
||||||
int iNext = ( iNode + 1 == nbNodes ) ? 0 : iNode + 1;
|
int iNext = ( iNode + 1 == nbNodes ) ? 0 : iNode + 1;
|
||||||
const SMDS_MeshNode* n1 = vecNewNodes[ iNode ]->first;
|
const SMDS_MeshNode* n1 = vecNewNodes[ iNode ]->first;
|
||||||
const SMDS_MeshNode* n2 = vecNewNodes[ iNext ]->first;
|
const SMDS_MeshNode* n2 = vecNewNodes[ iNext ]->first;
|
||||||
@ -3070,6 +3080,7 @@ static void makeWalls (SMESHDS_Mesh* aMesh,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
// create faces for all steps
|
// create faces for all steps
|
||||||
|
// if such a face has been already created by sweep of edge, assure that its orientation is OK
|
||||||
for ( iStep = 0; iStep < nbSteps; iStep++ ) {
|
for ( iStep = 0; iStep < nbSteps; iStep++ ) {
|
||||||
vTool.Set( *v );
|
vTool.Set( *v );
|
||||||
vTool.SetExternalNormal();
|
vTool.SetExternalNormal();
|
||||||
@ -3077,34 +3088,51 @@ static void makeWalls (SMESHDS_Mesh* aMesh,
|
|||||||
for ( ; ind != fInd.end(); ind++ ) {
|
for ( ; ind != fInd.end(); ind++ ) {
|
||||||
const SMDS_MeshNode** nodes = vTool.GetFaceNodes( *ind );
|
const SMDS_MeshNode** nodes = vTool.GetFaceNodes( *ind );
|
||||||
int nbn = vTool.NbFaceNodes( *ind );
|
int nbn = vTool.NbFaceNodes( *ind );
|
||||||
//switch ( vTool.NbFaceNodes( *ind ) ) {
|
|
||||||
switch ( nbn ) {
|
switch ( nbn ) {
|
||||||
case 3:
|
case 3: { ///// triangle
|
||||||
myLastCreatedElems.Append(aMesh->AddFace( nodes[ 0 ], nodes[ 1 ], nodes[ 2 ] )); break;
|
const SMDS_MeshFace * f = aMesh->FindFace( nodes[ 0 ], nodes[ 1 ], nodes[ 2 ]);
|
||||||
case 4:
|
if ( !f )
|
||||||
myLastCreatedElems.Append(aMesh->AddFace( nodes[ 0 ], nodes[ 1 ], nodes[ 2 ], nodes[ 3 ] )); break;
|
myLastCreatedElems.Append(aMesh->AddFace( nodes[ 0 ], nodes[ 1 ], nodes[ 2 ] ));
|
||||||
|
else if ( nodes[ 1 ] != f->GetNode( f->GetNodeIndex( nodes[ 0 ] ) + 1 ))
|
||||||
|
aMesh->ChangeElementNodes( f, nodes, nbn );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 4: { ///// quadrangle
|
||||||
|
const SMDS_MeshFace * f = aMesh->FindFace( nodes[ 0 ], nodes[ 1 ], nodes[ 2 ], nodes[ 3 ]);
|
||||||
|
if ( !f )
|
||||||
|
myLastCreatedElems.Append(aMesh->AddFace( nodes[ 0 ], nodes[ 1 ], nodes[ 2 ], nodes[ 3 ] ));
|
||||||
|
else if ( nodes[ 1 ] != f->GetNode( f->GetNodeIndex( nodes[ 0 ] ) + 1 ))
|
||||||
|
aMesh->ChangeElementNodes( f, nodes, nbn );
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
{
|
if( (*v)->IsQuadratic() ) {
|
||||||
if( (*v)->IsQuadratic() ) {
|
if(nbn==6) { /////// quadratic triangle
|
||||||
if(nbn==6) {
|
const SMDS_MeshFace * f = aMesh->FindFace( nodes[0], nodes[2], nodes[4],
|
||||||
|
nodes[1], nodes[3], nodes[5] );
|
||||||
|
if ( !f )
|
||||||
myLastCreatedElems.Append(aMesh->AddFace(nodes[0], nodes[2], nodes[4],
|
myLastCreatedElems.Append(aMesh->AddFace(nodes[0], nodes[2], nodes[4],
|
||||||
nodes[1], nodes[3], nodes[5])); break;
|
nodes[1], nodes[3], nodes[5]));
|
||||||
}
|
else if ( nodes[ 2 ] != f->GetNode( f->GetNodeIndex( nodes[ 0 ] ) + 1 ))
|
||||||
else {
|
aMesh->ChangeElementNodes( f, nodes, nbn );
|
||||||
myLastCreatedElems.Append(aMesh->AddFace(nodes[0], nodes[2], nodes[4], nodes[6],
|
|
||||||
nodes[1], nodes[3], nodes[5], nodes[7]));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else { /////// quadratic quadrangle
|
||||||
int nbPolygonNodes = vTool.NbFaceNodes( *ind );
|
const SMDS_MeshFace * f = aMesh->FindFace( nodes[0], nodes[2], nodes[4], nodes[6],
|
||||||
vector<const SMDS_MeshNode*> polygon_nodes (nbPolygonNodes);
|
nodes[1], nodes[3], nodes[5], nodes[7] );
|
||||||
for (int inode = 0; inode < nbPolygonNodes; inode++) {
|
if ( !f )
|
||||||
polygon_nodes[inode] = nodes[inode];
|
myLastCreatedElems.Append(aMesh->AddFace(nodes[0], nodes[2], nodes[4], nodes[6],
|
||||||
}
|
nodes[1], nodes[3], nodes[5], nodes[7]));
|
||||||
|
else if ( nodes[ 2 ] != f->GetNode( f->GetNodeIndex( nodes[ 0 ] ) + 1 ))
|
||||||
|
aMesh->ChangeElementNodes( f, nodes, nbn );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else { //////// polygon
|
||||||
|
vector<const SMDS_MeshNode*> polygon_nodes ( nodes, &nodes[nbn] );
|
||||||
|
const SMDS_MeshFace * f = aMesh->FindFace( polygon_nodes );
|
||||||
|
if ( !f )
|
||||||
myLastCreatedElems.Append(aMesh->AddPolygonalFace(polygon_nodes));
|
myLastCreatedElems.Append(aMesh->AddPolygonalFace(polygon_nodes));
|
||||||
}
|
else if ( nodes[ 1 ] != f->GetNode( f->GetNodeIndex( nodes[ 0 ] ) + 1 ))
|
||||||
break;
|
aMesh->ChangeElementNodes( f, nodes, nbn );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3136,36 +3164,29 @@ static void makeWalls (SMESHDS_Mesh* aMesh,
|
|||||||
myLastCreatedElems.Append(aMesh->AddFace( nodes[ 0 ], nodes[ 1 ], nodes[ 2 ], nodes[ 3 ] ));
|
myLastCreatedElems.Append(aMesh->AddFace( nodes[ 0 ], nodes[ 1 ], nodes[ 2 ], nodes[ 3 ] ));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
{
|
if(itElem->second.back()->IsQuadratic()) {
|
||||||
if(itElem->second.back()->IsQuadratic()) {
|
if(nbn==6) {
|
||||||
if(nbn==6) {
|
if (!hasFreeLinks ||
|
||||||
if (!hasFreeLinks ||
|
!aMesh->FindFace(nodes[0], nodes[2], nodes[4],
|
||||||
!aMesh->FindFace(nodes[0], nodes[2], nodes[4],
|
nodes[1], nodes[3], nodes[5]) ) {
|
||||||
nodes[1], nodes[3], nodes[5]) ) {
|
myLastCreatedElems.Append(aMesh->AddFace(nodes[0], nodes[2], nodes[4],
|
||||||
myLastCreatedElems.Append(aMesh->AddFace(nodes[0], nodes[2], nodes[4],
|
nodes[1], nodes[3], nodes[5]));
|
||||||
nodes[1], nodes[3], nodes[5])); break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else { // nbn==8
|
|
||||||
if (!hasFreeLinks ||
|
|
||||||
!aMesh->FindFace(nodes[0], nodes[2], nodes[4], nodes[6],
|
|
||||||
nodes[1], nodes[3], nodes[5], nodes[7]) )
|
|
||||||
myLastCreatedElems.Append(aMesh->AddFace(nodes[0], nodes[2], nodes[4], nodes[6],
|
|
||||||
nodes[1], nodes[3], nodes[5], nodes[7]));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else { // nbn==8
|
||||||
int nbPolygonNodes = lastVol.NbFaceNodes( iF );
|
if (!hasFreeLinks ||
|
||||||
vector<const SMDS_MeshNode*> polygon_nodes (nbPolygonNodes);
|
!aMesh->FindFace(nodes[0], nodes[2], nodes[4], nodes[6],
|
||||||
for (int inode = 0; inode < nbPolygonNodes; inode++) {
|
nodes[1], nodes[3], nodes[5], nodes[7]) )
|
||||||
polygon_nodes[inode] = nodes[inode];
|
myLastCreatedElems.Append(aMesh->AddFace(nodes[0], nodes[2], nodes[4], nodes[6],
|
||||||
}
|
nodes[1], nodes[3], nodes[5], nodes[7]));
|
||||||
if (!hasFreeLinks || !aMesh->FindFace(polygon_nodes))
|
|
||||||
myLastCreatedElems.Append(aMesh->AddPolygonalFace(polygon_nodes));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
else {
|
||||||
}
|
vector<const SMDS_MeshNode*> polygon_nodes ( nodes, &nodes[nbn] );
|
||||||
|
if (!hasFreeLinks || !aMesh->FindFace(polygon_nodes))
|
||||||
|
myLastCreatedElems.Append(aMesh->AddPolygonalFace(polygon_nodes));
|
||||||
|
}
|
||||||
|
} // switch
|
||||||
}
|
}
|
||||||
} // loop on swept elements
|
} // loop on swept elements
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user