From 811a7a4c176887c38fcd93e53b1822ef60981c6b Mon Sep 17 00:00:00 2001 From: eap Date: Mon, 11 Aug 2014 17:30:26 +0400 Subject: [PATCH] 022484: EDF 2304 SMESH: Reorient a group of faces regarding to a volume --- .../examples/transforming_meshes_ex13.py | 19 +- .../gui/SMESH/images/reorient_2d_face.png | Bin 20186 -> 19058 bytes .../gui/SMESH/images/reorient_2d_point.png | Bin 20814 -> 19112 bytes .../gui/SMESH/images/reorient_2d_volume.png | Bin 0 -> 18658 bytes doc/salome/gui/SMESH/input/reorient_faces.doc | 71 +++++--- idl/SMESH_MeshEditor.idl | 13 +- resources/CMakeLists.txt | 1 + resources/reorient_faces_volume.png | Bin 0 -> 355 bytes src/SMESH/SMESH_MeshEditor.cxx | 86 ++++++++++ src/SMESH/SMESH_MeshEditor.hxx | 6 + src/SMESHGUI/SMESHGUI_ReorientFacesDlg.cxx | 162 ++++++++++++++---- src/SMESHGUI/SMESHGUI_ReorientFacesDlg.h | 7 +- src/SMESHGUI/SMESH_images.ts | 4 + src/SMESHGUI/SMESH_msg_en.ts | 24 ++- src/SMESH_I/SMESH_2smeshpy.cxx | 2 +- src/SMESH_I/SMESH_MeshEditor_i.cxx | 51 +++++- src/SMESH_I/SMESH_MeshEditor_i.hxx | 12 ++ src/SMESH_SWIG/smeshBuilder.py | 31 ++++ 18 files changed, 419 insertions(+), 70 deletions(-) create mode 100644 doc/salome/gui/SMESH/images/reorient_2d_volume.png create mode 100644 resources/reorient_faces_volume.png diff --git a/doc/salome/examples/transforming_meshes_ex13.py b/doc/salome/examples/transforming_meshes_ex13.py index fb56273ba..37a3f5eed 100644 --- a/doc/salome/examples/transforming_meshes_ex13.py +++ b/doc/salome/examples/transforming_meshes_ex13.py @@ -1,4 +1,4 @@ -# Reorient faces by vector +# Reorient faces import salome @@ -52,3 +52,20 @@ mesh.Reorient2D( group, smesh.MakeDirStruct( -10, 1, 10 ), [0,0,0]) # # FaceOrPoint - a SMESH.PointStruct structure mesh.Reorient2D( localAlgo.GetSubMesh().GetIDs(), [10,1,0], SMESH.PointStruct(0,0,0)) + + +# Use Reorient2DBy3D() to orient faces of 2 geom faces to have their normal pointing inside volumes + +mesh3D = smesh.Mesh( box, '3D mesh') +mesh3D.AutomaticHexahedralization(0.5) +group0 = mesh3D.Group( faces[0] ) +group1 = mesh3D.Group( faces[1] ) + +# pass group0 and ids of faces of group1 to inverse +nbRev = mesh3D.Reorient2DBy3D([ group0, group1.GetIDs() ], mesh3D, theOutsideNormal=False) +print "Nb reoriented faces:", nbRev + +# orient the reversed faces back +nbRev = mesh3D.Reorient2DBy3D( mesh3D, mesh3D, theOutsideNormal=True) +print "Nb re-reoriented faces:", nbRev + diff --git a/doc/salome/gui/SMESH/images/reorient_2d_face.png b/doc/salome/gui/SMESH/images/reorient_2d_face.png index b143ac4ebad635b8cf76bca63c524afa7a0b8cd9..0407fafed71f8a89b63d6fa2f20add9b8c6b435c 100644 GIT binary patch literal 19058 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 literal 20186 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 NO*juCw!tm*;=iMLc3A)b diff --git a/doc/salome/gui/SMESH/images/reorient_2d_point.png b/doc/salome/gui/SMESH/images/reorient_2d_point.png index 844ac09ef384e2f13fd71cf4acc5c6f207ae7b8f..8440c9137db18c979f581b97606e7f27e26b62aa 100644 GIT binary patch literal 19112 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 literal 20814 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 R5Z*htOpGiIs|?QF`Y)cer(e-7O&*-` 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/SMESH/input/reorient_faces.doc b/doc/salome/gui/SMESH/input/reorient_faces.doc index db408ef08..519da7ef1 100644 --- a/doc/salome/gui/SMESH/input/reorient_faces.doc +++ b/doc/salome/gui/SMESH/input/reorient_faces.doc @@ -1,49 +1,66 @@ /*! -\page reorient_faces_page Reorient faces by vector +\page reorient_faces_page Reorient faces -\n This operation allows changing orientation of a set of neighboring -faces. The desired orientation is defined by a vector. Since the direction -of face normals in the set can be even opposite, it is necessary to -specify a control face whose normal will be compared with the vector. This -face can be either specified explicitly or found by proximity to -a given point. +\n This operation allows changing orientation of faces two ways. +
    +
  1. To reorient a set of neighboring faces by defining the desired + orientation by a vector.
    Since the direction of face normals in + the set can be even opposite, it is necessary to specify a control + face whose normal will be compared with the vector. This face can be + either
      +
    • found by proximity to a given point or
    • +
    • specified explicitly.
    • +
  2. +
  3. To reorient faces with relation to adjacent volumes.
  4. +
Orientation of a face is changed by reverting the order of its nodes. To change orientation of faces:
    -
  1. In the \b Modification menu select Reorient faces by - vector item or click Reorient faces by - vector button in the toolbar. +
  2. In the \b Modification menu select Reorient faces + item or click Reorient faces button in the toolbar.
    \image html reorient_faces_face.png -"Reorient faces by vector" button +"Reorient faces" button
    The following dialog box will appear:
    -\image html reorient_2d_point.png -\image html reorient_2d_face.png +\image html reorient_2d_point.png "First mode: to reorient adjacent faces according to a vector. The control face is found by point." +
    +\image html reorient_2d_face.png "Second mode: to reorient adjacent faces according to a vector. The control face is explicitly given." +
    +\image html reorient_2d_volume.png "Third mode: to reorient faces with relation to adjacent volumes."
  3. In this dialog
      -
    • Specify the way of selection of the control face: by point or - explicitly.
    • -
    • Select the \b Object (mesh, sub-mesh or a group of faces) containing faces to reorient in the Object Browser or in the 3D Viewer.
    • -
    • Specify the coordinates of the \b Point by which the control face - will be found or of the control \b Face itself. You can easy specify the \b - Point by either picking a node in the 3D Viewer or selecting a vertex - in the Object Browser. It is possible to pick the \b Face by mouse in - the 3D Viewer or enter its ID.
    • -
    • Set up the \b Direction vector to be compared with the normal of the - control face. If you pick a node in the 3D Viewer then the \b Direction - vector will go from the coordinate system origin to the selected node. - If you pick two nodes (holding Shift button) then the \b Direction vector - will go from the first to the second node.
    • +
    • Specify either of the tree operation modes.
    • +
    • Select the \b Object (mesh, sub-mesh or group) + containing faces to reorient, in the Object Browser or in the 3D + Viewer.
    • +
    • To reorient according to vector:
        +
      • Specify the coordinates of the \b Point by which the control face + will be found or the control \b Face itself. You can easy specify the \b + Point by either picking a node in the 3D Viewer or selecting a vertex + in the Object Browser. It is possible to pick the \b Face by mouse in + the 3D Viewer or enter its ID.
      • +
      • Set up the \b Direction vector to be compared with the normal of the + control face. If you pick a node in the 3D Viewer then the \b Direction + vector will go from the coordinate system origin to the selected node. + If you pick two nodes (holding Shift button) then the \b Direction vector + will go from the first to the second node.
    • +
    • To reorient according to volumes:
        +
      • Select an object (mesh, sub-mesh or group) containing + reference \b Volumes, in the Object Browser or in the 3D + Viewer.
      • +
      • Specify whether face normals should point outside or inside + the reference volumes using Face normal outside volume + check-box.
  4. @@ -51,6 +68,6 @@ The following dialog box will appear:

See Also a sample TUI Script of a -\ref tui_reorient_faces "Reorient faces by vector" operation. +\ref tui_reorient_faces "Reorient faces" operation. */ diff --git a/idl/SMESH_MeshEditor.idl b/idl/SMESH_MeshEditor.idl index 397efff44..293c8c8de 100644 --- a/idl/SMESH_MeshEditor.idl +++ b/idl/SMESH_MeshEditor.idl @@ -238,12 +238,23 @@ module SMESH * \param theFace - ID of face whose orientation is checked. * It can be < 1 then \a thePoint is used to find a face. * \param thePoint - is used to find a face if \a theFace < 1. - * \return number of reoriented elements. + * \return number of reoriented faces. */ long Reorient2D(in SMESH_IDSource the2Dgroup, in DirStruct theDirection, in long theFace, in PointStruct thePoint) raises (SALOME::SALOME_Exception); + /*! + * \brief Reorient faces basing on orientation of adjacent volumes. + * \param faces - a list of objects containing face to reorient + * \param volumes - an object containing volumes. + * \param outsideNormal - to orient faces to have their normal + * pointing either \a outside or \a inside the adjacent volumes. + * \return number of reoriented faces. + */ + long Reorient2DBy3D(in ListOfIDSources faces, + in SMESH_IDSource volumes, + in boolean outsideNormal) raises (SALOME::SALOME_Exception); /*! * \brief Fuse neighbour triangles into quadrangles. diff --git a/resources/CMakeLists.txt b/resources/CMakeLists.txt index f55e54a70..6bab9ef29 100755 --- a/resources/CMakeLists.txt +++ b/resources/CMakeLists.txt @@ -205,6 +205,7 @@ SET(SMESH_RESOURCES_FILES mesh_min_dist.png reorient_faces_point.png reorient_faces_face.png + reorient_faces_volume.png mesh_ball.png mesh_measure_basic_props.png mesh_measure_length.png diff --git a/resources/reorient_faces_volume.png b/resources/reorient_faces_volume.png new file mode 100644 index 0000000000000000000000000000000000000000..e58bdb6dcb2111fe76e31595e992525eed1d9d49 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VV{wqX6T`Z5GB1G~wj^(N7a$D; zKb?2i11Zh|kH}&M25un`X1sK_?hjCqy~NYkmHi$E2d|mB=_}?rK%vK;E{-7+&i#b$*4CNloG!7MyuYqYnmiJi2oG3UdX|+*b)vSvj{t9&83nGN4B*(_mO z-MRyEF~8<&CWMNYo@#cTHRowzz}}rcVKXj;K3;#oDdHg8k{~;#r6r8sogZ$_*=6=q zJHqXv%f|;!USEvY>}Z=|Lkdl?}d~-yAZy-!yHNopwNGMo(czlm}Dd u`^^`ZeEakNf1(@X1J3CN>U_5i8q_)ZvnI{G+ZPJ-E`z75pUXO@geCywP>YBF literal 0 HcmV?d00001 diff --git a/src/SMESH/SMESH_MeshEditor.cxx b/src/SMESH/SMESH_MeshEditor.cxx index 6bdd80cac..e216b2e74 100644 --- a/src/SMESH/SMESH_MeshEditor.cxx +++ b/src/SMESH/SMESH_MeshEditor.cxx @@ -1243,6 +1243,92 @@ int SMESH_MeshEditor::Reorient2D (TIDSortedElemSet & theFaces, return nbReori; } +//================================================================================ +/*! + * \brief Reorient faces basing on orientation of adjacent volumes. + * \param theFaces - faces to reorient. If empty, all mesh faces are treated. + * \param theVolumes - reference volumes. + * \param theOutsideNormal - to orient faces to have their normal + * pointing either \a outside or \a inside the adjacent volumes. + * \return number of reoriented faces. + */ +//================================================================================ + +int SMESH_MeshEditor::Reorient2DBy3D (TIDSortedElemSet & theFaces, + TIDSortedElemSet & theVolumes, + const bool theOutsideNormal) +{ + int nbReori = 0; + + SMDS_ElemIteratorPtr faceIt; + if ( theFaces.empty() ) + faceIt = GetMeshDS()->elementsIterator( SMDSAbs_Face ); + else + faceIt = elemSetIterator( theFaces ); + + vector< const SMDS_MeshNode* > faceNodes; + TIDSortedElemSet checkedVolumes; + set< const SMDS_MeshNode* > faceNodesSet; + SMDS_VolumeTool volumeTool; + + while ( faceIt->more() ) // loop on given faces + { + const SMDS_MeshElement* face = faceIt->next(); + if ( face->GetType() != SMDSAbs_Face ) + continue; + + const int nbCornersNodes = face->NbCornerNodes(); + faceNodes.assign( face->begin_nodes(), face->end_nodes() ); + + checkedVolumes.clear(); + SMDS_ElemIteratorPtr vIt = faceNodes[ 0 ]->GetInverseElementIterator( SMDSAbs_Volume ); + while ( vIt->more() ) + { + const SMDS_MeshElement* volume = vIt->next(); + + if ( !checkedVolumes.insert( volume ).second ) + continue; + if ( !theVolumes.empty() && !theVolumes.count( volume )) + continue; + + // is volume adjacent? + bool allNodesCommon = true; + for ( int iN = 1; iN < nbCornersNodes && allNodesCommon; ++iN ) + allNodesCommon = ( volume->GetNodeIndex( faceNodes[ iN ]) > -1 ); + if ( !allNodesCommon ) + continue; + + // get nodes of a corresponding volume facet + faceNodesSet.clear(); + faceNodesSet.insert( faceNodes.begin(), faceNodes.end() ); + volumeTool.Set( volume ); + int facetID = volumeTool.GetFaceIndex( faceNodesSet ); + if ( facetID < 0 ) continue; + volumeTool.SetExternalNormal(); + const SMDS_MeshNode** facetNodes = volumeTool.GetFaceNodes( facetID ); + + // compare order of faceNodes and facetNodes + const int iQ = 1 + ( nbCornersNodes < faceNodes.size() ); + int iNN[2]; + for ( int i = 0; i < 2; ++i ) + { + const SMDS_MeshNode* n = facetNodes[ i*iQ ]; + for ( int iN = 0; iN < nbCornersNodes; ++iN ) + if ( faceNodes[ iN ] == n ) + { + iNN[ i ] = iN; + break; + } + } + bool isOutside = Abs( iNN[0]-iNN[1] ) == 1 ? iNN[0] < iNN[1] : iNN[0] > iNN[1]; + if ( isOutside != theOutsideNormal ) + nbReori += Reorient( face ); + } + } // loop on given faces + + return nbReori; +} + //======================================================================= //function : getBadRate //purpose : diff --git a/src/SMESH/SMESH_MeshEditor.hxx b/src/SMESH/SMESH_MeshEditor.hxx index c8f821f4e..5adb43a41 100644 --- a/src/SMESH/SMESH_MeshEditor.hxx +++ b/src/SMESH/SMESH_MeshEditor.hxx @@ -126,6 +126,12 @@ public: // Reverse theFaces whose orientation to be same as that of theFace // oriented according to theDirection. Return nb of reoriented faces + int Reorient2DBy3D (TIDSortedElemSet & theFaces, + TIDSortedElemSet & theVolumes, + const bool theOutsideNormal); + // Reorient faces basing on orientation of adjacent volumes. + // Return nb of reoriented faces + /*! * \brief Fuse neighbour triangles into quadrangles. * \param theElems - The triangles to be fused. diff --git a/src/SMESHGUI/SMESHGUI_ReorientFacesDlg.cxx b/src/SMESHGUI/SMESHGUI_ReorientFacesDlg.cxx index aee6f62d7..41e341cca 100644 --- a/src/SMESHGUI/SMESHGUI_ReorientFacesDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ReorientFacesDlg.cxx @@ -92,8 +92,8 @@ #define SPACING 6 #define MARGIN 11 -enum { CONSTRUCTOR_POINT=0, CONSTRUCTOR_FACE, - EObject, EPoint, EFace, EDirection }; +enum { CONSTRUCTOR_POINT=0, CONSTRUCTOR_FACE, CONSTRUCTOR_VOLUME, + EObject, EPoint, EFace, EDirection, EVolumes }; //======================================================================= /*! @@ -131,6 +131,7 @@ QWidget* SMESHGUI_ReorientFacesDlg::createMainFrame (QWidget* theParent) QPixmap iconReoriPoint (resMgr()->loadPixmap("SMESH", tr("ICON_DLG_REORIENT2D_POINT"))); QPixmap iconReoriFace (resMgr()->loadPixmap("SMESH", tr("ICON_DLG_REORIENT2D_FACE"))); + QPixmap iconReoriVolum (resMgr()->loadPixmap("SMESH", tr("ICON_DLG_REORIENT2D_VOLUME"))); QGroupBox* aConstructorBox = new QGroupBox(tr("REORIENT_FACES"), aFrame); myConstructorGrp = new QButtonGroup(aConstructorBox); @@ -149,6 +150,11 @@ QWidget* SMESHGUI_ReorientFacesDlg::createMainFrame (QWidget* theParent) aConstructorGrpLayout->addWidget(aFaceBut); myConstructorGrp->addButton(aFaceBut, CONSTRUCTOR_FACE); + QRadioButton* aVolBut= new QRadioButton(aConstructorBox); + aVolBut->setIcon(iconReoriVolum); + aConstructorGrpLayout->addWidget(aVolBut); + myConstructorGrp->addButton(aVolBut, CONSTRUCTOR_VOLUME); + // Create other controls setObjectPixmap( "SMESH", tr( "ICON_SELECT" ) ); @@ -157,17 +163,22 @@ QWidget* SMESHGUI_ReorientFacesDlg::createMainFrame (QWidget* theParent) createObject( tr("POINT") , aFrame, EPoint ); createObject( tr("FACE") , aFrame, EFace ); createObject( tr("DIRECTION"), aFrame, EDirection ); + createObject( tr("VOLUMES"), aFrame, EVolumes ); setNameIndication( EObject, OneName ); setNameIndication( EFace, OneName ); setReadOnly( EFace, false ); if ( QLineEdit* le = qobject_cast( objectWg( EFace, Control ) )) le->setValidator( new SMESHGUI_IdValidator( this,1 )); - const int width = aFaceBut->fontMetrics().width( tr("DIRECTION")); + int width = aFaceBut->fontMetrics().width( tr("DIRECTION")); objectWg( EDirection, Label )->setFixedWidth( width ); objectWg( EObject , Label )->setFixedWidth( width ); objectWg( EPoint , Label )->setFixedWidth( width ); objectWg( EFace , Label )->setFixedWidth( width ); + objectWg( EVolumes , Label )->setFixedWidth( width ); + + myOutsideChk = new QCheckBox( tr("OUTSIDE_VOLUME_NORMAL"), aFrame); + myOutsideChk->setChecked( true ); QLabel* aXLabel = new QLabel(tr("SMESH_X"), aFrame); myX = new SMESHGUI_SpinBox(aFrame); @@ -197,6 +208,15 @@ QWidget* SMESHGUI_ReorientFacesDlg::createMainFrame (QWidget* theParent) myDY->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision"); myDZ->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision"); + width = Max( aFaceBut->fontMetrics().width( tr("SMESH_X")), + aFaceBut->fontMetrics().width( tr("SMESH_DX"))); + aXLabel->setFixedWidth( width ); + aYLabel->setFixedWidth( width ); + aZLabel->setFixedWidth( width ); + aDXLabel->setFixedWidth( width ); + aDYLabel->setFixedWidth( width ); + aDZLabel->setFixedWidth( width ); + // Layouting QGroupBox* anObjectGrp = new QGroupBox(tr("FACES"), aFrame); @@ -213,12 +233,12 @@ QWidget* SMESHGUI_ReorientFacesDlg::createMainFrame (QWidget* theParent) objectWg( EPoint, Control )->hide(); aPointGrpLayout->addWidget( objectWg( EPoint, Label ) ); aPointGrpLayout->addWidget( objectWg( EPoint, Btn ) ); - aPointGrpLayout->addWidget( aXLabel ); - aPointGrpLayout->addWidget( myX ); - aPointGrpLayout->addWidget( aYLabel ); - aPointGrpLayout->addWidget( myY ); - aPointGrpLayout->addWidget( aZLabel ); - aPointGrpLayout->addWidget( myZ ); + aPointGrpLayout->addWidget( aXLabel, 0 ); + aPointGrpLayout->addWidget( myX, 1 ); + aPointGrpLayout->addWidget( aYLabel, 0 ); + aPointGrpLayout->addWidget( myY, 1 ); + aPointGrpLayout->addWidget( aZLabel, 0 ); + aPointGrpLayout->addWidget( myZ, 1 ); myFaceFrm = new QFrame(aFrame); QHBoxLayout* aFaceGrpLayout = new QHBoxLayout(myFaceFrm); @@ -227,25 +247,35 @@ QWidget* SMESHGUI_ReorientFacesDlg::createMainFrame (QWidget* theParent) aFaceGrpLayout->addWidget( objectWg( EFace, Btn ) ); aFaceGrpLayout->addWidget( objectWg( EFace, Control ) ); - QFrame* aDirectFrm = new QFrame(aFrame); - QHBoxLayout* aDirectGrpLayout = new QHBoxLayout(aDirectFrm); + myVolumFrm = new QFrame(aFrame); + QGridLayout* aVolumGrpLayout = new QGridLayout(myVolumFrm); + aVolumGrpLayout->setMargin(0); + aVolumGrpLayout->setSpacing(SPACING); + aVolumGrpLayout->addWidget( objectWg( EVolumes, Label ), 0, 0 ); + aVolumGrpLayout->addWidget( objectWg( EVolumes, Btn ), 0, 1 ); + aVolumGrpLayout->addWidget( objectWg( EVolumes, Control ), 0, 2 ); + aVolumGrpLayout->addWidget( myOutsideChk, 1, 0, 1, 3 ); + + myDirFrm = new QFrame(aFrame); + QHBoxLayout* aDirectGrpLayout = new QHBoxLayout(myDirFrm); aDirectGrpLayout->setMargin(0); objectWg( EDirection, Control )->hide(); aDirectGrpLayout->addWidget( objectWg( EDirection, Label ) ); aDirectGrpLayout->addWidget( objectWg( EDirection, Btn ) ); - aDirectGrpLayout->addWidget(aDXLabel ); - aDirectGrpLayout->addWidget(myDX ); - aDirectGrpLayout->addWidget(aDYLabel ); - aDirectGrpLayout->addWidget(myDY ); - aDirectGrpLayout->addWidget(aDZLabel ); - aDirectGrpLayout->addWidget(myDZ ); + aDirectGrpLayout->addWidget( aDXLabel, 0 ); + aDirectGrpLayout->addWidget( myDX, 1 ); + aDirectGrpLayout->addWidget( aDYLabel, 0 ); + aDirectGrpLayout->addWidget( myDY, 1 ); + aDirectGrpLayout->addWidget( aDZLabel, 0 ); + aDirectGrpLayout->addWidget( myDZ, 1 ); QGroupBox* anOrientGrp = new QGroupBox(tr("ORIENTATION"), aFrame); QVBoxLayout* anOrientGrpLayout = new QVBoxLayout ( anOrientGrp ); anOrientGrpLayout->addWidget(myPointFrm); anOrientGrpLayout->addWidget(myFaceFrm); - anOrientGrpLayout->addWidget(aDirectFrm); + anOrientGrpLayout->addWidget(myVolumFrm); + anOrientGrpLayout->addWidget(myDirFrm); QVBoxLayout* aLay = new QVBoxLayout(aFrame); @@ -269,15 +299,27 @@ void SMESHGUI_ReorientFacesDlg::constructorChange(int id) if ( id == CONSTRUCTOR_FACE ) { myPointFrm->hide(); + myVolumFrm->hide(); myFaceFrm->show(); + myDirFrm->show(); activateObject( EFace ); } - else + else if ( id == CONSTRUCTOR_POINT ) { myFaceFrm->hide(); + myVolumFrm->hide(); myPointFrm->show(); + myDirFrm->show(); activateObject( EPoint ); } + else // CONSTRUCTOR_VOLUME + { + myFaceFrm->hide(); + myPointFrm->hide(); + myDirFrm->hide(); + myVolumFrm->show(); + activateObject( EVolumes ); + } } //================================================================================ @@ -373,6 +415,7 @@ void SMESHGUI_ReorientFacesOp::onActivateObject( int what ) SMESH::SetPickable(); break; case EObject: + case EVolumes: SMESH::SetPointRepresentation(false); setSelectionMode( ActorSelection ); break; @@ -406,6 +449,14 @@ SUIT_SelectionFilter* SMESHGUI_ReorientFacesOp::createFilter( const int what ) c filters.append( new SMESH_TypeFilter( SMESH::GROUP_FACE )); return new SMESH_LogicalFilter( filters, SMESH_LogicalFilter::LO_OR ); } + case EVolumes: + { + QList filters; + filters.append( new SMESH_TypeFilter( SMESH::MESH )); + filters.append( new SMESH_TypeFilter( SMESH::SUBMESH_SOLID )); + filters.append( new SMESH_TypeFilter( SMESH::GROUP_VOLUME )); + return new SMESH_LogicalFilter( filters, SMESH_LogicalFilter::LO_OR ); + } case EPoint: { QList filters; @@ -433,6 +484,12 @@ void SMESHGUI_ReorientFacesOp::selectionDone() if ( !myDlg->isVisible() || !myDlg->isEnabled() ) return; + if ( mySelectionMode == EVolumes ) + { + SMESHGUI_SelectionOp::selectionDone(); + return; + } + myDlg->clearSelection( mySelectionMode ); SALOME_ListIO aList; @@ -603,29 +660,45 @@ bool SMESHGUI_ReorientFacesOp::onApply() try { SUIT_OverrideCursor wc; + SMESH::SMESH_Mesh_var aMesh = myObject->GetMesh(); if ( aMesh->_is_nil() ) return false; - SMESH::DirStruct direction; - direction.PS.x = myDlg->myDX->GetValue(); - direction.PS.y = myDlg->myDY->GetValue(); - direction.PS.z = myDlg->myDZ->GetValue(); + SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor(); + if (aMeshEditor->_is_nil()) return false; - long face = myDlg->objectText( EFace ).toInt(); - if ( myDlg->myConstructorGrp->checkedId() == CONSTRUCTOR_POINT ) - face = -1; + int aResult = 0; + if ( myDlg->myConstructorGrp->checkedId() == CONSTRUCTOR_VOLUME ) + { + SMESH::ListOfIDSources_var faceGroups = new SMESH::ListOfIDSources; + faceGroups->length(1); + faceGroups[0] = myObject; - SMESH::PointStruct point; - point.x = myDlg->myX->GetValue(); - point.y = myDlg->myY->GetValue(); - point.z = myDlg->myZ->GetValue(); + bool outsideNormal = myDlg->myOutsideChk->isChecked(); - SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor(); - if (aMeshEditor->_is_nil()) return false; + aResult = aMeshEditor->Reorient2DBy3D( faceGroups, myVolumeObj, outsideNormal ); + } + else + { + SMESH::DirStruct direction; + direction.PS.x = myDlg->myDX->GetValue(); + direction.PS.y = myDlg->myDY->GetValue(); + direction.PS.z = myDlg->myDZ->GetValue(); + + long face = myDlg->objectText( EFace ).toInt(); + if ( myDlg->myConstructorGrp->checkedId() == CONSTRUCTOR_POINT ) + face = -1; + + SMESH::PointStruct point; + point.x = myDlg->myX->GetValue(); + point.y = myDlg->myY->GetValue(); + point.z = myDlg->myZ->GetValue(); + + aMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); - aMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); + aResult = aMeshEditor->Reorient2D( myObject, direction, face, point ); + } - int aResult = aMeshEditor->Reorient2D( myObject, direction, face, point ); if (aResult) { SALOME_ListIO aList; @@ -673,6 +746,27 @@ bool SMESHGUI_ReorientFacesOp::isValid( QString& msg ) return false; } + // check volume object + if ( myDlg->myConstructorGrp->checkedId() == CONSTRUCTOR_VOLUME ) + { + objectEntry = myDlg->selectedObject( EVolumes ); + _PTR(SObject) pSObject = studyDS()->FindObjectID( objectEntry.toLatin1().data() ); + myVolumeObj = SMESH::SObjectToInterface< SMESH::SMESH_IDSource>( pSObject ); + if ( myVolumeObj->_is_nil() ) + { + msg = tr("NO_VOLUME_OBJECT_SELECTED"); + return false; + } + bool hasVolumes = false; + types = myVolumeObj->GetTypes(); + for ( size_t i = 0; i < types->length() && !hasVolumes; ++i ) + hasVolumes = ( types[i] == SMESH::VOLUME ); + if ( !hasVolumes ) + { + msg = tr("NO_VOLUMES"); + return false; + } + } // check vector gp_Vec vec( myDlg->myDX->GetValue(), myDlg->myDY->GetValue(), diff --git a/src/SMESHGUI/SMESHGUI_ReorientFacesDlg.h b/src/SMESHGUI/SMESHGUI_ReorientFacesDlg.h index 400850b89..e0908171b 100644 --- a/src/SMESHGUI/SMESHGUI_ReorientFacesDlg.h +++ b/src/SMESHGUI/SMESHGUI_ReorientFacesDlg.h @@ -33,12 +33,13 @@ #include "SMESHGUI_SelectionOp.h" class QButtonGroup; +class QCheckBox; class QLineEdit; class SMESHGUI_SpinBox; class SMESHGUI_ReorientFacesDlg; /*! - * \brief Operation to reorient faces acoording to vector + * \brief Operation to reorient faces acoording to some criterion */ class SMESHGUI_EXPORT SMESHGUI_ReorientFacesOp: public SMESHGUI_SelectionOp { @@ -76,6 +77,7 @@ private: int mySelectionMode; SMESH::SMESH_IDSource_var myObject; + SMESH::SMESH_IDSource_var myVolumeObj; }; /*! @@ -98,6 +100,9 @@ private: QButtonGroup* myConstructorGrp; QFrame* myFaceFrm; QFrame* myPointFrm; + QFrame* myDirFrm; + QFrame* myVolumFrm; + QCheckBox* myOutsideChk; SMESHGUI_SpinBox* myX; SMESHGUI_SpinBox* myY; SMESHGUI_SpinBox* myZ; diff --git a/src/SMESHGUI/SMESH_images.ts b/src/SMESHGUI/SMESH_images.ts index b27b101ca..63187d137 100644 --- a/src/SMESHGUI/SMESH_images.ts +++ b/src/SMESHGUI/SMESH_images.ts @@ -427,6 +427,10 @@ ICON_DLG_REORIENT2D_FACE reorient_faces_face.png + + ICON_DLG_REORIENT2D_VOLUME + reorient_faces_volume.png + ICON_REORIENT_2D reorient_faces_face.png diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts index 7e1bb3da3..fcb37740a 100644 --- a/src/SMESHGUI/SMESH_msg_en.ts +++ b/src/SMESHGUI/SMESH_msg_en.ts @@ -470,15 +470,15 @@ TOP_REORIENT_2D - Reorient faces by vector + Reorient faces MEN_REORIENT_2D - Reorient faces by vector + Reorient faces STB_REORIENT_2D - Reorient faces by vector + Reorient faces TOP_FIND_ELEM @@ -7656,7 +7656,7 @@ as they are of improper type: SMESHGUI_ReorientFacesDlg CAPTION - Reorient faces by vector + Reorient faces REORIENT_FACES @@ -7686,6 +7686,14 @@ as they are of improper type: ORIENTATION Orientation + + VOLUMES + Volumes + + + OUTSIDE_VOLUME_NORMAL + Face normal outside volume + SMESHGUI_ReorientFacesOp @@ -7693,10 +7701,18 @@ as they are of improper type: NO_OBJECT_SELECTED No object selected + + NO_VOLUME_OBJECT_SELECTED + No volume object selected + NO_FACES Object includes no faces + + NO_VOLUMES + Volume object includes no volumes + ZERO_SIZE_VECTOR Zero size vector diff --git a/src/SMESH_I/SMESH_2smeshpy.cxx b/src/SMESH_I/SMESH_2smeshpy.cxx index 9a7550d18..564632744 100644 --- a/src/SMESH_I/SMESH_2smeshpy.cxx +++ b/src/SMESH_I/SMESH_2smeshpy.cxx @@ -2369,7 +2369,7 @@ void _pyMeshEditor::Process( const Handle(_pyCommand)& theCommand) "AddNode","Add0DElement","AddEdge","AddFace","AddPolygonalFace","AddBall", "AddVolume","AddPolyhedralVolume","AddPolyhedralVolumeByFaces", "MoveNode", "MoveClosestNodeToPoint", - "InverseDiag","DeleteDiag","Reorient","ReorientObject", + "InverseDiag","DeleteDiag","Reorient","ReorientObject","Reorient2DBy3D", "TriToQuad","TriToQuadObject", "QuadTo4Tri", "SplitQuad","SplitQuadObject", "BestSplit","Smooth","SmoothObject","SmoothParametric","SmoothParametricObject", "ConvertToQuadratic","ConvertFromQuadratic","RenumberNodes","RenumberElements", diff --git a/src/SMESH_I/SMESH_MeshEditor_i.cxx b/src/SMESH_I/SMESH_MeshEditor_i.cxx index 9de57c975..fd69f00f6 100644 --- a/src/SMESH_I/SMESH_MeshEditor_i.cxx +++ b/src/SMESH_I/SMESH_MeshEditor_i.cxx @@ -1645,7 +1645,7 @@ CORBA::Long SMESH_MeshEditor_i::Reorient2D(SMESH::SMESH_IDSource_ptr the2Dgroup, TIDSortedElemSet elements; prepareIdSource( the2Dgroup ); if ( !idSourceToSet( the2Dgroup, getMeshDS(), elements, SMDSAbs_Face, /*emptyIfIsMesh=*/1)) - THROW_SALOME_CORBA_EXCEPTION("No faces in given group", SALOME::BAD_PARAM); + return 0;//THROW_SALOME_CORBA_EXCEPTION("No faces in given group", SALOME::BAD_PARAM); const SMDS_MeshElement* face = 0; @@ -1710,6 +1710,55 @@ CORBA::Long SMESH_MeshEditor_i::Reorient2D(SMESH::SMESH_IDSource_ptr the2Dgroup, return 0; } +//======================================================================= +//function : Reorient2DBy3D +//purpose : Reorient faces basing on orientation of adjacent volumes. +//======================================================================= + +CORBA::Long SMESH_MeshEditor_i::Reorient2DBy3D(const SMESH::ListOfIDSources& faceGroups, + SMESH::SMESH_IDSource_ptr volumeGroup, + CORBA::Boolean outsideNormal) + throw (SALOME::SALOME_Exception) +{ + SMESH_TRY; + initData(); + + TIDSortedElemSet volumes; + prepareIdSource( volumeGroup ); + if ( !idSourceToSet( volumeGroup, getMeshDS(), volumes, SMDSAbs_Volume, /*emptyIfIsMesh=*/1)) + THROW_SALOME_CORBA_EXCEPTION("No volumes in a given object", SALOME::BAD_PARAM); + + int nbReori = 0; + for ( size_t i = 0; i < faceGroups.length(); ++i ) + { + SMESH::SMESH_IDSource_ptr faceGrp = faceGroups[i].in(); + prepareIdSource( faceGrp ); + + TIDSortedElemSet faces; + if ( !idSourceToSet( faceGrp, getMeshDS(), faces, SMDSAbs_Face, /*emptyIfIsMesh=*/1) && + faceGroups.length() == 1 ) + ; //THROW_SALOME_CORBA_EXCEPTION("No faces in a given object", SALOME::BAD_PARAM); + + nbReori += getEditor().Reorient2DBy3D( faces, volumes, outsideNormal ); + + if ( faces.empty() ) // all faces in the mesh treated + break; + } + + if ( nbReori ) { + declareMeshModified( /*isReComputeSafe=*/false ); + } + TPythonDump() << this << ".Reorient2DBy3D( " + << faceGroups << ", " + << volumeGroup << ", " + << outsideNormal << " )"; + + return nbReori; + + SMESH_CATCH( SMESH::throwCorbaException ); + return 0; +} + //============================================================================= /*! * \brief Fuse neighbour triangles into quadrangles. diff --git a/src/SMESH_I/SMESH_MeshEditor_i.hxx b/src/SMESH_I/SMESH_MeshEditor_i.hxx index ead3048b0..bce7c4c4c 100644 --- a/src/SMESH_I/SMESH_MeshEditor_i.hxx +++ b/src/SMESH_I/SMESH_MeshEditor_i.hxx @@ -203,6 +203,18 @@ public: const SMESH::DirStruct& theDirection, CORBA::Long theFace, const SMESH::PointStruct& thePoint) throw (SALOME::SALOME_Exception); + /*! + * \brief Reorient faces basing on orientation of adjacent volumes. + * \param faces - a list of objects containing face to reorient + * \param volumes - an object containing volumes. + * \param outsideNormal - to orient faces to have their normal + * pointing either \a outside or \a inside the adjacent volumes. + * \return number of reoriented faces. + */ + CORBA::Long Reorient2DBy3D(const SMESH::ListOfIDSources & faces, + SMESH::SMESH_IDSource_ptr volumes, + CORBA::Boolean outsideNormal) + throw (SALOME::SALOME_Exception); // Split/Join faces CORBA::Boolean TriToQuad (const SMESH::long_array & IDsOfElements, diff --git a/src/SMESH_SWIG/smeshBuilder.py b/src/SMESH_SWIG/smeshBuilder.py index 767a5ef14..a51e40ce8 100644 --- a/src/SMESH_SWIG/smeshBuilder.py +++ b/src/SMESH_SWIG/smeshBuilder.py @@ -2964,6 +2964,37 @@ class Mesh: theFace = -1 return self.editor.Reorient2D( the2DObject, theDirection, theFace, thePoint ) + ## Reorient faces according to adjacent volumes. + # @param the2DObject is a mesh, sub-mesh, group or list of + # either IDs of faces or face groups. + # @param the3DObject is a mesh, sub-mesh, group or list of IDs of volumes. + # @param theOutsideNormal to orient faces to have their normals + # pointing either \a outside or \a inside the adjacent volumes. + # @return number of reoriented faces. + # @ingroup l2_modif_changori + def Reorient2DBy3D(self, the2DObject, the3DObject, theOutsideNormal=True ): + unRegister = genObjUnRegister() + # check the2DObject + if not isinstance( the2DObject, list ): + the2DObject = [ the2DObject ] + elif the2DObject and isinstance( the2DObject[0], int ): + the2DObject = self.GetIDSource( the2DObject, SMESH.FACE ) + unRegister.set( the2DObject ) + the2DObject = [ the2DObject ] + for i,obj2D in enumerate( the2DObject ): + if isinstance( obj2D, Mesh ): + the2DObject[i] = obj2D.GetMesh() + if isinstance( obj2D, list ): + the2DObject[i] = self.GetIDSource( obj2D, SMESH.FACE ) + unRegister.set( the2DObject[i] ) + # check the3DObject + if isinstance( the3DObject, Mesh ): + the3DObject = the3DObject.GetMesh() + if isinstance( the3DObject, list ): + the3DObject = self.GetIDSource( the3DObject, SMESH.VOLUME ) + unRegister.set( the3DObject ) + return self.editor.Reorient2DBy3D( the2DObject, the3DObject, theOutsideNormal ) + ## Fuses the neighbouring triangles into quadrangles. # @param IDsOfElements The triangles to be fused, # @param theCriterion is a numerical functor, in terms of enum SMESH.FunctorType, used to -- 2.39.2