X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_ExtrusionDlg.cxx;h=5dba32360f703511d8bb65eb19559ffd724f2acf;hp=a950917c714a44abe6bf3f4ae7564c2c1cc3c9af;hb=52d825495306f72048c8754aa5c86c6a390f8262;hpb=f62232e2120081e11f5c52ff57736a56d9a521ab diff --git a/src/SMESHGUI/SMESHGUI_ExtrusionDlg.cxx b/src/SMESHGUI/SMESHGUI_ExtrusionDlg.cxx index a950917c7..5dba32360 100644 --- a/src/SMESHGUI/SMESHGUI_ExtrusionDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ExtrusionDlg.cxx @@ -1,31 +1,30 @@ -// SMESH SMESHGUI : GUI for SMESH component +// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE // -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. // -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// -// -// File : SMESHGUI_ExtrusionDlg.cxx -// Author : Michael ZORIN -// Module : SMESH -// $Header: +// SMESH SMESHGUI : GUI for SMESH component +// File : SMESHGUI_ExtrusionDlg.cxx +// Author : Michael ZORIN, Open CASCADE S.A.S. +// SMESH includes +// #include "SMESHGUI_ExtrusionDlg.h" #include "SMESHGUI.h" @@ -34,243 +33,319 @@ #include "SMESHGUI_MeshUtils.h" #include "SMESHGUI_SpinBox.h" #include "SMESHGUI_IdValidator.h" +#include "SMESHGUI_FilterDlg.h" +#include "SMESHGUI_MeshEditPreview.h" + +#include +#include +#include -#include "SMESH_Actor.h" -#include "SMESH_TypeFilter.hxx" -#include "SMESH_NumberFilter.hxx" -#include "SMESH_LogicalFilter.hxx" +#include -#include "SMDS_Mesh.hxx" +// SALOME GUI includes +#include +#include +#include +#include +#include -#include "SUIT_ResourceMgr.h" -#include "SUIT_OverrideCursor.h" -#include "SUIT_Desktop.h" -#include "SUIT_MessageBox.h" +#include +#include -#include "SVTK_ViewModel.h" -#include "SVTK_ViewWindow.h" -#include "SVTK_Selector.h" -#include "SVTK_Selection.h" -#include "SALOME_ListIO.hxx" +#include +#include -#include "utilities.h" +#include -// OCCT Includes +// OCCT includes #include #include - -// QT Includes -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// IDL Headers -#include "SALOMEconfig.h" +#include + +// Qt includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// IDL includes +#include #include CORBA_SERVER_HEADER(SMESH_Group) +#include CORBA_SERVER_HEADER(SMESH_MeshEditor) -using namespace std; +#define SPACING 6 +#define MARGIN 11 //================================================================================= // function : SMESHGUI_ExtrusionDlg() // purpose : constructor //================================================================================= -SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule, - bool modal) - : QDialog( SMESH::GetDesktop( theModule ), "SMESHGUI_ExtrusionDlg", modal, WStyle_Customize | - WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | Qt::WDestructiveClose), - mySMESHGUI( theModule ), - mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ) +SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule) + : SMESHGUI_PreviewDlg( theModule ), + mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), + myEditCurrentArgument(0), + myFilterDlg( 0 ), + mySelectedObject(SMESH::SMESH_IDSource::_nil()) { QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_EDGE"))); QPixmap image1 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_TRIANGLE"))); QPixmap image2 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT"))); + QPixmap image3 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_NODE"))); - resize(303, 185); - setCaption(tr("EXTRUSION_ALONG_LINE")); - setSizeGripEnabled(TRUE); + setModal( false ); + setAttribute( Qt::WA_DeleteOnClose, true ); + setWindowTitle(tr("EXTRUSION_ALONG_LINE")); + setSizeGripEnabled(true); - QGridLayout* SMESHGUI_ExtrusionDlgLayout = new QGridLayout(this); - SMESHGUI_ExtrusionDlgLayout->setSpacing(6); - SMESHGUI_ExtrusionDlgLayout->setMargin(11); + QVBoxLayout* SMESHGUI_ExtrusionDlgLayout = new QVBoxLayout(this); + SMESHGUI_ExtrusionDlgLayout->setSpacing(SPACING); + SMESHGUI_ExtrusionDlgLayout->setMargin(MARGIN); /***************************************************************/ - GroupConstructors = new QButtonGroup("GroupConstructors", this); - GroupConstructors->setTitle(tr("SMESH_EXTRUSION")); - GroupConstructors->setExclusive(TRUE); - GroupConstructors->setColumnLayout(0, Qt::Vertical); - GroupConstructors->layout()->setSpacing(0); - GroupConstructors->layout()->setMargin(0); - QGridLayout* GroupConstructorsLayout = new QGridLayout(GroupConstructors->layout()); - GroupConstructorsLayout->setAlignment(Qt::AlignTop); - GroupConstructorsLayout->setSpacing(6); - GroupConstructorsLayout->setMargin(11); - RadioButton1= new QRadioButton(GroupConstructors, "RadioButton1"); - RadioButton1->setText(tr("")); - RadioButton1->setPixmap(image0); - GroupConstructorsLayout->addWidget(RadioButton1, 0, 0); - RadioButton2= new QRadioButton(GroupConstructors, "RadioButton2"); - RadioButton2->setText(tr("")); - RadioButton2->setPixmap(image1); - GroupConstructorsLayout->addWidget(RadioButton2, 0, 2); - SMESHGUI_ExtrusionDlgLayout->addWidget(GroupConstructors, 0, 0); + ConstructorsBox = new QGroupBox(tr("SMESH_EXTRUSION"), this); + GroupConstructors = new QButtonGroup(this); + QHBoxLayout* ConstructorsBoxLayout = new QHBoxLayout(ConstructorsBox); + ConstructorsBoxLayout->setSpacing(SPACING); + ConstructorsBoxLayout->setMargin(MARGIN); + + RadioButton0= new QRadioButton(ConstructorsBox); + RadioButton0->setIcon(image3); + RadioButton1= new QRadioButton(ConstructorsBox); + RadioButton1->setIcon(image0); + RadioButton2= new QRadioButton(ConstructorsBox); + RadioButton2->setIcon(image1); + + ConstructorsBoxLayout->addWidget(RadioButton0); + ConstructorsBoxLayout->addWidget(RadioButton1); + ConstructorsBoxLayout->addWidget(RadioButton2); + + GroupConstructors->addButton(RadioButton0, 0); + GroupConstructors->addButton(RadioButton1, 1); + GroupConstructors->addButton(RadioButton2, 2); /***************************************************************/ - GroupButtons = new QGroupBox(this, "GroupButtons"); - GroupButtons->setGeometry(QRect(10, 10, 281, 48)); - GroupButtons->setTitle(tr("")); - GroupButtons->setColumnLayout(0, Qt::Vertical); - GroupButtons->layout()->setSpacing(0); - GroupButtons->layout()->setMargin(0); - QGridLayout* GroupButtonsLayout = new QGridLayout(GroupButtons->layout()); - GroupButtonsLayout->setAlignment(Qt::AlignTop); - GroupButtonsLayout->setSpacing(6); - GroupButtonsLayout->setMargin(11); - buttonCancel = new QPushButton(GroupButtons, "buttonCancel"); - buttonCancel->setText(tr("SMESH_BUT_CLOSE" )); - buttonCancel->setAutoDefault(TRUE); - GroupButtonsLayout->addWidget(buttonCancel, 0, 3); - buttonApply = new QPushButton(GroupButtons, "buttonApply"); - buttonApply->setText(tr("SMESH_BUT_APPLY" )); - buttonApply->setAutoDefault(TRUE); - GroupButtonsLayout->addWidget(buttonApply, 0, 1); - QSpacerItem* spacer_9 = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); - GroupButtonsLayout->addItem(spacer_9, 0, 2); - buttonOk = new QPushButton(GroupButtons, "buttonOk"); - buttonOk->setText(tr("SMESH_BUT_OK" )); - buttonOk->setAutoDefault(TRUE); - buttonOk->setDefault(TRUE); - GroupButtonsLayout->addWidget(buttonOk, 0, 0); - SMESHGUI_ExtrusionDlgLayout->addWidget(GroupButtons, 2, 0); + GroupButtons = new QGroupBox(this); + QHBoxLayout* GroupButtonsLayout = new QHBoxLayout(GroupButtons); + GroupButtonsLayout->setSpacing(SPACING); + GroupButtonsLayout->setMargin(MARGIN); + + buttonOk = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), GroupButtons); + buttonOk->setAutoDefault(true); + buttonOk->setDefault(true); + buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons); + buttonApply->setAutoDefault(true); + buttonCancel = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons); + buttonCancel->setAutoDefault(true); + buttonHelp = new QPushButton(tr("SMESH_BUT_HELP"), GroupButtons); + buttonHelp->setAutoDefault(true); + + GroupButtonsLayout->addWidget(buttonOk); + GroupButtonsLayout->addSpacing(10); + GroupButtonsLayout->addWidget(buttonApply); + GroupButtonsLayout->addSpacing(10); + GroupButtonsLayout->addStretch(); + GroupButtonsLayout->addWidget(buttonCancel); + GroupButtonsLayout->addWidget(buttonHelp); /***************************************************************/ - GroupArguments = new QGroupBox(this, "GroupArguments"); - GroupArguments->setTitle(tr("EXTRUSION_1D")); - GroupArguments->setColumnLayout(0, Qt::Vertical); - GroupArguments->layout()->setSpacing(0); - GroupArguments->layout()->setMargin(0); - QGridLayout* GroupArgumentsLayout = new QGridLayout(GroupArguments->layout()); - GroupArgumentsLayout->setAlignment(Qt::AlignTop); - GroupArgumentsLayout->setSpacing(6); - GroupArgumentsLayout->setMargin(11); + GroupArguments = new QGroupBox(tr("EXTRUSION_0D"), this); + QGridLayout* GroupArgumentsLayout = new QGridLayout(GroupArguments); + GroupArgumentsLayout->setSpacing(SPACING); + GroupArgumentsLayout->setMargin(MARGIN); + + myIdValidator = new SMESHGUI_IdValidator(this); // Controls for elements selection - TextLabelElements = new QLabel(GroupArguments, "TextLabelElements"); - TextLabelElements->setText(tr("SMESH_ID_ELEMENTS" )); - TextLabelElements->setFixedWidth(74); - GroupArgumentsLayout->addWidget(TextLabelElements, 0, 0); - - SelectElementsButton = new QPushButton(GroupArguments, "SelectElementsButton"); - SelectElementsButton->setText(tr("" )); - SelectElementsButton->setPixmap(image2); - SelectElementsButton->setToggleButton(FALSE); - GroupArgumentsLayout->addWidget(SelectElementsButton, 0, 1); + TextLabelElements = new QLabel(tr("SMESH_ID_ELEMENTS"), GroupArguments); - LineEditElements = new QLineEdit(GroupArguments, "LineEditElements"); - LineEditElements->setValidator(new SMESHGUI_IdValidator(this, "validator")); - GroupArgumentsLayout->addMultiCellWidget(LineEditElements, 0, 0, 2, 7); + SelectElementsButton = new QPushButton(GroupArguments); + SelectElementsButton->setIcon(image2); + + LineEditElements = new QLineEdit(GroupArguments); + LineEditElements->setValidator(myIdValidator); + LineEditElements->setMaxLength(-1); + myFilterBtn = new QPushButton( tr( "SMESH_BUT_FILTER" ), GroupArguments ); + connect(myFilterBtn, SIGNAL(clicked()), this, SLOT(setFilters())); // Control for the whole mesh selection - CheckBoxMesh = new QCheckBox(GroupArguments, "CheckBoxMesh"); - CheckBoxMesh->setText(tr("SMESH_SELECT_WHOLE_MESH" )); - GroupArgumentsLayout->addMultiCellWidget(CheckBoxMesh, 1, 1, 0, 7); + CheckBoxMesh = new QCheckBox(tr("SMESH_SELECT_WHOLE_MESH"), GroupArguments); + + RadioButton3 = new QRadioButton(GroupArguments); + RadioButton3->setText( tr("SMESH_EXTRUSION_TO_DISTANCE") ); + RadioButton4 = new QRadioButton(GroupArguments); + RadioButton4->setText( tr("SMESH_EXTRUSION_ALONG_VECTOR") ); + + //Control for the Distance selection + TextLabelDistance = new QLabel(tr("SMESH_DISTANCE"), GroupArguments); + + TextLabelDx = new QLabel(tr("SMESH_X"), GroupArguments); + SpinBox_Dx = new SMESHGUI_SpinBox(GroupArguments); + + TextLabelDy = new QLabel(tr("SMESH_Y"), GroupArguments); + SpinBox_Dy = new SMESHGUI_SpinBox(GroupArguments); + + TextLabelDz = new QLabel(tr("SMESH_Z"), GroupArguments); + SpinBox_Dz = new SMESHGUI_SpinBox(GroupArguments); // Controls for vector selection - TextLabelVector = new QLabel(GroupArguments, "TextLabelVector"); - TextLabelVector->setText(tr("SMESH_VECTOR")); - GroupArgumentsLayout->addWidget(TextLabelVector, 2, 0); - TextLabelDx = new QLabel(GroupArguments, "TextLabelDx"); - TextLabelDx->setText(tr("SMESH_DX")); - GroupArgumentsLayout->addWidget(TextLabelDx, 2, 2); + TextLabelVector = new QLabel(tr("SMESH_VECTOR"), GroupArguments); - SpinBox_Dx = new SMESHGUI_SpinBox(GroupArguments, "SpinBox_Dx"); - GroupArgumentsLayout->addWidget(SpinBox_Dx, 2, 3); + SelectVectorButton = new QPushButton(GroupArguments); + SelectVectorButton->setIcon(image2); - TextLabelDy = new QLabel(GroupArguments, "TextLabelDy"); - TextLabelDy->setText(tr("SMESH_DY")); - GroupArgumentsLayout->addWidget(TextLabelDy, 2, 4); + TextLabelVx = new QLabel(tr("SMESH_DX"), GroupArguments); + SpinBox_Vx = new SMESHGUI_SpinBox(GroupArguments); - SpinBox_Dy = new SMESHGUI_SpinBox(GroupArguments, "SpinBox_Dy"); - GroupArgumentsLayout->addWidget(SpinBox_Dy, 2, 5); + TextLabelVy = new QLabel(tr("SMESH_DY"), GroupArguments); + SpinBox_Vy = new SMESHGUI_SpinBox(GroupArguments); - TextLabelDz = new QLabel(GroupArguments, "TextLabelDz"); - TextLabelDz->setText(tr("SMESH_DZ")); - GroupArgumentsLayout->addWidget(TextLabelDz, 2, 6); + TextLabelVz = new QLabel(tr("SMESH_DZ"), GroupArguments); + SpinBox_Vz = new SMESHGUI_SpinBox(GroupArguments); - SpinBox_Dz = new SMESHGUI_SpinBox(GroupArguments, "SpinBox_Dz"); - GroupArgumentsLayout->addWidget(SpinBox_Dz, 2, 7); + TextLabelDist = new QLabel(tr("SMESH_DISTANCE"), GroupArguments); + SpinBox_VDist = new SMESHGUI_SpinBox(GroupArguments); // Controls for nb. steps defining - TextLabelNbSteps = new QLabel(GroupArguments, "TextLabelNbSteps"); - TextLabelNbSteps->setText(tr("SMESH_NUMBEROFSTEPS" )); - GroupArgumentsLayout->addMultiCellWidget(TextLabelNbSteps, 3, 3, 0, 1); + TextLabelNbSteps = new QLabel(tr("SMESH_NUMBEROFSTEPS"), GroupArguments); + SpinBox_NbSteps = new SalomeApp_IntSpinBox(GroupArguments); - SpinBox_NbSteps = new QSpinBox(GroupArguments, "SpinBox_NbSteps"); - GroupArgumentsLayout->addMultiCellWidget(SpinBox_NbSteps, 3, 3, 2, 7); + // CheckBox for groups generation + MakeGroupsCheck = new QCheckBox(tr("SMESH_MAKE_GROUPS"), GroupArguments); - SMESHGUI_ExtrusionDlgLayout->addWidget(GroupArguments, 1, 0); + //Preview check box + myPreviewCheckBox = new QCheckBox(tr("PREVIEW"), GroupArguments); + + GroupArgumentsLayout->addWidget(TextLabelElements, 0, 0); + GroupArgumentsLayout->addWidget(SelectElementsButton, 0, 1); + GroupArgumentsLayout->addWidget(LineEditElements, 0, 2, 1, 5); + GroupArgumentsLayout->addWidget(myFilterBtn, 0, 7); + GroupArgumentsLayout->addWidget(CheckBoxMesh, 1, 0, 1, 8); + GroupArgumentsLayout->addWidget(RadioButton3, 2, 1, 1, 3); + GroupArgumentsLayout->addWidget(RadioButton4, 2, 5, 1, 3); + GroupArgumentsLayout->addWidget(TextLabelDistance, 3, 0); + GroupArgumentsLayout->addWidget(TextLabelDx, 3, 2); + GroupArgumentsLayout->addWidget(SpinBox_Dx, 3, 3); + GroupArgumentsLayout->addWidget(TextLabelDy, 3, 4); + GroupArgumentsLayout->addWidget(SpinBox_Dy, 3, 5); + GroupArgumentsLayout->addWidget(TextLabelDz, 3, 6); + GroupArgumentsLayout->addWidget(SpinBox_Dz, 3, 7); + GroupArgumentsLayout->addWidget(TextLabelVector, 4, 0); + GroupArgumentsLayout->addWidget(SelectVectorButton, 4, 1); + GroupArgumentsLayout->addWidget(TextLabelVx, 4, 2); + GroupArgumentsLayout->addWidget(SpinBox_Vx, 4, 3); + GroupArgumentsLayout->addWidget(TextLabelVy, 4, 4); + GroupArgumentsLayout->addWidget(SpinBox_Vy, 4, 5); + GroupArgumentsLayout->addWidget(TextLabelVz, 4, 6); + GroupArgumentsLayout->addWidget(SpinBox_Vz, 4, 7); + GroupArgumentsLayout->addWidget(TextLabelDist, 5, 0); + GroupArgumentsLayout->addWidget(SpinBox_VDist, 5, 3); + GroupArgumentsLayout->addWidget(TextLabelNbSteps, 6, 0, 1, 3); + GroupArgumentsLayout->addWidget(SpinBox_NbSteps, 6, 3); + GroupArgumentsLayout->addWidget(myPreviewCheckBox, 7, 0, 1, 8); + GroupArgumentsLayout->addWidget(MakeGroupsCheck, 8, 0, 1, 8); + GroupArgumentsLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding), 8, 0); - /* Initialisations */ - SpinBox_Dx->RangeStepAndValidator(-999999.999, +999999.999, 10.0, 3); - SpinBox_Dy->RangeStepAndValidator(-999999.999, +999999.999, 10.0, 3); - SpinBox_Dz->RangeStepAndValidator(-999999.999, +999999.999, 10.0, 3); - QIntValidator* anIntValidator = new QIntValidator(SpinBox_NbSteps); - SpinBox_NbSteps->setValidator(anIntValidator); + /***************************************************************/ + SMESHGUI_ExtrusionDlgLayout->addWidget(ConstructorsBox); + SMESHGUI_ExtrusionDlgLayout->addWidget(GroupArguments); + SMESHGUI_ExtrusionDlgLayout->addWidget(GroupButtons); + + /* Initialisations */ + SpinBox_Vx->RangeStepAndValidator(COORD_MIN, COORD_MAX, 0.01, "length_precision"); + SpinBox_Vy->RangeStepAndValidator(COORD_MIN, COORD_MAX, 0.01, "length_precision"); + SpinBox_Vz->RangeStepAndValidator(COORD_MIN, COORD_MAX, 0.01, "length_precision"); + + SpinBox_Dx->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision"); + SpinBox_Dy->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision"); + SpinBox_Dz->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision"); + SpinBox_NbSteps->setRange(1, 999999); + SpinBox_VDist->RangeStepAndValidator(0, COORD_MAX, 10.0, "length_precision"); - GroupArguments->show(); - RadioButton1->setChecked(TRUE); + RadioButton0->setChecked(true); + RadioButton3->setChecked(true); + MakeGroupsCheck->setChecked(true); mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector(); mySMESHGUI->SetActiveDialogBox(this); // Costruction of the logical filter for the elements: mesh/sub-mesh/group - SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH); - SMESH_TypeFilter* aSmeshGroupFilter = new SMESH_TypeFilter (GROUP); - - QPtrList aListOfFilters; - if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter); - if (aSmeshGroupFilter) aListOfFilters.append(aSmeshGroupFilter); - - myMeshOrSubMeshOrGroupFilter = - new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR); + QList aListOfFilters; + aListOfFilters.append(new SMESH_TypeFilter (SMESH::MESH)); + aListOfFilters.append(new SMESH_TypeFilter (SMESH::SUBMESH_VERTEX)); + aListOfFilters.append(new SMESH_TypeFilter (SMESH::GROUP_NODE)); + myMeshOrSubMeshOrGroupFilter0D = + new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true); + aListOfFilters[0] = new SMESH_TypeFilter (SMESH::MESH); + aListOfFilters[1] = new SMESH_TypeFilter (SMESH::SUBMESH_EDGE); + aListOfFilters[2] = new SMESH_TypeFilter (SMESH::GROUP_EDGE); + myMeshOrSubMeshOrGroupFilter1D = + new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true); + aListOfFilters[0] = new SMESH_TypeFilter (SMESH::MESH); + aListOfFilters[1] = new SMESH_TypeFilter (SMESH::SUBMESH_FACE); + aListOfFilters[2] = new SMESH_TypeFilter (SMESH::GROUP_FACE); + myMeshOrSubMeshOrGroupFilter2D = + new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true); + + myHelpFileName = "extrusion_page.html"; Init(); /***************************************************************/ // signals and slots connections - connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); - connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); - connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); - connect(GroupConstructors, SIGNAL(clicked(int)), SLOT(ConstructorsClicked(int))); - - connect(SelectElementsButton, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument())); - connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); - connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonCancel, SIGNAL(clicked()), this, SLOT(reject())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(buttonHelp, SIGNAL(clicked()), this, SLOT(ClickOnHelp())); + + connect(RadioButton3, SIGNAL(clicked()), this, SLOT(ClickOnRadio())); + connect(RadioButton4, SIGNAL(clicked()), this, SLOT(ClickOnRadio())); + + // to update state of the Ok & Apply buttons + connect(SpinBox_Vx, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable())); + connect(SpinBox_Vy, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable())); + connect(SpinBox_Vz, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable())); + connect(SpinBox_Dx, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable())); + connect(SpinBox_Dy, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable())); + connect(SpinBox_Dz, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable())); + + connect(GroupConstructors, SIGNAL(buttonClicked(int)), SLOT(ConstructorsClicked(int))); + connect(SelectElementsButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(SelectVectorButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); + connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); /* to close dialog if study change */ - connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); - connect(LineEditElements, SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&))); - connect(CheckBoxMesh, SIGNAL(toggled(bool)), SLOT(onSelectMesh(bool))); + connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(reject())); + connect(LineEditElements, SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&))); + connect(CheckBoxMesh, SIGNAL(toggled(bool)), SLOT(onSelectMesh(bool))); + + connect(SpinBox_Dx, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + connect(SpinBox_Dy, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + connect(SpinBox_Dz, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + connect(SpinBox_Vx, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + connect(SpinBox_Vy, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + connect(SpinBox_Vz, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + connect(SpinBox_VDist, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + connect(SpinBox_NbSteps, SIGNAL(valueChanged(int)), this, SLOT(toDisplaySimulation())); + + //To Connect preview check box + connectPreviewControl(); /***************************************************************/ - /* Move widget on the botton right corner of main widget */ - int x, y; - mySMESHGUI->DefineDlgPosition(this, x, y); - this->move(x, y); - this->show(); // displays Dialog - + ConstructorsClicked(0); + ClickOnRadio(); SelectionIntoArgument(); } @@ -280,7 +355,13 @@ SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule, //================================================================================= SMESHGUI_ExtrusionDlg::~SMESHGUI_ExtrusionDlg() { - // no need to delete child widgets, Qt does it all for us + if ( myFilterDlg != 0 ) { + myFilterDlg->setParent( 0 ); + delete myFilterDlg; + } + if ( myMeshOrSubMeshOrGroupFilter0D ) delete myMeshOrSubMeshOrGroupFilter0D; + if ( myMeshOrSubMeshOrGroupFilter1D ) delete myMeshOrSubMeshOrGroupFilter1D; + if ( myMeshOrSubMeshOrGroupFilter2D ) delete myMeshOrSubMeshOrGroupFilter2D; } //================================================================================= @@ -290,26 +371,63 @@ SMESHGUI_ExtrusionDlg::~SMESHGUI_ExtrusionDlg() void SMESHGUI_ExtrusionDlg::Init (bool ResetControls) { myBusy = false; + myIDs.clear(); LineEditElements->clear(); - myElementsId = ""; myNbOkElements = 0; - buttonOk->setEnabled(false); - buttonApply->setEnabled(false); - myActor = 0; myMesh = SMESH::SMESH_Mesh::_nil(); if (ResetControls) { SpinBox_NbSteps->setValue(1); + SpinBox_VDist->setValue(10); SpinBox_Dx->SetValue(0); SpinBox_Dy->SetValue(0); SpinBox_Dz->SetValue(0); + SpinBox_Vx->SetValue(0); + SpinBox_Vy->SetValue(0); + SpinBox_Vz->SetValue(0); CheckBoxMesh->setChecked(false); onSelectMesh(false); + myPreviewCheckBox->setChecked(false); + onDisplaySimulation(false); + } + + CheckIsEnable(); +} + +//================================================================================= +// function : CheckIsEnable() +// purpose : Check whether the Ok and Apply buttons should be enabled or not +//================================================================================= +void SMESHGUI_ExtrusionDlg::CheckIsEnable() +{ + bool anIsEnable = myNbOkElements > 0 && isValuesValid(); + + buttonOk->setEnabled(anIsEnable); + buttonApply->setEnabled(anIsEnable); +} + +//================================================================================= +// function : isValuesValid() +// purpose : Return true in case if values entered into dialog are valid +//================================================================================= +bool SMESHGUI_ExtrusionDlg::isValuesValid() { + double aX, aY, aZ, aModule = 0; + if ( RadioButton3->isChecked() ) { + aX = SpinBox_Dx->GetValue(); + aY = SpinBox_Dy->GetValue(); + aZ = SpinBox_Dz->GetValue(); + aModule = sqrt(aX*aX + aY*aY + aZ*aZ); + } else if ( RadioButton4->isChecked() ) { + aX = SpinBox_Vx->GetValue(); + aY = SpinBox_Vy->GetValue(); + aZ = SpinBox_Vz->GetValue(); + aModule = sqrt(aX*aX + aY*aY + aZ*aZ); } + return aModule > 1.0E-38; } //================================================================================= @@ -320,38 +438,113 @@ void SMESHGUI_ExtrusionDlg::ConstructorsClicked (int constructorId) { disconnect(mySelectionMgr, 0, this, 0); + hidePreview(); + + TextLabelElements->setText(tr( constructorId ? "SMESH_ID_ELEMENTS" : "SMESH_ID_NODES")); + switch (constructorId) { case 0: { - GroupArguments->setTitle(tr("EXTRUSION_1D")); + GroupArguments->setTitle(tr("EXTRUSION_0D")); if (!CheckBoxMesh->isChecked()) - { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(EdgeSelection); - } + { + LineEditElements->clear(); + myIDs.clear(); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(NodeSelection); + } break; } case 1: + { + GroupArguments->setTitle(tr("EXTRUSION_1D")); + if (!CheckBoxMesh->isChecked()) + { + LineEditElements->clear(); + myIDs.clear(); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(EdgeSelection); + } + break; + } + case 2: { GroupArguments->setTitle(tr("EXTRUSION_2D")); if (!CheckBoxMesh->isChecked()) - { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(FaceSelection); - } + { + LineEditElements->clear(); + myIDs.clear(); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(FaceSelection); + } break; } } - myEditCurrentArgument = LineEditElements; + myEditCurrentArgument = (QWidget*)LineEditElements; LineEditElements->setFocus(); if (CheckBoxMesh->isChecked()) onSelectMesh(true); + myEditCurrentArgument->hide(); + myEditCurrentArgument->show(); + connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); } +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void SMESHGUI_ExtrusionDlg::ClickOnRadio() +{ + if ( RadioButton3->isChecked() ) { + TextLabelDistance->show(); + TextLabelDx->show(); + SpinBox_Dx->show(); + TextLabelDy->show(); + SpinBox_Dy->show(); + TextLabelDz->show(); + SpinBox_Dz->show(); + + TextLabelVector->hide(); + TextLabelVx->hide(); + SpinBox_Vx->hide(); + TextLabelVy->hide(); + SpinBox_Vy->hide(); + TextLabelVz->hide(); + SpinBox_Vz->hide(); + TextLabelDist->hide(); + SpinBox_VDist->hide(); + SelectVectorButton->hide(); + } else if ( RadioButton4->isChecked() ) { + TextLabelDistance->hide(); + TextLabelDx->hide(); + SpinBox_Dx->hide(); + TextLabelDy->hide(); + SpinBox_Dy->hide(); + TextLabelDz->hide(); + SpinBox_Dz->hide(); + + TextLabelVector->show(); + TextLabelVx->show(); + SpinBox_Vx->show(); + TextLabelVy->show(); + SpinBox_Vy->show(); + TextLabelVz->show(); + SpinBox_Vz->show(); + TextLabelDist->show(); + SpinBox_VDist->show(); + SelectVectorButton->show(); + } + onDisplaySimulation(true); + // AdjustSize + qApp->processEvents(); + updateGeometry(); + resize( minimumSizeHint() ); +} + //================================================================================= // function : ClickOnApply() // purpose : Called when user presses button @@ -361,34 +554,108 @@ bool SMESHGUI_ExtrusionDlg::ClickOnApply() if (mySMESHGUI->isActiveStudyLocked()) return false; - if (myNbOkElements) { - QStringList aListElementsId = QStringList::split(" ", myElementsId, false); - - SMESH::long_array_var anElementsId = new SMESH::long_array; + if (!isValid()) + return false; - anElementsId->length(aListElementsId.count()); - for (int i = 0; i < aListElementsId.count(); i++) - anElementsId[i] = aListElementsId[i].toInt(); + if (myNbOkElements) { SMESH::DirStruct aVector; - aVector.PS.x = SpinBox_Dx->GetValue(); - aVector.PS.y = SpinBox_Dy->GetValue(); - aVector.PS.z = SpinBox_Dz->GetValue(); + getExtrusionVector(aVector); + + QStringList aParameters; + if ( RadioButton3->isChecked() ) { + aParameters << SpinBox_Dx->text(); + aParameters << SpinBox_Dy->text(); + aParameters << SpinBox_Dz->text(); + } else if ( RadioButton4->isChecked() ) { + // only 3 coords in a python dump command :( + // aParameters << SpinBox_Vx->text(); + // aParameters << SpinBox_Vy->text(); + // aParameters << SpinBox_Vz->text(); + // aParameters << SpinBox_VDist->text(); + } long aNbSteps = (long)SpinBox_NbSteps->value(); + aParameters << SpinBox_NbSteps->text(); + try { + SUIT_OverrideCursor aWaitCursor; SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); - QApplication::setOverrideCursor(Qt::waitCursor); - aMeshEditor->ExtrusionSweep(anElementsId.inout(), aVector, aNbSteps); - QApplication::restoreOverrideCursor(); + + myMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); + + if ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() ) { + if( CheckBoxMesh->isChecked() ) + switch (GetConstructorId() ) { + case 0: + { + SMESH::ListOfGroups_var groups = + aMeshEditor->ExtrusionSweepObject0DMakeGroups(mySelectedObject, aVector, aNbSteps); + break; + } + case 1: + { + SMESH::ListOfGroups_var groups = + aMeshEditor->ExtrusionSweepObject1DMakeGroups(mySelectedObject, aVector, aNbSteps); + break; + } + case 2: + { + SMESH::ListOfGroups_var groups = + aMeshEditor->ExtrusionSweepObject2DMakeGroups(mySelectedObject, aVector, aNbSteps); + break; + } + } + else + { + SMESH::ListOfGroups_var groups; + if (GetConstructorId() == 0) + groups = aMeshEditor->ExtrusionSweepMakeGroups0D(myElementsId.inout(), aVector, aNbSteps); + else + groups = aMeshEditor->ExtrusionSweepMakeGroups(myElementsId.inout(), aVector, aNbSteps); + } + + } + else { + if( CheckBoxMesh->isChecked() ) + switch( GetConstructorId() ) { + case 0: + { + aMeshEditor->ExtrusionSweepObject0D(mySelectedObject, aVector, aNbSteps); + break; + } + case 1: + { + aMeshEditor->ExtrusionSweepObject1D(mySelectedObject, aVector, aNbSteps); + break; + } + case 2: + { + aMeshEditor->ExtrusionSweepObject2D(mySelectedObject, aVector, aNbSteps); + break; + } + } + else + if (GetConstructorId() == 0) + aMeshEditor->ExtrusionSweep0D(myElementsId.inout(), aVector, aNbSteps); + else + aMeshEditor->ExtrusionSweep(myElementsId.inout(), aVector, aNbSteps); + } + } catch (...) { } - SMESH::UpdateView(); + SMESH::Update(myIO, SMESH::eDisplay); + if ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() ) + mySMESHGUI->updateObjBrowser(true); // new groups may appear Init(false); ConstructorsClicked(GetConstructorId()); + mySelectionMgr->clearSelected(); + mySelectedObject = SMESH::SMESH_IDSource::_nil(); SelectionIntoArgument(); + + SMESHGUI::Modified(); } return true; } @@ -400,24 +667,52 @@ bool SMESHGUI_ExtrusionDlg::ClickOnApply() void SMESHGUI_ExtrusionDlg::ClickOnOk() { if (ClickOnApply()) - ClickOnCancel(); + reject(); } //================================================================================= -// function : ClickOnCancel() +// function : reject() // purpose : Called when dialog box is closed //================================================================================= -void SMESHGUI_ExtrusionDlg::ClickOnCancel() +void SMESHGUI_ExtrusionDlg::reject() { disconnect(mySelectionMgr, 0, this, 0); mySelectionMgr->clearFilters(); - mySelectionMgr->clearSelected(); - SMESH::SetPickable(); // ??? - SMESH::SetPointRepresentation(false); + //mySelectionMgr->clearSelected(); + if (SMESH::GetCurrentVtkView()) { + SMESH::RemoveFilters(); // PAL6938 -- clean all mesh entity filters + SMESH::SetPointRepresentation(false); + SMESH::SetPickable(); + } if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) aViewWindow->SetSelectionMode(ActorSelection); mySMESHGUI->ResetState(); - reject(); + + QDialog::reject(); +} + +//================================================================================= +// function : ClickOnHelp() +// purpose : +//================================================================================= +void SMESHGUI_ExtrusionDlg::ClickOnHelp() +{ + LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication()); + if (app) + app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName); + else { + QString platform; +#ifdef WIN32 + platform = "winapplication"; +#else + platform = "application"; +#endif + SUIT_MessageBox::warning(this, tr("WRN_WARNING"), + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); + } } //================================================================================= @@ -437,37 +732,67 @@ void SMESHGUI_ExtrusionDlg::onTextChange (const QString& theNewText) if (send == LineEditElements) myNbOkElements = 0; - buttonOk->setEnabled(false); - buttonApply->setEnabled(false); - // hilight entered elements/nodes - SMDS_Mesh* aMesh = 0; - if (myActor) - aMesh = myActor->GetObject()->GetMesh(); - if (aMesh) { - QStringList aListId = QStringList::split(" ", theNewText, false); + if (!myIO.IsNull()) { + QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts); - if (send == LineEditElements) { - const Handle(SALOME_InteractiveObject)& anIO = myActor->getIO(); + if (send == LineEditElements) + { + SMDS_Mesh* aMesh = myActor ? myActor->GetObject()->GetMesh() : 0; + SMESH::ElementType SMESHType; + SMDSAbs_ElementType SMDSType; + switch (GetConstructorId()) { + case 0: + { + SMESHType = SMESH::NODE; + SMDSType = SMDSAbs_Node; + break; + } + case 1: + { + SMESHType = SMESH::EDGE; + SMDSType = SMDSAbs_Edge; + break; + } + case 2: + { + SMESHType = SMESH::FACE; + SMDSType = SMDSAbs_Face; + break; + } + } + myElementsId = new SMESH::long_array; + myElementsId->length( aListId.count() ); TColStd_MapOfInteger newIndices; for (int i = 0; i < aListId.count(); i++) { - const SMDS_MeshElement * e = aMesh->FindElement(aListId[ i ].toInt()); - if (e) - newIndices.Add(e->GetID()); - myNbOkElements++; + int id = aListId[ i ].toInt(); + bool validId = false; + if ( id > 0 ) { + if ( aMesh ) { + const SMDS_MeshElement * e; + if (SMDSType == SMDSAbs_Node) + e = aMesh->FindNode( id ); + else + e = aMesh->FindElement( id ); + validId = ( e && e->GetType() == SMDSType ); + } else { + validId = ( myMesh->GetElementType( id, true ) == SMESHType ); + } + } + if ( validId && newIndices.Add( id )) + myElementsId[ newIndices.Extent()-1 ] = id; } - mySelector->AddOrRemoveIndex(anIO, newIndices, false); + myElementsId->length( myNbOkElements = newIndices.Extent() ); + mySelector->AddOrRemoveIndex(myIO, newIndices, false); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->highlight( anIO, true, true ); - myElementsId = theNewText; + aViewWindow->highlight( myIO, true, true ); } } - if (myNbOkElements) { - buttonOk->setEnabled(true); - buttonApply->setEnabled(true); - } + CheckIsEnable(); + + onDisplaySimulation(true); myBusy = false; } @@ -485,121 +810,104 @@ void SMESHGUI_ExtrusionDlg::SelectionIntoArgument() return; // clear - myActor = 0; - QString aString = ""; + if(myEditCurrentArgument != (QWidget*)SpinBox_Vx) { + myActor = 0; + Handle(SALOME_InteractiveObject) resIO = myIO; + myIO.Nullify(); + } + QString aString = ""; // set busy flag - myBusy = true; - - myEditCurrentArgument->setText(aString); - myNbOkElements = 0; - buttonOk->setEnabled(false); - buttonApply->setEnabled(false); - myBusy = false; - + if(myEditCurrentArgument == (QWidget*)LineEditElements) { + myBusy = true; + LineEditElements->setText(aString); + myNbOkElements = 0; + myBusy = false; + } // get selected mesh SALOME_ListIO aList; - mySelectionMgr->selectedObjects(aList, SVTK_Viewer::Type()); + mySelectionMgr->selectedObjects(aList); int nbSel = SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString); if (nbSel != 1) return; Handle(SALOME_InteractiveObject) IO = aList.First(); - myMesh = SMESH::GetMeshByIO(IO); - if (myMesh->_is_nil()) - return; - myActor = SMESH::FindActorByObject(myMesh); - if (!myActor) - return; + if(myEditCurrentArgument != (QWidget*)SpinBox_Vx) { + myMesh = SMESH::GetMeshByIO(IO); + if (myMesh->_is_nil()) + return; + myIO = IO; + myActor = SMESH::FindActorByObject(myMesh); + } - if (myEditCurrentArgument == LineEditElements) { + if (myEditCurrentArgument == (QWidget*)LineEditElements) { int aNbElements = 0; - myElementsId = ""; - if (CheckBoxMesh->isChecked()) { - int aConstructorId = GetConstructorId(); + // MakeGroups is available if there are groups + if ( myMesh->NbGroups() == 0 ) { + MakeGroupsCheck->setChecked(false); + MakeGroupsCheck->setEnabled(false); + } else { + MakeGroupsCheck->setEnabled(true); + } + if (CheckBoxMesh->isChecked()) { SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString); - if (!SMESH::IObjectToInterface(IO)->_is_nil()) { //MESH - // get IDs from mesh - SMDS_Mesh* aSMDSMesh = myActor->GetObject()->GetMesh(); - if (!aSMDSMesh) - return; - - if (aConstructorId == 0) { - SMDS_EdgeIteratorPtr anIter = aSMDSMesh->edgesIterator(); - - while (anIter->more()) { - const SMDS_MeshEdge * edge = anIter->next(); - if (edge) { - myElementsId += QString(" %1").arg(edge->GetID()); - aNbElements++; - } - } - } else if (aConstructorId == 1) { - SMDS_FaceIteratorPtr anIter = aSMDSMesh->facesIterator(); - while (anIter->more()) { - const SMDS_MeshFace * face = anIter->next(); - if (face) { - myElementsId += QString(" %1").arg(face->GetID()); - aNbElements++; - } - } - } - } else if (!SMESH::IObjectToInterface(IO)->_is_nil()) { //SUBMESH - // get submesh - SMESH::SMESH_subMesh_var aSubMesh = SMESH::IObjectToInterface(IO); - - // get IDs from submesh - SMESH::long_array_var anElementsIds = new SMESH::long_array; - if (aConstructorId == 0) - anElementsIds = aSubMesh->GetElementsByType(SMESH::EDGE); - else if (aConstructorId == 1) - anElementsIds = aSubMesh->GetElementsByType(SMESH::FACE); - - for (int i = 0; i < anElementsIds->length(); i++) - myElementsId += QString(" %1").arg(anElementsIds[i]); - aNbElements = anElementsIds->length(); - } else { // GROUP - // get smesh group - SMESH::SMESH_GroupBase_var aGroup = - SMESH::IObjectToInterface(IO); - if (aGroup->_is_nil()) - return; - - if ((aConstructorId == 0 && aGroup->GetType() != SMESH::EDGE) || - (aConstructorId == 1 && aGroup->GetType()!= SMESH::FACE)) - return; - - // get IDs from smesh group - SMESH::long_array_var anElementsIds = new SMESH::long_array; - anElementsIds = aGroup->GetListOfID(); - for (int i = 0; i < anElementsIds->length(); i++) - myElementsId += QString(" %1").arg(anElementsIds[i]); - aNbElements = anElementsIds->length(); - } + if (!SMESH::IObjectToInterface(IO)->_is_nil()) + mySelectedObject = SMESH::IObjectToInterface(IO); + else + return; } else { - aNbElements = SMESH::GetNameOfSelectedElements(mySelector, myActor->getIO(), aString); - myElementsId = aString; + // get indices of selcted elements + TColStd_IndexedMapOfInteger aMapIndex; + mySelector->GetIndex(IO,aMapIndex); + aNbElements = aMapIndex.Extent(); + + if (aNbElements < 1) + return; + + myElementsId = new SMESH::long_array; + myElementsId->length( aNbElements ); + aString = ""; + for ( int i = 0; i < aNbElements; ++i ) + aString += QString(" %1").arg( myElementsId[ i ] = aMapIndex( i+1 ) ); } - if (aNbElements < 1) - return; - myNbOkElements = true; + + myBusy = true; + ((QLineEdit*)myEditCurrentArgument)->setText(aString); + myBusy = false; } + else if(myEditCurrentArgument == (QWidget*)SpinBox_Vx){ + TColStd_IndexedMapOfInteger aMapIndex; + mySelector->GetIndex(IO,aMapIndex); + int aNbElements = aMapIndex.Extent(); + SMESH::SMESH_Mesh_var aMesh_var = SMESH::GetMeshByIO(IO); + SMESH_Actor* anActor = SMESH::FindActorByObject(aMesh_var); + SMDS_Mesh* aMesh = anActor ? anActor->GetObject()->GetMesh() : 0; + + if(aNbElements != 1 || !aMesh) + return; + + const SMDS_MeshFace* face = dynamic_cast(aMesh->FindElement(aMapIndex(aNbElements))); - myBusy = true; - myEditCurrentArgument->setText(aString); - myBusy = false; + if (!face) + return; - // OK - if (myNbOkElements) { - buttonOk->setEnabled(true); - buttonApply->setEnabled(true); + gp_XYZ aNormale = SMESH::getNormale(face); + SpinBox_Vx->SetValue(aNormale.X()); + SpinBox_Vy->SetValue(aNormale.Y()); + SpinBox_Vz->SetValue(aNormale.Z()); + } + + onDisplaySimulation(true); + + // OK + CheckIsEnable(); } //================================================================================= @@ -615,26 +923,48 @@ void SMESHGUI_ExtrusionDlg::SetEditCurrentArgument() mySelectionMgr->clearFilters(); if (send == SelectElementsButton) { - myEditCurrentArgument = LineEditElements; - if (CheckBoxMesh->isChecked()) { + myEditCurrentArgument = (QWidget*)LineEditElements; + if (CheckBoxMesh->isChecked()) + { if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(ActorSelection); - mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter); - } else { + aViewWindow->SetSelectionMode(ActorSelection); + switch( GetConstructorId() ) { + case 0: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter0D); break; + case 1: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter1D); break; + case 2: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter2D); break; + } + } + else + { int aConstructorId = GetConstructorId(); - if (aConstructorId == 0) - { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(EdgeSelection); - } - else if (aConstructorId == 1) - { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(FaceSelection); - } + switch(aConstructorId) { + case 0: + { + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(NodeSelection); + break; + } + case 1: + { + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(EdgeSelection); + break; + } + case 2: + { + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(FaceSelection); + break; + } + } } } - + else if (send == SelectVectorButton){ + myEditCurrentArgument = (QWidget*)SpinBox_Vx; + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(FaceSelection); + } + myEditCurrentArgument->setFocus(); connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); SelectionIntoArgument(); @@ -646,8 +976,8 @@ void SMESHGUI_ExtrusionDlg::SetEditCurrentArgument() //================================================================================= void SMESHGUI_ExtrusionDlg::DeactivateActiveDialog() { - if (GroupConstructors->isEnabled()) { - GroupConstructors->setEnabled(false); + if (ConstructorsBox->isEnabled()) { + ConstructorsBox->setEnabled(false); GroupArguments->setEnabled(false); GroupButtons->setEnabled(false); mySMESHGUI->ResetState(); @@ -663,7 +993,7 @@ void SMESHGUI_ExtrusionDlg::ActivateThisDialog() { // Emit a signal to deactivate the active dialog mySMESHGUI->EmitSignalDeactivateDialog(); - GroupConstructors->setEnabled(true); + ConstructorsBox->setEnabled(true); GroupArguments->setEnabled(true); GroupButtons->setEnabled(true); @@ -679,41 +1009,25 @@ void SMESHGUI_ExtrusionDlg::ActivateThisDialog() //================================================================================= void SMESHGUI_ExtrusionDlg::enterEvent (QEvent*) { - if (!GroupConstructors->isEnabled()) + if (!ConstructorsBox->isEnabled()) ActivateThisDialog(); } -//================================================================================= -// function : closeEvent() -// purpose : -//================================================================================= -//void SMESHGUI_ExtrusionDlg::closeEvent (QCloseEvent*) -//{ -// /* same than click on cancel button */ -// this->ClickOnCancel(); -//} -// -//================================================================================= -// function : hideEvent() -// purpose : caused by ESC key -//================================================================================= -//void SMESHGUI_ExtrusionDlg::hideEvent (QHideEvent*) -//{ -// if (!isMinimized()) -// ClickOnCancel(); -//} - //================================================================================= // function : onSelectMesh() // purpose : //================================================================================= void SMESHGUI_ExtrusionDlg::onSelectMesh (bool toSelectMesh) { - if (toSelectMesh) + if (toSelectMesh) { + myIDs = LineEditElements->text(); TextLabelElements->setText(tr("SMESH_NAME")); + } else TextLabelElements->setText(tr("SMESH_ID_ELEMENTS")); + myFilterBtn->setEnabled(!toSelectMesh); + if (myEditCurrentArgument != LineEditElements) { LineEditElements->clear(); return; @@ -721,29 +1035,50 @@ void SMESHGUI_ExtrusionDlg::onSelectMesh (bool toSelectMesh) mySelectionMgr->clearFilters(); - if (toSelectMesh) { + if (toSelectMesh) + { if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) aViewWindow->SetSelectionMode(ActorSelection); - mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter); + switch( GetConstructorId() ) { + case 0: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter0D); break; + case 1: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter1D); break; + case 2: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter2D); break; + } LineEditElements->setReadOnly(true); - } else { + LineEditElements->setValidator(0); + } + else + { int aConstructorId = GetConstructorId(); - if (aConstructorId == 0) - { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(EdgeSelection); - } - else if (aConstructorId == 0) - { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(FaceSelection); - } - + switch(aConstructorId) { + case 0: + { + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(NodeSelection); + break; + } + case 1: + { + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(EdgeSelection); + break; + } + case 2: + { + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(FaceSelection); + break; + } + } LineEditElements->setReadOnly(false); + LineEditElements->setValidator(myIdValidator); onTextChange(LineEditElements->text()); } SelectionIntoArgument(); + + if (!toSelectMesh) + LineEditElements->setText( myIDs ); } //================================================================================= @@ -752,7 +1087,176 @@ void SMESHGUI_ExtrusionDlg::onSelectMesh (bool toSelectMesh) //================================================================================= int SMESHGUI_ExtrusionDlg::GetConstructorId() { - if (GroupConstructors != NULL && GroupConstructors->selected() != NULL) - return GroupConstructors->id(GroupConstructors->selected()); - return -1; + return GroupConstructors->checkedId(); +} + +//================================================================================= +// function : keyPressEvent() +// purpose : +//================================================================================= +void SMESHGUI_ExtrusionDlg::keyPressEvent( QKeyEvent* e ) +{ + QDialog::keyPressEvent( e ); + if ( e->isAccepted() ) + return; + + if ( e->key() == Qt::Key_F1 ) { + e->accept(); + ClickOnHelp(); + } +} + +//================================================================================= +// function : setFilters() +// purpose : SLOT. Called when "Filter" button pressed. +//================================================================================= +void SMESHGUI_ExtrusionDlg::setFilters() +{ + if(myMesh->_is_nil()) { + SUIT_MessageBox::critical(this, + tr("SMESH_ERROR"), + tr("NO_MESH_SELECTED")); + return; + } + if ( !myFilterDlg ) + { + QList types; + types.append( SMESH::NODE ); + types.append( SMESH::EDGE ); + types.append( SMESH::FACE ); + myFilterDlg = new SMESHGUI_FilterDlg( mySMESHGUI, types ); + } + switch( GetConstructorId() ){ + case 0: + { + myFilterDlg->Init( SMESH::NODE ); + break; + } + case 1: + { + myFilterDlg->Init( SMESH::EDGE ); + break; + } + case 2: + { + myFilterDlg->Init( SMESH::FACE ); + break; + } + } + + + myFilterDlg->SetSelection(); + myFilterDlg->SetMesh( myMesh ); + myFilterDlg->SetSourceWg( LineEditElements ); + + myFilterDlg->show(); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool SMESHGUI_ExtrusionDlg::isValid() +{ + QString msg; + bool ok = true; + if ( RadioButton3->isChecked() ) { + ok = SpinBox_Dx->isValid( msg, true ) && ok; + ok = SpinBox_Dy->isValid( msg, true ) && ok; + ok = SpinBox_Dz->isValid( msg, true ) && ok; + } else if ( RadioButton4->isChecked() ) { + ok = SpinBox_Vx->isValid( msg, true ) && ok; + ok = SpinBox_Vy->isValid( msg, true ) && ok; + ok = SpinBox_Vz->isValid( msg, true ) && ok; + ok = SpinBox_VDist->isValid( msg, true ) && ok; + } + ok = SpinBox_NbSteps->isValid( msg, true ) && ok; + + if( !ok ) { + QString str( tr( "SMESH_INCORRECT_INPUT" ) ); + if ( !msg.isEmpty() ) + str += "\n" + msg; + SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str ); + return false; + } + return true; +} + +//================================================================================= +// function : onDisplaySimulation +// purpose : Show/Hide preview +//================================================================================= +void SMESHGUI_ExtrusionDlg::onDisplaySimulation( bool toDisplayPreview ) { + if (myPreviewCheckBox->isChecked() && toDisplayPreview) { + if (myNbOkElements && isValid() && isValuesValid()) { + //Get input vector + SMESH::DirStruct aVector; + getExtrusionVector(aVector); + + //Get Number of the steps + long aNbSteps = (long)SpinBox_NbSteps->value(); + + try { + SUIT_OverrideCursor aWaitCursor; + SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditPreviewer(); + if( CheckBoxMesh->isChecked() ) { + switch (GetConstructorId()) { + case 0: + { + aMeshEditor->ExtrusionSweepObject0D(mySelectedObject, aVector, aNbSteps); + break; + } + case 1: + { + aMeshEditor->ExtrusionSweepObject1D(mySelectedObject, aVector, aNbSteps); + break; + } + case 2: + { + aMeshEditor->ExtrusionSweepObject2D(mySelectedObject, aVector, aNbSteps); + break; + } + } + } + else + if(GetConstructorId() == 0) + aMeshEditor->ExtrusionSweep0D(myElementsId.inout(), aVector, aNbSteps); + else + aMeshEditor->ExtrusionSweep(myElementsId.inout(), aVector, aNbSteps); + + SMESH::MeshPreviewStruct_var aMeshPreviewStruct = aMeshEditor->GetPreviewData(); + mySimulation->SetData(aMeshPreviewStruct._retn()); + } catch (...) { + hidePreview(); + } + } else { + hidePreview(); + } + } else { + hidePreview(); + } +} + +//================================================================================= +// function : getExtrusionVector() +// purpose : get direction of the extrusion +//================================================================================= +void SMESHGUI_ExtrusionDlg::getExtrusionVector(SMESH::DirStruct& aVector) { + if ( RadioButton3->isChecked() ) { + aVector.PS.x = SpinBox_Dx->GetValue(); + aVector.PS.y = SpinBox_Dy->GetValue(); + aVector.PS.z = SpinBox_Dz->GetValue(); + } else if ( RadioButton4->isChecked() ) { + gp_XYZ aNormale(SpinBox_Vx->GetValue(), + SpinBox_Vy->GetValue(), + SpinBox_Vz->GetValue()); + + + aNormale /= aNormale.Modulus(); + double aVDist = (double)SpinBox_VDist->value(); + + aVector.PS.x = aNormale.X()*aVDist; + aVector.PS.y = aNormale.Y()*aVDist; + aVector.PS.z = aNormale.Z()*aVDist; + } }