X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_ExtrusionAlongPathDlg.cxx;h=2779ce68917e4d004fd4017040187263bb5373eb;hp=46222594ed97e7242cc0c7d3c3bd6ad8bdbb440a;hb=d1ed915c6868c000dc9125ac68641c92c0961349;hpb=c38c10811a065cf5b13e8807ed71864d92ca7d80 diff --git a/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.cxx b/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.cxx index 46222594e..2779ce689 100644 --- a/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.cxx @@ -1,193 +1,163 @@ -// SMESH SMESHGUI : GUI for SMESH component +// Copyright (C) 2007-2015 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_ExtrusionAlongPathDlg.cxx -// Author : Vadim SANDLER -// Module : SMESH -// $Header: + +// SMESH SMESHGUI : GUI for SMESH component +// File : SMESHGUI_ExtrusionAlongPathDlg.cxx +// Author : Vadim SANDLER, Open CASCADE S.A.S. +// SMESH includes #include "SMESHGUI_ExtrusionAlongPathDlg.h" #include "SMESHGUI.h" -#include "SMESHGUI_Utils.h" -#include "SMESHGUI_VTKUtils.h" +#include "SMESHGUI_ExtrusionDlg.h" // for SMESHGUI_3TypesSelector +#include "SMESHGUI_FilterDlg.h" +#include "SMESHGUI_IdValidator.h" +#include "SMESHGUI_MeshEditPreview.h" #include "SMESHGUI_MeshUtils.h" #include "SMESHGUI_SpinBox.h" -#include "SMESHGUI_IdValidator.h" - -#include "SMESH_Actor.h" -#include "SMESH_TypeFilter.hxx" -#include "SMESH_NumberFilter.hxx" -#include "SMESH_LogicalFilter.hxx" - -#include "SMDS_Mesh.hxx" +#include "SMESHGUI_Utils.h" +#include "SMESHGUI_VTKUtils.h" -#include "GEOMBase.h" +#include +#include +#include +#include -#include "SUIT_ResourceMgr.h" -#include "SUIT_OverrideCursor.h" -#include "SUIT_Desktop.h" -#include "SUIT_MessageBox.h" +#include -#include "SVTK_ViewModel.h" -#include "SVTK_ViewWindow.h" -#include "SVTK_Selector.h" -#include "SVTK_Selection.h" -#include "SALOME_ListIO.hxx" +// SALOME GEOM includes +#include -#include "utilities.h" +// SALOME GUI includes +#include +#include +#include +#include +#include +#include +#include +#include -// OCCT Includes +// OCCT includes #include -#include -#include #include #include #include -#include - -// QT Includes -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// IDL Headers -#include "SALOMEconfig.h" + +// Qt includes +#include +#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) + +#define SPACING 6 +#define MARGIN 11 -using namespace std; +class SMESHGUI_ExtrusionAlongPathDlg::SetBusy +{ +public: + SetBusy( SMESHGUI_ExtrusionAlongPathDlg* _dlg ) + { + myDlg = _dlg; + myDlg->myBusy = true; + } + + ~SetBusy() + { + myDlg->myBusy = false; + } + +private: + SMESHGUI_ExtrusionAlongPathDlg* myDlg; +}; //================================================================================= // function : SMESHGUI_ExtrusionAlongPathDlg() // purpose : constructor //================================================================================= -SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theModule, - bool modal ) - : QDialog( SMESH::GetDesktop( theModule ), "SMESHGUI_ExtrusionAlongPathDlg", modal, - WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | Qt::WDestructiveClose), - mySMESHGUI( theModule ), - mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), - myViewWindow( SMESH::GetViewWindow( theModule ) ), - mySelector( myViewWindow->GetSelector() ) +SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theModule ) + : SMESHGUI_PreviewDlg( theModule ), + mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ) { - QPixmap edgeImage (SMESHGUI::resourceMgr()->loadPixmap("SMESH", tr("ICON_DLG_EDGE"))); - QPixmap faceImage (SMESHGUI::resourceMgr()->loadPixmap("SMESH", tr("ICON_DLG_TRIANGLE"))); - QPixmap selectImage (SMESHGUI::resourceMgr()->loadPixmap("SMESH", tr("ICON_SELECT"))); - QPixmap addImage (SMESHGUI::resourceMgr()->loadPixmap("SMESH", tr("ICON_APPEND"))); - QPixmap removeImage (SMESHGUI::resourceMgr()->loadPixmap("SMESH", tr("ICON_REMOVE"))); - - myType = -1; + SUIT_ResourceMgr* mgr = SMESH::GetResourceMgr( mySMESHGUI ); + QPixmap selectImage ( mgr->loadPixmap("SMESH", tr("ICON_SELECT"))); + QPixmap addImage ( mgr->loadPixmap("SMESH", tr("ICON_APPEND"))); + QPixmap removeImage ( mgr->loadPixmap("SMESH", tr("ICON_REMOVE"))); - setCaption(tr("EXTRUSION_ALONG_PATH")); - setSizeGripEnabled(TRUE); + setModal( false ); + setAttribute( Qt::WA_DeleteOnClose, true ); + setWindowTitle(tr("EXTRUSION_ALONG_PATH")); + setSizeGripEnabled(true); - QGridLayout* topLayout = new QGridLayout(this); - topLayout->setSpacing(6); - topLayout->setMargin(11); - - /***************************************************************/ - // Elements type group box (1d / 2d elements) - GroupConstructors = new QButtonGroup(tr("SMESH_EXTRUSION"), this); - 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); - - Elements1dRB = new QRadioButton(GroupConstructors); - Elements1dRB->setPixmap(edgeImage); - Elements2dRB = new QRadioButton(GroupConstructors); - Elements2dRB->setPixmap(faceImage); - Elements1dRB->setChecked(true); - - // layouting - GroupConstructorsLayout->addWidget(Elements1dRB, 0, 0); - GroupConstructorsLayout->addWidget(Elements2dRB, 0, 2); + QVBoxLayout* topLayout = new QVBoxLayout(this); + topLayout->setSpacing(SPACING); + topLayout->setMargin(MARGIN); /***************************************************************/ // Arguments group box - GroupArguments = new QGroupBox(tr("EXTRUSION_1D"), this); - 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); - - // Controls for elements selection - ElementsLab = new QLabel(tr("SMESH_ID_ELEMENTS"), GroupArguments); - - SelectElementsButton = new QToolButton(GroupArguments); - SelectElementsButton->setPixmap(selectImage); - - ElementsLineEdit = new QLineEdit(GroupArguments); - ElementsLineEdit->setValidator(new SMESHGUI_IdValidator(this)); + GroupArguments = new QGroupBox(tr("SMESH_EXTRUSION"), this); + QGridLayout* GroupArgumentsLayout = new QGridLayout(GroupArguments); + GroupArgumentsLayout->setSpacing(SPACING); GroupArgumentsLayout->setMargin(MARGIN); - // Controls for the whole mesh selection - MeshCheck = new QCheckBox(tr("SMESH_SELECT_WHOLE_MESH"), GroupArguments); + myIdValidator = new SMESHGUI_IdValidator(this); + // Controls for elements selection + SelectorWdg = new SMESHGUI_3TypesSelector( GroupArguments ); + // Controls for path selection PathGrp = new QGroupBox(tr("SMESH_PATH"), GroupArguments); - PathGrp->setColumnLayout(0, Qt::Vertical); - PathGrp->layout()->setSpacing(0); PathGrp->layout()->setMargin(0); - QGridLayout* PathGrpLayout = new QGridLayout(PathGrp->layout()); - PathGrpLayout->setAlignment(Qt::AlignTop); - PathGrpLayout->setSpacing(6); PathGrpLayout->setMargin(11); + QGridLayout* PathGrpLayout = new QGridLayout(PathGrp); + PathGrpLayout->setSpacing(SPACING); PathGrpLayout->setMargin(MARGIN); // Controls for path mesh selection - PathMeshLab = new QLabel(tr("SMESH_PATH_MESH"), PathGrp); + QLabel* PathMeshLab = new QLabel(tr("SMESH_PATH_MESH"), PathGrp); - SelectPathMeshButton = new QToolButton(PathGrp); - SelectPathMeshButton->setPixmap(selectImage); + SelectPathMeshButton = new QPushButton(PathGrp); + SelectPathMeshButton->setIcon(selectImage); + SelectPathMeshButton->setCheckable(true); PathMeshLineEdit = new QLineEdit(PathGrp); PathMeshLineEdit->setReadOnly(true); - // Controls for path shape selection - PathShapeLab = new QLabel(tr("SMESH_PATH_SHAPE"), PathGrp); - - SelectPathShapeButton = new QToolButton(PathGrp); - SelectPathShapeButton->setPixmap(selectImage); - - PathShapeLineEdit = new QLineEdit(PathGrp); - PathShapeLineEdit->setReadOnly(true); - // Controls for path starting point selection - StartPointLab = new QLabel(tr("SMESH_PATH_START"), PathGrp); + QLabel* StartPointLab = new QLabel(tr("SMESH_PATH_START"), PathGrp); - SelectStartPointButton = new QToolButton(PathGrp); - SelectStartPointButton->setPixmap(selectImage); + SelectStartPointButton = new QPushButton(PathGrp); + SelectStartPointButton->setIcon(selectImage); + SelectStartPointButton->setCheckable(true); StartPointLineEdit = new QLineEdit(PathGrp); StartPointLineEdit->setValidator(new QIntValidator(this)); @@ -196,138 +166,130 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod PathGrpLayout->addWidget(PathMeshLab, 0, 0); PathGrpLayout->addWidget(SelectPathMeshButton, 0, 1); PathGrpLayout->addWidget(PathMeshLineEdit, 0, 2); - PathGrpLayout->addWidget(PathShapeLab, 1, 0); - PathGrpLayout->addWidget(SelectPathShapeButton, 1, 1); - PathGrpLayout->addWidget(PathShapeLineEdit, 1, 2); - PathGrpLayout->addWidget(StartPointLab, 2, 0); - PathGrpLayout->addWidget(SelectStartPointButton, 2, 1); - PathGrpLayout->addWidget(StartPointLineEdit, 2, 2); - - // Controls for base point defining - BasePointCheck = new QCheckBox(tr("SMESH_USE_BASE_POINT"), GroupArguments); + PathGrpLayout->addWidget(StartPointLab, 1, 0); + PathGrpLayout->addWidget(SelectStartPointButton, 1, 1); + PathGrpLayout->addWidget(StartPointLineEdit, 1, 2); BasePointGrp = new QGroupBox(tr("SMESH_BASE_POINT"), GroupArguments); - BasePointGrp->setColumnLayout(0, Qt::Vertical); - BasePointGrp->layout()->setSpacing(0); BasePointGrp->layout()->setMargin(0); - QGridLayout* BasePointGrpLayout = new QGridLayout(BasePointGrp->layout()); - BasePointGrpLayout->setAlignment(Qt::AlignTop); - BasePointGrpLayout->setSpacing(6); BasePointGrpLayout->setMargin(11); + BasePointGrp->setCheckable(true); + BasePointGrp->setChecked(false); + QHBoxLayout* BasePointGrpLayout = new QHBoxLayout(BasePointGrp); + BasePointGrpLayout->setSpacing(SPACING); BasePointGrpLayout->setMargin(MARGIN); + + SelectBasePointButton = new QPushButton(BasePointGrp); + SelectBasePointButton->setIcon(selectImage); + SelectBasePointButton->setCheckable(true); - SelectBasePointButton = new QToolButton(BasePointGrp); - SelectBasePointButton->setPixmap(selectImage); + SelectorWdg->GetButtonGroup()->addButton( SelectPathMeshButton ); + SelectorWdg->GetButtonGroup()->addButton( SelectStartPointButton ); + SelectorWdg->GetButtonGroup()->addButton( SelectBasePointButton ); - XLab = new QLabel(tr("SMESH_X"), BasePointGrp); + QLabel* XLab = new QLabel(tr("SMESH_X"), BasePointGrp); XSpin = new SMESHGUI_SpinBox(BasePointGrp); - YLab = new QLabel(tr("SMESH_Y"), BasePointGrp); + QLabel* YLab = new QLabel(tr("SMESH_Y"), BasePointGrp); YSpin = new SMESHGUI_SpinBox(BasePointGrp); - ZLab = new QLabel(tr("SMESH_Z"), BasePointGrp); + QLabel* ZLab = new QLabel(tr("SMESH_Z"), BasePointGrp); ZSpin = new SMESHGUI_SpinBox(BasePointGrp); // layouting - BasePointGrpLayout->addWidget(SelectBasePointButton, 0, 0); - BasePointGrpLayout->addWidget(XLab, 0, 1); - BasePointGrpLayout->addWidget(XSpin, 0, 2); - BasePointGrpLayout->addWidget(YLab, 0, 3); - BasePointGrpLayout->addWidget(YSpin, 0, 4); - BasePointGrpLayout->addWidget(ZLab, 0, 5); - BasePointGrpLayout->addWidget(ZSpin, 0, 6); - - // Controls for angles defining - AnglesCheck = new QCheckBox(tr("SMESH_USE_ANGLES"), GroupArguments); + BasePointGrpLayout->addWidget(SelectBasePointButton); + BasePointGrpLayout->addWidget(XLab); + BasePointGrpLayout->addWidget(XSpin); + BasePointGrpLayout->addWidget(YLab); + BasePointGrpLayout->addWidget(YSpin); + BasePointGrpLayout->addWidget(ZLab); + BasePointGrpLayout->addWidget(ZSpin); AnglesGrp = new QGroupBox(tr("SMESH_ANGLES"), GroupArguments); - AnglesGrp->setColumnLayout(0, Qt::Vertical); - AnglesGrp->layout()->setSpacing(0); AnglesGrp->layout()->setMargin(0); - QGridLayout* AnglesGrpLayout = new QGridLayout(AnglesGrp->layout()); - AnglesGrpLayout->setAlignment(Qt::AlignTop); - AnglesGrpLayout->setSpacing(6); AnglesGrpLayout->setMargin(11); + AnglesGrp->setCheckable(true); + AnglesGrp->setChecked(false); + QGridLayout* AnglesGrpLayout = new QGridLayout(AnglesGrp); + AnglesGrpLayout->setSpacing(SPACING); AnglesGrpLayout->setMargin(MARGIN); - AnglesList = new QListBox(AnglesGrp); - AnglesList->setSelectionMode(QListBox::Extended); + AnglesList = new QListWidget(AnglesGrp); + AnglesList->setSelectionMode(QListWidget::ExtendedSelection); AddAngleButton = new QToolButton(AnglesGrp); - AddAngleButton->setPixmap(addImage); + AddAngleButton->setIcon(addImage); RemoveAngleButton = new QToolButton(AnglesGrp); - RemoveAngleButton->setPixmap(removeImage); + RemoveAngleButton->setIcon(removeImage); AngleSpin = new SMESHGUI_SpinBox(AnglesGrp); + LinearAnglesCheck = new QCheckBox(tr("LINEAR_ANGLES"), AnglesGrp); + // layouting - QVBoxLayout* bLayout = new QVBoxLayout(); - bLayout->addWidget(AddAngleButton); - bLayout->addSpacing(6); - bLayout->addWidget(RemoveAngleButton); - bLayout->addStretch(); - AnglesGrpLayout->addMultiCellWidget(AnglesList, 0, 1, 0, 0); - AnglesGrpLayout->addMultiCellLayout(bLayout, 0, 1, 1, 1); - AnglesGrpLayout->addWidget( AngleSpin, 0, 2 ); - AnglesGrpLayout->setRowStretch(1, 10); + AnglesGrpLayout->addWidget(AnglesList, 0, 0, 4, 1); + AnglesGrpLayout->addWidget(AddAngleButton, 0, 1); + AnglesGrpLayout->addWidget(RemoveAngleButton, 2, 1); + AnglesGrpLayout->addWidget(AngleSpin, 0, 2); + AnglesGrpLayout->addWidget(LinearAnglesCheck, 4, 0); + AnglesGrpLayout->setRowMinimumHeight(1, 10); + AnglesGrpLayout->setRowStretch(3, 10); + + // CheckBox for groups generation + MakeGroupsCheck = new QCheckBox(tr("SMESH_MAKE_GROUPS"), GroupArguments); + MakeGroupsCheck->setChecked(true); + + //Preview check box + myPreviewCheckBox = new QCheckBox(tr("PREVIEW"), GroupArguments); // layouting - GroupArgumentsLayout->addWidget( ElementsLab, 0, 0 ); - GroupArgumentsLayout->addWidget( SelectElementsButton, 0, 1 ); - GroupArgumentsLayout->addWidget( ElementsLineEdit, 0, 2 ); - GroupArgumentsLayout->addMultiCellWidget(MeshCheck, 1, 1, 0, 2); - GroupArgumentsLayout->addMultiCellWidget(PathGrp, 2, 2, 0, 2); - GroupArgumentsLayout->addWidget( BasePointCheck, 3, 0 ); - GroupArgumentsLayout->addMultiCellWidget(BasePointGrp, 3, 4, 1, 2); - GroupArgumentsLayout->addWidget( AnglesCheck, 5, 0 ); - GroupArgumentsLayout->addMultiCellWidget(AnglesGrp, 5, 6, 1, 2); - GroupArgumentsLayout->setRowStretch(6, 10); + GroupArgumentsLayout->addWidget(SelectorWdg, 0, 0); + GroupArgumentsLayout->addWidget(PathGrp, 1, 0); + GroupArgumentsLayout->addWidget(BasePointGrp, 2, 0); + GroupArgumentsLayout->addWidget(AnglesGrp, 3, 0); + GroupArgumentsLayout->addWidget(myPreviewCheckBox, 4, 0); + GroupArgumentsLayout->addWidget(MakeGroupsCheck, 5, 0); /***************************************************************/ // common buttons group box GroupButtons = new QGroupBox(this); - 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); - - OkButton = new QPushButton(tr("SMESH_BUT_OK"), GroupButtons); + QHBoxLayout* GroupButtonsLayout = new QHBoxLayout(GroupButtons); + GroupButtonsLayout->setSpacing(SPACING); GroupButtonsLayout->setMargin(MARGIN); + + OkButton = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), GroupButtons); OkButton->setAutoDefault(true); OkButton->setDefault(true); - ApplyButton = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons); + ApplyButton = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons); ApplyButton->setAutoDefault(true); CloseButton = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons); CloseButton->setAutoDefault(true); + HelpButton = new QPushButton(tr("SMESH_BUT_HELP"), GroupButtons); + HelpButton->setAutoDefault(true); + // layouting - GroupButtonsLayout->addWidget(OkButton, 0, 0); - GroupButtonsLayout->addWidget(ApplyButton, 0, 1); - GroupButtonsLayout->addWidget(CloseButton, 0, 3); - GroupButtonsLayout->addColSpacing(2, 10); - GroupButtonsLayout->setColStretch(2, 10); + GroupButtonsLayout->addWidget(OkButton); + GroupButtonsLayout->addSpacing(10); + GroupButtonsLayout->addWidget(ApplyButton); + GroupButtonsLayout->addSpacing(10); + GroupButtonsLayout->addStretch(); + GroupButtonsLayout->addWidget(CloseButton); + GroupButtonsLayout->addWidget(HelpButton); /***************************************************************/ // layouting - topLayout->addWidget(GroupConstructors, 0, 0); - topLayout->addWidget(GroupArguments, 1, 0); - topLayout->addWidget(GroupButtons, 2, 0); + topLayout->addWidget(GroupArguments); + topLayout->addWidget(GroupButtons); /***************************************************************/ // Initialisations - XSpin->RangeStepAndValidator(-999999.999, +999999.999, 10.0, 3); - YSpin->RangeStepAndValidator(-999999.999, +999999.999, 10.0, 3); - ZSpin->RangeStepAndValidator(-999999.999, +999999.999, 10.0, 3); - AngleSpin->RangeStepAndValidator(-999999.999, +999999.999, 5.0, 3); + XSpin->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision"); + YSpin->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision"); + ZSpin->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision"); + AngleSpin->RangeStepAndValidator(-180.0, 180.0, 5.0, "angle_precision"); - mySMESHGUI->SetActiveDialogBox(this); + mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector(); - // 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); + mySMESHGUI->SetActiveDialogBox(this); - QPtrList aListOfFilters; - if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter); - if (aSmeshGroupFilter) aListOfFilters.append(aSmeshGroupFilter); + myPathMeshFilter = new SMESH_TypeFilter(SMESH::MESHorSUBMESH); - myElementsFilter = new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR); - myPathMeshFilter = new SMESH_TypeFilter (MESH); + myHelpFileName = "extrusion_along_path_page.html"; Init(); @@ -336,44 +298,45 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod connect(OkButton, SIGNAL(clicked()), this, SLOT(ClickOnOk())); connect(CloseButton, SIGNAL(clicked()), this, SLOT(reject())); connect(ApplyButton, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(HelpButton, SIGNAL(clicked()), this, SLOT(ClickOnHelp())); connect(AddAngleButton, SIGNAL(clicked()), this, SLOT(OnAngleAdded())); connect(RemoveAngleButton, SIGNAL(clicked()), this, SLOT(OnAngleRemoved())); - connect(GroupConstructors, SIGNAL(clicked(int)), SLOT(ConstructorsClicked(int))); - - connect(SelectElementsButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(SelectPathMeshButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); - connect(SelectPathShapeButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(SelectStartPointButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(SelectBasePointButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(BasePointGrp, SIGNAL(toggled(bool)), this, SLOT(SetEditCurrentArgument())); - connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); - connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); - connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(reject())); + connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(reject())); + connect(mySMESHGUI, SIGNAL(SignalActivatedViewManager()), SLOT(onOpenView())); + connect(mySMESHGUI, SIGNAL(SignalCloseView()), SLOT(onCloseView())); + connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), SLOT(DeactivateActiveDialog())); + connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(SelectionIntoArgument())); + connect(SelectorWdg, SIGNAL(selectionChanged()), this, SLOT(toDisplaySimulation())); + connect(SelectorWdg, SIGNAL(selectionChanged()), this, SLOT(CheckIsEnable())); - connect(ElementsLineEdit, SIGNAL(textChanged(const QString&)), - SLOT(onTextChange(const QString&))); connect(StartPointLineEdit, SIGNAL(textChanged(const QString&)), - SLOT(onTextChange(const QString&))); + SLOT(onTextChange(const QString&))); + + connect(XSpin, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + connect(YSpin, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + connect(ZSpin, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + connect(AddAngleButton, SIGNAL(clicked()), this, SLOT(toDisplaySimulation())); + connect(RemoveAngleButton, SIGNAL(clicked()), this, SLOT(toDisplaySimulation())); + //connect(LinearAnglesCheck, SIGNAL(toggled(bool)), SLOT(onSelectMesh())); - connect(MeshCheck, SIGNAL(toggled(bool)), SLOT(onSelectMesh())); - connect(AnglesCheck, SIGNAL(toggled(bool)), SLOT(onAnglesCheck())); - connect(BasePointCheck, SIGNAL(toggled(bool)), SLOT(onBasePointCheck())); - AnglesList->installEventFilter(this); - ElementsLineEdit->installEventFilter(this); + //To Connect preview check box + connectPreviewControl(); + + AnglesList ->installEventFilter(this); StartPointLineEdit->installEventFilter(this); - XSpin->editor()->installEventFilter(this); - YSpin->editor()->installEventFilter(this); - ZSpin->editor()->installEventFilter(this); + XSpin->editor() ->installEventFilter(this); + YSpin->editor() ->installEventFilter(this); + ZSpin->editor() ->installEventFilter(this); - /***************************************************************/ - // set position and show dialog box - int x, y; - mySMESHGUI->DefineDlgPosition(this, x, y); - this->move(x, y); - this->show(); // displays Dialog + CheckIsEnable(); } //================================================================================= @@ -394,15 +357,10 @@ void SMESHGUI_ExtrusionAlongPathDlg::Init (bool ResetControls) myBusy = false; myEditCurrentArgument = 0; - myMesh = SMESH::SMESH_Mesh::_nil(); - myIDSource = SMESH::SMESH_IDSource::_nil(); - myMeshActor = 0; - myPathMesh = SMESH::SMESH_Mesh::_nil(); - myPathShape = GEOM::GEOM_Object::_nil(); + myPath = SMESH::SMESH_IDSource::_nil(); - ElementsLineEdit->clear(); + SelectorWdg->Clear(); PathMeshLineEdit->clear(); - PathShapeLineEdit->clear(); StartPointLineEdit->clear(); if (ResetControls) { @@ -411,54 +369,23 @@ void SMESHGUI_ExtrusionAlongPathDlg::Init (bool ResetControls) ZSpin->SetValue(0.0); AngleSpin->SetValue(45); - MeshCheck->setChecked(false); - ConstructorsClicked(0); - onSelectMesh(); - onAnglesCheck(); - onBasePointCheck(); + myPreviewCheckBox->setChecked(false); + onDisplaySimulation(false); } SetEditCurrentArgument(0); } //================================================================================= -// function : ConstructorsClicked() -// purpose : Called when user changes type of elements (1d / 2d) +// function : CheckIsEnable() +// purpose : Check whether the Ok and Apply buttons should be enabled or not //================================================================================= -void SMESHGUI_ExtrusionAlongPathDlg::ConstructorsClicked (int type) -{ - if (myType == type) return; - - disconnect(mySelectionMgr, 0, this, 0); - - if (type == 0) - GroupArguments->setTitle(tr("EXTRUSION_1D")); - else if (type == 1) - GroupArguments->setTitle(tr("EXTRUSION_2D")); - - // clear elements ID list - if (!MeshCheck->isChecked()) { - ElementsLineEdit->clear(); - } - // set selection mode if necessary - if (myEditCurrentArgument == ElementsLineEdit) { - mySelectionMgr->clearSelected(); - mySelectionMgr->clearFilters(); - SMESH::SetPickable(); - SMESH::SetPointRepresentation(false); - if (MeshCheck->isChecked()) { - myViewWindow->SetSelectionMode(ActorSelection); - mySelectionMgr->installFilter(myElementsFilter); - } else { - if (type == 0) - myViewWindow->SetSelectionMode(EdgeSelection); - if (type == 1) - myViewWindow->SetSelectionMode(FaceSelection); - } - } - connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); +void SMESHGUI_ExtrusionAlongPathDlg::CheckIsEnable() +{ + bool anIsEnable = SelectorWdg->IsAnythingSelected() && isValuesValid(); - myType = type; + OkButton->setEnabled(anIsEnable); + ApplyButton->setEnabled(anIsEnable); } //================================================================================= @@ -470,159 +397,107 @@ bool SMESHGUI_ExtrusionAlongPathDlg::ClickOnApply() if (mySMESHGUI->isActiveStudyLocked()) return false; - if (myMesh->_is_nil() || MeshCheck->isChecked() && myIDSource->_is_nil() || - !myMeshActor || myPathMesh->_is_nil() || myPathShape->_is_nil()) + if ( !SelectorWdg->IsAnythingSelected() || myPath->_is_nil() ) return false; - SMESH::long_array_var anElementsId = new SMESH::long_array; - - if (MeshCheck->isChecked()) { - // If "Select whole mesh, submesh or group" check box is on -> - // get all elements of the required type from the object selected - - // if MESH object is selected - if (!CORBA::is_nil(SMESH::SMESH_Mesh::_narrow(myIDSource))) { - // get mesh - SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow(myIDSource); - // get IDs from mesh... - if (Elements1dRB->isChecked()) - // 1d elements - anElementsId = aMesh->GetElementsByType(SMESH::EDGE); - else if (Elements2dRB->isChecked()) { - anElementsId = aMesh->GetElementsByType(SMESH::FACE); - } - } - // SUBMESH is selected - if (!CORBA::is_nil(SMESH::SMESH_subMesh::_narrow(myIDSource))) { - // get submesh - SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow(myIDSource); - // get IDs from submesh - if (Elements1dRB->isChecked()) - // 1d elements - anElementsId = aSubMesh->GetElementsByType(SMESH::EDGE); - else if (Elements2dRB->isChecked()) - // 2d elements - anElementsId = aSubMesh->GetElementsByType(SMESH::FACE); - } - // GROUP is selected - if (!CORBA::is_nil(SMESH::SMESH_GroupBase::_narrow(myIDSource))) { - // get smesh group - SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(myIDSource); - // get IDs from group - // 1d elements or 2d elements - if (Elements1dRB->isChecked() && aGroup->GetType() == SMESH::EDGE || - Elements2dRB->isChecked() && aGroup->GetType() == SMESH::FACE) - anElementsId = aGroup->GetListOfID(); - } - } else { - // If "Select whole mesh, submesh or group" check box is off -> - // use only elements of given type selected by user - - SMDS_Mesh* aMesh = myMeshActor->GetObject()->GetMesh(); - if (aMesh) { - QStringList aListElementsId = QStringList::split(" ", ElementsLineEdit->text(), false); - anElementsId = new SMESH::long_array; - anElementsId->length(aListElementsId.count()); - bool bOk; - int j = 0; - for (int i = 0; i < aListElementsId.count(); i++) { - long ind = aListElementsId[ i ].toLong(&bOk); - if (bOk) { - const SMDS_MeshElement* e = aMesh->FindElement(ind); - if (e) { - bool typeMatch = Elements1dRB->isChecked() && e->GetType() == SMDSAbs_Edge || - Elements2dRB->isChecked() && e->GetType() == SMDSAbs_Face; - if (typeMatch) - anElementsId[ j++ ] = ind; - } - } - } - anElementsId->length(j); - } - } - - if (anElementsId->length() <= 0) { + if (!isValid()) return false; - } - if (StartPointLineEdit->text().stripWhiteSpace().isEmpty()) { + if (StartPointLineEdit->text().trimmed().isEmpty()) { return false; } - + bool bOk; long aNodeStart = StartPointLineEdit->text().toLong(&bOk); if (!bOk) { return false; } - // get angles - SMESH::double_array_var anAngles = new SMESH::double_array; - if (AnglesCheck->isChecked()) { - anAngles->length(AnglesList->count()); - int j = 0; - bool bOk; - for (int i = 0; i < AnglesList->count(); i++) { - double angle = AnglesList->text(i).toDouble(&bOk); - if (bOk) - anAngles[ j++ ] = angle*PI/180; - } - anAngles->length(j); - } + QStringList aParameters; + + //get angles + SMESH::double_array_var anAngles = getAngles(); + + for (int i = 0; i < myAnglesList.count(); i++) + aParameters << AnglesList->item(i)->text(); + // get base point SMESH::PointStruct aBasePoint; - if (BasePointCheck->isChecked()) { + if (BasePointGrp->isChecked()) { aBasePoint.x = XSpin->GetValue(); aBasePoint.y = YSpin->GetValue(); aBasePoint.z = ZSpin->GetValue(); } + aParameters << XSpin->text(); + aParameters << YSpin->text(); + aParameters << ZSpin->text(); + + bool meshHadNewTypeBefore = true; + int maxSelType = 0; + const bool makeGroups = ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() ); try { SUIT_OverrideCursor wc; - SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); - SMESH::SMESH_MeshEditor::Extrusion_Error retVal = - aMeshEditor->ExtrusionAlongPath(anElementsId.inout(), myPathMesh, myPathShape, aNodeStart, - AnglesCheck->isChecked(), anAngles.inout(), - BasePointCheck->isChecked(), aBasePoint); - //wc.stop(); + SMESH::SMESH_Mesh_var mesh = SelectorWdg->GetMesh(); + + mesh->SetParameters( aParameters.join(":").toLatin1().constData() ); + + SMESH::ListOfIDSources_var nodes = new SMESH::ListOfIDSources(); + SMESH::ListOfIDSources_var edges = new SMESH::ListOfIDSources(); + SMESH::ListOfIDSources_var faces = new SMESH::ListOfIDSources(); + maxSelType = SelectorWdg->GetSelected( nodes, edges, faces ); + + // is it necessary to switch on the next Display Mode? + SMESH::ElementType newType = (SMESH::ElementType)( maxSelType + 1 ); + SMESH::array_of_ElementType_var oldTypes = mesh->GetTypes(); + meshHadNewTypeBefore = false; + for ( size_t i = 0; i < oldTypes->length() && !meshHadNewTypeBefore; ++i ) + meshHadNewTypeBefore = ( oldTypes[i] >= newType ); + + SMESH::SMESH_MeshEditor_var aMeshEditor = mesh->GetMeshEditor(); + SMESH::SMESH_MeshEditor::Extrusion_Error retVal; + + SMESH::ListOfGroups_var groups = + aMeshEditor->ExtrusionAlongPathObjects( nodes, edges, faces, myPath, + GEOM::GEOM_Object::_nil(), + aNodeStart, AnglesGrp->isChecked(), + anAngles, LinearAnglesCheck->isChecked(), + BasePointGrp->isChecked(), aBasePoint, + makeGroups, retVal ); + wc.suspend(); switch (retVal) { case SMESH::SMESH_MeshEditor::EXTR_NO_ELEMENTS: - SUIT_MessageBox::warn1(SMESHGUI::desktop(), - tr("SMESH_ERROR"), - tr("NO_ELEMENTS_SELECTED"), - tr("SMESH_BUT_OK")); + SUIT_MessageBox::warning(this, + tr("SMESH_ERROR"), + tr("NO_ELEMENTS_SELECTED")); return false; break; case SMESH::SMESH_MeshEditor::EXTR_PATH_NOT_EDGE: - SUIT_MessageBox::warn1(SMESHGUI::desktop(), - tr("SMESH_ERROR"), - tr("SELECTED_PATH_IS_NOT_EDGE"), - tr("SMESH_BUT_OK")); + SUIT_MessageBox::warning(this, + tr("SMESH_ERROR"), + tr("SELECTED_PATH_IS_NOT_EDGE")); return false; break; case SMESH::SMESH_MeshEditor::EXTR_BAD_PATH_SHAPE: - SUIT_MessageBox::warn1(SMESHGUI::desktop(), - tr("SMESH_ERROR"), - tr("BAD_SHAPE_TYPE"), - tr("SMESH_BUT_OK")); + SUIT_MessageBox::warning(this, + tr("SMESH_ERROR"), + tr("BAD_SHAPE_TYPE")); return false; break; case SMESH::SMESH_MeshEditor::EXTR_BAD_STARTING_NODE: - SUIT_MessageBox::warn1(SMESHGUI::desktop(), - tr("SMESH_ERROR"), - tr("EXTR_BAD_STARTING_NODE"), - tr("SMESH_BUT_OK")); + SUIT_MessageBox::warning(this, + tr("SMESH_ERROR"), + tr("EXTR_BAD_STARTING_NODE")); return false; break; case SMESH::SMESH_MeshEditor::EXTR_BAD_ANGLES_NUMBER: - SUIT_MessageBox::warn1(SMESHGUI::desktop(), - tr("SMESH_ERROR"), - tr("WRONG_ANGLES_NUMBER"), - tr("SMESH_BUT_OK")); + SUIT_MessageBox::warning(this, + tr("SMESH_ERROR"), + tr("WRONG_ANGLES_NUMBER")); return false; break; case SMESH::SMESH_MeshEditor::EXTR_CANT_GET_TANGENT: - SUIT_MessageBox::warn1(SMESHGUI::desktop(), - tr("SMESH_ERROR"), - tr("CANT_GET_TANGENT"), - tr("SMESH_BUT_OK")); + SUIT_MessageBox::warning(this, + tr("SMESH_ERROR"), + tr("CANT_GET_TANGENT")); return false; break; case SMESH::SMESH_MeshEditor::EXTR_OK: break; @@ -631,10 +506,31 @@ bool SMESHGUI_ExtrusionAlongPathDlg::ClickOnApply() return false; } - mySelectionMgr->clearSelected(); - SMESH::UpdateView(); + SMESH_Actor* actor = SelectorWdg->GetActor(); + if ( actor && !meshHadNewTypeBefore ) + { + unsigned int aMode = actor->GetEntityMode(); + switch ( maxSelType ) { + case SMESH::NODE: // extrude node -> edges + actor->SetRepresentation(SMESH_Actor::eEdge); + actor->SetEntityMode( aMode |= SMESH_Actor::eEdges ); break; + case SMESH::EDGE: // edge -> faces + actor->SetRepresentation(SMESH_Actor::eSurface); + actor->SetEntityMode( aMode |= SMESH_Actor::eFaces ); break; + case SMESH::FACE: // faces -> volumes + actor->SetRepresentation(SMESH_Actor::eSurface); + actor->SetEntityMode( aMode |= SMESH_Actor::eVolumes ); break; + } + } + if ( actor ) + SMESH::Update( actor->getIO(), actor->GetVisibility() ); + if ( makeGroups ) + mySMESHGUI->updateObjBrowser(true); // new groups may appear Init(false); - ConstructorsClicked(GetConstructorId()); + mySelectionMgr->clearSelected(); + SelectorWdg->Clear(); + + SMESHGUI::Modified(); return true; } @@ -648,6 +544,30 @@ void SMESHGUI_ExtrusionAlongPathDlg::ClickOnOk() reject(); } +//================================================================================= +// function : ClickOnHelp() +// purpose : +//================================================================================= +void SMESHGUI_ExtrusionAlongPathDlg::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)); + } +} + //================================================================================= // function : reject() // purpose : Called when dialog box is closed @@ -656,14 +576,44 @@ void SMESHGUI_ExtrusionAlongPathDlg::reject() { disconnect(mySelectionMgr, 0, this, 0); mySelectionMgr->clearFilters(); - mySelectionMgr->clearSelected(); - SMESH::SetPickable(); // ??? - SMESH::SetPointRepresentation(false); - myViewWindow->SetSelectionMode(ActorSelection); + //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(); + QDialog::reject(); } +//================================================================================= +// function : onOpenView() +// purpose : +//================================================================================= +void SMESHGUI_ExtrusionAlongPathDlg::onOpenView() +{ + if ( mySelector ) { + SMESH::SetPointRepresentation(false); + } + else { + mySelector = SMESH::GetViewWindow( mySMESHGUI )->GetSelector(); + ActivateThisDialog(); + } +} + +//================================================================================= +// function : onCloseView() +// purpose : +//================================================================================= +void SMESHGUI_ExtrusionAlongPathDlg::onCloseView() +{ + DeactivateActiveDialog(); + mySelector = 0; +} + //======================================================================= // function : onTextChange() // purpose : @@ -678,82 +628,34 @@ void SMESHGUI_ExtrusionAlongPathDlg::onTextChange (const QString& theNewText) // set busy flag SetBusy sb (this); - if (send != StartPointLineEdit && send != ElementsLineEdit) - send = ElementsLineEdit; - - if (send == ElementsLineEdit && myEditCurrentArgument == ElementsLineEdit) { - // hilight entered elements - SMDS_Mesh* aMesh = 0; - if (myMeshActor) - aMesh = myMeshActor->GetObject()->GetMesh(); - - if (aMesh) { - //mySelectionMgr->clearSelected(); - //mySelectionMgr->AddIObject(myMeshActor->getIO()); - SALOME_ListIO aList; - aList.Append(myMeshActor->getIO()); - mySelectionMgr->setSelectedObjects(aList, false); - - QStringList aListId = QStringList::split(" ", theNewText, false); - bool bOk; - const Handle(SALOME_InteractiveObject)& anIO = myMeshActor->getIO(); - TColStd_IndexedMapOfInteger selectedIndices; - TColStd_MapOfInteger newIndices; - mySelector->GetIndex(anIO, selectedIndices); - for (int i = 0; i < aListId.count(); i++) { - long ind = aListId[ i ].toLong(&bOk); - if (bOk) { - const SMDS_MeshElement* e = aMesh->FindElement(ind); - if (e) { - // check also type of element - bool typeMatch = Elements1dRB->isChecked() && e->GetType() == SMDSAbs_Edge || - Elements2dRB->isChecked() && e->GetType() == SMDSAbs_Face; - if (typeMatch) { - if (selectedIndices.Add(e->GetID())) { - newIndices.Add(e->GetID()); - } - } - } - } - } - if (newIndices.Extent() > 0) { - mySelector->AddOrRemoveIndex(anIO, newIndices, true); - myViewWindow->highlight( anIO, true, true ); - } - } - } else if (send == StartPointLineEdit && - myEditCurrentArgument == StartPointLineEdit) { - if (!myPathMesh->_is_nil()) { - SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh); - SMDS_Mesh* aMesh = 0; - if (aPathActor) - aMesh = aPathActor->GetObject()->GetMesh(); + if (send == StartPointLineEdit && + myEditCurrentArgument == StartPointLineEdit) + { + if (!myPath->_is_nil()) { + SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPath); + SMDS_Mesh* aMesh = aPathActor ? aPathActor->GetObject()->GetMesh() : 0; if (aMesh) { - //mySelectionMgr->clearSelected(); - //mySelectionMgr->AddIObject(aPathActor->getIO()); SALOME_ListIO aList; aList.Append(aPathActor->getIO()); mySelectionMgr->setSelectedObjects(aList, false); - bool bOk; - long ind = theNewText.toLong(&bOk); - if (bOk) { - const SMDS_MeshNode* n = aMesh->FindNode(ind); - if (n) { - //if (!mySelectionMgr->IsIndexSelected(aPathActor->getIO(), n->GetID())) { - TColStd_IndexedMapOfInteger selectedIndices; + bool bOk; + long ind = theNewText.toLong(&bOk); + if (bOk) { + const SMDS_MeshNode* n = aMesh->FindNode(ind); + if (n) { TColStd_MapOfInteger newIndices; - mySelector->GetIndex(aPathActor->getIO(), selectedIndices); - if (selectedIndices.Add(n->GetID())) { - newIndices.Add(n->GetID()); - mySelector->AddOrRemoveIndex( aPathActor->getIO(), newIndices, true ); - myViewWindow->highlight( aPathActor->getIO(), true, true ); - } - } - } + newIndices.Add(n->GetID()); + mySelector->AddOrRemoveIndex( aPathActor->getIO(), newIndices, false ); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->highlight( aPathActor->getIO(), true, true ); + } + } } } } + CheckIsEnable(); + onDisplaySimulation(true); } //================================================================================= @@ -777,101 +679,57 @@ void SMESHGUI_ExtrusionAlongPathDlg::SelectionIntoArgument() // set busy flag SetBusy sb (this); - if (myEditCurrentArgument == ElementsLineEdit) { - // we are now selecting mesh elements (or whole mesh/submesh/group) - // reset - ElementsLineEdit->clear(); - myMesh = SMESH::SMESH_Mesh::_nil(); - myIDSource = SMESH::SMESH_IDSource::_nil(); - myMeshActor = 0; - - // try to get mesh from selection - Handle(SALOME_InteractiveObject) IO = aList.First(); - myMesh = SMESH::GetMeshByIO(IO); - if (myMesh->_is_nil()) - return; - // find actor - myMeshActor = SMESH::FindActorByObject(myMesh); - if (!myMeshActor) - return; - - if (MeshCheck->isChecked()) { - // If "Select whole mesh, submesh or group" check box is on -> - // get ID source and put it's name to the edit box - QString aString; - SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString); + const bool isPathDef = ( SelectPathMeshButton->isChecked() || + SelectStartPointButton->isChecked() ); - myIDSource = SMESH::IObjectToInterface(IO); - ElementsLineEdit->setText(aString); - } else { - // If "Select whole mesh, submesh or group" check box is off -> - // try to get selected elements IDs - QString aString; - //int aNbUnits = SMESH::GetNameOfSelectedElements(mySelectionMgr, aString); - SMESH::GetNameOfSelectedElements(mySelector, myMeshActor->getIO(), aString); - ElementsLineEdit->setText(aString); - } - } else if (myEditCurrentArgument == PathMeshLineEdit) { + if (myEditCurrentArgument == PathMeshLineEdit && isPathDef) + { // we are now selecting path mesh // reset PathMeshLineEdit->clear(); - myPathMesh = SMESH::SMESH_Mesh::_nil(); - PathShapeLineEdit->clear(); - myPathShape = GEOM::GEOM_Object::_nil(); + myPath = SMESH::SMESH_IDSource::_nil(); StartPointLineEdit->clear(); // try to get mesh from selection Handle(SALOME_InteractiveObject) IO = aList.First(); - myPathMesh = SMESH::IObjectToInterface(IO); - if(myPathMesh->_is_nil()) + myPath = SMESH::IObjectToInterface(IO); + if( myPath->_is_nil() ) return; QString aString; SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString); PathMeshLineEdit->setText(aString); - } else if (myEditCurrentArgument == PathShapeLineEdit) { - // we are now selecting path mesh - // reset - PathShapeLineEdit->clear(); - myPathShape = GEOM::GEOM_Object::_nil(); - StartPointLineEdit->clear(); - - // return if path mesh is not yet selected - if (myPathMesh->_is_nil()) - return; - - // try to get shape from selection - Handle(SALOME_InteractiveObject) IO = aList.First(); - myPathShape = SMESH::IObjectToInterface(IO); - if (myPathShape->_is_nil()) - return; - - QString aString; - SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString); - PathShapeLineEdit->setText(aString); - } else if (myEditCurrentArgument == StartPointLineEdit) { + } + else if (myEditCurrentArgument == StartPointLineEdit && isPathDef ) + { // we are now selecting start point of path // reset StartPointLineEdit->clear(); // return if path mesh or path shape is not yet selected - if (myPathMesh->_is_nil() || myPathShape->_is_nil()) + if( myPath->_is_nil() ) return; // try to get shape from selection Handle(SALOME_InteractiveObject) IO = aList.First(); + SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPath); + if ( !aPathActor ) + return; + QString aString; - int aNbUnits = SMESH::GetNameOfSelectedElements(mySelector, myMeshActor->getIO(), aString); + int aNbUnits = SMESH::GetNameOfSelectedElements(mySelector, aPathActor->getIO(), aString); if (aNbUnits == 1) - StartPointLineEdit->setText(aString.stripWhiteSpace()); - - } else if (myEditCurrentArgument == XSpin) { + StartPointLineEdit->setText(aString.trimmed()); + } + else if ( myEditCurrentArgument == XSpin && + SelectBasePointButton->isChecked() ) + { // we are now selecting base point // reset is not performed here! // return if is not enabled - if (!BasePointGrp->isEnabled()) + if (!BasePointGrp->isChecked()) return; // try to get shape from selection @@ -882,10 +740,10 @@ void SMESHGUI_ExtrusionAlongPathDlg::SelectionIntoArgument() TopoDS_Vertex aVertex; if (!aGeomObj->_is_nil()) { if (aGeomObj->IsShape() && GEOMBase::GetShape(aGeomObj, aVertex) && !aVertex.IsNull()) { - gp_Pnt aPnt = BRep_Tool::Pnt(aVertex); - XSpin->SetValue(aPnt.X()); - YSpin->SetValue(aPnt.Y()); - ZSpin->SetValue(aPnt.Z()); + gp_Pnt aPnt = BRep_Tool::Pnt(aVertex); + XSpin->SetValue(aPnt.X()); + YSpin->SetValue(aPnt.Y()); + ZSpin->SetValue(aPnt.Z()); } return; } @@ -896,7 +754,7 @@ void SMESHGUI_ExtrusionAlongPathDlg::SelectionIntoArgument() return; QString aString; - int aNbUnits = SMESH::GetNameOfSelectedNodes(mySelector, myMeshActor->getIO(), aString); + int aNbUnits = SMESH::GetNameOfSelectedNodes(mySelector, IO, aString); // return if more than one node is selected if (aNbUnits != 1) return; @@ -917,6 +775,13 @@ void SMESHGUI_ExtrusionAlongPathDlg::SelectionIntoArgument() YSpin->SetValue(n->Y()); ZSpin->SetValue(n->Z()); } + else + { + return; + } + + onDisplaySimulation(true); + CheckIsEnable(); } //================================================================================= @@ -925,10 +790,10 @@ void SMESHGUI_ExtrusionAlongPathDlg::SelectionIntoArgument() //================================================================================= void SMESHGUI_ExtrusionAlongPathDlg::SetEditCurrentArgument() { - QToolButton* send = (QToolButton*)sender(); - if (send != SelectElementsButton && - send != SelectPathMeshButton && - send != SelectPathShapeButton && + QPushButton* send = (QPushButton*)sender(); + if ( sender() == BasePointGrp ) + send = SelectBasePointButton; + if (send != SelectPathMeshButton && send != SelectStartPointButton && send != SelectBasePointButton) return; @@ -939,73 +804,51 @@ void SMESHGUI_ExtrusionAlongPathDlg::SetEditCurrentArgument() // function : SetEditCurrentArgument() // purpose : //================================================================================= -void SMESHGUI_ExtrusionAlongPathDlg::SetEditCurrentArgument (QToolButton* button) +void SMESHGUI_ExtrusionAlongPathDlg::SetEditCurrentArgument (QPushButton* button) { disconnect(mySelectionMgr, 0, this, 0); - mySelectionMgr->clearSelected(); + // mySelectionMgr->clearSelected(); mySelectionMgr->clearFilters(); SMESH::SetPickable(); - if (button == SelectElementsButton) { - myEditCurrentArgument = ElementsLineEdit; - SMESH::SetPointRepresentation(false); - if (MeshCheck->isChecked()) { - myViewWindow->SetSelectionMode(ActorSelection); - mySelectionMgr->installFilter(myElementsFilter); - } else { - if (Elements1dRB->isChecked()) - myViewWindow->SetSelectionMode(EdgeSelection); - else if (Elements2dRB->isChecked()) - myViewWindow->SetSelectionMode(FaceSelection); - } - } else if (button == SelectPathMeshButton) { + myEditCurrentArgument = 0; + if (button == SelectPathMeshButton) + { myEditCurrentArgument = PathMeshLineEdit; SMESH::SetPointRepresentation(false); - myViewWindow->SetSelectionMode(ActorSelection); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(ActorSelection); mySelectionMgr->installFilter(myPathMeshFilter); } - else if (button == SelectPathShapeButton) { - myEditCurrentArgument = PathShapeLineEdit; - SMESH::SetPointRepresentation(false); - myViewWindow->SetSelectionMode(ActorSelection); - - if (!myPathMesh->_is_nil()) { - GEOM::GEOM_Object_var aMainShape = myPathMesh->GetShapeToMesh(); - SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh); - - if (!aMainShape->_is_nil() && aPathActor) - mySelectionMgr->installFilter(new SMESH_NumberFilter ("GEOM", TopAbs_SHAPE, -1, - TopAbs_EDGE, aMainShape)); - //SMESH::SetPickable(aPathActor); - } - } - else if (button == SelectStartPointButton) { + else if (button == SelectStartPointButton) + { myEditCurrentArgument = StartPointLineEdit; - if (!myPathMesh->_is_nil()) { - SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPathMesh); + if (!myPath->_is_nil()) { + SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPath); if (aPathActor) { - SMESH::SetPointRepresentation(true); - myViewWindow->SetSelectionMode(NodeSelection); - SMESH::SetPickable(aPathActor); + aPathActor->SetPointRepresentation( true ); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(NodeSelection); + SMESH::SetPickable(aPathActor); } } } - else if (button == SelectBasePointButton) { + else if (button == SelectBasePointButton) + { myEditCurrentArgument = XSpin; SMESH::SetPointRepresentation(true); - myViewWindow->SetSelectionMode(NodeSelection); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(NodeSelection); - SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter(MESHorSUBMESH); - SMESH_TypeFilter* aSmeshGroupFilter = new SMESH_TypeFilter(GROUP); + SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter(SMESH::IDSOURCE); SMESH_NumberFilter* aVertexFilter = new SMESH_NumberFilter ("GEOM", TopAbs_SHAPE, -1, TopAbs_VERTEX); - QPtrList aListOfFilters; + QList aListOfFilters; if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter); - if (aSmeshGroupFilter) aListOfFilters.append(aSmeshGroupFilter); if (aVertexFilter) aListOfFilters.append(aVertexFilter); mySelectionMgr->installFilter(new SMESH_LogicalFilter - (aListOfFilters, SMESH_LogicalFilter::LO_OR)); + (aListOfFilters, SMESH_LogicalFilter::LO_OR, true)); } if (myEditCurrentArgument && !myEditCurrentArgument->hasFocus()) @@ -1021,10 +864,11 @@ void SMESHGUI_ExtrusionAlongPathDlg::SetEditCurrentArgument (QToolButton* button //================================================================================= void SMESHGUI_ExtrusionAlongPathDlg::DeactivateActiveDialog() { - if (GroupConstructors->isEnabled()) { - GroupConstructors->setEnabled(false); + if (GroupButtons->isEnabled()) + { GroupArguments->setEnabled(false); GroupButtons->setEnabled(false); + SelectorWdg->setEnabled(false); mySMESHGUI->ResetState(); mySMESHGUI->SetActiveDialogBox(0); } @@ -1038,68 +882,27 @@ void SMESHGUI_ExtrusionAlongPathDlg::ActivateThisDialog() { // Emit a signal to deactivate the active dialog mySMESHGUI->EmitSignalDeactivateDialog(); - GroupConstructors->setEnabled(true); GroupArguments->setEnabled(true); GroupButtons->setEnabled(true); + SelectorWdg->setEnabled(true); mySMESHGUI->SetActiveDialogBox(this); - - ConstructorsClicked(GetConstructorId()); SelectionIntoArgument(); } //================================================================================= // function : enterEvent() -// purpose : Mouse enter event +// purpose : //================================================================================= void SMESHGUI_ExtrusionAlongPathDlg::enterEvent (QEvent*) { - if (!GroupConstructors->isEnabled()) + if ( !GroupButtons->isEnabled() ) { + SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ); + if ( aViewWindow && !mySelector) { + mySelector = aViewWindow->GetSelector(); + } ActivateThisDialog(); -} - -//======================================================================= -// function : onSelectMesh() -// purpose : -//======================================================================= -void SMESHGUI_ExtrusionAlongPathDlg::onSelectMesh() -{ - bool toSelectMesh = MeshCheck->isChecked(); - - ElementsLineEdit->setReadOnly(toSelectMesh); - ElementsLab->setText(toSelectMesh ? tr("SMESH_NAME") : tr("SMESH_ID_ELEMENTS")); - ElementsLineEdit->clear(); - - SetEditCurrentArgument(SelectElementsButton); -} - -//================================================================================= -// function : GetConstructorId() -// purpose : -//================================================================================= -int SMESHGUI_ExtrusionAlongPathDlg::GetConstructorId() -{ - if (GroupConstructors != NULL && GroupConstructors->selected() != NULL) - return GroupConstructors->id(GroupConstructors->selected()); - return -1; -} - -//======================================================================= -// function : onAnglesCheck() -// purpose : called when "Use Angles" check box is switched -//======================================================================= -void SMESHGUI_ExtrusionAlongPathDlg::onAnglesCheck() -{ - AnglesGrp->setEnabled(AnglesCheck->isChecked()); -} - -//======================================================================= -// function : onBasePointCheck() -// purpose : called when "Use Base Point" check box is switched -//======================================================================= -void SMESHGUI_ExtrusionAlongPathDlg::onBasePointCheck() -{ - BasePointGrp->setEnabled(BasePointCheck->isChecked()); + } } //======================================================================= @@ -1108,7 +911,18 @@ void SMESHGUI_ExtrusionAlongPathDlg::onBasePointCheck() //======================================================================= void SMESHGUI_ExtrusionAlongPathDlg::OnAngleAdded() { - AnglesList->insertItem(QString::number(AngleSpin->GetValue())); + QString msg; + if( !AngleSpin->isValid( msg, true ) ) { + QString str( tr( "SMESH_INCORRECT_INPUT" ) ); + if ( !msg.isEmpty() ) + str += "\n" + msg; + SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str ); + return; + } + AnglesList->addItem(AngleSpin->text()); + myAnglesList.append(AngleSpin->GetValue()); + + updateLinearAngles(); } //======================================================================= @@ -1117,14 +931,14 @@ void SMESHGUI_ExtrusionAlongPathDlg::OnAngleAdded() //======================================================================= void SMESHGUI_ExtrusionAlongPathDlg::OnAngleRemoved() { - QList aList; - aList.setAutoDelete(false); - for (int i = 0; i < AnglesList->count(); i++) - if (AnglesList->isSelected(i)) - aList.append(AnglesList->item(i)); - - for (int i = 0; i < aList.count(); i++) - delete aList.at(i); + QList aList = AnglesList->selectedItems(); + QListWidgetItem* anItem; + foreach(anItem, aList) { + myAnglesList.removeAt(AnglesList->row(anItem)); + delete anItem; + } + + updateLinearAngles(); } //================================================================================= @@ -1136,23 +950,201 @@ bool SMESHGUI_ExtrusionAlongPathDlg::eventFilter (QObject* object, QEvent* event if (event->type() == QEvent::KeyPress) { QKeyEvent* ke = (QKeyEvent*)event; if (object == AnglesList) { - if (ke->key() == Key_Delete) - OnAngleRemoved(); + if (ke->key() == Qt::Key_Delete) + OnAngleRemoved(); } } else if (event->type() == QEvent::FocusIn) { - if (object == ElementsLineEdit) { - if (myEditCurrentArgument != ElementsLineEdit) - SetEditCurrentArgument(SelectElementsButton); - } - else if (object == StartPointLineEdit) { + if (object == StartPointLineEdit) { if (myEditCurrentArgument != StartPointLineEdit) - SetEditCurrentArgument(SelectStartPointButton); + SetEditCurrentArgument(SelectStartPointButton); } else if (object == XSpin->editor() || object == YSpin->editor() || object == ZSpin->editor()) { if (myEditCurrentArgument != XSpin) - SetEditCurrentArgument(SelectBasePointButton); + SetEditCurrentArgument(SelectBasePointButton); } } return QDialog::eventFilter(object, event); } + +//================================================================================= +// function : keyPressEvent() +// purpose : +//================================================================================= +void SMESHGUI_ExtrusionAlongPathDlg::keyPressEvent( QKeyEvent* e ) +{ + QDialog::keyPressEvent( e ); + if ( e->isAccepted() ) + return; + + if ( e->key() == Qt::Key_F1 ) { + e->accept(); + ClickOnHelp(); + } +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool SMESHGUI_ExtrusionAlongPathDlg::isValid() +{ + QString msg; + bool ok = true; + ok = XSpin->isValid( msg, true ) && ok; + ok = YSpin->isValid( msg, true ) && ok; + ok = ZSpin->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 : updateLinearAngles +// purpose : +//================================================================================= +void SMESHGUI_ExtrusionAlongPathDlg::updateLinearAngles() +{ + bool enableLinear = true; + for( int row = 0, nbRows = AnglesList->count(); row < nbRows; row++ ) { + if( QListWidgetItem* anItem = AnglesList->item( row ) ) { + enableLinear = false; + anItem->text().toDouble(&enableLinear); + if( !enableLinear ) + break; + } + } + if( !enableLinear ) + LinearAnglesCheck->setChecked( false ); + LinearAnglesCheck->setEnabled( enableLinear ); +} + +//================================================================================= +// function : isValuesValid() +// purpose : Return true in case if values entered into dialog are valid +//================================================================================= + +bool SMESHGUI_ExtrusionAlongPathDlg::isValuesValid() +{ + if ( myPath->_is_nil() ) + return false; + + bool bOk; + long aNodeStart = StartPointLineEdit->text().toLong(&bOk); + if ( !bOk || aNodeStart < 1 ) + return false; + + SMESH::SMESH_Mesh_var mesh = myPath->GetMesh(); + if ( mesh->_is_nil() ) + return false; + + SMESH::ElementType type = mesh->GetElementType( aNodeStart, false ); + if ( type != SMESH::NODE ) + return false; + + if ( mesh->HasShapeToMesh() ) + { + SMESH::NodePosition_var pos = mesh->GetNodePosition( aNodeStart ); + if ( pos->shapeType != GEOM::VERTEX ) + return false; + } + else + { + SMESH::long_array_var elems = mesh->GetNodeInverseElements( aNodeStart ); + if ( elems->length() != 1 || + mesh->GetElementType( elems[0], true ) != SMESH::EDGE ) + return false; + } + return true; +} + +//================================================================================= +// function : onDisplaySimulation +// purpose : Show/Hide preview +//================================================================================= + +void SMESHGUI_ExtrusionAlongPathDlg::onDisplaySimulation( bool toDisplayPreview ) +{ + if ( myPreviewCheckBox->isChecked() && toDisplayPreview ) { + if ( SelectorWdg->IsAnythingSelected() && isValid() && isValuesValid()) + { + // get angles + SMESH::double_array_var anAngles = getAngles(); + + // get base point + SMESH::PointStruct aBasePoint; + if (BasePointGrp->isChecked()) { + aBasePoint.x = XSpin->GetValue(); + aBasePoint.y = YSpin->GetValue(); + aBasePoint.z = ZSpin->GetValue(); + } + bool bOk; + long aNodeStart = StartPointLineEdit->text().toLong(&bOk); + if (bOk) { + + try { + SUIT_OverrideCursor wc; + + SMESH::SMESH_MeshEditor::Extrusion_Error retVal; + SMESH::SMESH_Mesh_var mesh = SelectorWdg->GetMesh(); + SMESH::SMESH_MeshEditor_var meshEditor = mesh->GetMeshEditPreviewer(); + + SMESH::ListOfIDSources_var nodes = new SMESH::ListOfIDSources(); + SMESH::ListOfIDSources_var edges = new SMESH::ListOfIDSources(); + SMESH::ListOfIDSources_var faces = new SMESH::ListOfIDSources(); + SelectorWdg->GetSelected( nodes, edges, faces ); + const bool makeGroups = false; + + SMESH::ListOfGroups_var groups = + meshEditor->ExtrusionAlongPathObjects( nodes, edges, faces, myPath, + GEOM::GEOM_Object::_nil(), + aNodeStart, AnglesGrp->isChecked(), + anAngles, LinearAnglesCheck->isChecked(), + BasePointGrp->isChecked(), aBasePoint, + makeGroups, retVal ); + + if( retVal == SMESH::SMESH_MeshEditor::EXTR_OK ) + { + SMESH::MeshPreviewStruct_var aMeshPreviewStruct = meshEditor->GetPreviewData(); + mySimulation->SetData( aMeshPreviewStruct._retn() ); + } + else { + hidePreview(); + } + + } catch (...) { + hidePreview(); + } + } else { + hidePreview(); + } + + } else { + hidePreview(); + } + } else { + hidePreview(); + } +} + +SMESH::double_array_var SMESHGUI_ExtrusionAlongPathDlg::getAngles() +{ + SMESH::double_array_var anAngles = new SMESH::double_array; + if (AnglesGrp->isChecked()) + { + anAngles->length(myAnglesList.count()); + int j = 0; + for (int i = 0; i < myAnglesList.count(); i++) { + double angle = myAnglesList[i]; + anAngles[ j++ ] = angle*M_PI/180.; + } + anAngles->length(j); + } + return anAngles; +}