X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_RotationDlg.cxx;h=18aabb74cd3a30580050eed98ec2da2214205b96;hb=15e0993d69189f5b30a4adb90767044c3f653952;hp=1e701097474a88072cf1b6ff6fd3557cc6077a25;hpb=0635c9fc80f67d1e5dc0e94ec85f487286a92070;p=modules%2Fsmesh.git diff --git a/src/SMESHGUI/SMESHGUI_RotationDlg.cxx b/src/SMESHGUI/SMESHGUI_RotationDlg.cxx index 1e7010974..18aabb74c 100644 --- a/src/SMESHGUI/SMESHGUI_RotationDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_RotationDlg.cxx @@ -1,29 +1,28 @@ -// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2013 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 +// 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. // -// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -// SMESH SMESHGUI : GUI for SMESH component -// File : SMESHGUI_RotationDlg.cxx -// Author : Michael ZORIN, Open CASCADE S.A.S. -// SMESH includes +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // +// File : SMESHGUI_RotationDlg.cxx +// Author : Michael ZORIN, Open CASCADE S.A.S. +// SMESH includes + #include "SMESHGUI_RotationDlg.h" #include "SMESHGUI.h" @@ -33,6 +32,7 @@ #include "SMESHGUI_MeshUtils.h" #include "SMESHGUI_IdValidator.h" #include "SMESHGUI_FilterDlg.h" +#include "SMESHGUI_MeshEditPreview.h" #include #include @@ -52,8 +52,10 @@ #include #include #include +#include // SALOME KERNEL includes +#include #include // OCCT includes @@ -83,16 +85,15 @@ enum { MOVE_ELEMS_BUTTON = 0, COPY_ELEMS_BUTTON, MAKE_MESH_BUTTON }; //!< action #define SPACING 8 #define MARGIN 11 + //================================================================================= // class : SMESHGUI_RotationDlg() // purpose : //================================================================================= -SMESHGUI_RotationDlg::SMESHGUI_RotationDlg( SMESHGUI* theModule ) - : QDialog( SMESH::GetDesktop( theModule ) ), - mySMESHGUI( theModule ), +SMESHGUI_RotationDlg::SMESHGUI_RotationDlg( SMESHGUI* theModule ) : + SMESHGUI_MultiPreviewDlg( theModule ), mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), - myFilterDlg(0), - mySelectedObject(SMESH::SMESH_IDSource::_nil()) + myFilterDlg(0) { QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_MESH_ROTATION"))); QPixmap image1 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT"))); @@ -133,8 +134,9 @@ SMESHGUI_RotationDlg::SMESHGUI_RotationDlg( SMESHGUI* theModule ) SelectElementsButton->setIcon(image1); LineEditElements = new QLineEdit(GroupArguments); LineEditElements->setValidator(myIdValidator); - QPushButton* filterBtn = new QPushButton( tr( "SMESH_BUT_FILTER" ), GroupArguments ); - connect(filterBtn, SIGNAL(clicked()), this, SLOT(setFilters())); + LineEditElements->setMaxLength(-1); + myFilterBtn = new QPushButton( tr( "SMESH_BUT_FILTER" ), GroupArguments ); + connect(myFilterBtn, SIGNAL(clicked()), this, SLOT(setFilters())); // Control for the whole mesh selection CheckBoxMesh = new QCheckBox(tr("SMESH_SELECT_WHOLE_MESH"), GroupArguments); @@ -212,10 +214,14 @@ SMESHGUI_RotationDlg::SMESHGUI_RotationDlg( SMESHGUI* theModule ) // Name of a mesh to create LineEditNewMesh = new QLineEdit(GroupArguments); + + //Preview check box + myPreviewCheckBox = new QCheckBox(tr("PREVIEW"), GroupArguments); + GroupArgumentsLayout->addWidget(TextLabelElements, 0, 0); GroupArgumentsLayout->addWidget(SelectElementsButton, 0, 1); GroupArgumentsLayout->addWidget(LineEditElements, 0, 2, 1, 1); - GroupArgumentsLayout->addWidget(filterBtn, 0, 3); + GroupArgumentsLayout->addWidget(myFilterBtn, 0, 3); GroupArgumentsLayout->addWidget(CheckBoxMesh, 1, 0, 1, 4); GroupArgumentsLayout->addWidget(GroupAxis, 2, 0, 1, 4); GroupArgumentsLayout->addWidget(TextLabelAngle, 3, 0, 1, 2); @@ -223,6 +229,8 @@ SMESHGUI_RotationDlg::SMESHGUI_RotationDlg( SMESHGUI* theModule ) GroupArgumentsLayout->addWidget(ActionBox, 4, 0, 3, 3); GroupArgumentsLayout->addWidget(MakeGroupsCheck, 5, 3); GroupArgumentsLayout->addWidget(LineEditNewMesh, 6, 3); + GroupArgumentsLayout->addWidget(myPreviewCheckBox, 7, 0); + /***************************************************************/ GroupButtons = new QGroupBox(this); @@ -254,14 +262,14 @@ SMESHGUI_RotationDlg::SMESHGUI_RotationDlg( SMESHGUI* theModule ) SMESHGUI_RotationDlgLayout->addWidget(GroupButtons); /* Initialisations */ - SpinBox_X->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, 3); - SpinBox_Y->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, 3); - SpinBox_Z->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, 3); - SpinBox_DX->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, 3); - SpinBox_DY->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, 3); - SpinBox_DZ->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, 3); + SpinBox_X->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision"); + SpinBox_Y->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision"); + SpinBox_Z->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision"); + SpinBox_DX->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision"); + SpinBox_DY->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision"); + SpinBox_DZ->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision"); - SpinBox_Angle->RangeStepAndValidator(-360.0, +360.0, 5.0, 3); + SpinBox_Angle->RangeStepAndValidator(-360.0, +360.0, 5.0, "angle_precision"); myConstructorId = 0; RadioButton1->setChecked(true); @@ -271,8 +279,8 @@ SMESHGUI_RotationDlg::SMESHGUI_RotationDlg( SMESHGUI* theModule ) mySMESHGUI->SetActiveDialogBox((QDialog*)this); // Costruction of the logical filter - SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH); - SMESH_TypeFilter* aSmeshGroupFilter = new SMESH_TypeFilter (GROUP); + SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (SMESH::MESHorSUBMESH); + SMESH_TypeFilter* aSmeshGroupFilter = new SMESH_TypeFilter (SMESH::GROUP); QList aListOfFilters; if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter); @@ -287,7 +295,7 @@ SMESHGUI_RotationDlg::SMESHGUI_RotationDlg( SMESHGUI* theModule ) /* signals and slots connections */ connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); - connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); + connect(buttonCancel, SIGNAL(clicked()), this, SLOT(reject())); connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); connect(buttonHelp, SIGNAL(clicked()), this, SLOT(ClickOnHelp())); @@ -302,11 +310,22 @@ SMESHGUI_RotationDlg::SMESHGUI_RotationDlg( SMESHGUI* theModule ) connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); /* to close dialog if study change */ - connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); + connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(reject())); connect(LineEditElements, SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&))); connect(CheckBoxMesh, SIGNAL(toggled(bool)), SLOT(onSelectMesh(bool))); connect(ActionGroup, SIGNAL(buttonClicked(int)), SLOT(onActionClicked(int))); + connect(SpinBox_X, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + connect(SpinBox_Y, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + connect(SpinBox_Z, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + connect(SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + connect(SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + connect(SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + connect(SpinBox_Angle, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + + //To Connect preview check box + connectPreviewControl(); + onActionClicked(MOVE_ELEMS_BUTTON); } @@ -330,6 +349,9 @@ SMESHGUI_RotationDlg::~SMESHGUI_RotationDlg() void SMESHGUI_RotationDlg::Init (bool ResetControls) { myBusy = false; + myMeshes.clear(); + myObjects.clear(); + myObjectsNames.clear(); myEditCurrentArgument = (QWidget*)LineEditElements; LineEditElements->setFocus(); @@ -340,7 +362,6 @@ void SMESHGUI_RotationDlg::Init (bool ResetControls) buttonApply->setEnabled(false); myActor = 0; - myMesh = SMESH::SMESH_Mesh::_nil(); if (ResetControls) { SpinBox_X->SetValue(0.0); @@ -354,6 +375,9 @@ void SMESHGUI_RotationDlg::Init (bool ResetControls) ActionGroup->button( MOVE_ELEMS_BUTTON )->setChecked(true); CheckBoxMesh->setChecked(false); + myPreviewCheckBox->setChecked(false); + onDisplaySimulation(false); + // MakeGroupsCheck->setChecked(false); // MakeGroupsCheck->setEnabled(false); // onSelectMesh(false); @@ -392,7 +416,7 @@ bool SMESHGUI_RotationDlg::ClickOnApply() anAxis.vy = SpinBox_DY->GetValue(); anAxis.vz = SpinBox_DZ->GetValue(); - double anAngle = (SpinBox_Angle->GetValue())*PI/180; + double anAngle = (SpinBox_Angle->GetValue())*M_PI/180.; QStringList aParameters; aParameters << SpinBox_X->text(); @@ -405,56 +429,103 @@ bool SMESHGUI_RotationDlg::ClickOnApply() int actionButton = ActionGroup->checkedId(); bool makeGroups = ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() ); + QStringList anEntryList; try { SUIT_OverrideCursor aWaitCursor; - SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); + switch ( actionButton ) { case MOVE_ELEMS_BUTTON: - if(CheckBoxMesh->isChecked()) - aMeshEditor->RotateObject(mySelectedObject, anAxis, anAngle, false); - else - aMeshEditor->Rotate(anElementsId, anAxis, anAngle, false); - if( !myMesh->_is_nil()) - myMesh->SetParameters(SMESHGUI::JoinObjectParameters(aParameters)); + if(CheckBoxMesh->isChecked()) { + for ( int i = 0; i < myObjects.count(); i++ ) { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor(); + myMeshes[i]->SetParameters(aParameters.join( ":" ).toLatin1().constData()); + aMeshEditor->RotateObject(myObjects[i], anAxis, anAngle, false); + } + } + else { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor(); + myMeshes[0]->SetParameters(aParameters.join( ":" ).toLatin1().constData()); + aMeshEditor->Rotate(anElementsId, anAxis, anAngle, false); + } break; case COPY_ELEMS_BUTTON: if ( makeGroups ) { SMESH::ListOfGroups_var groups; - if(CheckBoxMesh->isChecked()) - groups = aMeshEditor->RotateObjectMakeGroups(mySelectedObject, anAxis, anAngle); - else + if(CheckBoxMesh->isChecked()) { + for ( int i = 0; i < myObjects.count(); i++ ) { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor(); + myMeshes[i]->SetParameters(aParameters.join( ":" ).toLatin1().constData()); + groups = aMeshEditor->RotateObjectMakeGroups(myObjects[i], anAxis, anAngle); + } + } + else { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor(); + myMeshes[0]->SetParameters(aParameters.join( ":" ).toLatin1().constData()); groups = aMeshEditor->RotateMakeGroups(anElementsId, anAxis, anAngle); + } } else { - if(CheckBoxMesh->isChecked()) - aMeshEditor->RotateObject(mySelectedObject, anAxis, anAngle, true); - else + if(CheckBoxMesh->isChecked()) { + for ( int i = 0; i < myObjects.count(); i++ ) { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor(); + myMeshes[i]->SetParameters(aParameters.join( ":" ).toLatin1().constData()); + aMeshEditor->RotateObject(myObjects[i], anAxis, anAngle, true); + } + } + else { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor(); + myMeshes[0]->SetParameters(aParameters.join( ":" ).toLatin1().constData()); aMeshEditor->Rotate(anElementsId, anAxis, anAngle, true); + } } - if( !myMesh->_is_nil()) - myMesh->SetParameters(SMESHGUI::JoinObjectParameters(aParameters)); break; - case MAKE_MESH_BUTTON: + case MAKE_MESH_BUTTON: { SMESH::SMESH_Mesh_var mesh; - if(CheckBoxMesh->isChecked()) - mesh = aMeshEditor->RotateObjectMakeMesh(mySelectedObject, anAxis, anAngle, makeGroups, - LineEditNewMesh->text().toLatin1().data()); - else + if (CheckBoxMesh->isChecked()) { + for ( int i = 0; i < myObjects.count(); i++ ) { + QString aName = SMESH::UniqueMeshName( LineEditNewMesh->text().replace( "*", myObjectsNames[i] ) ); + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor(); + myMeshes[i]->SetParameters(aParameters.join( ":" ).toLatin1().constData()); + mesh = aMeshEditor->RotateObjectMakeMesh(myObjects[i], anAxis, anAngle, makeGroups, + aName.toLatin1().data()); + if (!mesh->_is_nil()) { + if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( mesh ) ) + anEntryList.append( aSObject->GetID().c_str() ); + } + } + } + else { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor(); + myMeshes[0]->SetParameters(aParameters.join( ":" ).toLatin1().constData()); mesh = aMeshEditor->RotateMakeMesh(anElementsId, anAxis, anAngle, makeGroups, LineEditNewMesh->text().toLatin1().data()); - if( !mesh->_is_nil()) - mesh->SetParameters(SMESHGUI::JoinObjectParameters(aParameters)); + if (!mesh->_is_nil()) { + if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( mesh ) ) + anEntryList.append( aSObject->GetID().c_str() ); + } + } + break; + } } } catch (...) { } - SMESH::UpdateView(); - if ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() || - actionButton == MAKE_MESH_BUTTON ) + for ( int i = 0; i < myObjects.count(); i++ ) { + SMESH_Actor* actor = SMESH::FindActorByObject( myObjects[i] ); + if ( actor ) SMESH::Update( actor->getIO(), true ); + } + + if ( ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() ) || + actionButton == MAKE_MESH_BUTTON ) { mySMESHGUI->updateObjBrowser(true); // new groups may appear + if( LightApp_Application* anApp = + dynamic_cast( SUIT_Session::session()->activeApplication() ) ) + anApp->browseObjects( anEntryList, isApplyAndClose() ); + } Init(false); - mySelectedObject = SMESH::SMESH_IDSource::_nil(); SelectionIntoArgument(); + + SMESHGUI::Modified(); } return true; @@ -466,15 +537,16 @@ bool SMESHGUI_RotationDlg::ClickOnApply() //================================================================================= void SMESHGUI_RotationDlg::ClickOnOk() { + setIsApplyAndClose( true ); if( ClickOnApply() ) - ClickOnCancel(); + reject(); } //================================================================================= -// function : ClickOnCancel() +// function : reject() // purpose : //================================================================================= -void SMESHGUI_RotationDlg::ClickOnCancel() +void SMESHGUI_RotationDlg::reject() { disconnect(mySelectionMgr, 0, this, 0); mySelectionMgr->clearFilters(); @@ -486,7 +558,7 @@ void SMESHGUI_RotationDlg::ClickOnCancel() if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) aViewWindow->SetSelectionMode(ActorSelection); mySMESHGUI->ResetState(); - reject(); + QDialog::reject(); } //================================================================================= @@ -496,7 +568,7 @@ void SMESHGUI_RotationDlg::ClickOnCancel() void SMESHGUI_RotationDlg::ClickOnHelp() { LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication()); - if (app) + if (app) app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName); else { QString platform; @@ -506,10 +578,10 @@ void SMESHGUI_RotationDlg::ClickOnHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -538,21 +610,21 @@ void SMESHGUI_RotationDlg::onTextChange (const QString& theNewText) if (aMesh) { if (send == LineEditElements) { Handle(SALOME_InteractiveObject) anIO = myActor->getIO(); - + TColStd_MapOfInteger newIndices; - + QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts); for (int i = 0; i < aListId.count(); i++) { - const SMDS_MeshElement * e = aMesh->FindElement(aListId[ i ].toInt()); - if (e) - newIndices.Add(e->GetID()); - myNbOkElements++; + const SMDS_MeshElement * e = aMesh->FindElement(aListId[ i ].toInt()); + if (e) + newIndices.Add(e->GetID()); + myNbOkElements++; } mySelector->AddOrRemoveIndex( anIO, newIndices, false ); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->highlight( anIO, true, true ); - + aViewWindow->highlight( anIO, true, true ); + myElementsId = theNewText; } } @@ -576,6 +648,7 @@ void SMESHGUI_RotationDlg::SelectionIntoArgument() // clear myActor = 0; QString aString = ""; + onDisplaySimulation(false); myBusy = true; if (myEditCurrentArgument == (QWidget*)LineEditElements) { @@ -594,27 +667,48 @@ void SMESHGUI_RotationDlg::SelectionIntoArgument() mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type()); int nbSel = aList.Extent(); - if (nbSel != 1) - return; - - Handle(SALOME_InteractiveObject) IO = aList.First(); - myMesh = SMESH::GetMeshByIO(IO); - if (myMesh->_is_nil()) - return; - - myActor = SMESH::FindActorByObject(myMesh); - if (!myActor) - myActor = SMESH::FindActorByEntry(IO->getEntry()); - if (!myActor) + if (nbSel < 1) return; int aNbUnits = 0; if (myEditCurrentArgument == (QWidget*)LineEditElements) { myElementsId = ""; + myObjects.clear(); + myObjectsNames.clear(); + myMeshes.clear(); + + for ( SALOME_ListIteratorOfListIO it( aList ); it.More(); it.Next() ) { + Handle(SALOME_InteractiveObject) IO = it.Value(); + SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO( IO ); + if ( aMesh->_is_nil() ) + return; + + myActor = SMESH::FindActorByObject( aMesh ); + if ( !myActor ) + myActor = SMESH::FindActorByEntry( IO->getEntry() ); + if ( !myActor && !CheckBoxMesh->isChecked() ) + return; + + if ( !SMESH::IObjectToInterface( IO )->_is_nil() ) { + if ( _PTR(Study) aStudy = SMESH::GetActiveStudyDocument() ) { + _PTR(SObject) obj = aStudy->FindObjectID( qPrintable( QString( IO->getEntry() ) ) ); + _PTR(GenericAttribute) anAttr; + if ( obj && obj->FindAttribute( anAttr, "AttributeName" ) ) { + _PTR(AttributeName) aNameAttr( anAttr ); + myObjects << SMESH::IObjectToInterface( IO ); + myObjectsNames << aNameAttr->Value().c_str(); + myMeshes << aMesh; + } + } + } + } // MakeGroups is available if there are groups and "Copy" - if ( myMesh->NbGroups() == 0 ) { + int aNbGroups = 0; + for ( int i = 0; i < myMeshes.count(); i++ ) + aNbGroups += myMeshes[i]->NbGroups(); + if ( aNbGroups == 0 ) { MakeGroupsCheck->setChecked(false); MakeGroupsCheck->setEnabled(false); } @@ -624,12 +718,9 @@ void SMESHGUI_RotationDlg::SelectionIntoArgument() if (CheckBoxMesh->isChecked()) { SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString); - if (!SMESH::IObjectToInterface(IO)->_is_nil()) { //MESH - mySelectedObject = SMESH::IObjectToInterface(IO); - } - else + if ( myMeshes.isEmpty() ) return; - // get IDs from mesh + // get IDs from mesh /* SMDS_Mesh* aSMDSMesh = myActor->GetObject()->GetMesh(); if (!aSMDSMesh) @@ -645,7 +736,7 @@ void SMESHGUI_RotationDlg::SelectionIntoArgument() } else if (!SMESH::IObjectToInterface(IO)->_is_nil()) { //SUBMESH // get submesh SMESH::SMESH_subMesh_var aSubMesh = SMESH::IObjectToInterface(IO); - + // get IDs from submesh SMESH::long_array_var anElementsIds = new SMESH::long_array; anElementsIds = aSubMesh->GetElementsId(); @@ -670,7 +761,7 @@ void SMESHGUI_RotationDlg::SelectionIntoArgument() } */ } else { - aNbUnits = SMESH::GetNameOfSelectedElements(mySelector, IO, aString); + aNbUnits = SMESH::GetNameOfSelectedElements(mySelector, aList.First(), aString); myElementsId = aString; if (aNbUnits < 1) return; @@ -679,11 +770,21 @@ void SMESHGUI_RotationDlg::SelectionIntoArgument() myNbOkElements = true; } else { + Handle(SALOME_InteractiveObject) IO = aList.First(); + if ((SMESH::GetMeshByIO(IO))->_is_nil()) + return; + + SMESH_Actor* anActor = SMESH::FindActorByObject(SMESH::GetMeshByIO(IO)); + if (!anActor) + anActor = SMESH::FindActorByEntry(IO->getEntry()); + if (!anActor && !CheckBoxMesh->isChecked()) + return; + aNbUnits = SMESH::GetNameOfSelectedNodes(mySelector, IO, aString); if (aNbUnits != 1) return; - SMDS_Mesh* aMesh = myActor->GetObject()->GetMesh(); + SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); if (!aMesh) return; @@ -711,7 +812,7 @@ void SMESHGUI_RotationDlg::SelectionIntoArgument() LineEditElements->setText(aString); LineEditElements->repaint(); LineEditElements->setEnabled(false); // to update lineedit IPAL 19809 - LineEditElements->setEnabled(true); + LineEditElements->setEnabled(true); setNewMeshName(); } myBusy = false; @@ -721,6 +822,7 @@ void SMESHGUI_RotationDlg::SelectionIntoArgument() buttonOk->setEnabled(true); buttonApply->setEnabled(true); } + onDisplaySimulation(true); } //================================================================================= @@ -743,23 +845,23 @@ void SMESHGUI_RotationDlg::SetEditCurrentArgument() myEditCurrentArgument = (QWidget*)LineEditElements; SMESH::SetPointRepresentation(false); if (CheckBoxMesh->isChecked()) { - if ( aViewWindow ) - aViewWindow->SetSelectionMode(ActorSelection); + if ( aViewWindow ) + aViewWindow->SetSelectionMode(ActorSelection); mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter); } else { - if ( aViewWindow ) - aViewWindow->SetSelectionMode( CellSelection ); - } + if ( aViewWindow ) + aViewWindow->SetSelectionMode( CellSelection ); + } } else if (send == SelectPointButton) { myEditCurrentArgument = (QWidget*)SpinBox_X; SMESH::SetPointRepresentation(true); - if ( aViewWindow ) - aViewWindow->SetSelectionMode( NodeSelection ); + if ( aViewWindow ) + aViewWindow->SetSelectionMode( NodeSelection ); } else if (send == SelectVectorButton) { myEditCurrentArgument = (QWidget*)SpinBox_DX; SMESH::SetPointRepresentation(true); - if ( aViewWindow ) - aViewWindow->SetSelectionMode( NodeSelection ); + if ( aViewWindow ) + aViewWindow->SetSelectionMode( NodeSelection ); } break; } @@ -815,26 +917,6 @@ void SMESHGUI_RotationDlg::enterEvent (QEvent*) ActivateThisDialog(); } -//================================================================================= -// function : closeEvent() -// purpose : -//================================================================================= -void SMESHGUI_RotationDlg::closeEvent (QCloseEvent*) -{ - /* same than click on cancel button */ - ClickOnCancel(); -} - -//================================================================================= -// function : hideEvent() -// purpose : caused by ESC key -//================================================================================= -void SMESHGUI_RotationDlg::hideEvent (QHideEvent*) -{ - if (!isMinimized()) - ClickOnCancel(); -} - //================================================================================= // function : onSelectMesh() // purpose : @@ -845,6 +927,7 @@ void SMESHGUI_RotationDlg::onSelectMesh (bool toSelectMesh) TextLabelElements->setText(tr("SMESH_NAME")); else TextLabelElements->setText(tr("SMESH_ID_ELEMENTS")); + myFilterBtn->setEnabled(!toSelectMesh); if (myEditCurrentArgument != LineEditElements) { LineEditElements->clear(); @@ -866,6 +949,7 @@ void SMESHGUI_RotationDlg::onSelectMesh (bool toSelectMesh) LineEditElements->setReadOnly(false); LineEditElements->setValidator(myIdValidator); onTextChange(LineEditElements->text()); + hidePreview(); } SelectionIntoArgument(); @@ -878,8 +962,8 @@ void SMESHGUI_RotationDlg::onSelectMesh (bool toSelectMesh) bool SMESHGUI_RotationDlg::IsAxisOk() { return (SpinBox_DX->GetValue() != 0 || - SpinBox_DY->GetValue() != 0 || - SpinBox_DZ->GetValue() != 0); + SpinBox_DY->GetValue() != 0 || + SpinBox_DZ->GetValue() != 0); } //================================================================================= @@ -905,6 +989,10 @@ void SMESHGUI_RotationDlg::onVectorChanged() void SMESHGUI_RotationDlg::onActionClicked(int button) { + int aNbGroups = 0; + for ( int i = 0; i < myMeshes.count(); i++ ) + aNbGroups += myMeshes[i]->NbGroups(); + switch ( button ) { case MOVE_ELEMS_BUTTON: MakeGroupsCheck->setEnabled(false); @@ -913,21 +1001,16 @@ void SMESHGUI_RotationDlg::onActionClicked(int button) case COPY_ELEMS_BUTTON: LineEditNewMesh->setEnabled(false); MakeGroupsCheck->setText( tr("SMESH_MAKE_GROUPS")); - if ( myMesh->_is_nil() || myMesh->NbGroups() > 0) - MakeGroupsCheck->setEnabled(true); - else - MakeGroupsCheck->setEnabled(false); + MakeGroupsCheck->setEnabled( myMeshes.isEmpty() || aNbGroups > 0 ); break; case MAKE_MESH_BUTTON: LineEditNewMesh->setEnabled(true); MakeGroupsCheck->setText( tr("SMESH_COPY_GROUPS")); - if ( myMesh->_is_nil() || myMesh->NbGroups() > 0) - MakeGroupsCheck->setEnabled(true); - else - MakeGroupsCheck->setEnabled(false); + MakeGroupsCheck->setEnabled( myMeshes.isEmpty() || aNbGroups > 0 ); break; } setNewMeshName(); + toDisplaySimulation(); } //======================================================================= @@ -938,13 +1021,13 @@ void SMESHGUI_RotationDlg::onActionClicked(int button) void SMESHGUI_RotationDlg::setNewMeshName() { LineEditNewMesh->setText(""); - if ( LineEditNewMesh->isEnabled() && !myMesh->_is_nil() ) { + if ( LineEditNewMesh->isEnabled() && !myMeshes.isEmpty() ) { QString name; if ( CheckBoxMesh->isChecked() ) { - name = LineEditElements->text(); + name = myMeshes.count() > 1 ? "*" : LineEditElements->text(); } else { - _PTR(SObject) meshSO = SMESH::FindSObject( myMesh ); + _PTR(SObject) meshSO = SMESH::FindSObject( myMeshes[0] ); name = meshSO->GetName().c_str(); } if ( !name.isEmpty() ) @@ -974,11 +1057,17 @@ void SMESHGUI_RotationDlg::keyPressEvent( QKeyEvent* e ) //================================================================================= void SMESHGUI_RotationDlg::setFilters() { + if ( myMeshes.isEmpty() ) { + SUIT_MessageBox::critical(this, + tr("SMESH_ERROR"), + tr("NO_MESH_SELECTED")); + return; + } if ( !myFilterDlg ) myFilterDlg = new SMESHGUI_FilterDlg( mySMESHGUI, SMESH::ALL ); myFilterDlg->SetSelection(); - myFilterDlg->SetMesh( myMesh ); + myFilterDlg->SetMesh( myMeshes[0] ); myFilterDlg->SetSourceWg( LineEditElements ); myFilterDlg->show(); @@ -1010,3 +1099,57 @@ bool SMESHGUI_RotationDlg::isValid() } return true; } + + +//================================================================================= +// function : onDisplaySimulation +// purpose : Show/Hide preview +//================================================================================= +void SMESHGUI_RotationDlg::onDisplaySimulation( bool toDisplayPreview ) { + if (myPreviewCheckBox->isChecked() && toDisplayPreview) { + if(myNbOkElements && isValid() && IsAxisOk()) { + QStringList aListElementsId = myElementsId.split(" ", QString::SkipEmptyParts); + SMESH::long_array_var anElementsId = new SMESH::long_array; + + anElementsId->length(aListElementsId.count()); + for (int i = 0; i < aListElementsId.count(); i++) + anElementsId[i] = aListElementsId[i].toInt(); + + SMESH::AxisStruct anAxis; + + anAxis.x = SpinBox_X->GetValue(); + anAxis.y = SpinBox_Y->GetValue(); + anAxis.z = SpinBox_Z->GetValue();; + anAxis.vx = SpinBox_DX->GetValue(); + anAxis.vy = SpinBox_DY->GetValue(); + anAxis.vz = SpinBox_DZ->GetValue(); + double anAngle = (SpinBox_Angle->GetValue())*M_PI/180.; + + try { + SUIT_OverrideCursor aWaitCursor; + bool copy = ( ActionGroup->checkedId() == COPY_ELEMS_BUTTON || + ActionGroup->checkedId() == MAKE_MESH_BUTTON ); + QList aMeshPreviewStruct; + if(CheckBoxMesh->isChecked()) + for ( int i = 0; i < myObjects.count(); i++ ) { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditPreviewer(); + aMeshEditor->RotateObject(myObjects[i], anAxis, anAngle, copy); + aMeshPreviewStruct << aMeshEditor->GetPreviewData(); + } + else { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditPreviewer(); + aMeshEditor->Rotate(anElementsId, anAxis, anAngle, copy); + aMeshPreviewStruct << aMeshEditor->GetPreviewData(); + } + setSimulationPreview( aMeshPreviewStruct ); + } catch (...) { + hidePreview(); + } + } + else { + hidePreview(); + } + } else { + hidePreview(); + } +}