mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-02-05 00:24:17 +05:00
0021270: EDF 1870 SMESH: ExtrusionAlongPathObjX + Merge nodes remove 3D elements
fix MergeNode() and makeWalls()
This commit is contained in:
parent
1dee10aec7
commit
f8c598aa16
@ -4019,93 +4019,111 @@ void SMESH_MeshEditor::makeWalls (TNodeOfNodeListMap & mapNewNodes,
|
|||||||
for ( int iStep = 0; iStep < nbSteps; iStep++ ) {
|
for ( int iStep = 0; iStep < nbSteps; iStep++ ) {
|
||||||
vTool.Set( *v );
|
vTool.Set( *v );
|
||||||
vTool.SetExternalNormal();
|
vTool.SetExternalNormal();
|
||||||
|
const int nextShift = vTool.IsForward() ? +1 : -1;
|
||||||
list< int >::iterator ind = freeInd.begin();
|
list< int >::iterator ind = freeInd.begin();
|
||||||
list< const SMDS_MeshElement* >::iterator srcEdge = srcEdges.begin();
|
list< const SMDS_MeshElement* >::iterator srcEdge = srcEdges.begin();
|
||||||
for ( ; ind != freeInd.end(); ++ind, ++srcEdge ) // loop on free faces
|
for ( ; ind != freeInd.end(); ++ind, ++srcEdge ) // loop on free faces
|
||||||
{
|
{
|
||||||
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 ( nbn ) {
|
if ( ! (*v)->IsPoly() )
|
||||||
case 3: { ///// triangle
|
switch ( nbn ) {
|
||||||
const SMDS_MeshFace * f = aMesh->FindFace( nodes[ 0 ], nodes[ 1 ], nodes[ 2 ]);
|
case 3: { ///// triangle
|
||||||
if ( !f )
|
const SMDS_MeshFace * f = aMesh->FindFace( nodes[ 0 ], nodes[ 1 ], nodes[ 2 ]);
|
||||||
myLastCreatedElems.Append(aMesh->AddFace( nodes[ 0 ], nodes[ 1 ], nodes[ 2 ] ));
|
if ( !f ||
|
||||||
else if ( nodes[ 1 ] != f->GetNodeWrap( f->GetNodeIndex( nodes[ 0 ] ) + 1 ))
|
nodes[ 1 ] != f->GetNodeWrap( f->GetNodeIndex( nodes[ 0 ]) + nextShift ))
|
||||||
{
|
{
|
||||||
myLastCreatedElems.Append(aMesh->AddFace( nodes[ 0 ], nodes[ 1 ], nodes[ 2 ] ));
|
const SMDS_MeshNode* newOrder[3] = { nodes[ 1 - nextShift ],
|
||||||
aMesh->RemoveElement(f);
|
nodes[ 1 ],
|
||||||
}
|
nodes[ 1 + nextShift ] };
|
||||||
break;
|
if ( f )
|
||||||
}
|
aMesh->ChangeElementNodes( f, &newOrder[0], nbn );
|
||||||
case 4: { ///// quadrangle
|
else
|
||||||
const SMDS_MeshFace * f = aMesh->FindFace( nodes[ 0 ], nodes[ 1 ], nodes[ 2 ], nodes[ 3 ]);
|
myLastCreatedElems.Append(aMesh->AddFace( newOrder[ 0 ], newOrder[ 1 ],
|
||||||
if ( !f )
|
newOrder[ 2 ] ));
|
||||||
myLastCreatedElems.Append(aMesh->AddFace( nodes[ 0 ], nodes[ 1 ], nodes[ 2 ], nodes[ 3 ] ));
|
|
||||||
else if ( nodes[ 1 ] != f->GetNodeWrap( f->GetNodeIndex( nodes[ 0 ] ) + 1 ))
|
|
||||||
{
|
|
||||||
myLastCreatedElems.Append(aMesh->AddFace( nodes[ 0 ], nodes[ 1 ], nodes[ 2 ], nodes[ 3 ] ));
|
|
||||||
aMesh->RemoveElement(f);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
if( (*v)->IsQuadratic() ) {
|
|
||||||
if(nbn==6) { /////// quadratic triangle
|
|
||||||
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],
|
|
||||||
nodes[1], nodes[3], nodes[5]));
|
|
||||||
}
|
|
||||||
else if ( nodes[ 2 ] != f->GetNodeWrap( f->GetNodeIndex( nodes[ 0 ] ) + 1 )) {
|
|
||||||
const SMDS_MeshNode** tmpnodes = new const SMDS_MeshNode*[6];
|
|
||||||
tmpnodes[0] = nodes[0];
|
|
||||||
tmpnodes[1] = nodes[2];
|
|
||||||
tmpnodes[2] = nodes[4];
|
|
||||||
tmpnodes[3] = nodes[1];
|
|
||||||
tmpnodes[4] = nodes[3];
|
|
||||||
tmpnodes[5] = nodes[5];
|
|
||||||
myLastCreatedElems.Append(aMesh->AddFace(nodes[0], nodes[2], nodes[4],
|
|
||||||
nodes[1], nodes[3], nodes[5]));
|
|
||||||
aMesh->RemoveElement(f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else { /////// quadratic quadrangle
|
|
||||||
const SMDS_MeshFace * f = aMesh->FindFace( nodes[0], nodes[2], nodes[4], nodes[6],
|
|
||||||
nodes[1], nodes[3], nodes[5], nodes[7] );
|
|
||||||
if ( !f ) {
|
|
||||||
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->GetNodeWrap( f->GetNodeIndex( nodes[ 0 ] ) + 1 )) {
|
|
||||||
const SMDS_MeshNode** tmpnodes = new const SMDS_MeshNode*[8];
|
|
||||||
tmpnodes[0] = nodes[0];
|
|
||||||
tmpnodes[1] = nodes[2];
|
|
||||||
tmpnodes[2] = nodes[4];
|
|
||||||
tmpnodes[3] = nodes[6];
|
|
||||||
tmpnodes[4] = nodes[1];
|
|
||||||
tmpnodes[5] = nodes[3];
|
|
||||||
tmpnodes[6] = nodes[5];
|
|
||||||
tmpnodes[7] = nodes[7];
|
|
||||||
myLastCreatedElems.Append(aMesh->AddFace(nodes[0], nodes[2], nodes[4], nodes[6],
|
|
||||||
nodes[1], nodes[3], nodes[5], nodes[7]));
|
|
||||||
aMesh->RemoveElement(f);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else { //////// polygon
|
case 4: { ///// quadrangle
|
||||||
vector<const SMDS_MeshNode*> polygon_nodes ( nodes, &nodes[nbn] );
|
const SMDS_MeshFace * f =
|
||||||
const SMDS_MeshFace * f = aMesh->FindFace( polygon_nodes );
|
aMesh->FindFace( nodes[ 0 ], nodes[ 1 ], nodes[ 2 ], nodes[ 3 ]);
|
||||||
if ( !f )
|
if ( !f ||
|
||||||
|
nodes[ 1 ] != f->GetNodeWrap( f->GetNodeIndex( nodes[ 0 ]) + nextShift ))
|
||||||
|
{
|
||||||
|
const SMDS_MeshNode* newOrder[4] = { nodes[ 0 ], nodes[ 2-nextShift ],
|
||||||
|
nodes[ 2 ], nodes[ 2+nextShift ] };
|
||||||
|
if ( f )
|
||||||
|
aMesh->ChangeElementNodes( f, &newOrder[0], nbn );
|
||||||
|
else
|
||||||
|
myLastCreatedElems.Append(aMesh->AddFace( newOrder[ 0 ], newOrder[ 1 ],
|
||||||
|
newOrder[ 2 ], newOrder[ 3 ]));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 6: { /////// quadratic triangle
|
||||||
|
const SMDS_MeshFace * f = aMesh->FindFace( nodes[0], nodes[2], nodes[4],
|
||||||
|
nodes[1], nodes[3], nodes[5] );
|
||||||
|
if ( !f ||
|
||||||
|
nodes[2] != f->GetNodeWrap( f->GetNodeIndex( nodes[0] ) + 2*nextShift ))
|
||||||
|
{
|
||||||
|
const SMDS_MeshNode* newOrder[6] = { nodes[2 - 2*nextShift],
|
||||||
|
nodes[2],
|
||||||
|
nodes[2 + 2*nextShift],
|
||||||
|
nodes[3 - 2*nextShift],
|
||||||
|
nodes[3],
|
||||||
|
nodes[3 + 2*nextShift]};
|
||||||
|
if ( f )
|
||||||
|
aMesh->ChangeElementNodes( f, &newOrder[0], nbn );
|
||||||
|
else
|
||||||
|
myLastCreatedElems.Append(aMesh->AddFace( newOrder[ 0 ],
|
||||||
|
newOrder[ 1 ],
|
||||||
|
newOrder[ 2 ],
|
||||||
|
newOrder[ 3 ],
|
||||||
|
newOrder[ 4 ],
|
||||||
|
newOrder[ 5 ] ));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: /////// quadratic quadrangle
|
||||||
|
const SMDS_MeshFace * f = aMesh->FindFace( nodes[0], nodes[2], nodes[4], nodes[6],
|
||||||
|
nodes[1], nodes[3], nodes[5], nodes[7] );
|
||||||
|
if ( !f ||
|
||||||
|
nodes[ 2 ] != f->GetNodeWrap( f->GetNodeIndex( nodes[ 0 ] ) + 2*nextShift ))
|
||||||
|
{
|
||||||
|
const SMDS_MeshNode* newOrder[8] = { nodes[0],
|
||||||
|
nodes[4 - 2*nextShift],
|
||||||
|
nodes[4],
|
||||||
|
nodes[4 + 2*nextShift],
|
||||||
|
nodes[1],
|
||||||
|
nodes[5 - 2*nextShift],
|
||||||
|
nodes[5],
|
||||||
|
nodes[5 + 2*nextShift] };
|
||||||
|
if ( f )
|
||||||
|
aMesh->ChangeElementNodes( f, &newOrder[0], nbn );
|
||||||
|
else
|
||||||
|
myLastCreatedElems.Append(aMesh->AddFace(newOrder[ 0 ], newOrder[ 1 ],
|
||||||
|
newOrder[ 2 ], newOrder[ 3 ],
|
||||||
|
newOrder[ 4 ], newOrder[ 5 ],
|
||||||
|
newOrder[ 6 ], newOrder[ 7 ]));
|
||||||
|
}
|
||||||
|
} // switch ( nbn )
|
||||||
|
|
||||||
|
else { //////// polygon
|
||||||
|
|
||||||
|
vector<const SMDS_MeshNode*> polygon_nodes ( nodes, &nodes[nbn] );
|
||||||
|
const SMDS_MeshFace * f = aMesh->FindFace( polygon_nodes );
|
||||||
|
if ( !f ||
|
||||||
|
nodes[ 1 ] != f->GetNodeWrap( f->GetNodeIndex( nodes[ 0 ] ) + nextShift ))
|
||||||
|
{
|
||||||
|
if ( !vTool.IsForward() )
|
||||||
|
std::reverse( polygon_nodes.begin(), polygon_nodes.end());
|
||||||
|
if ( f )
|
||||||
|
aMesh->ChangeElementNodes( f, &polygon_nodes[0], nbn );
|
||||||
|
else
|
||||||
myLastCreatedElems.Append(aMesh->AddPolygonalFace(polygon_nodes));
|
myLastCreatedElems.Append(aMesh->AddPolygonalFace(polygon_nodes));
|
||||||
else if ( nodes[ 1 ] != f->GetNodeWrap( f->GetNodeIndex( nodes[ 0 ] ) + 1 ))
|
|
||||||
{
|
|
||||||
// TODO problem ChangeElementNodes : not the same number of nodes, not the same type
|
|
||||||
MESSAGE("ChangeElementNodes");
|
|
||||||
aMesh->ChangeElementNodes( f, nodes, nbn );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while ( srcElements.Length() < myLastCreatedElems.Length() )
|
while ( srcElements.Length() < myLastCreatedElems.Length() )
|
||||||
srcElements.Append( *srcEdge );
|
srcElements.Append( *srcEdge );
|
||||||
|
|
||||||
@ -4114,8 +4132,9 @@ void SMESH_MeshEditor::makeWalls (TNodeOfNodeListMap & mapNewNodes,
|
|||||||
// go to the next volume
|
// go to the next volume
|
||||||
iVol = 0;
|
iVol = 0;
|
||||||
while ( iVol++ < nbVolumesByStep ) v++;
|
while ( iVol++ < nbVolumesByStep ) v++;
|
||||||
}
|
|
||||||
}
|
} // loop on steps
|
||||||
|
} // loop on volumes of one step
|
||||||
} // sweep free links into faces
|
} // sweep free links into faces
|
||||||
|
|
||||||
// Make a ceiling face with a normal external to a volume
|
// Make a ceiling face with a normal external to a volume
|
||||||
@ -7368,8 +7387,11 @@ void SMESH_MeshEditor::MergeNodes (TListOfListOfNodes & theGroupsOfNodes)
|
|||||||
}
|
}
|
||||||
curNodes[ iCur ] = n;
|
curNodes[ iCur ] = n;
|
||||||
bool isUnique = nodeSet.insert( n ).second;
|
bool isUnique = nodeSet.insert( n ).second;
|
||||||
if ( isUnique )
|
if ( isUnique ) {
|
||||||
uniqueNodes[ iUnique++ ] = n;
|
uniqueNodes[ iUnique++ ] = n;
|
||||||
|
if ( nbRepl && iRepl[ nbRepl-1 ] == iCur )
|
||||||
|
--nbRepl; // n do not stick to a node of the elem
|
||||||
|
}
|
||||||
iCur++;
|
iCur++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7481,7 +7503,7 @@ void SMESH_MeshEditor::MergeNodes (TListOfListOfNodes & theGroupsOfNodes)
|
|||||||
}
|
}
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
} // poly element
|
||||||
|
|
||||||
// Regular elements
|
// Regular elements
|
||||||
// TODO not all the possible cases are solved. Find something more generic?
|
// TODO not all the possible cases are solved. Find something more generic?
|
||||||
@ -7654,8 +7676,8 @@ void SMESH_MeshEditor::MergeNodes (TListOfListOfNodes & theGroupsOfNodes)
|
|||||||
isOk = false;
|
isOk = false;
|
||||||
SMDS_VolumeTool hexa (elem);
|
SMDS_VolumeTool hexa (elem);
|
||||||
hexa.SetExternalNormal();
|
hexa.SetExternalNormal();
|
||||||
if ( nbUniqueNodes == 4 && nbRepl == 6 ) {
|
if ( nbUniqueNodes == 4 && nbRepl == 4 ) {
|
||||||
//////////////////////// ---> tetrahedron
|
//////////////////////// HEX ---> 1 tetrahedron
|
||||||
for ( int iFace = 0; iFace < 6; iFace++ ) {
|
for ( int iFace = 0; iFace < 6; iFace++ ) {
|
||||||
const int *ind = hexa.GetFaceNodesIndices( iFace ); // indices of face nodes
|
const int *ind = hexa.GetFaceNodesIndices( iFace ); // indices of face nodes
|
||||||
if (curNodes[ind[ 0 ]] == curNodes[ind[ 1 ]] &&
|
if (curNodes[ind[ 0 ]] == curNodes[ind[ 1 ]] &&
|
||||||
@ -7665,12 +7687,9 @@ void SMESH_MeshEditor::MergeNodes (TListOfListOfNodes & theGroupsOfNodes)
|
|||||||
int iOppFace = hexa.GetOppFaceIndex( iFace );
|
int iOppFace = hexa.GetOppFaceIndex( iFace );
|
||||||
ind = hexa.GetFaceNodesIndices( iOppFace );
|
ind = hexa.GetFaceNodesIndices( iOppFace );
|
||||||
int nbStick = 0;
|
int nbStick = 0;
|
||||||
iUnique = 2; // reverse a tetrahedron bottom
|
|
||||||
for ( iCur = 0; iCur < 4 && nbStick < 2; iCur++ ) {
|
for ( iCur = 0; iCur < 4 && nbStick < 2; iCur++ ) {
|
||||||
if ( curNodes[ind[ iCur ]] == curNodes[ind[ iCur + 1 ]] )
|
if ( curNodes[ind[ iCur ]] == curNodes[ind[ iCur + 1 ]] )
|
||||||
nbStick++;
|
nbStick++;
|
||||||
else if ( iUnique >= 0 )
|
|
||||||
uniqueNodes[ iUnique-- ] = curNodes[ind[ iCur ]];
|
|
||||||
}
|
}
|
||||||
if ( nbStick == 1 ) {
|
if ( nbStick == 1 ) {
|
||||||
// ... and the opposite one - into a triangle.
|
// ... and the opposite one - into a triangle.
|
||||||
@ -7683,6 +7702,45 @@ void SMESH_MeshEditor::MergeNodes (TListOfListOfNodes & theGroupsOfNodes)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if ( nbUniqueNodes == 6 && nbRepl == 2 ) {
|
||||||
|
//////////////////////// HEX ---> 1 prism
|
||||||
|
int nbTria = 0, iTria[3];
|
||||||
|
const int *ind; // indices of face nodes
|
||||||
|
// look for triangular faces
|
||||||
|
for ( int iFace = 0; iFace < 6 && nbTria < 3; iFace++ ) {
|
||||||
|
ind = hexa.GetFaceNodesIndices( iFace );
|
||||||
|
TIDSortedNodeSet faceNodes;
|
||||||
|
for ( iCur = 0; iCur < 4; iCur++ )
|
||||||
|
faceNodes.insert( curNodes[ind[iCur]] );
|
||||||
|
if ( faceNodes.size() == 3 )
|
||||||
|
iTria[ nbTria++ ] = iFace;
|
||||||
|
}
|
||||||
|
// check if triangles are opposite
|
||||||
|
if ( nbTria == 2 && iTria[0] == hexa.GetOppFaceIndex( iTria[1] ))
|
||||||
|
{
|
||||||
|
isOk = true;
|
||||||
|
// set nodes of the bottom triangle
|
||||||
|
ind = hexa.GetFaceNodesIndices( iTria[ 0 ]);
|
||||||
|
vector<int> indB;
|
||||||
|
for ( iCur = 0; iCur < 4; iCur++ )
|
||||||
|
if ( ind[iCur] != iRepl[0] && ind[iCur] != iRepl[1])
|
||||||
|
indB.push_back( ind[iCur] );
|
||||||
|
if ( !hexa.IsForward() )
|
||||||
|
std::swap( indB[0], indB[2] );
|
||||||
|
for ( iCur = 0; iCur < 3; iCur++ )
|
||||||
|
uniqueNodes[ iCur ] = curNodes[indB[iCur]];
|
||||||
|
// set nodes of the top triangle
|
||||||
|
const int *indT = hexa.GetFaceNodesIndices( iTria[ 1 ]);
|
||||||
|
for ( iCur = 0; iCur < 3; ++iCur )
|
||||||
|
for ( int j = 0; j < 4; ++j )
|
||||||
|
if ( hexa.IsLinked( indB[ iCur ], indT[ j ] ))
|
||||||
|
{
|
||||||
|
uniqueNodes[ iCur + 3 ] = curNodes[ indT[ j ]];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
else if (nbUniqueNodes == 5 && nbRepl == 4 ) {
|
else if (nbUniqueNodes == 5 && nbRepl == 4 ) {
|
||||||
//////////////////// HEXAHEDRON ---> 2 tetrahedrons
|
//////////////////// HEXAHEDRON ---> 2 tetrahedrons
|
||||||
for ( int iFace = 0; iFace < 6; iFace++ ) {
|
for ( int iFace = 0; iFace < 6; iFace++ ) {
|
||||||
@ -7820,6 +7878,10 @@ void SMESH_MeshEditor::MergeNodes (TListOfListOfNodes & theGroupsOfNodes)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // if ( nbUniqueNodes == 6 && nbRepl == 4 )
|
} // if ( nbUniqueNodes == 6 && nbRepl == 4 )
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MESSAGE("MergeNodes() removes hexahedron "<< elem);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
} // HEXAHEDRON
|
} // HEXAHEDRON
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user