X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FSMESHGUI%2FSMESHGUI_SymmetryDlg.cxx;h=f70eacab3238d91869112e1a835334bf2da8791e;hb=2c607013a23bd4e7ba07e72e0c04dee2c1209cff;hp=6fec286e31d9dff88d54e00d0cd4f1ac2513b8d4;hpb=9357f5c87098aff2b95b754d69f66c76d2df9c24;p=modules%2Fsmesh.git diff --git a/src/SMESHGUI/SMESHGUI_SymmetryDlg.cxx b/src/SMESHGUI/SMESHGUI_SymmetryDlg.cxx index 6fec286e3..f70eacab3 100644 --- a/src/SMESHGUI/SMESHGUI_SymmetryDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_SymmetryDlg.cxx @@ -1,30 +1,28 @@ -// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2011 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 +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // +// File : SMESHGUI_SymmetryDlg.cxx +// Author : Michael ZORIN, Open CASCADE S.A.S. +// SMESH includes -// SMESH SMESHGUI : GUI for SMESH component -// File : SMESHGUI_SymmetryDlg.cxx -// Author : Michael ZORIN, Open CASCADE S.A.S. -// SMESH includes -// #include "SMESHGUI_SymmetryDlg.h" #include "SMESHGUI.h" @@ -34,6 +32,7 @@ #include "SMESHGUI_MeshUtils.h" #include "SMESHGUI_IdValidator.h" #include "SMESHGUI_FilterDlg.h" +#include "SMESHGUI_MeshEditPreview.h" #include #include @@ -84,14 +83,17 @@ enum { MOVE_ELEMS_BUTTON = 0, COPY_ELEMS_BUTTON, MAKE_MESH_BUTTON }; //!< action #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_SymmetryDlg() // purpose : //================================================================================= SMESHGUI_SymmetryDlg::SMESHGUI_SymmetryDlg( SMESHGUI* theModule ) - : QDialog( SMESH::GetDesktop( theModule ) ), - mySMESHGUI( theModule ), + : SMESHGUI_PreviewDlg( theModule ), mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), myFilterDlg(0), mySelectedObject(SMESH::SMESH_IDSource::_nil()) @@ -145,6 +147,7 @@ SMESHGUI_SymmetryDlg::SMESHGUI_SymmetryDlg( SMESHGUI* theModule ) SelectElementsButton->setIcon(image3); 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())); @@ -221,6 +224,10 @@ SMESHGUI_SymmetryDlg::SMESHGUI_SymmetryDlg( 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); @@ -231,6 +238,7 @@ SMESHGUI_SymmetryDlg::SMESHGUI_SymmetryDlg( SMESHGUI* theModule ) GroupArgumentsLayout->addWidget(ActionBox, 3, 0, 3, 3); GroupArgumentsLayout->addWidget(MakeGroupsCheck, 4, 3); GroupArgumentsLayout->addWidget(LineEditNewMesh, 5, 3); + GroupArgumentsLayout->addWidget(myPreviewCheckBox, 6, 0); /***************************************************************/ GroupButtons = new QGroupBox(this); @@ -313,6 +321,16 @@ SMESHGUI_SymmetryDlg::SMESHGUI_SymmetryDlg( SMESHGUI* theModule ) 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())); + + //To Connect preview check box + connectPreviewControl(); + ConstructorsClicked(0); SelectionIntoArgument(); onActionClicked(MOVE_ELEMS_BUTTON); @@ -359,6 +377,9 @@ void SMESHGUI_SymmetryDlg::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); @@ -430,6 +451,8 @@ void SMESHGUI_SymmetryDlg::ConstructorsClicked (int constructorId) connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + onDisplaySimulation(true); + QApplication::instance()->processEvents(); updateGeometry(); resize(100,100); @@ -457,17 +480,8 @@ bool SMESHGUI_SymmetryDlg::ClickOnApply() anElementsId[i] = aListElementsId[i].toInt(); SMESH::AxisStruct aMirror; - - aMirror.x = SpinBox_X->GetValue(); - aMirror.y = SpinBox_Y->GetValue(); - aMirror.z = SpinBox_Z->GetValue(); - if (GetConstructorId() == 0) { - aMirror.vx = aMirror.vy = aMirror.vz = 0; - } else { - aMirror.vx = SpinBox_DX->GetValue(); - aMirror.vy = SpinBox_DY->GetValue(); - aMirror.vz = SpinBox_DZ->GetValue(); - } + SMESH::SMESH_MeshEditor::MirrorType aMirrorType; + getMirror(aMirror,aMirrorType); QStringList aParameters; aParameters << SpinBox_X->text(); @@ -477,18 +491,9 @@ bool SMESHGUI_SymmetryDlg::ClickOnApply() aParameters << ( GetConstructorId() == 0 ? QString::number(0) : SpinBox_DY->text() ); aParameters << ( GetConstructorId() == 0 ? QString::number(0) : SpinBox_DZ->text() ); - SMESH::SMESH_MeshEditor::MirrorType aMirrorType; - - if (GetConstructorId() == 0) - aMirrorType = SMESH::SMESH_MeshEditor::POINT; - if (GetConstructorId() == 1) - aMirrorType = SMESH::SMESH_MeshEditor::AXIS; - if (GetConstructorId() == 2) - aMirrorType = SMESH::SMESH_MeshEditor::PLANE; - int actionButton = ActionGroup->checkedId(); bool makeGroups = ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() ); - + QStringList anEntryList; try { SUIT_OverrideCursor aWaitCursor; SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); @@ -499,7 +504,7 @@ bool SMESHGUI_SymmetryDlg::ClickOnApply() aMeshEditor->MirrorObject(mySelectedObject, aMirror, aMirrorType, false ); else aMeshEditor->Mirror(anElementsId, aMirror, aMirrorType, false ); - + if( !myMesh->_is_nil()) myMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); break; @@ -524,28 +529,43 @@ bool SMESHGUI_SymmetryDlg::ClickOnApply() } case MAKE_MESH_BUTTON: { SMESH::SMESH_Mesh_var mesh; - if(CheckBoxMesh->isChecked()) + if (CheckBoxMesh->isChecked()) mesh = aMeshEditor->MirrorObjectMakeMesh(mySelectedObject, aMirror, aMirrorType, makeGroups, LineEditNewMesh->text().toLatin1().data()); else mesh = aMeshEditor->MirrorMakeMesh(anElementsId, aMirror, aMirrorType, makeGroups, LineEditNewMesh->text().toLatin1().data()); - if( !mesh->_is_nil()) - mesh->SetParameters( aParameters.join(":").toLatin1().constData() ); + 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 + } 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; } @@ -556,6 +576,7 @@ bool SMESHGUI_SymmetryDlg::ClickOnApply() //================================================================================= void SMESHGUI_SymmetryDlg::ClickOnOk() { + setIsApplyAndClose( true ); if( ClickOnApply() ) ClickOnCancel(); } @@ -586,7 +607,7 @@ void SMESHGUI_SymmetryDlg::ClickOnCancel() void SMESHGUI_SymmetryDlg::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; @@ -629,7 +650,7 @@ void SMESHGUI_SymmetryDlg::onTextChange (const QString& theNewText) Handle(SALOME_InteractiveObject) anIO = myActor->getIO(); TColStd_MapOfInteger newIndices; - + QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts); if (send == LineEditElements) { @@ -643,7 +664,7 @@ void SMESHGUI_SymmetryDlg::onTextChange (const QString& theNewText) mySelector->AddOrRemoveIndex( anIO, newIndices, false ); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) aViewWindow->highlight( anIO, true, true ); - + myElementsId = theNewText; } } @@ -733,7 +754,6 @@ void SMESHGUI_SymmetryDlg::SelectionIntoArgument() aNbUnits++; } } - } else if (!SMESH::IObjectToInterface(IO)->_is_nil()) { //SUBMESH // get submesh SMESH::SMESH_subMesh_var aSubMesh = SMESH::IObjectToInterface(IO); @@ -746,7 +766,6 @@ void SMESHGUI_SymmetryDlg::SelectionIntoArgument() myElementsId += QString(" %1").arg(anElementsIds[i]); } aNbUnits = anElementsIds->length(); - } else { // GROUP // get smesh group SMESH::SMESH_GroupBase_var aGroup = @@ -769,7 +788,7 @@ void SMESHGUI_SymmetryDlg::SelectionIntoArgument() if (aNbUnits < 1) return; } - + myNbOkElements = true; } else { aNbUnits = SMESH::GetNameOfSelectedNodes(mySelector, IO, aString); @@ -804,7 +823,7 @@ void SMESHGUI_SymmetryDlg::SelectionIntoArgument() LineEditElements->setText(aString); LineEditElements->repaint(); LineEditElements->setEnabled(false); // to update lineedit IPAL 19809 - LineEditElements->setEnabled(true); + LineEditElements->setEnabled(true); setNewMeshName(); } myBusy = false; @@ -814,6 +833,7 @@ void SMESHGUI_SymmetryDlg::SelectionIntoArgument() buttonOk->setEnabled(true); buttonApply->setEnabled(true); } + onDisplaySimulation(true); } //================================================================================= @@ -954,6 +974,7 @@ void SMESHGUI_SymmetryDlg::onSelectMesh (bool toSelectMesh) LineEditElements->setReadOnly(false); LineEditElements->setValidator(myIdValidator); onTextChange(LineEditElements->text()); + hidePreview(); } SelectionIntoArgument(); @@ -1029,6 +1050,7 @@ void SMESHGUI_SymmetryDlg::onActionClicked(int button) break; } setNewMeshName(); + toDisplaySimulation(); } //======================================================================= @@ -1118,3 +1140,68 @@ bool SMESHGUI_SymmetryDlg::isValid() } return true; } + +//================================================================================= +// function : onDisplaySimulation +// purpose : Show/Hide preview +//================================================================================= +void SMESHGUI_SymmetryDlg::onDisplaySimulation( bool toDisplayPreview ) { + if (myPreviewCheckBox->isChecked() && toDisplayPreview) { + if ( myNbOkElements && isValid() && IsMirrorOk() ) { + 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 aMirror; + SMESH::SMESH_MeshEditor::MirrorType aMirrorType; + + getMirror(aMirror,aMirrorType); + + try { + bool copy = ( ActionGroup->checkedId() == COPY_ELEMS_BUTTON || + ActionGroup->checkedId() == MAKE_MESH_BUTTON ); + SUIT_OverrideCursor aWaitCursor; + SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditPreviewer(); + if(CheckBoxMesh->isChecked()) + aMeshEditor->MirrorObject(mySelectedObject, aMirror, aMirrorType, copy ); + else + aMeshEditor->Mirror(anElementsId, aMirror, aMirrorType, copy ); + + SMESH::MeshPreviewStruct_var aMeshPreviewStruct = aMeshEditor->GetPreviewData(); + mySimulation->SetData(aMeshPreviewStruct._retn()); + } catch (...) { + hidePreview(); + } + } else { + hidePreview(); + } + } else { + hidePreview(); + } +} + +//================================================================================= +// function : getMirror +// purpose : return mirror parameters +//================================================================================= +void SMESHGUI_SymmetryDlg::getMirror(SMESH::AxisStruct& theMirror, SMESH::SMESH_MeshEditor::MirrorType& theMirrorType) { + theMirror.x = SpinBox_X->GetValue(); + theMirror.y = SpinBox_Y->GetValue(); + theMirror.z = SpinBox_Z->GetValue(); + if (GetConstructorId() == 0) { + theMirror.vx = theMirror.vy = theMirror.vz = 0; + } else { + theMirror.vx = SpinBox_DX->GetValue(); + theMirror.vy = SpinBox_DY->GetValue(); + theMirror.vz = SpinBox_DZ->GetValue(); + } + if (GetConstructorId() == 0) + theMirrorType = SMESH::SMESH_MeshEditor::POINT; + if (GetConstructorId() == 1) + theMirrorType = SMESH::SMESH_MeshEditor::AXIS; + if (GetConstructorId() == 2) + theMirrorType = SMESH::SMESH_MeshEditor::PLANE; +}