X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_ScaleDlg.cxx;h=b4282186250d8b5d3e4b01d9835bd011544abab2;hp=97976bf046638c157c566fbaa6b5f3a2cd492e1f;hb=4b5fd249abfca52265832f10435f18f5bb9c69ae;hpb=9357f5c87098aff2b95b754d69f66c76d2df9c24 diff --git a/src/SMESHGUI/SMESHGUI_ScaleDlg.cxx b/src/SMESHGUI/SMESHGUI_ScaleDlg.cxx index 97976bf04..b42821862 100644 --- a/src/SMESHGUI/SMESHGUI_ScaleDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ScaleDlg.cxx @@ -1,27 +1,25 @@ -// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE // -// 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 +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // +// File : SMESHGUI_ScaleDlg.cxx +// Author : Michael ZORIN, Open CASCADE S.A.S. +// SMESH includes -// SMESH SMESHGUI : GUI for SMESH component -// File : SMESHGUI_ScaleDlg.cxx -// Author : Michael ZORIN, Open CASCADE S.A.S. -// SMESH includes -// #include "SMESHGUI_ScaleDlg.h" #include "SMESHGUI.h" @@ -31,6 +29,7 @@ #include "SMESHGUI_MeshUtils.h" #include "SMESHGUI_IdValidator.h" #include "SMESHGUI_FilterDlg.h" +#include "SMESHGUI_MeshEditPreview.h" #include #include @@ -99,13 +98,16 @@ private: #define SPACING 6 #define MARGIN 11 +//To disable automatic genericobj management, the following line should be commented. +//Otherwise, it should be uncommented. Refer to KERNEL_SRC/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx +#define WITHGENERICOBJ + //================================================================================= // class : SMESHGUI_ScaleDlg() // purpose : //================================================================================= -SMESHGUI_ScaleDlg::SMESHGUI_ScaleDlg( SMESHGUI* theModule ) - : QDialog( SMESH::GetDesktop( theModule ) ), - mySMESHGUI( theModule ), +SMESHGUI_ScaleDlg::SMESHGUI_ScaleDlg( SMESHGUI* theModule ) : + SMESHGUI_PreviewDlg( theModule ), mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), myFilterDlg(0), mySelectedObject(SMESH::SMESH_IDSource::_nil()) @@ -154,6 +156,7 @@ SMESHGUI_ScaleDlg::SMESHGUI_ScaleDlg( SMESHGUI* theModule ) SelectElementsButton->setIcon(image2); LineEditElements = new QLineEdit(GroupArguments); LineEditElements->setValidator(myIdValidator); + LineEditElements->setMaxLength(-1); myFilterBtn = new QPushButton( tr( "SMESH_BUT_FILTER" ), GroupArguments ); connect(myFilterBtn, SIGNAL(clicked()), this, SLOT(setFilters())); @@ -207,6 +210,9 @@ SMESHGUI_ScaleDlg::SMESHGUI_ScaleDlg( SMESHGUI* theModule ) // Name of a mesh to create LineEditNewMesh = new QLineEdit(GroupArguments); + //Preview check box + myPreviewCheckBox = new QCheckBox(tr("PREVIEW"), GroupArguments); + // layout GroupArgumentsLayout->addWidget(TextLabelElements, 0, 0); GroupArgumentsLayout->addWidget(SelectElementsButton, 0, 1); @@ -228,8 +234,9 @@ SMESHGUI_ScaleDlg::SMESHGUI_ScaleDlg( SMESHGUI* theModule ) GroupArgumentsLayout->addWidget(TextLabel4, 5, 0); GroupArgumentsLayout->addWidget(SpinBox_FZ, 5, 3); GroupArgumentsLayout->addWidget(ActionBox, 7, 0, 3, 4); - GroupArgumentsLayout->addWidget(MakeGroupsCheck, 7, 5, 1, 4); - GroupArgumentsLayout->addWidget(LineEditNewMesh, 8, 5, 1, 4); + GroupArgumentsLayout->addWidget(MakeGroupsCheck, 8, 5, 1, 4); + GroupArgumentsLayout->addWidget(LineEditNewMesh, 9, 5, 1, 4); + GroupArgumentsLayout->addWidget(myPreviewCheckBox, 10, 0); /***************************************************************/ GroupButtons = new QGroupBox(this); @@ -310,6 +317,17 @@ SMESHGUI_ScaleDlg::SMESHGUI_ScaleDlg( SMESHGUI* theModule ) connect(CheckBoxMesh, SIGNAL(toggled(bool)), SLOT(onSelectMesh(bool))); connect(ActionGroup, SIGNAL(buttonClicked(int)), SLOT(onActionClicked(int))); + connect(SpinBox1_1, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + connect(SpinBox1_2, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + connect(SpinBox1_3, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + + connect(SpinBox_FX, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + connect(SpinBox_FY, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + connect(SpinBox_FZ, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation())); + + //To Connect preview check box + connectPreviewControl(); + ConstructorsClicked(0); SelectionIntoArgument(); onActionClicked(MOVE_ELEMS_BUTTON); @@ -354,6 +372,8 @@ void SMESHGUI_ScaleDlg::Init (bool ResetControls) SpinBox_FX->SetValue(1.0); SpinBox_FY->SetValue(1.0); SpinBox_FZ->SetValue(1.0); + myPreviewCheckBox->setChecked(false); + onDisplaySimulation(false); ActionGroup->button( MOVE_ELEMS_BUTTON )->setChecked(true); CheckBoxMesh->setChecked(false); @@ -432,20 +452,8 @@ bool SMESHGUI_ScaleDlg::ClickOnApply() anElementsId[i] = aListElementsId[i].toInt(); SMESH::PointStruct aPoint; - aPoint.x = SpinBox1_1->GetValue(); - aPoint.y = SpinBox1_2->GetValue(); - aPoint.z = SpinBox1_3->GetValue(); SMESH::double_array_var aScaleFact = new SMESH::double_array; - aScaleFact->length(3); - aScaleFact[0] = SpinBox_FX->GetValue(); - if (GetConstructorId() == 0) { - aScaleFact[1] = SpinBox_FX->GetValue(); - aScaleFact[2] = SpinBox_FX->GetValue(); - } - else { - aScaleFact[1] = SpinBox_FY->GetValue(); - aScaleFact[2] = SpinBox_FZ->GetValue(); - } + getScale(aPoint, aScaleFact); QStringList aParameters; aParameters << SpinBox1_1->text(); @@ -463,71 +471,71 @@ bool SMESHGUI_ScaleDlg::ClickOnApply() int actionButton = ActionGroup->checkedId(); bool makeGroups = ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() ); + QStringList anEntryList; try { SUIT_OverrideCursor aWaitCursor; SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); + SMESH::SMESH_IDSource_var obj; + if ( CheckBoxMesh->isChecked() ) + obj = mySelectedObject; + else + obj = aMeshEditor->MakeIDSource(anElementsId, SMESH::ALL); + switch ( actionButton ) { + case MOVE_ELEMS_BUTTON: - if(CheckBoxMesh->isChecked()) { - aMeshEditor->Scale(mySelectedObject, aPoint, aScaleFact, false); - } - else { - SMESH::SMESH_IDSource_ptr anObj = aMeshEditor->MakeIDSource(anElementsId); - aMeshEditor->Scale(anObj, aPoint, aScaleFact, false); - } + aMeshEditor->Scale(obj, aPoint, aScaleFact, false); if( !myMesh->_is_nil()) myMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); break; + case COPY_ELEMS_BUTTON: - if ( makeGroups ) { - SMESH::ListOfGroups_var groups; - if(CheckBoxMesh->isChecked()) { - groups = aMeshEditor->ScaleMakeGroups(mySelectedObject, aPoint, aScaleFact); - } - else { - groups = aMeshEditor->ScaleMakeGroups(aMeshEditor->MakeIDSource(anElementsId), - aPoint, aScaleFact); - } - } - else { - if(CheckBoxMesh->isChecked()) { - aMeshEditor->Scale(mySelectedObject, aPoint, aScaleFact, true); - } - else { - aMeshEditor->Scale(aMeshEditor->MakeIDSource(anElementsId), - aPoint, aScaleFact, true); - } - } + if ( makeGroups ) + SMESH::ListOfGroups_var groups = + aMeshEditor->ScaleMakeGroups(obj, aPoint, aScaleFact); + else + aMeshEditor->Scale(obj, aPoint, aScaleFact, true); if( !myMesh->_is_nil()) myMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); break; - case MAKE_MESH_BUTTON: - SMESH::SMESH_Mesh_var mesh; - if(CheckBoxMesh->isChecked()) { - mesh = aMeshEditor->ScaleMakeMesh(mySelectedObject, aPoint, aScaleFact, makeGroups, - LineEditNewMesh->text().toLatin1().data()); - } - else { - mesh = aMeshEditor->ScaleMakeMesh(aMeshEditor->MakeIDSource(anElementsId), - aPoint, aScaleFact, makeGroups, - LineEditNewMesh->text().toLatin1().data()); + + case MAKE_MESH_BUTTON: { + SMESH::SMESH_Mesh_var mesh = + aMeshEditor->ScaleMakeMesh(obj, aPoint, aScaleFact, makeGroups, + LineEditNewMesh->text().toLatin1().data()); + if (!mesh->_is_nil()) { + mesh->SetParameters(aParameters.join(":").toLatin1().constData()); + if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( mesh ) ) + anEntryList.append( aSObject->GetID().c_str() ); +#ifdef WITHGENERICOBJ + // obj has been published in study. Its refcount has been incremented. + // It is safe to decrement its refcount + // so that it will be destroyed when the entry in study will be removed + mesh->UnRegister(); +#endif } - if( !mesh->_is_nil()) - mesh->SetParameters( aParameters.join(":").toLatin1().constData() ); + break; + } } } catch (...) { } - + SMESH::UpdateView(); - if ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() || - actionButton == MAKE_MESH_BUTTON ) + 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); ConstructorsClicked(GetConstructorId()); mySelectedObject = SMESH::SMESH_IDSource::_nil(); SelectionIntoArgument(); + + SMESHGUI::Modified(); } - + return true; } @@ -537,6 +545,7 @@ bool SMESHGUI_ScaleDlg::ClickOnApply() //================================================================================= void SMESHGUI_ScaleDlg::ClickOnOk() { + setIsApplyAndClose( true ); if( ClickOnApply() ) ClickOnCancel(); } @@ -567,7 +576,7 @@ void SMESHGUI_ScaleDlg::ClickOnCancel() void SMESHGUI_ScaleDlg::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; @@ -578,7 +587,7 @@ void SMESHGUI_ScaleDlg::ClickOnHelp() #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", + arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)). arg(myHelpFileName)); } @@ -608,7 +617,7 @@ void SMESHGUI_ScaleDlg::onTextChange (const QString& theNewText) if (aMesh) { Handle(SALOME_InteractiveObject) anIO = myActor->getIO(); - + TColStd_MapOfInteger newIndices; QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts); @@ -625,7 +634,7 @@ void SMESHGUI_ScaleDlg::onTextChange (const QString& theNewText) mySelector->AddOrRemoveIndex( anIO, newIndices, false ); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) aViewWindow->highlight( anIO, true, true ); - + myElementsId = theNewText; } @@ -742,7 +751,7 @@ void SMESHGUI_ScaleDlg::SelectionIntoArgument() aNbUnits = SMESH::GetNameOfSelectedElements(mySelector, IO, aString); myElementsId = aString; if (aNbUnits < 1) - return; + return; } myNbOkElements = true; @@ -779,7 +788,7 @@ void SMESHGUI_ScaleDlg::SelectionIntoArgument() LineEditElements->setText(aString); LineEditElements->repaint(); LineEditElements->setEnabled(false); // to fully update lineedit IPAL 19809 - LineEditElements->setEnabled(true); + LineEditElements->setEnabled(true); setNewMeshName(); } @@ -788,6 +797,8 @@ void SMESHGUI_ScaleDlg::SelectionIntoArgument() buttonOk->setEnabled(true); buttonApply->setEnabled(true); } + + onDisplaySimulation(true); } //================================================================================= @@ -924,6 +935,7 @@ void SMESHGUI_ScaleDlg::onSelectMesh (bool toSelectMesh) LineEditElements->setReadOnly(false); LineEditElements->setValidator(myIdValidator); onTextChange(LineEditElements->text()); + hidePreview(); } SelectionIntoArgument(); @@ -959,6 +971,7 @@ void SMESHGUI_ScaleDlg::onActionClicked(int button) break; } setNewMeshName(); + toDisplaySimulation(); } //======================================================================= @@ -1057,3 +1070,69 @@ bool SMESHGUI_ScaleDlg::isValid() } return true; } + +//================================================================================= +// function : onDisplaySimulation +// purpose : Show/Hide preview +//================================================================================= +void SMESHGUI_ScaleDlg::onDisplaySimulation( bool toDisplayPreview ) { + if (myPreviewCheckBox->isChecked() && toDisplayPreview) { + if ( myNbOkElements && isValid() ) { + 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::PointStruct aPoint; + SMESH::double_array_var aScaleFact = new SMESH::double_array; + getScale(aPoint, aScaleFact); + + try { + bool copy = ( ActionGroup->checkedId() == COPY_ELEMS_BUTTON || + ActionGroup->checkedId() == MAKE_MESH_BUTTON ); + SUIT_OverrideCursor aWaitCursor; + SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditPreviewer(); + SMESH::SMESH_IDSource_var obj; + if ( CheckBoxMesh->isChecked() ) + obj = mySelectedObject; + else + obj = aMeshEditor->MakeIDSource(anElementsId, SMESH::ALL); + aMeshEditor->Scale(obj, aPoint, aScaleFact, copy); + + SMESH::MeshPreviewStruct_var aMeshPreviewStruct = aMeshEditor->GetPreviewData(); + mySimulation->SetData(aMeshPreviewStruct._retn()); + + } catch (...) { + hidePreview(); + } + } else { + hidePreview(); + } + } else { + hidePreview(); + } +} + +//================================================================================= +// function : getScale +// purpose : get scale parameters +//================================================================================= +void SMESHGUI_ScaleDlg::getScale( SMESH::PointStruct& thePoint , SMESH::double_array_var& theScaleFact) { + thePoint.x = SpinBox1_1->GetValue(); + thePoint.y = SpinBox1_2->GetValue(); + thePoint.z = SpinBox1_3->GetValue(); + + theScaleFact->length(3); + theScaleFact[0] = SpinBox_FX->GetValue(); + if (GetConstructorId() == 0) { + theScaleFact[1] = SpinBox_FX->GetValue(); + theScaleFact[2] = SpinBox_FX->GetValue(); + } + else { + theScaleFact[1] = SpinBox_FY->GetValue(); + theScaleFact[2] = SpinBox_FZ->GetValue(); + } +}