smesh/src/SMESHGUI/SMESHGUI_ExtrusionDlg.cxx

1645 lines
57 KiB
C++
Raw Normal View History

2016-03-18 22:10:20 +05:00
// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
2004-12-01 15:48:31 +05:00
//
2012-08-09 16:03:55 +06:00
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
2012-08-09 16:03:55 +06:00
// 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
2014-02-20 18:25:37 +06:00
// version 2.1 of the License, or (at your option) any later version.
//
2012-08-09 16:03:55 +06:00
// 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.
//
2012-08-09 16:03:55 +06:00
// 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
//
2012-08-09 16:03:55 +06:00
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
2004-12-01 15:48:31 +05:00
//
2012-08-09 16:03:55 +06:00
2009-02-17 10:27:49 +05:00
// SMESH SMESHGUI : GUI for SMESH component
// File : SMESHGUI_ExtrusionDlg.cxx
// Author : Michael ZORIN, Open CASCADE S.A.S.
// SMESH includes
2004-12-01 15:48:31 +05:00
//
#include "SMESHGUI_ExtrusionDlg.h"
2004-12-01 15:48:31 +05:00
#include "SMESHGUI.h"
2009-02-17 10:27:49 +05:00
#include "SMESHGUI_FilterDlg.h"
#include "SMESHGUI_IdValidator.h"
2012-08-09 16:03:55 +06:00
#include "SMESHGUI_MeshEditPreview.h"
#include "SMESHGUI_MeshUtils.h"
#include "SMESHGUI_SpinBox.h"
#include "SMESHGUI_Utils.h"
#include "SMESHGUI_VTKUtils.h"
#include <GEOMBase.h>
#include <SMDS_Mesh.hxx>
2009-02-17 10:27:49 +05:00
#include <SMESH_Actor.h>
#include <SMESH_LogicalFilter.hxx>
#include <SMESH_TypeFilter.hxx>
2004-12-01 15:48:31 +05:00
2009-02-17 10:27:49 +05:00
// SALOME GUI includes
#include <LightApp_Application.h>
#include <LightApp_SelectionMgr.h>
2009-02-17 10:27:49 +05:00
#include <SUIT_Desktop.h>
#include <SUIT_MessageBox.h>
#include <SUIT_OverrideCursor.h>
#include <SUIT_ResourceMgr.h>
#include <SUIT_Session.h>
2009-02-17 10:27:49 +05:00
#include <SVTK_ViewModel.h>
#include <SVTK_ViewWindow.h>
#include <SalomeApp_IntSpinBox.h>
2004-12-01 15:48:31 +05:00
2009-02-17 10:27:49 +05:00
// OCCT includes
#include <BRep_Tool.hxx>
#include <TColStd_IndexedMapOfInteger.hxx>
#include <TColStd_MapOfInteger.hxx>
#include <TopoDS_Vertex.hxx>
2009-02-17 10:27:49 +05:00
#include <gp_XYZ.hxx>
// Qt includes
#include <QApplication>
#include <QButtonGroup>
#include <QCheckBox>
#include <QGridLayout>
2009-02-17 10:27:49 +05:00
#include <QGroupBox>
#include <QHBoxLayout>
#include <QKeyEvent>
2009-02-17 10:27:49 +05:00
#include <QLabel>
#include <QLineEdit>
#include <QListWidget>
2009-02-17 10:27:49 +05:00
#include <QPushButton>
#include <QRadioButton>
#include <QToolButton>
2009-02-17 10:27:49 +05:00
#include <QVBoxLayout>
// IDL includes
#include <SALOMEconfig.h>
2005-01-20 11:25:54 +05:00
#include CORBA_SERVER_HEADER(SMESH_Group)
#include CORBA_SERVER_HEADER(SMESH_MeshEditor)
#include <SMESH_NumberFilter.hxx>
2005-01-20 11:25:54 +05:00
2009-02-17 10:27:49 +05:00
#define SPACING 6
#define MARGIN 11
2004-12-01 15:48:31 +05:00
namespace
{
const char* getLabelText( int typeIndex, bool objSelection )
{
const char* typeLbl[3] = { "SMESH_ID_NODES", "SMESH_ID_EDGES", "SMESH_ID_FACES" };
const char* obj = "SMESH_OBJECTS";
return objSelection ? obj : typeLbl[ typeIndex ];
}
}
//================================================================================
/*!
* \brief Constructor
*/
//================================================================================
SMESHGUI_3TypesSelector::SMESHGUI_3TypesSelector( QWidget * parent ):
QWidget( parent )
{
SMESHGUI* gui = SMESHGUI::GetSMESHGUI();
mySelectionMgr = SMESH::GetSelectionMgr( gui );
mySelector = SMESH::GetViewWindow( gui )->GetSelector();
myFilterDlg = 0;
myIdValidator = new SMESHGUI_IdValidator(this);
QPixmap image( SMESH::GetResourceMgr( gui )->loadPixmap("SMESH", tr("ICON_SELECT")));
mySelectBtnGrp = new QButtonGroup( this );
mySelectBtnGrp->setExclusive( true );
QVBoxLayout* mainLayout = new QVBoxLayout( this );
mainLayout->setSpacing( SPACING );
mainLayout->setMargin( 0 );
const char* groupLbl[3] = { "SMESH_NODES", "SMESH_EDGES", "SMESH_FACES" };
for ( int i = 0; i < 3; ++i )
{
myGroups[i] = new QGroupBox( tr( groupLbl[i] ), this );
mainLayout->addWidget( myGroups[i] );
QGridLayout* layout = new QGridLayout( myGroups[i] );
layout->setSpacing( SPACING );
layout->setMargin( MARGIN );
QPushButton* selBtn = new QPushButton( myGroups[i] );
selBtn->setIcon( image );
selBtn->setCheckable( true );
mySelectBtnGrp->addButton( selBtn, i );
myLabel [i] = new QLabel( myGroups[i] );
myLineEdit [i] = new QLineEdit( myGroups[i] );
myMeshChk [i] = new QCheckBox( tr("SMESH_SELECT_WHOLE_MESH"), myGroups[i] );
myFilterBtn[i] = new QPushButton( tr( "SMESH_BUT_FILTER" ), myGroups[i] );
myLineEdit[i]->setMaxLength(-1);
myLabel [i]->setText( tr( getLabelText( i, true )));
layout->addWidget(myLabel [i], 0, 0);
layout->addWidget(selBtn, 0, 1);
layout->addWidget(myLineEdit [i], 0, 2, 1, 2);
layout->addWidget(myFilterBtn[i], 0, 4);
layout->addWidget(myMeshChk [i], 1, 0, 1, 5);
layout->setColumnStretch( 2, 10 );
connect( myMeshChk [i], SIGNAL(toggled(bool)), SLOT(onSelectMesh(bool)));
connect( myFilterBtn[i], SIGNAL(clicked()), SLOT(setFilters()));
connect( myLineEdit [i], SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&)));
myIDSource[i] = new SMESH::ListOfIDSources;
}
connect( mySelectBtnGrp, SIGNAL(buttonClicked (int)), SLOT(onSelectType(int)));
connect(mySelectionMgr, SIGNAL( currentSelectionChanged()), SLOT(selectionIntoArgument()));
// Costruction of the logical filter for the elements: mesh/sub-mesh/group
QList<SUIT_SelectionFilter*> aListOfFilters;
aListOfFilters.append(new SMESH_TypeFilter (SMESH::MESH));
aListOfFilters.append(new SMESH_TypeFilter (SMESH::SUBMESH_VERTEX));
aListOfFilters.append(new SMESH_TypeFilter (SMESH::GROUP_NODE));
myFilter[0] =
new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true);
aListOfFilters.append(0);
aListOfFilters[0] = new SMESH_TypeFilter (SMESH::MESH);
aListOfFilters[1] = new SMESH_TypeFilter (SMESH::SUBMESH_EDGE);
aListOfFilters[2] = new SMESH_TypeFilter (SMESH::GROUP_EDGE);
aListOfFilters[3] = new SMESH_TypeFilter (SMESH::IDSOURCE_EDGE); // for sub-mesh on group of EDGEs
myFilter[1] =
new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true);
aListOfFilters[0] = new SMESH_TypeFilter (SMESH::MESH);
aListOfFilters[1] = new SMESH_TypeFilter (SMESH::SUBMESH_FACE);
aListOfFilters[2] = new SMESH_TypeFilter (SMESH::GROUP_FACE);
aListOfFilters[3] = new SMESH_TypeFilter (SMESH::IDSOURCE_FACE); // for sub-mesh on group of FACEs
myFilter[2] =
new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true);
myBusy = false;
myMeshChk[0]->setChecked( true );
myMeshChk[1]->setChecked( true );
myMeshChk[2]->setChecked( true );
mySelectBtnGrp->button(0)->click();
}
//================================================================================
/*!
* \brief Destructor
*/
//================================================================================
SMESHGUI_3TypesSelector::~SMESHGUI_3TypesSelector()
{
myIDSource[0].out();
myIDSource[1].out();
myIDSource[2].out();
delete myFilter[0];
delete myFilter[1];
delete myFilter[2];
if ( myFilterDlg )
{
myFilterDlg->setParent( 0 );
delete myFilterDlg;
myFilterDlg = 0;
}
disconnect(mySelectionMgr, 0, this, 0);
}
//================================================================================
/*!
* \brief Slot called when selection changes
*/
//================================================================================
void SMESHGUI_3TypesSelector::selectionIntoArgument()
{
if (myBusy) return;
// return if dialog box is inactive
if ( !isEnabled() )
return;
// get a current element type
int iType = mySelectBtnGrp->checkedId();
if ( iType < 0 || iType > 2 )
return;
QString aString = "";
int nbObjects = 0;
// clear
myBusy = true;
myLineEdit[ iType ]->setText(aString);
myIDSource[ iType ]->length (nbObjects);
myBusy = false;
if ( !myGroups[ iType ]->isEnabled() )
return;
SMESH::SetPointRepresentation(false);
SALOME_ListIO selected;
mySelectionMgr->selectedObjects( selected );
if ( myMeshChk[ iType ]->isChecked() ) // objects selection
myIDSource[ iType ]->length( selected.Extent() ); // reserve
myIDSource[ iType ]->length(0);
SALOME_ListIteratorOfListIO It( selected );
for ( ; It.More(); It.Next() )
{
Handle(SALOME_InteractiveObject) IO = It.Value();
// get selected mesh
SMESH::SMESH_Mesh_var mesh = SMESH::GetMeshByIO(IO);
if ( mesh->_is_nil() )
continue;
if ( !myMesh->_is_nil() &&
IsAnythingSelected() &&
myMesh->GetId() != mesh->GetId() )
continue; // other mesh
myMesh = mesh;
myIO = IO;
myActor = SMESH::FindActorByEntry( IO->getEntry() );
if ( myMeshChk[ iType ]->isChecked() ) // objects selection
{
SMESH::SMESH_IDSource_var idSrc = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(IO);
if ( idSrc->_is_nil() )
continue;
mesh = SMESH::SMESH_Mesh::_narrow( idSrc );
if ( !mesh->_is_nil() ) // if a mesh is selected, stop iteration
{
nbObjects = 1;
myIDSource[ iType ]->length( nbObjects );
myIDSource[ iType ][ 0 ] = idSrc;
aString = IO->getName();
break;
}
else // several groups can be selected
{
myIDSource[ iType ]->length( nbObjects + 1 );
myIDSource[ iType ][ nbObjects++ ] = idSrc;
aString += " " + QString( IO->getName() ) + " ";
}
}
else // get indices of selected elements
{
TColStd_IndexedMapOfInteger aMapIndex;
mySelector->GetIndex(IO,aMapIndex);
int nbElements = aMapIndex.Extent();
if ( nbElements > 0 )
{
SMESH::long_array_var ids = new SMESH::long_array;
ids->length( nbElements );
for ( int i = 0; i < nbElements; ++i )
aString += QString(" %1").arg( ids[ i ] = aMapIndex( i+1 ));
addTmpIdSource( ids, iType, nbObjects++ );
}
break;
}
}
myIDSource[ iType ]->length( nbObjects );
myBusy = true;
myLineEdit[ iType ]->setText(aString);
myBusy = false;
emit selectionChanged();
}
//================================================================================
/*!
* \brief Slot called when text changes in myLineEdit
*/
//================================================================================
void SMESHGUI_3TypesSelector::onTextChange( const QString& theNewText )
{
// return if busy
if (myBusy) return;
// get a current element type
int iType = 0;
QLineEdit* le = (QLineEdit*) sender();
for ( ; iType < 3; ++iType )
if ( myLineEdit[ iType ] == le )
break;
if ( iType < 0 || iType > 2 )
return;
if ( !myGroups[ iType ]->isEnabled() )
return;
myBusy = true;
// hilight entered elements/nodes
myIDSource[ iType ]->length( 0 );
if ( !myMesh->_is_nil() )
{
QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts);
if ( aListId.count() > 0 )
{
SMDS_Mesh* aMesh = myActor ? myActor->GetObject()->GetMesh() : 0;
SMESH::ElementType SMESHType = SMESH::ElementType ( iType+1 );
SMDSAbs_ElementType SMDSType = SMDSAbs_ElementType( iType+1 );
const bool isNode = ( SMDSType == SMDSAbs_Node );
SMESH::long_array_var ids = new SMESH::long_array;
ids->length( aListId.count() );
TColStd_MapOfInteger newIndices;
for (int i = 0; i < aListId.count(); i++) {
int id = aListId[ i ].toInt();
bool validId = false;
if ( id > 0 ) {
if ( aMesh ) {
const SMDS_MeshElement * e;
if ( isNode ) e = aMesh->FindNode( id );
else e = aMesh->FindElement( id );
validId = ( e && e->GetType() == SMDSType );
} else {
validId = ( myMesh->GetElementType( id, !isNode ) == SMESHType );
}
}
if ( validId && newIndices.Add( id ))
ids[ newIndices.Extent()-1 ] = id;
}
if ( !newIndices.IsEmpty() ) {
ids->length( newIndices.Extent() );
addTmpIdSource( ids, iType, 0 );
}
mySelector->AddOrRemoveIndex(myIO, newIndices, false);
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetCurrentVtkView() )
aViewWindow->highlight( myIO, true, true );
}
}
emit selectionChanged();
myBusy = false;
}
//================================================================================
/*!
* \brief Creates from ids and stores a temporary IDSource
*/
//================================================================================
void SMESHGUI_3TypesSelector::addTmpIdSource( SMESH::long_array_var& ids, int iType, int index )
{
SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
SMESH::SMESH_IDSource_var idSrc =
aMeshEditor->MakeIDSource( ids, SMESH::ElementType( iType+1 ));
if ( (int) myIDSource[ iType ]->length() <= index )
myIDSource[ iType ]->length( index + 1 );
myIDSource[ iType ][ index ] = idSrc;
myTmpIDSourceList.push_back( idSrc );
}
//================================================================================
/*!
* \brief Slot called when myMeshChk is checked
*/
//================================================================================
void SMESHGUI_3TypesSelector::onSelectMesh( bool on )
{
QCheckBox* send = (QCheckBox*)sender();
for ( int iType = 0; iType < 3; ++iType )
if ( send == myMeshChk[ iType ])
{
myLabel[ iType ]->setText( tr( getLabelText( iType, on )));
myFilterBtn[ iType ]->setEnabled( !on );
myIDSource [ iType ]->length(0);
myBusy = true;
myLineEdit [ iType ]->setText("");
myBusy = false;
myLineEdit [ iType ]->setReadOnly( on );
myLineEdit [ iType ]->setValidator( on ? 0 : myIdValidator );
mySelectBtnGrp->button(iType)->click();
break;
}
else
{
}
}
//================================================================================
/*!
* \brief Slot called when a selection button is clicked
*/
//================================================================================
void SMESHGUI_3TypesSelector::onSelectType(int iType)
{
if ( iType < 0 || iType > 2 )
return;
myIDSource[ iType ]->length(0);
myLineEdit[ iType ]->setText("");
disconnect(mySelectionMgr, 0, this, 0);
mySelectionMgr->clearFilters();
SVTK_ViewWindow* aViewWindow = SMESH::GetCurrentVtkView();
if ( myMeshChk[ iType ]->isChecked() )
{
if ( aViewWindow ) aViewWindow->SetSelectionMode(ActorSelection);
mySelectionMgr->installFilter( myFilter[ iType ]);
}
else if ( aViewWindow )
{
switch ( iType+1 ) {
case SMESH::NODE: aViewWindow->SetSelectionMode(NodeSelection); break;
case SMESH::EDGE: aViewWindow->SetSelectionMode(EdgeSelection); break;
case SMESH::FACE: aViewWindow->SetSelectionMode(FaceSelection); break;
}
}
myLineEdit[ iType ]->setFocus();
connect(mySelectionMgr, SIGNAL( currentSelectionChanged()), SLOT( selectionIntoArgument()));
selectionIntoArgument();
}
//================================================================================
/*!
* \brief Slot called when "Set filter" is clicked
*/
//================================================================================
void SMESHGUI_3TypesSelector::setFilters()
{
if ( myMesh->_is_nil() ) {
SUIT_MessageBox::critical(this,
tr("SMESH_ERROR"),
tr("NO_MESH_SELECTED"));
return;
}
if ( !myFilterDlg )
{
QList<int> types;
types.append( SMESH::NODE );
types.append( SMESH::EDGE );
types.append( SMESH::FACE );
myFilterDlg = new SMESHGUI_FilterDlg( SMESHGUI::GetSMESHGUI(), types );
}
QPushButton* send = (QPushButton*)sender();
for ( int iType = 0; iType < 3; ++iType )
if ( send == myFilterBtn[ iType ])
{
mySelectBtnGrp->button(iType)->click();
myFilterDlg->Init( SMESH::ElementType( iType+1 ) );
myFilterDlg->SetSelection();
myFilterDlg->SetMesh( myMesh );
myFilterDlg->SetSourceWg( myLineEdit[ iType ]);
myFilterDlg->show();
break;
}
}
//================================================================================
/*!
* \brief Clear selection
*/
//================================================================================
void SMESHGUI_3TypesSelector::Clear()
{
myBusy = true;
for ( int iType = 0; iType < 3; ++iType )
{
myIDSource[ iType ]->length(0);
myLineEdit[ iType ]->setText("");
}
myBusy = false;
selectionIntoArgument();
}
//================================================================================
/*!
* \brief Enable/disable controls of a type
*/
//================================================================================
void SMESHGUI_3TypesSelector::SetEnabled( bool enable, SMESH::ElementType type )
{
myBusy = true;
for ( int iType = 0; iType < 3; ++iType )
if ( iType+1 == type || type == SMESH::ALL )
{
myGroups[ iType ]->setEnabled( enable );
if ( !enable ) {
myIDSource[ iType ]->length(0);
myLineEdit[ iType ]->setText("");
}
}
myBusy = false;
selectionIntoArgument();
}
//================================================================================
/*!
* \brief Checks if anything is selected
*/
//================================================================================
bool SMESHGUI_3TypesSelector::IsAnythingSelected( SMESH::ElementType type )
{
int nbSel = 0;
for ( int iType = 0; iType < 3; ++iType )
if ( iType+1 == type || type == SMESH::ALL )
nbSel += myIDSource[ iType ]->length();
return nbSel;
}
//================================================================================
/*!
* \brief Returns selected elements and most complex type of selected elements
*/
//================================================================================
SMESH::ElementType SMESHGUI_3TypesSelector::GetSelected( SMESH::ListOfIDSources & nodes,
SMESH::ListOfIDSources & edges,
SMESH::ListOfIDSources & faces )
{
nodes = myIDSource[0];
edges = myIDSource[1];
faces = myIDSource[2];
if ( myIDSource[2]->length() > 0 ) return SMESH::FACE;
if ( myIDSource[1]->length() > 0 ) return SMESH::EDGE;
if ( myIDSource[0]->length() > 0 ) return SMESH::NODE;
return SMESH::ALL;
}
2004-12-01 15:48:31 +05:00
//=================================================================================
// function : SMESHGUI_ExtrusionDlg()
// purpose : constructor
2004-12-01 15:48:31 +05:00
//=================================================================================
2009-02-17 10:27:49 +05:00
SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule)
2012-08-09 16:03:55 +06:00
: SMESHGUI_PreviewDlg( theModule ),
mySelectionMgr( SMESH::GetSelectionMgr( theModule ) )
2004-12-01 15:48:31 +05:00
{
SUIT_ResourceMgr* mgr = SMESH::GetResourceMgr( mySMESHGUI );
QPixmap selectImage ( mgr->loadPixmap("SMESH", tr("ICON_SELECT")));
QPixmap addImage ( mgr->loadPixmap("SMESH", tr("ICON_APPEND")));
QPixmap removeImage ( mgr->loadPixmap("SMESH", tr("ICON_REMOVE")));
2009-02-17 10:27:49 +05:00
setModal( false );
setAttribute( Qt::WA_DeleteOnClose, true );
setWindowTitle(tr("EXTRUSION_ALONG_LINE"));
setSizeGripEnabled(true);
2009-02-17 10:27:49 +05:00
QVBoxLayout* SMESHGUI_ExtrusionDlgLayout = new QVBoxLayout(this);
SMESHGUI_ExtrusionDlgLayout->setSpacing(SPACING);
SMESHGUI_ExtrusionDlgLayout->setMargin(MARGIN);
2004-12-01 15:48:31 +05:00
/***************************************************************/
GroupArguments = new QGroupBox(tr("SMESH_EXTRUSION"), this);
2009-02-17 10:27:49 +05:00
QGridLayout* GroupArgumentsLayout = new QGridLayout(GroupArguments);
GroupArgumentsLayout->setSpacing(SPACING);
GroupArgumentsLayout->setMargin(MARGIN);
2004-12-01 15:48:31 +05:00
// Controls for elements selection
SelectorWdg = new SMESHGUI_3TypesSelector( GroupArguments );
2004-12-01 15:48:31 +05:00
ExtrMethod_RBut0 = new QRadioButton(GroupArguments);
ExtrMethod_RBut0->setText( tr("SMESH_EXTRUSION_TO_DISTANCE") );
ExtrMethod_RBut1 = new QRadioButton(GroupArguments);
ExtrMethod_RBut1->setText( tr("SMESH_EXTRUSION_ALONG_VECTOR") );
ExtrMethod_RBut2 = new QRadioButton(GroupArguments);
ExtrMethod_RBut2->setText( tr("SMESH_EXTRUSION_BY_NORMAL") );
2012-08-09 16:03:55 +06:00
2009-02-17 10:27:49 +05:00
//Control for the Distance selection
TextLabelDistance = new QLabel(tr("SMESH_DISTANCE"), GroupArguments);
TextLabelDx = new QLabel(tr("SMESH_X"), GroupArguments);
SpinBox_Dx = new SMESHGUI_SpinBox(GroupArguments);
TextLabelDy = new QLabel(tr("SMESH_Y"), GroupArguments);
SpinBox_Dy = new SMESHGUI_SpinBox(GroupArguments);
2009-02-17 10:27:49 +05:00
TextLabelDz = new QLabel(tr("SMESH_Z"), GroupArguments);
SpinBox_Dz = new SMESHGUI_SpinBox(GroupArguments);
2004-12-01 15:48:31 +05:00
2009-02-17 10:27:49 +05:00
// Controls for vector selection
2004-12-01 15:48:31 +05:00
2012-08-09 16:03:55 +06:00
TextLabelVector = new QLabel(tr("SMESH_VECTOR"), GroupArguments);
SelectVectorButton = new QPushButton( GroupArguments );
SelectVectorButton->setIcon( selectImage );
SelectVectorButton->setCheckable( true );
SelectorWdg->GetButtonGroup()->addButton( SelectVectorButton );
2004-12-01 15:48:31 +05:00
2009-02-17 10:27:49 +05:00
TextLabelVx = new QLabel(tr("SMESH_DX"), GroupArguments);
SpinBox_Vx = new SMESHGUI_SpinBox(GroupArguments);
2009-02-17 10:27:49 +05:00
TextLabelVy = new QLabel(tr("SMESH_DY"), GroupArguments);
SpinBox_Vy = new SMESHGUI_SpinBox(GroupArguments);
2004-12-01 15:48:31 +05:00
2009-02-17 10:27:49 +05:00
TextLabelVz = new QLabel(tr("SMESH_DZ"), GroupArguments);
SpinBox_Vz = new SMESHGUI_SpinBox(GroupArguments);
2012-08-09 16:03:55 +06:00
TextLabelDist = new QLabel(tr("SMESH_DISTANCE"), GroupArguments);
SpinBox_VDist = new SMESHGUI_SpinBox(GroupArguments);
2004-12-01 15:48:31 +05:00
// Controls for nb. steps defining
2009-02-17 10:27:49 +05:00
TextLabelNbSteps = new QLabel(tr("SMESH_NUMBEROFSTEPS"), GroupArguments);
SpinBox_NbSteps = new SalomeApp_IntSpinBox(GroupArguments);
// CheckBox for groups generation
MakeGroupsCheck = new QCheckBox(tr("SMESH_MAKE_GROUPS"), GroupArguments);
// CheckBox for ByAverageNormal arg of ExtrusionByNormal()
ByAverageNormalCheck = new QCheckBox(tr("BY_AVERAGE_NORMAL"), GroupArguments);
// CheckBox for UseInputElemsOnly arg of ExtrusionByNormal()
UseInputElemsOnlyCheck = new QCheckBox(tr("USE_INPUT_ELEMS_ONLY"), GroupArguments);
2012-08-09 16:03:55 +06:00
//Preview check box
myPreviewCheckBox = new QCheckBox(tr("PREVIEW"), GroupArguments);
// Base point
BasePointGrp = new QGroupBox(tr("BASE_POINT"), GroupArguments);
BasePointGrp->setCheckable(true);
BasePointGrp->setChecked(false);
QHBoxLayout* BasePointGrpLayout = new QHBoxLayout(BasePointGrp);
BasePointGrpLayout->setSpacing(SPACING); BasePointGrpLayout->setMargin(MARGIN);
SelectBasePointButton = new QPushButton(BasePointGrp);
SelectBasePointButton->setIcon(selectImage);
SelectBasePointButton->setCheckable(true);
SelectorWdg->GetButtonGroup()->addButton( SelectBasePointButton );
QLabel* XLab = new QLabel(tr("SMESH_X"), BasePointGrp);
BasePoint_XSpin = new SMESHGUI_SpinBox(BasePointGrp);
BasePoint_XSpin->SetValue(0.);
QLabel* YLab = new QLabel(tr("SMESH_Y"), BasePointGrp);
BasePoint_YSpin = new SMESHGUI_SpinBox(BasePointGrp);
BasePoint_YSpin->SetValue(0.);
QLabel* ZLab = new QLabel(tr("SMESH_Z"), BasePointGrp);
BasePoint_ZSpin = new SMESHGUI_SpinBox(BasePointGrp);
BasePoint_ZSpin->SetValue(0.);
BasePointGrpLayout->addWidget(SelectBasePointButton);
BasePointGrpLayout->addWidget(XLab);
BasePointGrpLayout->addWidget(BasePoint_XSpin, 1);
BasePointGrpLayout->addWidget(YLab);
BasePointGrpLayout->addWidget(BasePoint_YSpin, 1);
BasePointGrpLayout->addWidget(ZLab);
BasePointGrpLayout->addWidget(BasePoint_ZSpin, 1);
// Scales
ScalesGrp = new QGroupBox(tr("SMESH_SCALES"), GroupArguments);
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 );
ScaleSpin->SetValue(2);
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);
ScalesGrpLayout->setRowMinimumHeight(1, 10);
ScalesGrpLayout->setRowStretch(3, 10);
// layouting
GroupArgumentsLayout->addWidget(SelectorWdg, 0, 0, 1, 9);
GroupArgumentsLayout->addWidget(ExtrMethod_RBut0, 1, 0, 1, 3);
GroupArgumentsLayout->addWidget(ExtrMethod_RBut1, 1, 3, 1, 3);
GroupArgumentsLayout->addWidget(ExtrMethod_RBut2, 1, 6, 1, 3);
GroupArgumentsLayout->addWidget(TextLabelDistance, 2, 0);
GroupArgumentsLayout->addWidget(TextLabelDx, 2, 2);
GroupArgumentsLayout->addWidget(SpinBox_Dx, 2, 3);
GroupArgumentsLayout->addWidget(TextLabelDy, 2, 4);
GroupArgumentsLayout->addWidget(SpinBox_Dy, 2, 5);
GroupArgumentsLayout->addWidget(TextLabelDz, 2, 6);
GroupArgumentsLayout->addWidget(SpinBox_Dz, 2, 7);
GroupArgumentsLayout->addWidget(TextLabelVector, 3, 0);
GroupArgumentsLayout->addWidget(SelectVectorButton, 3, 1);
GroupArgumentsLayout->addWidget(TextLabelVx, 3, 2);
GroupArgumentsLayout->addWidget(SpinBox_Vx, 3, 3);
GroupArgumentsLayout->addWidget(TextLabelVy, 3, 4);
GroupArgumentsLayout->addWidget(SpinBox_Vy, 3, 5);
GroupArgumentsLayout->addWidget(TextLabelVz, 3, 6);
GroupArgumentsLayout->addWidget(SpinBox_Vz, 3, 7);
GroupArgumentsLayout->addWidget(TextLabelDist, 4, 0);
GroupArgumentsLayout->addWidget(SpinBox_VDist, 4, 3);
GroupArgumentsLayout->addWidget(TextLabelNbSteps, 5, 0, 1, 3);
GroupArgumentsLayout->addWidget(SpinBox_NbSteps, 5, 3);
GroupArgumentsLayout->addWidget(ByAverageNormalCheck, 6, 0, 1, 4);
GroupArgumentsLayout->addWidget(UseInputElemsOnlyCheck, 6, 4, 1, 4);
GroupArgumentsLayout->addWidget(BasePointGrp, 7, 0, 1, 9);
GroupArgumentsLayout->addWidget(ScalesGrp, 8, 0, 1, 9);
GroupArgumentsLayout->addWidget(myPreviewCheckBox, 9, 0, 1, 8);
GroupArgumentsLayout->addWidget(MakeGroupsCheck, 10,0, 1, 8);
GroupArgumentsLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding), 10, 0);
2012-08-09 16:03:55 +06:00
/***************************************************************/
GroupButtons = new QGroupBox(this);
QHBoxLayout* GroupButtonsLayout = new QHBoxLayout(GroupButtons);
GroupButtonsLayout->setSpacing(SPACING);
GroupButtonsLayout->setMargin(MARGIN);
buttonOk = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), GroupButtons);
buttonOk->setAutoDefault(true);
buttonOk->setDefault(true);
buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons);
buttonApply->setAutoDefault(true);
buttonCancel = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons);
buttonCancel->setAutoDefault(true);
buttonHelp = new QPushButton(tr("SMESH_BUT_HELP"), GroupButtons);
buttonHelp->setAutoDefault(true);
GroupButtonsLayout->addWidget(buttonOk);
GroupButtonsLayout->addSpacing(10);
GroupButtonsLayout->addWidget(buttonApply);
GroupButtonsLayout->addSpacing(10);
GroupButtonsLayout->addStretch();
GroupButtonsLayout->addWidget(buttonCancel);
GroupButtonsLayout->addWidget(buttonHelp);
2009-02-17 10:27:49 +05:00
/***************************************************************/
SMESHGUI_ExtrusionDlgLayout->addWidget(GroupArguments);
SMESHGUI_ExtrusionDlgLayout->addWidget(GroupButtons);
2004-12-01 15:48:31 +05:00
/* Initialisations */
SpinBox_Vx->RangeStepAndValidator(COORD_MIN, COORD_MAX, 0.1, "length_precision");
SpinBox_Vy->RangeStepAndValidator(COORD_MIN, COORD_MAX, 0.1, "length_precision");
SpinBox_Vz->RangeStepAndValidator(COORD_MIN, COORD_MAX, 0.1, "length_precision");
2009-02-17 10:27:49 +05:00
2012-08-09 16:03:55 +06:00
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");
2009-02-17 10:27:49 +05:00
SpinBox_NbSteps->setRange(1, 999999);
SpinBox_VDist->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
BasePoint_XSpin->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
BasePoint_YSpin->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
BasePoint_ZSpin->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
ScaleSpin->RangeStepAndValidator (COORD_MIN, COORD_MAX, 1.0, "length_precision");
ExtrMethod_RBut0->setChecked(true);
UseInputElemsOnlyCheck->setChecked(true);
2009-02-17 10:27:49 +05:00
MakeGroupsCheck->setChecked(true);
mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
mySMESHGUI->SetActiveDialogBox(this);
myHelpFileName = "extrusion_page.html";
2004-12-01 15:48:31 +05:00
Init();
/***************************************************************/
// signals and slots connections
2009-02-17 10:27:49 +05:00
connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk()));
2013-02-28 21:07:35 +06:00
connect(buttonCancel, SIGNAL(clicked()), this, SLOT(reject()));
2009-02-17 10:27:49 +05:00
connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply()));
connect(buttonHelp, SIGNAL(clicked()), this, SLOT(ClickOnHelp()));
connect(ExtrMethod_RBut0, SIGNAL(clicked()), this, SLOT(ClickOnRadio()));
connect(ExtrMethod_RBut1, SIGNAL(clicked()), this, SLOT(ClickOnRadio()));
connect(ExtrMethod_RBut2, SIGNAL(clicked()), this, SLOT(ClickOnRadio()));
2012-08-09 16:03:55 +06:00
// to update state of the Ok & Apply buttons
2009-02-17 10:27:49 +05:00
connect(SpinBox_Vx, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
connect(SpinBox_Vy, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
connect(SpinBox_Vz, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
connect(SpinBox_Dx, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
connect(SpinBox_Dy, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
connect(SpinBox_Dz, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
connect(AddScaleButton, SIGNAL(clicked()), this, SLOT(OnScaleAdded()));
connect(RemoveScaleButton, SIGNAL(clicked()), this, SLOT(OnScaleRemoved()));
2009-02-17 10:27:49 +05:00
connect(SelectVectorButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
connect(SelectBasePointButton,SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
connect(BasePointGrp, SIGNAL(toggled(bool)), this, SLOT(SetEditCurrentArgument()));
connect(BasePointGrp, SIGNAL(toggled(bool)), SelectBasePointButton, SLOT(click()));
connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), SLOT(DeactivateActiveDialog()));
connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(toDisplaySimulation()));
connect(SelectorWdg, SIGNAL(selectionChanged()), this, SLOT(toDisplaySimulation()));
connect(SelectorWdg, SIGNAL(selectionChanged()), this, SLOT(CheckIsEnable()));
2004-12-01 15:48:31 +05:00
/* to close dialog if study change */
connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(reject()));
connect(mySMESHGUI, SIGNAL(SignalActivatedViewManager()), this, SLOT(onOpenView()));
connect(mySMESHGUI, SIGNAL(SignalCloseView()), this, SLOT(onCloseView()));
2004-12-01 15:48:31 +05:00
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_Vx, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
connect(SpinBox_Vy, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
connect(SpinBox_Vz, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
connect(SpinBox_VDist, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
connect(SpinBox_NbSteps, SIGNAL(valueChanged(int)), this, SLOT(toDisplaySimulation()));
connect(ByAverageNormalCheck, SIGNAL(toggled(bool)), this, SLOT(toDisplaySimulation()));
connect(UseInputElemsOnlyCheck, SIGNAL(toggled(bool)), this, SLOT(toDisplaySimulation()));
connect(AddScaleButton, SIGNAL(clicked()), this, SLOT(toDisplaySimulation()));
connect(RemoveScaleButton, SIGNAL(clicked()), this, SLOT(toDisplaySimulation()));
connect(LinearScalesCheck, SIGNAL(toggled(bool)), this, SLOT(toDisplaySimulation()));
connect(BasePointGrp, SIGNAL(toggled(bool)), this, SLOT(toDisplaySimulation()));
connect(BasePoint_XSpin, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
connect(BasePoint_YSpin, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
connect(BasePoint_ZSpin, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
2012-08-09 16:03:55 +06:00
//To Connect preview check box
connectPreviewControl();
/***************************************************************/
2012-08-09 16:03:55 +06:00
ClickOnRadio();
2004-12-01 15:48:31 +05:00
}
//=================================================================================
// function : ~SMESHGUI_ExtrusionDlg()
// purpose : destructor
2004-12-01 15:48:31 +05:00
//=================================================================================
SMESHGUI_ExtrusionDlg::~SMESHGUI_ExtrusionDlg()
{
}
//=================================================================================
// function : Init()
// purpose : initialization
2004-12-01 15:48:31 +05:00
//=================================================================================
void SMESHGUI_ExtrusionDlg::Init (bool ResetControls)
2004-12-01 15:48:31 +05:00
{
if (ResetControls)
{
SpinBox_NbSteps->setValue(1);
2012-08-09 16:03:55 +06:00
SpinBox_VDist->setValue(10);
SpinBox_Dx->SetValue(0);
SpinBox_Dy->SetValue(0);
SpinBox_Dz->SetValue(0);
2009-02-17 10:27:49 +05:00
SpinBox_Vx->SetValue(0);
SpinBox_Vy->SetValue(0);
SpinBox_Vz->SetValue(0);
2012-08-09 16:03:55 +06:00
myPreviewCheckBox->setChecked(false);
onDisplaySimulation(false);
}
SelectorWdg->Clear();
CheckIsEnable();
}
//=================================================================================
// function : CheckIsEnable()
// purpose : Check whether the Ok and Apply buttons should be enabled or not
//=================================================================================
void SMESHGUI_ExtrusionDlg::CheckIsEnable()
2012-08-09 16:03:55 +06:00
{
bool anIsEnable = SelectorWdg->IsAnythingSelected() && isValuesValid();
buttonOk->setEnabled(anIsEnable);
buttonApply->setEnabled(anIsEnable);
}
2004-12-01 15:48:31 +05:00
2012-08-09 16:03:55 +06:00
//=================================================================================
// function : isValuesValid()
// purpose : Return true in case if values entered into dialog are valid
//=================================================================================
bool SMESHGUI_ExtrusionDlg::isValuesValid()
{
2012-08-09 16:03:55 +06:00
double aX, aY, aZ, aModule = 0;
if ( ExtrMethod_RBut0->isChecked() )
{
2012-08-09 16:03:55 +06:00
aX = SpinBox_Dx->GetValue();
aY = SpinBox_Dy->GetValue();
aZ = SpinBox_Dz->GetValue();
aModule = sqrt(aX*aX + aY*aY + aZ*aZ);
}
else if ( ExtrMethod_RBut1->isChecked() )
{
2012-08-09 16:03:55 +06:00
aX = SpinBox_Vx->GetValue();
aY = SpinBox_Vy->GetValue();
aZ = SpinBox_Vz->GetValue();
aModule = sqrt(aX*aX + aY*aY + aZ*aZ);
double aVDist = (double)SpinBox_VDist->value();
aModule *= aVDist;
2012-08-09 16:03:55 +06:00
}
else if ( ExtrMethod_RBut2->isChecked() )
{
aModule = Abs((double)SpinBox_VDist->value());
}
2012-08-09 16:03:55 +06:00
return aModule > 1.0E-38;
}
//=======================================================================
//function : getScaleParams
//purpose : return 3 scaling parameters
//=======================================================================
bool SMESHGUI_ExtrusionDlg::getScaleParams( SMESH::double_array*& scales,
SMESH::double_array*& basePoint )
{
scales = new SMESH::double_array;
scales->length( myScalesList.count() );
for ( int i = 0; i < myScalesList.count(); ++i )
(*scales)[i] = myScalesList[i];
basePoint = new SMESH::double_array;
if ( BasePointGrp->isChecked() )
{
basePoint->length( 3 );
(*basePoint)[0] = BasePoint_XSpin->GetValue();
(*basePoint)[1] = BasePoint_YSpin->GetValue();
(*basePoint)[2] = BasePoint_ZSpin->GetValue();
}
return ( scales->length() > 0 && LinearScalesCheck->isChecked() );
}
2004-12-01 15:48:31 +05:00
//=================================================================================
// function : ClickOnRadio()
2004-12-01 15:48:31 +05:00
// purpose : Radio button management
//=================================================================================
2012-08-09 16:03:55 +06:00
void SMESHGUI_ExtrusionDlg::ClickOnRadio()
{
if ( ExtrMethod_RBut0->isChecked() )
{
2012-08-09 16:03:55 +06:00
TextLabelDistance->show();
TextLabelDx->show();
SpinBox_Dx->show();
TextLabelDy->show();
SpinBox_Dy->show();
TextLabelDz->show();
SpinBox_Dz->show();
TextLabelVector->hide();
TextLabelVx->hide();
SpinBox_Vx->hide();
TextLabelVy->hide();
SpinBox_Vy->hide();
TextLabelVz->hide();
SpinBox_Vz->hide();
TextLabelDist->hide();
SpinBox_VDist->hide();
SelectVectorButton->hide();
ByAverageNormalCheck->hide();
UseInputElemsOnlyCheck->hide();
SelectorWdg->SetEnabled( true, SMESH::ALL );
}
else if ( ExtrMethod_RBut1->isChecked() )
{
2012-08-09 16:03:55 +06:00
TextLabelDistance->hide();
TextLabelDx->hide();
SpinBox_Dx->hide();
TextLabelDy->hide();
SpinBox_Dy->hide();
TextLabelDz->hide();
SpinBox_Dz->hide();
TextLabelVector->show();
TextLabelVx->show();
SpinBox_Vx->show();
TextLabelVy->show();
SpinBox_Vy->show();
TextLabelVz->show();
SpinBox_Vz->show();
TextLabelDist->show();
SpinBox_VDist->show();
SelectVectorButton->show();
ByAverageNormalCheck->hide();
UseInputElemsOnlyCheck->hide();
SelectorWdg->SetEnabled( true, SMESH::ALL );
2012-08-09 16:03:55 +06:00
}
else if ( ExtrMethod_RBut2->isChecked() )
{
TextLabelDistance->hide();
TextLabelDx->hide();
SpinBox_Dx->hide();
TextLabelDy->hide();
SpinBox_Dy->hide();
TextLabelDz->hide();
SpinBox_Dz->hide();
TextLabelVector->hide();
TextLabelVx->hide();
SpinBox_Vx->hide();
TextLabelVy->hide();
SpinBox_Vy->hide();
TextLabelVz->hide();
SpinBox_Vz->hide();
TextLabelDist->show();
SpinBox_VDist->show();
SelectVectorButton->hide();
ByAverageNormalCheck->show();
UseInputElemsOnlyCheck->show();
SelectorWdg->SetEnabled( false, SMESH::NODE );
SelectorWdg->SetEnabled( false, SMESH::EDGE );
}
CheckIsEnable();
2012-08-09 16:03:55 +06:00
onDisplaySimulation(true);
// AdjustSize
qApp->processEvents();
updateGeometry();
resize( minimumSizeHint() );
}
2004-12-01 15:48:31 +05:00
//=================================================================================
// function : ClickOnApply()
// purpose : Called when user presses <Apply> button
2004-12-01 15:48:31 +05:00
//=================================================================================
bool SMESHGUI_ExtrusionDlg::ClickOnApply()
2004-12-01 15:48:31 +05:00
{
if (mySMESHGUI->isActiveStudyLocked())
return false;
2009-02-17 10:27:49 +05:00
if (!isValid())
return false;
if ( SelectorWdg->IsAnythingSelected() )
{
SMESH::DirStruct aVector;
2012-08-09 16:03:55 +06:00
getExtrusionVector(aVector);
2012-08-09 16:03:55 +06:00
QStringList aParameters;
if ( ExtrMethod_RBut0->isChecked() )
{
2012-08-09 16:03:55 +06:00
aParameters << SpinBox_Dx->text();
aParameters << SpinBox_Dy->text();
aParameters << SpinBox_Dz->text();
}
else if ( ExtrMethod_RBut1->isChecked() )
{
2012-08-09 16:03:55 +06:00
// only 3 coords in a python dump command :(
// aParameters << SpinBox_Vx->text();
// aParameters << SpinBox_Vy->text();
// aParameters << SpinBox_Vz->text();
// aParameters << SpinBox_VDist->text();
}
else if ( ExtrMethod_RBut2->isChecked() )
{
aParameters << SpinBox_VDist->text();
}
long aNbSteps = (long)SpinBox_NbSteps->value();
2009-02-17 10:27:49 +05:00
aParameters << SpinBox_NbSteps->text();
SMESH::double_array_var scales = new SMESH::double_array;
scales->length( myScalesList.count() );
for (int i = 0; i < myScalesList.count(); i++)
{
scales[i] = myScalesList[i];
aParameters << ScalesList->item(i)->text();
}
bool meshHadNewTypeBefore = true;
int maxSelType = 0;
const bool makeGroups = ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() );
try
{
2009-02-17 10:27:49 +05:00
SUIT_OverrideCursor aWaitCursor;
SMESH::SMESH_Mesh_var mesh = SelectorWdg->GetMesh();
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 meshEditor = mesh->GetMeshEditor();
SMESH::ListOfGroups_var groups;
2012-08-09 16:03:55 +06:00
mesh->SetParameters( aParameters.join(":").toLatin1().constData() );
if ( ExtrMethod_RBut2->isVisible() &&
ExtrMethod_RBut2->isChecked() ) // Extrusion by normal
{
double stepSize = (double) SpinBox_VDist->value();
long nbSteps = (long) SpinBox_NbSteps->value();
bool useInputElemsOnly = UseInputElemsOnlyCheck->isChecked();
bool byAverageNormal = ByAverageNormalCheck->isChecked();
int dim = (maxSelType == SMESH::FACE) ? 2 : 1;
groups = meshEditor->ExtrusionByNormal( faces, stepSize, nbSteps, useInputElemsOnly,
byAverageNormal, makeGroups, dim );
2009-02-17 10:27:49 +05:00
}
else
{
SMESH::double_array_var scales, basePoint;
bool linVariation = getScaleParams( scales.out(), basePoint.out() );
groups = meshEditor->ExtrusionSweepObjects( nodes, edges, faces,
aVector, aNbSteps,
scales, linVariation, basePoint,
makeGroups );
2009-02-17 10:27:49 +05:00
}
} catch (...) {
2004-12-01 15:48:31 +05:00
}
SMESH_Actor* actor = SelectorWdg->GetActor();
if ( actor && !meshHadNewTypeBefore )
{
unsigned int aMode = actor->GetEntityMode();
switch ( maxSelType ) {
case SMESH::NODE: // extrude node -> edges
actor->SetRepresentation(SMESH_Actor::eEdge);
actor->SetEntityMode( aMode |= SMESH_Actor::eEdges ); break;
case SMESH::EDGE: // edge -> faces
actor->SetRepresentation(SMESH_Actor::eSurface);
actor->SetEntityMode( aMode |= SMESH_Actor::eFaces ); break;
case SMESH::FACE: // faces -> volumes
actor->SetRepresentation(SMESH_Actor::eSurface);
actor->SetEntityMode( aMode |= SMESH_Actor::eVolumes ); break;
}
}
if ( actor )
SMESH::Update( actor->getIO(), actor->GetVisibility() );
if ( makeGroups )
mySMESHGUI->updateObjBrowser(true); // new groups may appear
Init(false);
2012-08-09 16:03:55 +06:00
mySelectionMgr->clearSelected();
SelectorWdg->Clear();
2012-08-09 16:03:55 +06:00
SMESHGUI::Modified();
}
return true;
2004-12-01 15:48:31 +05:00
}
//=================================================================================
// function : ClickOnOk()
// purpose : Called when user presses <OK> button
2004-12-01 15:48:31 +05:00
//=================================================================================
void SMESHGUI_ExtrusionDlg::ClickOnOk()
{
if (ClickOnApply())
2013-02-28 21:07:35 +06:00
reject();
2004-12-01 15:48:31 +05:00
}
//=================================================================================
2013-02-28 21:07:35 +06:00
// function : reject()
// purpose : Called when dialog box is closed
2004-12-01 15:48:31 +05:00
//=================================================================================
2013-02-28 21:07:35 +06:00
void SMESHGUI_ExtrusionDlg::reject()
2004-12-01 15:48:31 +05:00
{
2013-02-28 21:07:35 +06:00
disconnect(mySelectionMgr, 0, this, 0);
mySelectionMgr->clearFilters();
//mySelectionMgr->clearSelected();
if (SMESH::GetCurrentVtkView()) {
SMESH::RemoveFilters(); // PAL6938 -- clean all mesh entity filters
SMESH::SetPointRepresentation(false);
SMESH::SetPickable();
}
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
aViewWindow->SetSelectionMode(ActorSelection);
mySMESHGUI->ResetState();
QDialog::reject();
2004-12-01 15:48:31 +05:00
}
//=================================================================================
// function : onOpenView()
// purpose :
//=================================================================================
void SMESHGUI_ExtrusionDlg::onOpenView()
{
if ( mySelector ) {
SMESH::SetPointRepresentation(false);
}
else {
mySelector = SMESH::GetViewWindow( mySMESHGUI )->GetSelector();
ActivateThisDialog();
}
}
//=================================================================================
// function : onCloseView()
// purpose :
//=================================================================================
void SMESHGUI_ExtrusionDlg::onCloseView()
{
DeactivateActiveDialog();
mySelector = 0;
}
//=================================================================================
// function : ClickOnHelp()
// purpose :
//=================================================================================
void SMESHGUI_ExtrusionDlg::ClickOnHelp()
{
LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
if (app)
app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
else {
2009-02-17 10:27:49 +05:00
QString platform;
#ifdef WIN32
2009-02-17 10:27:49 +05:00
platform = "winapplication";
#else
2009-02-17 10:27:49 +05:00
platform = "application";
#endif
2009-02-17 10:27:49 +05:00
SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
2012-08-09 16:03:55 +06:00
tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
arg(app->resourceMgr()->stringValue("ExternalBrowser",
platform)).
arg(myHelpFileName));
}
}
2004-12-01 15:48:31 +05:00
//=================================================================================
// function : SelectionIntoArgument()
// purpose : Called when selection has changed or other case
2004-12-01 15:48:31 +05:00
//=================================================================================
void SMESHGUI_ExtrusionDlg::SelectionIntoArgument()
{
// return if dialog box is inactive
if (!GroupButtons->isEnabled())
return;
SALOME_ListIO aList;
mySelectionMgr->selectedObjects(aList);
if ( aList.IsEmpty() || aList.Extent() > 1 )
return;
if ( SelectVectorButton->isChecked() )
{
Handle(SALOME_InteractiveObject) IO = aList.First();
2009-02-17 10:27:49 +05:00
TColStd_IndexedMapOfInteger aMapIndex;
mySelector->GetIndex(IO,aMapIndex);
if ( aMapIndex.Extent() != 1 )
return;
SMESH_Actor* anActor = SMESH::FindActorByEntry( IO->getEntry() );
SMDS_Mesh* aMesh = anActor ? anActor->GetObject()->GetMesh() : 0;
if ( !aMesh )
2009-02-17 10:27:49 +05:00
return;
const SMDS_MeshFace* face =
dynamic_cast<const SMDS_MeshFace*>(aMesh->FindElement(aMapIndex(1)));
2009-02-17 10:27:49 +05:00
if (!face)
return;
2009-02-17 10:27:49 +05:00
gp_XYZ aNormale = SMESH::getNormale(face);
SpinBox_Vx->SetValue(aNormale.X());
SpinBox_Vy->SetValue(aNormale.Y());
SpinBox_Vz->SetValue(aNormale.Z());
}
else if ( SelectBasePointButton->isChecked() )
{
if (!BasePointGrp->isChecked())
return;
// try to get shape from selection
Handle(SALOME_InteractiveObject) IO = aList.First();
// check if geom vertex is selected
GEOM::GEOM_Object_var aGeomObj = SMESH::IObjectToInterface<GEOM::GEOM_Object>(IO);
TopoDS_Vertex aVertex;
if (!aGeomObj->_is_nil()) {
if (aGeomObj->IsShape() && GEOMBase::GetShape(aGeomObj, aVertex) && !aVertex.IsNull()) {
gp_Pnt aPnt = BRep_Tool::Pnt(aVertex);
BasePoint_XSpin->SetValue(aPnt.X());
BasePoint_YSpin->SetValue(aPnt.Y());
BasePoint_ZSpin->SetValue(aPnt.Z());
}
}
if ( aVertex.IsNull() )
{
// check if smesh node is selected
SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO(IO);
if (aMesh->_is_nil())
return;
QString aString;
int aNbUnits = SMESH::GetNameOfSelectedNodes(mySelector, IO, aString);
// return if more than one node is selected
if (aNbUnits != 1)
return;
SMESH_Actor* aMeshActor = SMESH::FindActorByObject(aMesh);
if (!aMeshActor)
return;
SMDS_Mesh* mesh = aMeshActor->GetObject()->GetMesh();
if (!mesh)
return;
const SMDS_MeshNode* n = mesh->FindNode(aString.toLong());
if (!n)
return;
BasePoint_XSpin->SetValue(n->X());
BasePoint_YSpin->SetValue(n->Y());
BasePoint_ZSpin->SetValue(n->Z());
}
}
2012-08-09 16:03:55 +06:00
onDisplaySimulation(true);
CheckIsEnable();
2004-12-01 15:48:31 +05:00
}
//=================================================================================
// function : SetEditCurrentArgument()
// purpose :
//=================================================================================
void SMESHGUI_ExtrusionDlg::SetEditCurrentArgument()
{
QPushButton* send = (QPushButton*)sender();
disconnect(mySelectionMgr, 0, this, 0);
mySelectionMgr->clearSelected();
mySelectionMgr->clearFilters();
if (send == SelectVectorButton)
{
2009-02-17 10:27:49 +05:00
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
aViewWindow->SetSelectionMode(FaceSelection);
}
else if ( send == SelectBasePointButton )
{
SMESH::SetPointRepresentation(true);
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
aViewWindow->SetSelectionMode(NodeSelection);
SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter(SMESH::IDSOURCE);
SMESH_NumberFilter* aVertexFilter = new SMESH_NumberFilter ("GEOM", TopAbs_VERTEX,
1, TopAbs_VERTEX);
QList<SUIT_SelectionFilter*> aListOfFilters;
aListOfFilters << aMeshOrSubMeshFilter << aVertexFilter;
mySelectionMgr->installFilter(new SMESH_LogicalFilter
(aListOfFilters, SMESH_LogicalFilter::LO_OR, true));
}
2009-02-17 10:27:49 +05:00
connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
SelectionIntoArgument();
2004-12-01 15:48:31 +05:00
}
//=================================================================================
// function : DeactivateActiveDialog()
// purpose : Deactivates this dialog
2004-12-01 15:48:31 +05:00
//=================================================================================
void SMESHGUI_ExtrusionDlg::DeactivateActiveDialog()
{
if (GroupButtons->isEnabled())
{
GroupArguments->setEnabled(false);
GroupButtons->setEnabled(false);
SelectorWdg->setEnabled(false);
mySMESHGUI->ResetState();
mySMESHGUI->SetActiveDialogBox(0);
2004-12-01 15:48:31 +05:00
}
}
//=================================================================================
// function : ActivateThisDialog()
// purpose : Activates this dialog
2004-12-01 15:48:31 +05:00
//=================================================================================
void SMESHGUI_ExtrusionDlg::ActivateThisDialog()
{
// Emit a signal to deactivate the active dialog
mySMESHGUI->EmitSignalDeactivateDialog();
GroupArguments->setEnabled(true);
GroupButtons->setEnabled(true);
SelectorWdg->setEnabled(true);
mySMESHGUI->SetActiveDialogBox(this);
2004-12-01 15:48:31 +05:00
}
//=================================================================================
// function : enterEvent()
// purpose :
2004-12-01 15:48:31 +05:00
//=================================================================================
void SMESHGUI_ExtrusionDlg::enterEvent (QEvent*)
2004-12-01 15:48:31 +05:00
{
if ( !GroupButtons->isEnabled() ) {
SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI );
if ( aViewWindow && !mySelector) {
mySelector = aViewWindow->GetSelector();
}
ActivateThisDialog();
}
2004-12-01 15:48:31 +05:00
}
//=================================================================================
// function : keyPressEvent()
// purpose :
//=================================================================================
void SMESHGUI_ExtrusionDlg::keyPressEvent( QKeyEvent* e )
{
QDialog::keyPressEvent( e );
if ( e->isAccepted() )
return;
2009-02-17 10:27:49 +05:00
if ( e->key() == Qt::Key_F1 ) {
e->accept();
ClickOnHelp();
}
}
//=================================================================================
// function : isValid
// purpose :
//=================================================================================
bool SMESHGUI_ExtrusionDlg::isValid()
{
QString msg;
bool ok = true;
if ( ExtrMethod_RBut0->isChecked() ) {
2012-08-09 16:03:55 +06:00
ok = SpinBox_Dx->isValid( msg, true ) && ok;
ok = SpinBox_Dy->isValid( msg, true ) && ok;
ok = SpinBox_Dz->isValid( msg, true ) && ok;
} else if ( ExtrMethod_RBut1->isChecked() ) {
2012-08-09 16:03:55 +06:00
ok = SpinBox_Vx->isValid( msg, true ) && ok;
ok = SpinBox_Vy->isValid( msg, true ) && ok;
ok = SpinBox_Vz->isValid( msg, true ) && ok;
ok = SpinBox_VDist->isValid( msg, true ) && ok;
}
2009-02-17 10:27:49 +05:00
ok = SpinBox_NbSteps->isValid( msg, true ) && ok;
if ( BasePointGrp->isChecked()) {
ok = BasePoint_XSpin->isValid( msg, true ) && ok;
ok = BasePoint_YSpin->isValid( msg, true ) && ok;
ok = BasePoint_ZSpin->isValid( msg, true ) && ok;
}
2009-02-17 10:27:49 +05:00
if( !ok ) {
QString str( tr( "SMESH_INCORRECT_INPUT" ) );
if ( !msg.isEmpty() )
str += "\n" + msg;
SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str );
return false;
}
return true;
}
2012-08-09 16:03:55 +06:00
//=================================================================================
// function : onDisplaySimulation
// purpose : Show/Hide preview
//=================================================================================
void SMESHGUI_ExtrusionDlg::onDisplaySimulation( bool toDisplayPreview )
{
2012-08-09 16:03:55 +06:00
if (myPreviewCheckBox->isChecked() && toDisplayPreview) {
if ( SelectorWdg->IsAnythingSelected() && isValid() && isValuesValid())
{
2012-08-09 16:03:55 +06:00
//Get input vector
SMESH::DirStruct aVector;
getExtrusionVector(aVector);
//Get Number of the steps
2012-08-09 16:03:55 +06:00
long aNbSteps = (long)SpinBox_NbSteps->value();
try
{
2012-08-09 16:03:55 +06:00
SUIT_OverrideCursor aWaitCursor;
SMESH::SMESH_Mesh_var mesh = SelectorWdg->GetMesh();
SMESH::SMESH_MeshEditor_var meshEditor = mesh->GetMeshEditPreviewer();
SMESH::ListOfGroups_var groups;
SMESH::ListOfIDSources_var nodes = new SMESH::ListOfIDSources();
SMESH::ListOfIDSources_var edges = new SMESH::ListOfIDSources();
SMESH::ListOfIDSources_var faces = new SMESH::ListOfIDSources();
const int maxSelType = SelectorWdg->GetSelected( nodes, edges, faces );
const bool makeGroups = false;
if ( ExtrMethod_RBut2->isVisible() &&
ExtrMethod_RBut2->isChecked() ) // Extrusion by normal
{
double stepSize = (double) SpinBox_VDist->value();
long nbSteps = (long) SpinBox_NbSteps->value();
bool useInputElemsOnly = UseInputElemsOnlyCheck->isChecked();
bool byAverageNormal = ByAverageNormalCheck->isChecked();
int dim = (maxSelType == SMESH::FACE) ? 2 : 1;
groups = meshEditor->ExtrusionByNormal( faces, stepSize, nbSteps, useInputElemsOnly,
byAverageNormal, makeGroups, dim );
2012-08-09 16:03:55 +06:00
}
else
{
SMESH::double_array_var scales, basePoint;
bool linVariation = getScaleParams( scales.out(), basePoint.out() );
groups = meshEditor->ExtrusionSweepObjects( nodes, edges, faces,
aVector, aNbSteps,
scales, linVariation, basePoint,
makeGroups );
}
SMESH::MeshPreviewStruct_var aMeshPreviewStruct = meshEditor->GetPreviewData();
2012-08-09 16:03:55 +06:00
mySimulation->SetData(aMeshPreviewStruct._retn());
2012-08-09 16:03:55 +06:00
} catch (...) {
hidePreview();
}
} else {
hidePreview();
}
} else {
hidePreview();
}
}
//=================================================================================
// function : getExtrusionVector()
// purpose : get direction of the extrusion
//=================================================================================
void SMESHGUI_ExtrusionDlg::getExtrusionVector(SMESH::DirStruct& aVector)
{
if ( ExtrMethod_RBut0->isChecked() )
{
2012-08-09 16:03:55 +06:00
aVector.PS.x = SpinBox_Dx->GetValue();
aVector.PS.y = SpinBox_Dy->GetValue();
aVector.PS.z = SpinBox_Dz->GetValue();
}
else if ( ExtrMethod_RBut1->isChecked() )
{
2012-08-09 16:03:55 +06:00
gp_XYZ aNormale(SpinBox_Vx->GetValue(),
SpinBox_Vy->GetValue(),
SpinBox_Vz->GetValue());
aNormale /= aNormale.Modulus();
double aVDist = (double)SpinBox_VDist->value();
2012-08-09 16:03:55 +06:00
aVector.PS.x = aNormale.X()*aVDist;
aVector.PS.y = aNormale.Y()*aVDist;
aVector.PS.z = aNormale.Z()*aVDist;
}
}
//=======================================================================
// function : OnScaleAdded()
// purpose : Called when user adds Scale to the list
//=======================================================================
void SMESHGUI_ExtrusionDlg::OnScaleAdded()
{
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());
}
//=======================================================================
// function : OnScaleRemoved()
// purpose : Called when user removes Scale(s) from the list
//=======================================================================
void SMESHGUI_ExtrusionDlg::OnScaleRemoved()
{
QList<QListWidgetItem*> aList = ScalesList->selectedItems();
QListWidgetItem* anItem;
int row = 0;
foreach(anItem, aList) {
row = ScalesList->row(anItem);
myScalesList.removeAt(row);
delete anItem;
}
ScalesList->setCurrentRow( row, QItemSelectionModel::Select );
}