X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_ExtrusionAlongPathDlg.cxx;h=bd2cb645aff6ca2b28be71cb19b023a48e13e237;hp=9c75297619ed4e0934c5da73e6659c5f7e6c93bd;hb=0fc0831670e27a5611b941c52dc152fd63964515;hpb=251f8c052dd12dd29922210dc901b295fe999a0e diff --git a/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.cxx b/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.cxx index 9c7529761..bd2cb645a 100644 --- a/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2020 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -28,13 +28,14 @@ #include "SMESHGUI_ExtrusionAlongPathDlg.h" #include "SMESHGUI.h" -#include "SMESHGUI_Utils.h" -#include "SMESHGUI_VTKUtils.h" -#include "SMESHGUI_MeshUtils.h" -#include "SMESHGUI_SpinBox.h" -#include "SMESHGUI_IdValidator.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_Utils.h" +#include "SMESHGUI_VTKUtils.h" #include #include @@ -52,10 +53,8 @@ #include #include #include - #include #include - #include // OCCT includes @@ -111,18 +110,13 @@ private: //================================================================================= SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theModule ) : SMESHGUI_PreviewDlg( theModule ), - mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), - myFilterDlg( 0 ) + mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ) { SUIT_ResourceMgr* mgr = SMESH::GetResourceMgr( mySMESHGUI ); - QPixmap edgeImage ( mgr->loadPixmap("SMESH", tr("ICON_DLG_EDGE"))); - QPixmap faceImage ( mgr->loadPixmap("SMESH", tr("ICON_DLG_TRIANGLE"))); QPixmap selectImage ( mgr->loadPixmap("SMESH", tr("ICON_SELECT"))); QPixmap addImage ( mgr->loadPixmap("SMESH", tr("ICON_APPEND"))); QPixmap removeImage ( mgr->loadPixmap("SMESH", tr("ICON_REMOVE"))); - myType = -1; - setModal( false ); setAttribute( Qt::WA_DeleteOnClose, true ); setWindowTitle(tr("EXTRUSION_ALONG_PATH")); @@ -132,48 +126,17 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod topLayout->setSpacing(SPACING); topLayout->setMargin(MARGIN); - /***************************************************************/ - // Elements type group box (1d / 2d elements) - ConstructorsBox = new QGroupBox(tr("SMESH_EXTRUSION"), this); - GroupConstructors = new QButtonGroup(this); - QHBoxLayout* ConstructorsBoxLayout = new QHBoxLayout(ConstructorsBox); - ConstructorsBoxLayout->setSpacing(SPACING); ConstructorsBoxLayout->setMargin(MARGIN); - - Elements1dRB = new QRadioButton(ConstructorsBox); - Elements1dRB->setIcon(edgeImage); - Elements2dRB = new QRadioButton(ConstructorsBox); - Elements2dRB->setIcon(faceImage); - Elements1dRB->setChecked(true); - - // layouting - ConstructorsBoxLayout->addWidget(Elements1dRB); - ConstructorsBoxLayout->addWidget(Elements2dRB); - GroupConstructors->addButton(Elements1dRB, 0); - GroupConstructors->addButton(Elements2dRB, 1); - /***************************************************************/ // Arguments group box - GroupArguments = new QGroupBox(tr("EXTRUSION_1D"), this); + GroupArguments = new QGroupBox(tr("SMESH_EXTRUSION"), this); QGridLayout* GroupArgumentsLayout = new QGridLayout(GroupArguments); GroupArgumentsLayout->setSpacing(SPACING); GroupArgumentsLayout->setMargin(MARGIN); myIdValidator = new SMESHGUI_IdValidator(this); // Controls for elements selection - ElementsLab = new QLabel(tr("SMESH_ID_ELEMENTS"), GroupArguments); - - SelectElementsButton = new QToolButton(GroupArguments); - SelectElementsButton->setIcon(selectImage); - - ElementsLineEdit = new QLineEdit(GroupArguments); - ElementsLineEdit->setValidator(myIdValidator); - ElementsLineEdit->setMaxLength(-1); - myFilterBtn = new QPushButton( tr( "SMESH_BUT_FILTER" ), GroupArguments ); - connect(myFilterBtn, SIGNAL(clicked()), this, SLOT(setFilters())); - - // Controls for the whole mesh selection - MeshCheck = new QCheckBox(tr("SMESH_SELECT_WHOLE_MESH"), GroupArguments); - + SelectorWdg = new SMESHGUI_3TypesSelector( GroupArguments ); + // Controls for path selection PathGrp = new QGroupBox(tr("SMESH_PATH"), GroupArguments); QGridLayout* PathGrpLayout = new QGridLayout(PathGrp); @@ -182,8 +145,9 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod // Controls for path mesh selection QLabel* PathMeshLab = new QLabel(tr("SMESH_PATH_MESH"), PathGrp); - SelectPathMeshButton = new QToolButton(PathGrp); + SelectPathMeshButton = new QPushButton(PathGrp); SelectPathMeshButton->setIcon(selectImage); + SelectPathMeshButton->setCheckable(true); PathMeshLineEdit = new QLineEdit(PathGrp); PathMeshLineEdit->setReadOnly(true); @@ -191,8 +155,9 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod // Controls for path starting point selection QLabel* StartPointLab = new QLabel(tr("SMESH_PATH_START"), PathGrp); - SelectStartPointButton = new QToolButton(PathGrp); + SelectStartPointButton = new QPushButton(PathGrp); SelectStartPointButton->setIcon(selectImage); + SelectStartPointButton->setCheckable(true); StartPointLineEdit = new QLineEdit(PathGrp); StartPointLineEdit->setValidator(new QIntValidator(this)); @@ -211,8 +176,13 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod QHBoxLayout* BasePointGrpLayout = new QHBoxLayout(BasePointGrp); BasePointGrpLayout->setSpacing(SPACING); BasePointGrpLayout->setMargin(MARGIN); - SelectBasePointButton = new QToolButton(BasePointGrp); + SelectBasePointButton = new QPushButton(BasePointGrp); SelectBasePointButton->setIcon(selectImage); + SelectBasePointButton->setCheckable(true); + + SelectorWdg->GetButtonGroup()->addButton( SelectPathMeshButton ); + SelectorWdg->GetButtonGroup()->addButton( SelectStartPointButton ); + SelectorWdg->GetButtonGroup()->addButton( SelectBasePointButton ); QLabel* XLab = new QLabel(tr("SMESH_X"), BasePointGrp); XSpin = new SMESHGUI_SpinBox(BasePointGrp); @@ -230,6 +200,7 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod BasePointGrpLayout->addWidget(ZLab); BasePointGrpLayout->addWidget(ZSpin); + // Angles AnglesGrp = new QGroupBox(tr("SMESH_ANGLES"), GroupArguments); AnglesGrp->setCheckable(true); AnglesGrp->setChecked(false); @@ -249,15 +220,42 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod LinearAnglesCheck = new QCheckBox(tr("LINEAR_ANGLES"), AnglesGrp); - // layouting 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->addWidget(LinearAnglesCheck, 4, 0, 1, 3); AnglesGrpLayout->setRowMinimumHeight(1, 10); AnglesGrpLayout->setRowStretch(3, 10); + // Scales + ScalesGrp = new QGroupBox(tr("SMESH_SCALES"), GroupArguments); + ScalesGrp->setCheckable(true); + ScalesGrp->setChecked(false); + QGridLayout* ScalesGrpLayout = new QGridLayout(ScalesGrp); + ScalesGrpLayout->setSpacing(SPACING); ScalesGrpLayout->setMargin(MARGIN); + + ScalesList = new QListWidget(ScalesGrp); + ScalesList->setSelectionMode(QListWidget::ExtendedSelection); + + AddScaleButton = new QToolButton(ScalesGrp); + AddScaleButton->setIcon(addImage); + + RemoveScaleButton = new QToolButton(ScalesGrp); + RemoveScaleButton->setIcon(removeImage); + + ScaleSpin = new SMESHGUI_SpinBox(ScalesGrp); + + LinearScalesCheck = new QCheckBox(tr("LINEAR_SCALES"), ScalesGrp); + + ScalesGrpLayout->addWidget(ScalesList, 0, 0, 4, 1); + ScalesGrpLayout->addWidget(AddScaleButton, 0, 1); + ScalesGrpLayout->addWidget(RemoveScaleButton, 2, 1); + ScalesGrpLayout->addWidget(ScaleSpin, 0, 2); + ScalesGrpLayout->addWidget(LinearScalesCheck, 4, 0, 1, 3); + ScalesGrpLayout->setRowMinimumHeight(1, 10); + ScalesGrpLayout->setRowStretch(3, 10); + // CheckBox for groups generation MakeGroupsCheck = new QCheckBox(tr("SMESH_MAKE_GROUPS"), GroupArguments); MakeGroupsCheck->setChecked(true); @@ -266,16 +264,13 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod myPreviewCheckBox = new QCheckBox(tr("PREVIEW"), GroupArguments); // layouting - GroupArgumentsLayout->addWidget(ElementsLab, 0, 0); - GroupArgumentsLayout->addWidget(SelectElementsButton, 0, 1); - GroupArgumentsLayout->addWidget(ElementsLineEdit, 0, 2); - GroupArgumentsLayout->addWidget(myFilterBtn, 0, 3); - GroupArgumentsLayout->addWidget(MeshCheck, 1, 0, 1, 4); - GroupArgumentsLayout->addWidget(PathGrp, 2, 0, 1, 4); - GroupArgumentsLayout->addWidget(BasePointGrp, 3, 0, 1, 4); - GroupArgumentsLayout->addWidget(AnglesGrp, 4, 0, 1, 4); - GroupArgumentsLayout->addWidget(myPreviewCheckBox, 5, 0, 1, 4); - GroupArgumentsLayout->addWidget(MakeGroupsCheck, 6, 0, 1, 4); + GroupArgumentsLayout->addWidget(SelectorWdg, 0, 0, 1, 2); + GroupArgumentsLayout->addWidget(PathGrp, 1, 0, 1, 2); + GroupArgumentsLayout->addWidget(BasePointGrp, 2, 0, 1, 2); + GroupArgumentsLayout->addWidget(AnglesGrp, 3, 0); + GroupArgumentsLayout->addWidget(ScalesGrp, 3, 1); + GroupArgumentsLayout->addWidget(myPreviewCheckBox, 4, 0); + GroupArgumentsLayout->addWidget(MakeGroupsCheck, 5, 0); /***************************************************************/ // common buttons group box @@ -287,7 +282,7 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod 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); @@ -307,7 +302,6 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod /***************************************************************/ // layouting - topLayout->addWidget(ConstructorsBox); topLayout->addWidget(GroupArguments); topLayout->addWidget(GroupButtons); @@ -317,24 +311,15 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod 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"); + ScaleSpin->RangeStepAndValidator(COORD_MIN, COORD_MAX, 1.0, "length_precision"); - mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector(); + 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 (SMESH::MESHorSUBMESH); - SMESH_TypeFilter* aSmeshGroupFilter = new SMESH_TypeFilter (SMESH::GROUP); - - QList aListOfFilters; - if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter); - if (aSmeshGroupFilter) aListOfFilters.append(aSmeshGroupFilter); + myPathMeshFilter = new SMESH_TypeFilter(SMESH::IDSOURCE_EDGE); - myElementsFilter = new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR); - //myPathMeshFilter = new SMESH_TypeFilter (SMESH::MESH); - myPathMeshFilter = new SMESH_TypeFilter(SMESH::MESHorSUBMESH); - - myHelpFileName = "extrusion_along_path_page.html"; + myHelpFileName = "extrusion_along_path.html"; Init(); @@ -347,43 +332,51 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod connect(AddAngleButton, SIGNAL(clicked()), this, SLOT(OnAngleAdded())); connect(RemoveAngleButton, SIGNAL(clicked()), this, SLOT(OnAngleRemoved())); + connect(AddScaleButton, SIGNAL(clicked()), this, SLOT(OnAngleAdded())); + connect(RemoveScaleButton, SIGNAL(clicked()), this, SLOT(OnAngleRemoved())); - connect(GroupConstructors, SIGNAL(buttonClicked(int)), SLOT(ConstructorsClicked(int))); - - connect(SelectElementsButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(SelectPathMeshButton, 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&))); - connect(MeshCheck, SIGNAL(toggled(bool)), SLOT(onSelectMesh())); - 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(AddAngleButton, SIGNAL(clicked()), this, SLOT(toDisplaySimulation())); connect(RemoveAngleButton, SIGNAL(clicked()), this, SLOT(toDisplaySimulation())); - connect(LinearAnglesCheck, SIGNAL(toggled(bool)), SLOT(onSelectMesh())); + connect(AddScaleButton, SIGNAL(clicked()), this, SLOT(toDisplaySimulation())); + connect(RemoveScaleButton, SIGNAL(clicked()), this, SLOT(toDisplaySimulation())); + connect(LinearScalesCheck, SIGNAL(toggled(bool)), this, SLOT(toDisplaySimulation())); + connect(LinearAnglesCheck, SIGNAL(toggled(bool)), this, SLOT(toDisplaySimulation())); + connect(ScalesGrp, SIGNAL(toggled(bool)), this, SLOT(toDisplaySimulation())); + connect(AnglesGrp, SIGNAL(toggled(bool)), this, SLOT(toDisplaySimulation())); //To Connect preview check box connectPreviewControl(); - AnglesList->installEventFilter(this); - ElementsLineEdit->installEventFilter(this); + AnglesList ->installEventFilter(this); + ScalesList ->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); + + CheckIsEnable(); + + resize( minimumSizeHint() ); } //================================================================================= @@ -393,10 +386,6 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod SMESHGUI_ExtrusionAlongPathDlg::~SMESHGUI_ExtrusionAlongPathDlg() { // no need to delete child widgets, Qt does it all for us - if ( myFilterDlg != 0 ) { - myFilterDlg->setParent( 0 ); - delete myFilterDlg; - } } //================================================================================= @@ -408,12 +397,9 @@ void SMESHGUI_ExtrusionAlongPathDlg::Init (bool ResetControls) myBusy = false; myEditCurrentArgument = 0; - myMesh = SMESH::SMESH_Mesh::_nil(); - myIDSource = SMESH::SMESH_IDSource::_nil(); - myMeshActor = 0; - myPath = SMESH::SMESH_IDSource::_nil(); + myPath = SMESH::SMESH_IDSource::_nil(); - ElementsLineEdit->clear(); + SelectorWdg->Clear(); PathMeshLineEdit->clear(); StartPointLineEdit->clear(); @@ -423,9 +409,7 @@ void SMESHGUI_ExtrusionAlongPathDlg::Init (bool ResetControls) ZSpin->SetValue(0.0); AngleSpin->SetValue(45); - MeshCheck->setChecked(false); - ConstructorsClicked(0); - onSelectMesh(); + ScaleSpin->SetValue(2); myPreviewCheckBox->setChecked(false); onDisplaySimulation(false); } @@ -433,53 +417,16 @@ void SMESHGUI_ExtrusionAlongPathDlg::Init (bool ResetControls) } //================================================================================= -// 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); - - hidePreview(); - - 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(); +void SMESHGUI_ExtrusionAlongPathDlg::CheckIsEnable() +{ + bool anIsEnable = SelectorWdg->IsAnythingSelected() && isValuesValid(); - SMESH::SetPointRepresentation(false); - if (MeshCheck->isChecked()) { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(ActorSelection); - mySelectionMgr->installFilter(myElementsFilter); - } else { - if (type == 0) - { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(EdgeSelection); - } - if (type == 1) - { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(FaceSelection); - } - } - } - connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); - - myType = type; + OkButton->setEnabled(anIsEnable); + ApplyButton->setEnabled(anIsEnable); } //================================================================================= @@ -488,20 +435,15 @@ void SMESHGUI_ExtrusionAlongPathDlg::ConstructorsClicked (int type) //================================================================================= bool SMESHGUI_ExtrusionAlongPathDlg::ClickOnApply() { - if (mySMESHGUI->isActiveStudyLocked()) + if (SMESHGUI::isStudyLocked()) return false; - //if (myMesh->_is_nil() || MeshCheck->isChecked() && myIDSource->_is_nil() || - // !myMeshActor || myPathMesh->_is_nil() || myPathShape->_is_nil()) - if ( myMesh->_is_nil() || (MeshCheck->isChecked() && myIDSource->_is_nil()) || - /*!myMeshActor ||*/ myPath->_is_nil() ) + if ( !SelectorWdg->IsAnythingSelected() || myPath->_is_nil() ) return false; if (!isValid()) return false; - SMESH::long_array_var anElementsId = getSelectedElements(); - if (StartPointLineEdit->text().trimmed().isEmpty()) { return false; } @@ -515,12 +457,10 @@ bool SMESHGUI_ExtrusionAlongPathDlg::ClickOnApply() QStringList aParameters; //get angles - SMESH::double_array_var anAngles = getAngles(); - - for (int i = 0; i < myAnglesList.count(); i++) + 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 (BasePointGrp->isChecked()) { @@ -528,38 +468,48 @@ bool SMESHGUI_ExtrusionAlongPathDlg::ClickOnApply() aBasePoint.y = YSpin->GetValue(); aBasePoint.z = ZSpin->GetValue(); } - aParameters << XSpin->text(); aParameters << YSpin->text(); aParameters << ZSpin->text(); + //get scales + SMESH::double_array_var aScales = getScales(); + for (int i = 0; i < myScalesList.count(); i++) + aParameters << ScalesList->item(i)->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; + SMESH::SMESH_Mesh_var mesh = SelectorWdg->GetMesh(); - myMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); - - bool NeedGroups = ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() ); - SMESH::ElementType ElemType = SMESH::FACE; - if( GetConstructorId() == 0 ) - ElemType = SMESH::EDGE; - if( !MeshCheck->isChecked() ) { - SMESH::ListOfGroups_var groups = - aMeshEditor->ExtrusionAlongPathX(anElementsId, myPath, aNodeStart, AnglesGrp->isChecked(), - anAngles, LinearAnglesCheck->isChecked(), - BasePointGrp->isChecked(), aBasePoint, - NeedGroups, ElemType, retVal); - } - else { - SMESH::ListOfGroups_var groups = - aMeshEditor->ExtrusionAlongPathObjX(myIDSource, myPath, aNodeStart, AnglesGrp->isChecked(), - anAngles, LinearAnglesCheck->isChecked(), - BasePointGrp->isChecked(), aBasePoint, - NeedGroups, ElemType, retVal); - } + mesh->SetParameters( aParameters.join(":").toUtf8().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, + aScales, LinearScalesCheck->isChecked(), retVal ); wc.suspend(); switch (retVal) { @@ -600,17 +550,31 @@ bool SMESHGUI_ExtrusionAlongPathDlg::ClickOnApply() return false; } - //mySelectionMgr->clearSelected(); - if ( myMeshActor ) - SMESH::Update( myMeshActor->getIO(), myMeshActor->GetVisibility() ); - - SMESHGUI::Modified(); - - if ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() ) + 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 - //SMESH::UpdateView(); Init(false); - ConstructorsClicked(GetConstructorId()); + mySelectionMgr->clearSelected(); + SelectorWdg->Clear(); + + SMESHGUI::Modified(); return true; } @@ -665,9 +629,35 @@ void SMESHGUI_ExtrusionAlongPathDlg::reject() 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 : @@ -682,54 +672,13 @@ 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 = theNewText.split(" ", QString::SkipEmptyParts); - bool bOk; - const Handle(SALOME_InteractiveObject)& anIO = myMeshActor->getIO(); - TColStd_MapOfInteger newIndices; - 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) - newIndices.Add(e->GetID()); - } - } - } - mySelector->AddOrRemoveIndex(anIO, newIndices, false); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->highlight( anIO, true, true ); - } - } - else if (send == StartPointLineEdit && - myEditCurrentArgument == StartPointLineEdit) { + if (send == StartPointLineEdit && + myEditCurrentArgument == StartPointLineEdit) + { if (!myPath->_is_nil()) { SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPath); - SMDS_Mesh* aMesh = 0; - if (aPathActor) - aMesh = aPathActor->GetObject()->GetMesh(); + 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); @@ -739,7 +688,6 @@ void SMESHGUI_ExtrusionAlongPathDlg::onTextChange (const QString& theNewText) if (bOk) { const SMDS_MeshNode* n = aMesh->FindNode(ind); if (n) { - //if (!mySelectionMgr->IsIndexSelected(aPathActor->getIO(), n->GetID())) { TColStd_MapOfInteger newIndices; newIndices.Add(n->GetID()); mySelector->AddOrRemoveIndex( aPathActor->getIO(), newIndices, false ); @@ -750,6 +698,8 @@ void SMESHGUI_ExtrusionAlongPathDlg::onTextChange (const QString& theNewText) } } } + CheckIsEnable(); + onDisplaySimulation(true); } //================================================================================= @@ -773,67 +723,29 @@ 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; + const bool isPathDef = ( SelectPathMeshButton->isChecked() || + SelectStartPointButton->isChecked() ); - // MakeGroups is available if there are groups - if ( myMesh->NbGroups() == 0 ) { - MakeGroupsCheck->setChecked(false); - MakeGroupsCheck->setEnabled(false); - } else { - MakeGroupsCheck->setEnabled(true); - } - // find actor - myMeshActor = SMESH::FindActorByObject(myMesh); - if (!myMeshActor && !MeshCheck->isChecked()) - 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); - - 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, IO, aString); - ElementsLineEdit->setText(aString); - } - } - else if (myEditCurrentArgument == PathMeshLineEdit) { + if (myEditCurrentArgument == PathMeshLineEdit && isPathDef) + { // we are now selecting path mesh // reset PathMeshLineEdit->clear(); myPath = SMESH::SMESH_IDSource::_nil(); StartPointLineEdit->clear(); - + // try to get mesh from selection Handle(SALOME_InteractiveObject) IO = aList.First(); myPath = SMESH::IObjectToInterface(IO); if( myPath->_is_nil() ) return; - + QString aString; SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString); PathMeshLineEdit->setText(aString); } - else if (myEditCurrentArgument == StartPointLineEdit) { + else if (myEditCurrentArgument == StartPointLineEdit && isPathDef ) + { // we are now selecting start point of path // reset StartPointLineEdit->clear(); @@ -848,13 +760,15 @@ void SMESHGUI_ExtrusionAlongPathDlg::SelectionIntoArgument() SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPath); if ( !aPathActor ) return; - + QString aString; int aNbUnits = SMESH::GetNameOfSelectedElements(mySelector, aPathActor->getIO(), aString); if (aNbUnits == 1) StartPointLineEdit->setText(aString.trimmed()); - - } else if (myEditCurrentArgument == XSpin) { + } + else if ( myEditCurrentArgument == XSpin && + SelectBasePointButton->isChecked() ) + { // we are now selecting base point // reset is not performed here! @@ -905,7 +819,13 @@ void SMESHGUI_ExtrusionAlongPathDlg::SelectionIntoArgument() YSpin->SetValue(n->Y()); ZSpin->SetValue(n->Z()); } + else + { + return; + } + onDisplaySimulation(true); + CheckIsEnable(); } //================================================================================= @@ -914,11 +834,10 @@ void SMESHGUI_ExtrusionAlongPathDlg::SelectionIntoArgument() //================================================================================= void SMESHGUI_ExtrusionAlongPathDlg::SetEditCurrentArgument() { - QToolButton* send = (QToolButton*)sender(); + QPushButton* send = (QPushButton*)sender(); if ( sender() == BasePointGrp ) send = SelectBasePointButton; - if (send != SelectElementsButton && - send != SelectPathMeshButton && + if (send != SelectPathMeshButton && send != SelectStartPointButton && send != SelectBasePointButton) return; @@ -929,53 +848,37 @@ 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->clearFilters(); SMESH::SetPickable(); - if (button == SelectElementsButton) { - myEditCurrentArgument = ElementsLineEdit; - SMESH::SetPointRepresentation(false); - if (MeshCheck->isChecked()) { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(ActorSelection); - mySelectionMgr->installFilter(myElementsFilter); - } else { - if (Elements1dRB->isChecked()) - { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(EdgeSelection); - } - else if (Elements2dRB->isChecked()) - { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(FaceSelection); - } - } - } else if (button == SelectPathMeshButton) { + myEditCurrentArgument = 0; + if (button == SelectPathMeshButton) + { myEditCurrentArgument = PathMeshLineEdit; SMESH::SetPointRepresentation(false); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) aViewWindow->SetSelectionMode(ActorSelection); mySelectionMgr->installFilter(myPathMeshFilter); } - else if (button == SelectStartPointButton) { + else if (button == SelectStartPointButton) + { myEditCurrentArgument = StartPointLineEdit; - //if (!myPathMesh->_is_nil()) { if (!myPath->_is_nil()) { SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPath); if (aPathActor) { - SMESH::SetPointRepresentation(true); + 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); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) @@ -1005,10 +908,11 @@ void SMESHGUI_ExtrusionAlongPathDlg::SetEditCurrentArgument (QToolButton* button //================================================================================= void SMESHGUI_ExtrusionAlongPathDlg::DeactivateActiveDialog() { - if (ConstructorsBox->isEnabled()) { - ConstructorsBox->setEnabled(false); + if (GroupButtons->isEnabled()) + { GroupArguments->setEnabled(false); GroupButtons->setEnabled(false); + SelectorWdg->setEnabled(false); mySMESHGUI->ResetState(); mySMESHGUI->SetActiveDialogBox(0); } @@ -1022,50 +926,27 @@ void SMESHGUI_ExtrusionAlongPathDlg::ActivateThisDialog() { // Emit a signal to deactivate the active dialog mySMESHGUI->EmitSignalDeactivateDialog(); - ConstructorsBox->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 (!ConstructorsBox->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); - ElementsLineEdit->setValidator(toSelectMesh ? 0 : myIdValidator); - ElementsLab->setText(toSelectMesh ? tr("SMESH_NAME") : tr("SMESH_ID_ELEMENTS")); - ElementsLineEdit->clear(); - myFilterBtn->setEnabled(!toSelectMesh); - - SetEditCurrentArgument(SelectElementsButton); -} - -//================================================================================= -// function : GetConstructorId() -// purpose : -//================================================================================= -int SMESHGUI_ExtrusionAlongPathDlg::GetConstructorId() -{ - return GroupConstructors->checkedId(); + } } //======================================================================= @@ -1074,17 +955,34 @@ int SMESHGUI_ExtrusionAlongPathDlg::GetConstructorId() //======================================================================= void SMESHGUI_ExtrusionAlongPathDlg::OnAngleAdded() { - 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; + if ( sender() == AddAngleButton ) + { + 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()); } - AnglesList->addItem(AngleSpin->text()); - myAnglesList.append(AngleSpin->GetValue()); - + + if ( sender() == AddScaleButton ) + { + QString msg; + if( !ScaleSpin->isValid( msg, true ) ) { + QString str( tr( "SMESH_INCORRECT_INPUT" ) ); + if ( !msg.isEmpty() ) + str += "\n" + msg; + SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str ); + return; + } + ScalesList->addItem(ScaleSpin->text()); + myScalesList.append(ScaleSpin->GetValue()); + } + updateLinearAngles(); } @@ -1094,10 +992,23 @@ void SMESHGUI_ExtrusionAlongPathDlg::OnAngleAdded() //======================================================================= void SMESHGUI_ExtrusionAlongPathDlg::OnAngleRemoved() { - QList aList = AnglesList->selectedItems(); + QListWidget* widget; + QList* list; + if ( sender() == RemoveScaleButton ) + { + widget = ScalesList; + list = & myScalesList; + } + else + { + widget = AnglesList; + list = & myAnglesList; + } + + QList aList = widget->selectedItems(); QListWidgetItem* anItem; foreach(anItem, aList) { - myAnglesList.removeAt(AnglesList->row(anItem)); + list->removeAt( widget->row( anItem )); delete anItem; } @@ -1114,15 +1025,15 @@ bool SMESHGUI_ExtrusionAlongPathDlg::eventFilter (QObject* object, QEvent* event QKeyEvent* ke = (QKeyEvent*)event; if (object == AnglesList) { if (ke->key() == Qt::Key_Delete) - OnAngleRemoved(); + RemoveAngleButton->click(); + } + if (object == ScalesList) { + if (ke->key() == Qt::Key_Delete) + RemoveScaleButton->click(); } } 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); } @@ -1150,34 +1061,6 @@ void SMESHGUI_ExtrusionAlongPathDlg::keyPressEvent( QKeyEvent* e ) } } -//================================================================================= -// function : setFilters() -// purpose : SLOT. Called when "Filter" button pressed. -//================================================================================= -void SMESHGUI_ExtrusionAlongPathDlg::setFilters() -{ - if(myMesh->_is_nil()) { - SUIT_MessageBox::critical(this, - tr("SMESH_ERROR"), - tr("NO_MESH_SELECTED")); - return; - } - if ( !myFilterDlg ) - { - QList types; - types.append( SMESH::EDGE ); - types.append( SMESH::FACE ); - myFilterDlg = new SMESHGUI_FilterDlg( mySMESHGUI, types ); - } - myFilterDlg->Init( Elements1dRB->isChecked() ? SMESH::EDGE : SMESH::FACE ); - - myFilterDlg->SetSelection(); - myFilterDlg->SetMesh( myMesh ); - myFilterDlg->SetSourceWg( ElementsLineEdit ); - - myFilterDlg->show(); -} - //================================================================================= // function : isValid // purpose : @@ -1218,49 +1101,74 @@ void SMESHGUI_ExtrusionAlongPathDlg::updateLinearAngles() if( !enableLinear ) LinearAnglesCheck->setChecked( false ); LinearAnglesCheck->setEnabled( enableLinear ); + + enableLinear = true; + for( int row = 0, nbRows = ScalesList->count(); row < nbRows; row++ ) { + if( QListWidgetItem* anItem = ScalesList->item( row ) ) { + enableLinear = false; + anItem->text().toDouble(&enableLinear); + if( !enableLinear ) + break; + } + } + if( !enableLinear ) + LinearScalesCheck->setChecked( false ); + LinearScalesCheck->setEnabled( enableLinear ); } //================================================================================= // function : isValuesValid() // purpose : Return true in case if values entered into dialog are valid //================================================================================= -bool SMESHGUI_ExtrusionAlongPathDlg::isValuesValid() { - - if ( (MeshCheck->isChecked() && myIDSource->_is_nil()) || - myMesh->_is_nil() || - myPath->_is_nil() ) + +bool SMESHGUI_ExtrusionAlongPathDlg::isValuesValid() +{ + if ( myPath->_is_nil() ) return false; - if(!MeshCheck->isChecked()) { - QStringList aListElementsId = ElementsLineEdit->text().split(" ", QString::SkipEmptyParts); - if(aListElementsId.count() <= 0) - return false; - } - bool bOk; - StartPointLineEdit->text().toLong(&bOk); - if (!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, SMESH::ALL ); + 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(isValid() && isValuesValid()) { - - //Get selected elements: - SMESH::long_array_var anElementsId = getSelectedElements(); - - // get angles + +void SMESHGUI_ExtrusionAlongPathDlg::onDisplaySimulation( bool toDisplayPreview ) +{ + if ( myPreviewCheckBox->isChecked() && toDisplayPreview ) { + if ( SelectorWdg->IsAnythingSelected() && isValid() && isValuesValid()) + { + // get angles and scales SMESH::double_array_var anAngles = getAngles(); - + SMESH::double_array_var aScales = getScales(); + // get base point SMESH::PointStruct aBasePoint; if (BasePointGrp->isChecked()) { @@ -1271,42 +1179,46 @@ void SMESHGUI_ExtrusionAlongPathDlg::onDisplaySimulation( bool toDisplayPreview bool bOk; long aNodeStart = StartPointLineEdit->text().toLong(&bOk); if (bOk) { - + try { SUIT_OverrideCursor wc; - + SMESH::SMESH_MeshEditor::Extrusion_Error retVal; - SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditPreviewer(); - bool NeedGroups = false; - SMESH::ElementType ElemType = ( GetConstructorId() == 0 ) ? SMESH::EDGE : SMESH::FACE; - if( !MeshCheck->isChecked() ) { - aMeshEditor->ExtrusionAlongPathX(anElementsId, myPath, aNodeStart, AnglesGrp->isChecked(), - anAngles, LinearAnglesCheck->isChecked(), - BasePointGrp->isChecked(), aBasePoint, - NeedGroups, ElemType, 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, + aScales, LinearScalesCheck->isChecked(), + retVal); + + if( retVal == SMESH::SMESH_MeshEditor::EXTR_OK ) + { + SMESH::MeshPreviewStruct_var aMeshPreviewStruct = meshEditor->GetPreviewData(); + mySimulation->SetData( aMeshPreviewStruct.in() ); } else { - SMESH::ListOfGroups_var groups = - aMeshEditor->ExtrusionAlongPathObjX(myIDSource, myPath, aNodeStart, AnglesGrp->isChecked(), - anAngles, LinearAnglesCheck->isChecked(), - BasePointGrp->isChecked(), aBasePoint, - NeedGroups, ElemType, retVal); - } - - if( retVal == SMESH::SMESH_MeshEditor::EXTR_OK ) { - SMESH::MeshPreviewStruct_var aMeshPreviewStruct = aMeshEditor->GetPreviewData(); - mySimulation->SetData(aMeshPreviewStruct._retn()); - } else { hidePreview(); } - + } catch (...) { hidePreview(); } } else { hidePreview(); } - + } else { hidePreview(); } @@ -1315,56 +1227,36 @@ void SMESHGUI_ExtrusionAlongPathDlg::onDisplaySimulation( bool toDisplayPreview } } +//======================================================================= +//function : getAngles +//purpose : return CORBA array of angles +//======================================================================= -//================================================================================= -// function : getSelectedElements -// purpose : return list of the selected elements -//================================================================================= -SMESH::long_array_var SMESHGUI_ExtrusionAlongPathDlg::getSelectedElements() { - - // If "Select whole mesh, submesh or group" check box is off -> - // use only elements of given type selected by user - SMESH::long_array_var anElementsId = new SMESH::long_array; - if (!MeshCheck->isChecked()) { - - SMDS_Mesh* aMesh; - if ( myMeshActor ) - aMesh = myMeshActor->GetObject()->GetMesh(); - - if (aMesh) { - QStringList aListElementsId = ElementsLineEdit->text().split(" ", QString::SkipEmptyParts); - 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); - } +SMESH::double_array_var SMESHGUI_ExtrusionAlongPathDlg::getAngles() +{ + SMESH::double_array_var anAngles = new SMESH::double_array; + if ( AnglesGrp->isChecked() ) + { + anAngles->length( myAnglesList.count() ); + for (int i = 0; i < myAnglesList.count(); i++) + anAngles[ i ] = myAnglesList[ i ] * M_PI / 180.; } - return anElementsId; + return anAngles; } -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); +//======================================================================= +//function : getScales +//purpose : return CORBA array of scale factors +//======================================================================= + +SMESH::double_array_var SMESHGUI_ExtrusionAlongPathDlg::getScales() +{ + SMESH::double_array_var anScales = new SMESH::double_array; + if ( ScalesGrp->isChecked() ) + { + anScales->length( myScalesList.count() ); + for (int i = 0; i < myScalesList.count(); i++) + anScales[ i ] = myScalesList[ i ]; } - return anAngles; + return anScales; }