PAL12398. Fix "walls" creation when sweeping both 1D + 2D elements

This commit is contained in:
eap 2006-05-26 09:03:02 +00:00
parent 45bfff6b5d
commit 0d350bc878

View File

@ -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
} }