//=======================================================================
//function : Reorient
-//purpose : Reverse the normal of theFace
-// Return false if theFace is null
+//purpose : Reverse theElement orientation
//=======================================================================
-bool SMESH_MeshEditor::Reorient (const SMDS_MeshElement * theFace)
+bool SMESH_MeshEditor::Reorient (const SMDS_MeshElement * theElem)
{
- if (!theFace) return false;
- const SMDS_FaceOfNodes* F = dynamic_cast<const SMDS_FaceOfNodes*>( theFace );
- if (!F) return false;
-
- const SMDS_MeshNode* aNodes [4], *tmpNode;
- int i = 0;
- SMDS_ElemIteratorPtr it = theFace->nodesIterator();
- while ( it->more() )
- aNodes[ i++ ] = static_cast<const SMDS_MeshNode*>( it->next() );
-
- // exchange nodes with indeces 0 and 2
- tmpNode = aNodes[ 0 ];
- aNodes[ 0 ] = aNodes[ 2 ];
- aNodes[ 2 ] = tmpNode;
-
- //MESSAGE( theFace );
-
- GetMeshDS()->ChangeElementNodes( theFace, aNodes, theFace->NbNodes() );
+ if (!theElem)
+ return false;
+ SMDS_ElemIteratorPtr it = theElem->nodesIterator();
+ if ( !it || !it->more() )
+ return false;
- //MESSAGE( theFace );
+ switch ( theElem->GetType() ) {
+
+ case SMDSAbs_Edge:
+ case SMDSAbs_Face:
+ {
+ int i = theElem->NbNodes();
+ vector<const SMDS_MeshNode*> aNodes( i );
+ while ( it->more() )
+ aNodes[ --i ]= static_cast<const SMDS_MeshNode*>( it->next() );
+ return GetMeshDS()->ChangeElementNodes( theElem, &aNodes[0], theElem->NbNodes() );
+ }
+ case SMDSAbs_Volume:
+ {
+ SMDS_VolumeTool vTool;
+ if ( !vTool.Set( theElem ))
+ return false;
+ vTool.Inverse();
+ return GetMeshDS()->ChangeElementNodes( theElem, vTool.GetNodes(), vTool.NbNodes() );
+ }
+ default:;
+ }
- return true;
+ return false;
}
//=======================================================================
nextNod[ i0 ], nextNod[ 1 ], nextNod[ i2 ] );
else if ( nbSame == 1 ) // --- pyramid
- aNewElem = aMesh->AddVolume (prevNod[ iAfterSame ], prevNod[ iBeforeSame ],
- nextNod[ iBeforeSame ], nextNod[ iAfterSame ],
+ aNewElem = aMesh->AddVolume (prevNod[ iBeforeSame ], prevNod[ iAfterSame ],
+ nextNod[ iAfterSame ], nextNod[ iBeforeSame ],
nextNod[ iSameNode ]);
else // 2 same nodes: --- tetrahedron
else if ( nbSame == 1 ) // --- pyramid + pentahedron
{
- aNewElem = aMesh->AddVolume (prevNod[ iAfterSame ], prevNod[ iBeforeSame ],
- nextNod[ iBeforeSame ], nextNod[ iAfterSame ],
+ aNewElem = aMesh->AddVolume (prevNod[ iBeforeSame ], prevNod[ iAfterSame ],
+ nextNod[ iAfterSame ], nextNod[ iBeforeSame ],
nextNod[ iSameNode ]);
newElems.push_back( aNewElem );
- aNewElem = aMesh->AddVolume (prevNod[ iBeforeSame ], prevNod[ iOpposSame ],
- prevNod[ iAfterSame ], nextNod[ iBeforeSame ],
- nextNod[ iOpposSame ], nextNod[ iAfterSame ] );
+ aNewElem = aMesh->AddVolume (prevNod[ iAfterSame ], prevNod[ iOpposSame ],
+ prevNod[ iBeforeSame ], nextNod[ iAfterSame ],
+ nextNod[ iOpposSame ], nextNod[ iBeforeSame ] );
}
else if ( nbSame == 2 ) // pentahedron
{
if ( prevNod[ iBeforeSame ] == nextNod[ iBeforeSame ] )
// iBeforeSame is same too
- aNewElem = aMesh->AddVolume (prevNod[ iOpposSame ], prevNod[ iBeforeSame ],
- nextNod[ iOpposSame ], prevNod[ iAfterSame ],
- prevNod[ iSameNode ], nextNod[ iAfterSame ]);
+ aNewElem = aMesh->AddVolume (prevNod[ iBeforeSame ], prevNod[ iOpposSame ],
+ nextNod[ iOpposSame ], prevNod[ iSameNode ],
+ prevNod[ iAfterSame ], nextNod[ iAfterSame ]);
else
// iAfterSame is same too
- aNewElem = aMesh->AddVolume (prevNod[ iBeforeSame ], prevNod[ iSameNode ],
- nextNod[ iBeforeSame ], prevNod[ iOpposSame ],
- prevNod[ iAfterSame ], nextNod[ iOpposSame ]);
+ aNewElem = aMesh->AddVolume (prevNod[ iSameNode ], prevNod[ iBeforeSame ],
+ nextNod[ iBeforeSame ], prevNod[ iAfterSame ],
+ prevNod[ iOpposSame ], nextNod[ iOpposSame ]);
}
break;
}
if ( theHasAngles ) {
aItD = theAngles.begin();
- for ( j=0; (aItD != theAngles.end()) && (j<aNbTP); ++aItD, ++j ) {
+ for ( j=1; (aItD != theAngles.end()) && (j<aNbTP); ++aItD, ++j ) {
aAngle = *aItD;
aAngles[j] = aAngle;
}
set<const SMDS_MeshElement*> elemSet, avoidSet;
if ( elem )
avoidSet.insert ( elem );
- SMESH_MeshEditor::FindFaceInSet( n1, n2, elemSet, avoidSet );
+ return SMESH_MeshEditor::FindFaceInSet( n1, n2, elemSet, avoidSet );
}
//=======================================================================