-// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2019 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
// SALOME GUI includes
#include <LightApp_SelectionMgr.h>
#include <SALOME_ListIO.hxx>
-#include <SALOME_ListIteratorOfListIO.hxx>
#include <SUIT_Desktop.h>
#include <SUIT_MessageBox.h>
#include <SUIT_OverrideCursor.h>
#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 };
//=======================================================================
/*!
- * \brief Dialog to reorient faces acoording to vector
+ * \brief Dialog to reorient faces according to vector
*/
//=======================================================================
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);
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" ) );
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<QLineEdit*>( 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);
myDY->SetValue(0);
myDZ->SetValue(0);
- myDX->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
- myDY->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
- myDZ->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
+ myDX->RangeStepAndValidator(COORD_MIN, COORD_MAX, 1.0, "length_precision");
+ myDY->RangeStepAndValidator(COORD_MIN, COORD_MAX, 1.0, "length_precision");
+ myDZ->RangeStepAndValidator(COORD_MIN, COORD_MAX, 1.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
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);
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);
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 );
+ }
}
//================================================================================
:SMESHGUI_SelectionOp( ActorSelection )
{
//myVectorPreview = 0;
- myHelpFileName = "reorient_faces_page.html";
+ myHelpFileName = "reorient_faces.html";
myDlg = new SMESHGUI_ReorientFacesDlg;
myDlg->constructorChange( CONSTRUCTOR_POINT );
SMESH::SetPickable();
break;
case EObject:
+ case EVolumes:
SMESH::SetPointRepresentation(false);
setSelectionMode( ActorSelection );
break;
filters.append( new SMESH_TypeFilter( SMESH::GROUP_FACE ));
return new SMESH_LogicalFilter( filters, SMESH_LogicalFilter::LO_OR );
}
+ case EVolumes:
+ {
+ QList<SUIT_SelectionFilter*> 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<SUIT_SelectionFilter*> filters;
if ( !myDlg->isVisible() || !myDlg->isEnabled() )
return;
+ if ( mySelectionMode == EVolumes )
+ {
+ SMESHGUI_SelectionOp::selectionDone();
+ return;
+ }
+
myDlg->clearSelection( mySelectionMode );
SALOME_ListIO aList;
bool SMESHGUI_ReorientFacesOp::onApply()
{
- if( isStudyLocked() )
+ if( SMESHGUI::isStudyLocked() )
return false;
QString msg;
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(":").toUtf8().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;
{
// check object
QString objectEntry = myDlg->selectedObject( EObject );
- _PTR(SObject) pSObject = studyDS()->FindObjectID( objectEntry.toLatin1().data() );
+ _PTR(SObject) pSObject = SMESH::getStudy()->FindObjectID( objectEntry.toUtf8().data() );
myObject = SMESH::SMESH_IDSource::_narrow( _CAST( SObject,pSObject )->GetObject() );
if ( myObject->_is_nil() )
{
return false;
}
+ // check volume object
+ if ( myDlg->myConstructorGrp->checkedId() == CONSTRUCTOR_VOLUME )
+ {
+ objectEntry = myDlg->selectedObject( EVolumes );
+ _PTR(SObject) pSObject = SMESH::getStudy()->FindObjectID( objectEntry.toUtf8().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(),
// }
// // display data
-// if ( aMeshPreviewStruct.operator->() )
+// if ( & aMeshPreviewStruct.in() )
// {
-// myVectorPreview->SetData(aMeshPreviewStruct._retn());
+// myVectorPreview->SetData(aMeshPreviewStruct.in());
// }
// else
// {