// Copyright (C) 2007-2012 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 // // 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. // // 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 // // File : SMESHGUI_PropertiesDlg.cxx // Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com) #include "SMESHGUI_PropertiesDlg.h" #include "SMESH_Actor.h" #include #include #include #include #include #include #include #include #include #include #include const int MARGIN = 9; const int SPACING = 6; /*! \class SMESHGUI_PropertiesDlg \brief Dialog box to set-up mesh presentation properties: colors, sizes of elements, width of lines etc */ /* \brief Constructor \param customMarkers custom node markers \param parent parent widget */ SMESHGUI_PropertiesDlg::SMESHGUI_PropertiesDlg( const VTK::MarkerMap& customMarkers, QWidget* parent ) : SMESHGUI_Dialog( parent, true, true, Standard ) { // set title setWindowTitle( tr( "TITLE" ) ); // create widgets QHBoxLayout* hl; int widthLab1 = 0, widthLab2 = 0; // -- node controls myNodeGrp = new QGroupBox( tr( "NODES" ), mainFrame() ); QLabel* nodeColorLab = new QLabel( tr( "COLOR" ), myNodeGrp ); myNodeColor = new QtxColorButton( myNodeGrp ); myNodeMarker = new VTKViewer_MarkerWidget( myNodeGrp ); hl = new QHBoxLayout( myNodeGrp ); hl->setMargin( MARGIN ); hl->setSpacing( SPACING ); hl->addWidget( nodeColorLab ); hl->addWidget( myNodeColor ); hl->addWidget( myNodeMarker ); widthLab1 = qMax( widthLab1, nodeColorLab->minimumSizeHint().width() ); widthLab2 = qMax( widthLab2, myNodeMarker->typeLabel()->minimumSizeHint().width() ); // -- edge controls myEdgeGrp = new QGroupBox( tr( "EDGES" ), mainFrame() ); QLabel* edgeColorLab = new QLabel( tr( "COLOR" ), myEdgeGrp ); myEdgeColor = new QtxColorButton( myEdgeGrp ); QLabel* edgeWidthLab = new QLabel( tr( "WIDTH" ), myEdgeGrp ); myEdgeWidth = new QtxIntSpinBox( myEdgeGrp ); hl = new QHBoxLayout( myEdgeGrp ); hl->setMargin( MARGIN ); hl->setSpacing( SPACING ); hl->addWidget( edgeColorLab ); hl->addWidget( myEdgeColor ); hl->addWidget( edgeWidthLab ); hl->addWidget( myEdgeWidth ); widthLab1 = qMax( widthLab1, edgeColorLab->minimumSizeHint().width() ); widthLab2 = qMax( widthLab2, edgeWidthLab->minimumSizeHint().width() ); // -- face controls myFaceGrp = new QGroupBox( tr( "FACES" ), mainFrame() ); QLabel* faceColorLab = new QLabel( tr( "FACE_FRONT" ), myFaceGrp ); myFaceColor = new QtxBiColorTool( myFaceGrp ); myFaceColor->label()->setText( tr( "FACE_BACK" ) ); hl = new QHBoxLayout( myFaceGrp ); hl->setMargin( MARGIN ); hl->setSpacing( SPACING ); hl->addWidget( faceColorLab ); hl->addWidget( myFaceColor ); widthLab1 = qMax( widthLab1, faceColorLab->minimumSizeHint().width() ); widthLab2 = qMax( widthLab2, myFaceColor->label()->minimumSizeHint().width() ); // -- volumes myVolumeGrp = new QGroupBox( tr( "VOLUMES" ), mainFrame() ); QLabel* volumeColorLab = new QLabel( tr( "VOLUME_NORMAL" ), myVolumeGrp ); myVolumeColor = new QtxBiColorTool( myVolumeGrp ); myVolumeColor->label()->setText( tr( "VOLUME_REVERSED" ) ); hl = new QHBoxLayout( myVolumeGrp ); hl->setMargin( MARGIN ); hl->setSpacing( SPACING ); hl->addWidget( volumeColorLab ); hl->addWidget( myVolumeColor ); widthLab1 = qMax( widthLab1, volumeColorLab->minimumSizeHint().width() ); widthLab2 = qMax( widthLab2, myVolumeColor->label()->minimumSizeHint().width() ); // -- outline controls myOutlineGrp = new QGroupBox( tr( "OUTLINES" ), mainFrame() ); QLabel* outlineColorLab = new QLabel( tr( "COLOR" ), myOutlineGrp ); myOutlineColor = new QtxColorButton( myOutlineGrp ); QLabel* outlineWidthLab = new QLabel( tr( "WIDTH" ), myOutlineGrp ); myOutlineWidth = new QtxIntSpinBox( myOutlineGrp ); hl = new QHBoxLayout( myOutlineGrp ); hl->setMargin( MARGIN ); hl->setSpacing( SPACING ); hl->addWidget( outlineColorLab ); hl->addWidget( myOutlineColor ); hl->addWidget( outlineWidthLab ); hl->addWidget( myOutlineWidth ); widthLab1 = qMax( widthLab1, outlineColorLab->minimumSizeHint().width() ); widthLab2 = qMax( widthLab2, outlineWidthLab->minimumSizeHint().width() ); // -- 0d element controls myElem0dGrp = new QGroupBox( tr( "0D_ELEMENTS" ), mainFrame() ); QLabel* elem0dColorLab = new QLabel( tr( "COLOR" ), myElem0dGrp ); myElem0dColor = new QtxColorButton( myElem0dGrp ); QLabel* elem0dSizeLab = new QLabel( tr( "SIZE" ), myElem0dGrp ); myElem0dSize = new QtxIntSpinBox( myElem0dGrp ); hl = new QHBoxLayout( myElem0dGrp ); hl->setMargin( MARGIN ); hl->setSpacing( SPACING ); hl->addWidget( elem0dColorLab ); hl->addWidget( myElem0dColor ); hl->addWidget( elem0dSizeLab ); hl->addWidget( myElem0dSize ); widthLab1 = qMax( widthLab1, elem0dColorLab->minimumSizeHint().width() ); widthLab2 = qMax( widthLab2, elem0dSizeLab->minimumSizeHint().width() ); // -- ball controls myBallGrp = new QGroupBox( tr( "BALLS" ), mainFrame() ); QLabel* ballColorLab = new QLabel( tr( "COLOR" ), myBallGrp ); myBallColor = new QtxColorButton( myBallGrp ); QLabel* ballSizeLab = new QLabel( tr( "SIZE" ), myBallGrp ); myBallSize = new QtxIntSpinBox( myBallGrp ); hl = new QHBoxLayout( myBallGrp ); hl->setMargin( MARGIN ); hl->setSpacing( SPACING ); hl->addWidget( ballColorLab ); hl->addWidget( myBallColor ); hl->addWidget( ballSizeLab ); hl->addWidget( myBallSize ); widthLab1 = qMax( widthLab1, ballColorLab->minimumSizeHint().width() ); widthLab2 = qMax( widthLab2, ballSizeLab->minimumSizeHint().width() ); // -- orientation vector controls myOrientationGrp = new QGroupBox( tr( "ORIENTATIONS" ), mainFrame() ); QLabel* orientationColorLab = new QLabel( tr( "COLOR" ), myOrientationGrp ); myOrientationColor = new QtxColorButton( myOrientationGrp ); QLabel* orientationScaleLab = new QLabel( tr( "ORIENTATION_SCALE" ), myOrientationGrp ); myOrientationSize = new QtxIntSpinBox( myOrientationGrp ); myOrientationSize->setSuffix( "% "); myOrientation3d = new QCheckBox( tr("ORIENTATION_3D"), myOrientationGrp ); hl = new QHBoxLayout( myOrientationGrp ); hl->setMargin( MARGIN ); hl->setSpacing( SPACING ); hl->addWidget( orientationColorLab ); hl->addWidget( myOrientationColor ); hl->addWidget( orientationScaleLab ); hl->addWidget( myOrientationSize ); hl->addWidget( myOrientation3d ); widthLab1 = qMax( widthLab1, orientationColorLab->minimumSizeHint().width() ); widthLab2 = qMax( widthLab2, orientationScaleLab->minimumSizeHint().width() ); // -- other controls myExtraGrp = new QFrame( mainFrame() ); QLabel* shrinkSizeLab = new QLabel( tr( "SHRINK" ), myExtraGrp ); myShrinkSize = new QtxIntSpinBox( myExtraGrp ); myShrinkSize->setSuffix( "% "); hl = new QHBoxLayout( myExtraGrp ); hl->setMargin( MARGIN ); hl->setSpacing( SPACING ); hl->addWidget( shrinkSizeLab ); hl->addWidget( myShrinkSize ); hl->addStretch(); widthLab1 = qMax( widthLab1, shrinkSizeLab->minimumSizeHint().width() ); // layout widgets QVBoxLayout* vl = new QVBoxLayout( mainFrame() ); vl->setMargin( 0 ); vl->setSpacing( SPACING ); vl->addWidget( myNodeGrp ); vl->addWidget( myEdgeGrp ); vl->addWidget( myFaceGrp ); vl->addWidget( myVolumeGrp ); vl->addWidget( myOutlineGrp ); vl->addWidget( myElem0dGrp ); vl->addWidget( myBallGrp ); vl->addWidget( myOrientationGrp ); vl->addWidget( myExtraGrp ); nodeColorLab->setMinimumWidth( widthLab1 ); edgeColorLab->setMinimumWidth( widthLab1 ); faceColorLab->setMinimumWidth( widthLab1 ); volumeColorLab->setMinimumWidth( widthLab1 ); outlineColorLab->setMinimumWidth( widthLab1 ); elem0dColorLab->setMinimumWidth( widthLab1 ); ballColorLab->setMinimumWidth( widthLab1 ); orientationColorLab->setMinimumWidth( widthLab1 ); shrinkSizeLab->setMinimumWidth( widthLab1 ); myNodeMarker->typeLabel()->setMinimumWidth( widthLab2 ); edgeWidthLab->setMinimumWidth( widthLab2 ); myFaceColor->label()->setMinimumWidth( widthLab2 ); myVolumeColor->label()->setMinimumWidth( widthLab2 ); outlineWidthLab->setMinimumWidth( widthLab2 ); elem0dSizeLab->setMinimumWidth( widthLab2 ); ballSizeLab->setMinimumWidth( widthLab2 ); orientationScaleLab->setMinimumWidth( widthLab2 ); myEdgeWidth->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); myOutlineWidth->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); myElem0dSize->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); myBallSize->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); myOrientationSize->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); myShrinkSize->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); // initialize widgets myNodeMarker->setCustomMarkers( customMarkers ); myElem0dSize->setRange( 1, 10 ); myBallSize->setRange( 1, 10 ); myEdgeWidth->setRange( 1, 5 ); myOutlineWidth->setRange( 1, 5 ); myShrinkSize->setRange( 20, 100 ); myOrientationSize->setRange( 5, 100 ); button( OK )->setText( tr( "SMESH_BUT_OK" ) ); connect( this, SIGNAL( dlgHelp() ), this, SLOT( onHelp() ) ); } /* \brief Destructor: clean-up resources if necessary */ SMESHGUI_PropertiesDlg::~SMESHGUI_PropertiesDlg() { } /*! \brief Set nodes color \param color nodes color */ void SMESHGUI_PropertiesDlg::setNodeColor( const QColor& color ) { myNodeColor->setColor( color ); } /*! \brief Get nodes color \return current nodes color */ QColor SMESHGUI_PropertiesDlg::nodeColor() const { return myNodeColor->color(); } /*! \brief Set standard nodes marker \param type standard nodes marker type \param scale standard nodes marker scale */ void SMESHGUI_PropertiesDlg::setNodeMarker( VTK::MarkerType type, VTK::MarkerScale scale ) { myNodeMarker->setMarker( type, scale ); } /*! \brief Set custom nodes marker \param id custom nodes marker id */ void SMESHGUI_PropertiesDlg::setNodeCustomMarker( int id ) { myNodeMarker->setCustomMarker( id ); } /*! \brief Get nodes marker type. For custom marker, VTK::MT_USER is returned and markerId() function then returns its identifier. \return currently selected nodes marker type */ VTK::MarkerType SMESHGUI_PropertiesDlg::nodeMarkerType() const { return myNodeMarker->markerType(); } /*! \brief Get nodes marker scale. For custom marker return value is undefined. \return currently selected nodes marker scale */ VTK::MarkerScale SMESHGUI_PropertiesDlg::nodeMarkerScale() const { return myNodeMarker->markerScale(); } /*! \brief Get custom nodes marker. For standard markers return value is VTK::MT_NONE. \return custom nodes marker id */ int SMESHGUI_PropertiesDlg::nodeMarkerId() const { return myNodeMarker->markerId(); } /*! \brief Set edges (wireframe) color \param color edges color */ void SMESHGUI_PropertiesDlg::setEdgeColor( const QColor& color ) { myEdgeColor->setColor( color ); } /*! \brief Get edges (wireframe) color \return current edges color */ QColor SMESHGUI_PropertiesDlg::edgeColor() const { return myEdgeColor->color(); } /*! \brief Set edges width \param width edges width */ void SMESHGUI_PropertiesDlg::setEdgeWidth( int width ) { myEdgeWidth->setValue( width ); } /*! \brief Get edges width \return current edges width */ int SMESHGUI_PropertiesDlg::edgeWidth() const { return myEdgeWidth->value(); } /*! \brief Set faces colors \param color front faces color \param delta back faces coloring delta */ void SMESHGUI_PropertiesDlg::setFaceColor( const QColor& color, int delta ) { myFaceColor->setMainColor( color ); myFaceColor->setDelta( delta ); } /*! \brief Get front faces color \return current front faces color */ QColor SMESHGUI_PropertiesDlg::faceColor() const { return myFaceColor->mainColor(); } /*! \brief Get back faces coloring delta \return current back faces coloring delta */ int SMESHGUI_PropertiesDlg::faceColorDelta() const { return myFaceColor->delta(); } /*! \brief Set volumes colors \param color normal volumes color \param delta reversed volumes coloring delta */ void SMESHGUI_PropertiesDlg::setVolumeColor( const QColor& color, int delta ) { myVolumeColor->setMainColor( color ); myVolumeColor->setDelta( delta ); } /*! \brief Get normal volumes color \return current normal volumes color */ QColor SMESHGUI_PropertiesDlg::volumeColor() const { return myVolumeColor->mainColor(); } /*! \brief Get reversed volumes coloring delta \return current reversed volumes coloring delta */ int SMESHGUI_PropertiesDlg::volumeColorDelta() const { return myVolumeColor->delta(); } /*! \brief Set outlines color \param color outlines color */ void SMESHGUI_PropertiesDlg::setOutlineColor( const QColor& color ) { myOutlineColor->setColor( color ); } /*! \brief Get outlines color \return current outlines color */ QColor SMESHGUI_PropertiesDlg::outlineColor() const { return myOutlineColor->color(); } /*! \brief Set outlines width \param width outlines width */ void SMESHGUI_PropertiesDlg::setOutlineWidth( int width ) { myOutlineWidth->setValue( width ); } /*! \brief Get outlines width \return current outlines width */ int SMESHGUI_PropertiesDlg::outlineWidth() const { return myOutlineWidth->value(); } /*! \brief Set 0D elements color \param color 0D elements color */ void SMESHGUI_PropertiesDlg::setElem0dColor( const QColor& color ) { myElem0dColor->setColor( color ); } /*! \brief Get 0D elements color \return current 0D elements color */ QColor SMESHGUI_PropertiesDlg::elem0dColor() const { return myElem0dColor->color(); } /*! \brief Set 0D elements size \param size 0D elements size */ void SMESHGUI_PropertiesDlg::setElem0dSize( int size ) { myElem0dSize->setValue( size ); } /*! \brief Get 0D elements size \return current 0D elements size */ int SMESHGUI_PropertiesDlg::elem0dSize() const { return myElem0dSize->value(); } /*! \brief Set discrete elements (balls) color \param color discrete elements (balls) color */ void SMESHGUI_PropertiesDlg::setBallColor( const QColor& color ) { myBallColor->setColor( color ); } /*! \brief Get discrete elements (balls) color \return current discrete elements (balls) color */ QColor SMESHGUI_PropertiesDlg::ballColor() const { return myBallColor->color(); } /*! \brief Set discrete elements (balls) size \param size discrete elements (balls) size */ void SMESHGUI_PropertiesDlg::setBallSize( int size ) { myBallSize->setValue( size ); } /*! \brief Get discrete elements (balls) size \return current discrete elements (balls) size */ int SMESHGUI_PropertiesDlg::ballSize() const { return myBallSize->value(); } /*! \brief Set orientation vectors color \param color orientation vectors color */ void SMESHGUI_PropertiesDlg::setOrientationColor( const QColor& color ) { myOrientationColor->setColor( color ); } /*! \brief Get orientation vectors color \return current orientation vectors color */ QColor SMESHGUI_PropertiesDlg::orientationColor() const { return myOrientationColor->color(); } /*! \brief Set orientation vectors scale (percent) \param scale orientation vectors scale */ void SMESHGUI_PropertiesDlg::setOrientationSize( int scale ) { myOrientationSize->setValue( scale ); } /*! \brief Get orientation vectors scale (percent) \return current orientation vectors scale */ int SMESHGUI_PropertiesDlg::orientationSize() const { return myOrientationSize->value(); } /*! \brief Set orientation vectors 3d flag \param on orientation vectors 3d flag value */ void SMESHGUI_PropertiesDlg::setOrientation3d( bool on ) { myOrientation3d->setChecked( on ); } /*! \brief Get orientation vectors 3d flag \return orientation vectors 3d flag value */ bool SMESHGUI_PropertiesDlg::orientation3d() const { return myOrientation3d->isChecked(); } /*! \brief Set shrink coefficient (percent) \param coef shrink coefficient */ void SMESHGUI_PropertiesDlg::setShrinkCoef( int coef ) { myShrinkSize->setValue( coef ); } /*! \brief Get shrink coefficient (percent) \return current shrink coefficient */ int SMESHGUI_PropertiesDlg::shrinkCoef() const { return myShrinkSize->value(); } /* \brief Get custom markers \return custom markers map */ VTK::MarkerMap SMESHGUI_PropertiesDlg::customMarkers() const { return myNodeMarker->customMarkers(); } /*! \brief Show / hide controls for specified entity type \param elements mesh element types (an or-ed combination of flags) \param nodes mesh nodes presence flag */ void SMESHGUI_PropertiesDlg::showControls( int elements, bool nodes ) { // node controls are supposed to be shown if at least any element type is present // or if there are only nodes myNodeGrp->setVisible( nodes || elements & SMESH_Actor::eAllEntity ); // edge/wireframe controls are needed for edges, faces and volumes myEdgeGrp->setVisible( elements & ( SMESH_Actor::eEdges | SMESH_Actor::eFaces | SMESH_Actor::eVolumes ) ); // face controls are shown only if there are faces myFaceGrp->setVisible( elements & SMESH_Actor::eFaces ); // volume controls are shown only if there are volumes myVolumeGrp->setVisible( elements & SMESH_Actor::eVolumes ); // 0d elements controls are shown only if there are 0d elements myElem0dGrp->setVisible( elements & SMESH_Actor::e0DElements ); // ball controls are shown only if there are balls myBallGrp->setVisible( elements & SMESH_Actor::eBallElem ); // outline controls are needed for faces and volumes myOutlineGrp->setVisible( elements & ( SMESH_Actor::eFaces | SMESH_Actor::eVolumes ) ); // orientation controls are needed for faces and volumes myOrientationGrp->setVisible( elements & ( SMESH_Actor::eFaces | SMESH_Actor::eVolumes ) ); // shrink factor is shown if there are edges and/or faces and/or volumes myExtraGrp->setVisible( elements & ( SMESH_Actor::eEdges | SMESH_Actor::eFaces | SMESH_Actor::eVolumes ) ); } /*! \brief Show online help on dialog box */ void SMESHGUI_PropertiesDlg::onHelp() { LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication()); app->onHelpContextModule( "SMESH", "colors_size_page.html" ); }