X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FStdMeshersGUI%2FStdMeshersGUI_NbSegmentsCreator.cxx;h=51369a80d63dc7e4bce895134b7c1a179cb43596;hp=f5468b118c6d13995b8fde295f45d8d9f496f788;hb=HEAD;hpb=79b1ac2b6df9117f16f11d444b1f165d477a1813 diff --git a/src/StdMeshersGUI/StdMeshersGUI_NbSegmentsCreator.cxx b/src/StdMeshersGUI/StdMeshersGUI_NbSegmentsCreator.cxx index f5468b118..116df94bc 100644 --- a/src/StdMeshersGUI/StdMeshersGUI_NbSegmentsCreator.cxx +++ b/src/StdMeshersGUI/StdMeshersGUI_NbSegmentsCreator.cxx @@ -1,12 +1,14 @@ -// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// Copyright (C) 2007-2024 CEA, EDF, 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. +// version 2.1 of the License, or (at your option) any later version. // -// This library is distributed in the hope that it will be useful +// 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. @@ -18,29 +20,45 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // +// File : StdMeshersGUI_NbSegmentsCreator.cxx +// Author : Open CASCADE S.A.S. +// SMESH includes +// #include "StdMeshersGUI_NbSegmentsCreator.h" +#ifndef DISABLE_PLOT2DVIEWER + #include "StdMeshersGUI_DistrPreview.h" +#endif #include "StdMeshersGUI_DistrTable.h" -#include "StdMeshersGUI_DistrPreview.h" +#include "StdMeshersGUI_PropagationHelperWdg.h" +#include "StdMeshersGUI_SubShapeSelectorWdg.h" +#include #include #include +#include +// IDL includes #include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) +// SALOME GUI includes #include - -#include +#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include +// Qt includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SPACING 6 +#define MARGIN 11 StdMeshersGUI_NbSegmentsCreator::StdMeshersGUI_NbSegmentsCreator() : StdMeshersGUI_StdHypothesisCreator( "NumberOfSegments" ), @@ -48,13 +66,15 @@ StdMeshersGUI_NbSegmentsCreator::StdMeshersGUI_NbSegmentsCreator() myDistr( 0 ), myScale( 0 ), myTable( 0 ), +#ifndef DISABLE_PLOT2DVIEWER myPreview( 0 ), +#endif myExpr( 0 ), + myConvBox( 0 ), myConv( 0 ), myLScale( 0 ), myLTable( 0 ), myLExpr( 0 ), - myLConv( 0 ), myInfo( 0 ), myGroupLayout( 0 ), myTableRow( 0 ), @@ -66,38 +86,41 @@ StdMeshersGUI_NbSegmentsCreator::~StdMeshersGUI_NbSegmentsCreator() { } -bool StdMeshersGUI_NbSegmentsCreator::checkParams() const +bool StdMeshersGUI_NbSegmentsCreator::checkParams( QString& msg ) const { + if( !SMESHGUI_GenericHypothesisCreator::checkParams( msg ) ) + return false; NbSegmentsHypothesisData data_old, data_new; readParamsFromHypo( data_old ); readParamsFromWidgets( data_new ); bool res = storeParamsToHypo( data_new ); - storeParamsToHypo( data_old ); + res = myNbSeg->isValid( msg, true ) && res; + res = myScale->isValid( msg, true ) && res; + if ( !res ) + storeParamsToHypo( data_old ); return res; } QFrame* StdMeshersGUI_NbSegmentsCreator::buildFrame() { - QFrame* fr = new QFrame( 0, "myframe" ); - QVBoxLayout* lay = new QVBoxLayout( fr, 5, 0 ); + QFrame* fr = new QFrame(); + fr->setMinimumWidth(460); + + QVBoxLayout* lay = new QVBoxLayout( fr ); + lay->setMargin( 0 ); + lay->setSpacing( SPACING ); - QGroupBox* GroupC1 = new QGroupBox( fr, "GroupC1" ); + QGroupBox* GroupC1 = new QGroupBox( tr( "SMESH_ARGUMENTS" ), fr ); lay->addWidget( GroupC1 ); StdMeshers::StdMeshers_NumberOfSegments_var h = StdMeshers::StdMeshers_NumberOfSegments::_narrow( hypothesis() ); - myPreview = new StdMeshersGUI_DistrPreview( GroupC1, h.in() ); - - GroupC1->setTitle( tr( "SMESH_ARGUMENTS" ) ); - GroupC1->setColumnLayout(0, Qt::Vertical ); - GroupC1->layout()->setSpacing( 0 ); - GroupC1->layout()->setMargin( 0 ); - myGroupLayout = new QGridLayout( GroupC1->layout() ); - myGroupLayout->setAlignment( Qt::AlignTop ); - myGroupLayout->setSpacing( 6 ); - myGroupLayout->setMargin( 11 ); - myGroupLayout->setColStretch( 0, 0 ); - myGroupLayout->setColStretch( 1, 1 ); + + myGroupLayout = new QGridLayout( GroupC1 ); + myGroupLayout->setSpacing( SPACING ); + myGroupLayout->setMargin( MARGIN ); + myGroupLayout->setColumnStretch( 0, 0 ); + myGroupLayout->setColumnStretch( 1, 1 ); int row = 0; // 0) name @@ -110,73 +133,118 @@ QFrame* StdMeshersGUI_NbSegmentsCreator::buildFrame() row++; } + // 1) number of segments myGroupLayout->addWidget( new QLabel( tr( "SMESH_NB_SEGMENTS_PARAM" ), GroupC1 ), row, 0 ); - myNbSeg = new QtxIntSpinBox( GroupC1 ); - myNbSeg->setMinValue( 1 ); - myNbSeg->setMaxValue( 9999 ); + myNbSeg = new SalomeApp_IntSpinBox( GroupC1 ); + myNbSeg->setMinimum( 1 ); + myNbSeg->setMaximum( 9999 ); myGroupLayout->addWidget( myNbSeg, row, 1 ); row++; + // 2) type of distribution myGroupLayout->addWidget( new QLabel( tr( "SMESH_DISTR_TYPE" ), GroupC1 ), row, 0 ); myDistr = new QtxComboBox( GroupC1 ); QStringList types; - types.append( QObject::tr( "SMESH_DISTR_REGULAR" ) ); - types.append( QObject::tr( "SMESH_DISTR_SCALE" ) ); - types.append( QObject::tr( "SMESH_DISTR_TAB" ) ); - types.append( QObject::tr( "SMESH_DISTR_EXPR" ) ); - myDistr->insertStringList( types ); + types.append( tr( "SMESH_DISTR_REGULAR" ) ); + types.append( tr( "SMESH_DISTR_SCALE" ) ); + types.append( tr( "SMESH_DISTR_TAB" ) ); + types.append( tr( "SMESH_DISTR_EXPR" ) ); + myDistr->addItems( types ); myGroupLayout->addWidget( myDistr, row, 1 ); row++; + // 3) scale myGroupLayout->addWidget( myLScale = new QLabel( tr( "SMESH_NB_SEGMENTS_SCALE_PARAM" ), GroupC1 ), row, 0 ); myScale = new SMESHGUI_SpinBox( GroupC1 ); - myScale->RangeStepAndValidator( 1E-5, 1E+5, 0.1, 6 ); + myScale->RangeStepAndValidator( 1E-5, 1E+5, 0.1, "parametric_precision" ); myGroupLayout->addWidget( myScale, row, 1 ); row++; - myInfo = new QLabel( tr( "SMESH_FUNC_DOMAIN" ), GroupC1 ); - myGroupLayout->addMultiCellWidget( myInfo, row, row, 0, 1 ); - row++; - // 4) table - myGroupLayout->addWidget( myLTable = new QLabel( tr( "SMESH_TAB_FUNC" ), GroupC1 ), row, 0 ); - myTable = new StdMeshersGUI_DistrTableFrame( GroupC1 ); - myGroupLayout->addWidget( myTable, row, 1 ); + // 4) Distribution definition + QGridLayout* myDistLayout = new QGridLayout(GroupC1); + myGroupLayout->addLayout( myDistLayout, row, 0, 1, 2 ); myGroupLayout->setRowStretch( row, 1 ); - myTableRow = row; - row++; + row ++; - // 5) expression - myGroupLayout->addWidget( myLExpr = new QLabel( tr( "SMESH_EXPR_FUNC" ), GroupC1 ), row, 0 ); + // a) expression + QHBoxLayout* myExprLayout = new QHBoxLayout(GroupC1); + myExprLayout->addWidget( myLExpr = new QLabel( "f(t)=", GroupC1 ), 0); myExpr = new QLineEdit( GroupC1 ); - myGroupLayout->addWidget( myExpr, row, 1 ); - row++; + myExprLayout->addWidget( myExpr,1); + myDistLayout->addLayout(myExprLayout,1 ,0); + myDistLayout->setRowStretch(2, 1); - // 6) conversion (radiogroup) - myGroupLayout->addWidget( myLConv = new QLabel( tr( "SMESH_CONV_MODE" ), GroupC1 ), row, 0 ); + // b) warning + myInfo = new QLabel( tr( "SMESH_FUNC_DOMAIN" ), GroupC1 ); + myDistLayout->addWidget( myInfo, 0, 0, 1, 2); + + // c) table + myTable = new StdMeshersGUI_DistrTableFrame( GroupC1 ); + myTable->setMinimumHeight(220); + myDistLayout->addWidget( myTable, 1, 0, 2, 1 ); + +#ifndef DISABLE_PLOT2DVIEWER + // d) preview + myPreview = new StdMeshersGUI_DistrPreview( GroupC1, h.in() ); + myDistLayout->addWidget( myPreview, 1, 1, 2, 1 ); +#endif + + // 5) conversion (radiogroup) + myConvBox = new QGroupBox( tr( "SMESH_CONV_MODE" ), GroupC1 ); myConv = new QButtonGroup( GroupC1 ); - myConv->setExclusive( true ); - myConv->setColumnLayout( 0, Qt::Vertical ); - QGridLayout* convLay = new QGridLayout( myConv->layout() ); - convLay->addWidget( new QRadioButton( tr( "SMESH_EXP_MODE" ), myConv ), 0, 0 ); - convLay->addWidget( myCutNeg = new QRadioButton( tr( "SMESH_CUT_NEG_MODE" ), myConv ), 1, 0 ); - myGroupLayout->addWidget( myConv, row, 1 ); - row++; - // 7) distribution preview - myGroupLayout->addMultiCellWidget( myPreview, row, row, 0, 1 ); - myGroupLayout->setRowStretch( row, 1 ); - myPreviewRow = row; + QHBoxLayout* convLay = new QHBoxLayout( myConvBox ); + convLay->setMargin( MARGIN ); + convLay->setSpacing( SPACING ); + + QRadioButton* rbExp = new QRadioButton( tr( "SMESH_EXP_MODE" ), myConvBox ); + QRadioButton* myCutNeg = new QRadioButton( tr( "SMESH_CUT_NEG_MODE" ), myConvBox ); + + convLay->addWidget( rbExp ); + convLay->addWidget( myCutNeg ); + myConv->addButton( rbExp, 0 ); + myConv->addButton( myCutNeg, 1 ); + + myGroupLayout->addWidget( myConvBox, row, 0, 1, 2 ); row++; + + // 6) reverse edge parameters + myReversedEdgesBox = new QGroupBox(tr( "SMESH_REVERSED_EDGES" ), fr); + QHBoxLayout* edgeLay = new QHBoxLayout( myReversedEdgesBox ); + + myDirectionWidget = new StdMeshersGUI_SubShapeSelectorWdg( myReversedEdgesBox ); + QString aGeomEntry = getShapeEntry(); + QString aMainEntry = getMainShapeEntry(); + if ( aGeomEntry == "" ) + aGeomEntry = h->GetObjectEntry(); + myDirectionWidget->SetGeomShapeEntry( aGeomEntry, aMainEntry ); + myDirectionWidget->SetListOfIDs( h->GetReversedEdges() ); + edgeLay->addWidget( myDirectionWidget ); + + lay->addWidget( myReversedEdgesBox ); + lay->setStretchFactor( GroupC1, 1); + lay->setStretchFactor( myReversedEdgesBox, 1); + + myReversedEdgesHelper = 0; + if ( !aGeomEntry.isEmpty() || !aMainEntry.isEmpty() ) + { + myReversedEdgesHelper = new StdMeshersGUI_PropagationHelperWdg( myDirectionWidget, fr, false ); + lay->addWidget( myReversedEdgesHelper ); + lay->setStretchFactor( myReversedEdgesHelper, 1 ); + } + connect( myNbSeg, SIGNAL( valueChanged( const QString& ) ), this, SLOT( onValueChanged() ) ); connect( myDistr, SIGNAL( activated( int ) ), this, SLOT( onValueChanged() ) ); connect( myTable, SIGNAL( valueChanged( int, int ) ), this, SLOT( onValueChanged() ) ); connect( myExpr, SIGNAL( textChanged( const QString& ) ), this, SLOT( onValueChanged() ) ); - connect( myConv, SIGNAL( clicked( int ) ), this, SLOT( onValueChanged() ) ); + connect( myConv, SIGNAL( buttonClicked( int ) ), this, SLOT( onValueChanged() ) ); + + onValueChanged(); return fr; } @@ -188,13 +256,23 @@ void StdMeshersGUI_NbSegmentsCreator::retrieveParams() const if( myName ) myName->setText( data.myName ); - myNbSeg->setValue( data.myNbSeg ); - myDistr->setCurrentItem( data.myDistrType ); - myScale->setValue( data.myScale ); - myConv->setButton( data.myConv ); - myTable->table()->funcValidator()->setBottom(myConv->id( myConv->selected() )==0 ? -1E20 : 0); - myTable->table()->setData( data.myTable ); + if(data.myNbSegVarName.isEmpty()) + myNbSeg->setValue( data.myNbSeg ); + else + myNbSeg->setText( data.myNbSegVarName ); + + myDistr->setCurrentIndex( data.myDistrType ); + if(data.myScaleVarName.isEmpty()) + myScale->setValue( data.myScale ); + else + myScale->setText( data.myScaleVarName ); + myConv->button( data.myConv )->setChecked( true ); + myTable->setFuncMinValue(myConv->checkedId()==0 ? -1E20 : 0); + myTable->setData( data.myTable ); myExpr->setText( data.myExpr ); + + if ( dlg() ) + dlg()->setMinimumSize( dlg()->minimumSizeHint().width(), dlg()->minimumSizeHint().height() ); } QString StdMeshersGUI_NbSegmentsCreator::storeParams() const @@ -202,7 +280,7 @@ QString StdMeshersGUI_NbSegmentsCreator::storeParams() const NbSegmentsHypothesisData data; readParamsFromWidgets( data ); storeParamsToHypo( data ); - + QString valStr = QString::number( data.myNbSeg ) += "; "; enum DistrType @@ -223,7 +301,7 @@ QString StdMeshersGUI_NbSegmentsCreator::storeParams() const case TabFunc : { //valStr += tr("SMESH_TAB_FUNC"); bool param = true; - for( int i=0; i < data.myTable.length(); i++, param = !param ) { + for( CORBA::ULong i = 0; i < data.myTable.length(); i++, param = !param ) { if ( param ) valStr += "["; valStr += QString::number( data.myTable[ i ]); @@ -238,10 +316,12 @@ QString StdMeshersGUI_NbSegmentsCreator::storeParams() const break; } if ( hasConv ) + { if ( data.myConv ) valStr += "; " + tr("SMESH_CUT_NEG_MODE"); else valStr += "; " + tr("SMESH_EXP_MODE"); + } return valStr; } @@ -254,9 +334,21 @@ bool StdMeshersGUI_NbSegmentsCreator::readParamsFromHypo( NbSegmentsHypothesisDa h_data.myName = hypName(); h_data.myNbSeg = (int) h->GetNumberOfSegments(); + + CORBA::String_var aVaribaleName = h->GetVarParameter( "SetNumberOfSegments" ); + h_data.myNbSegVarName = aVaribaleName.in(); + int distr = (int) h->GetDistrType(); h_data.myDistrType = distr; h_data.myScale = distr==1 ? h->GetScaleFactor() : 1.0; + + if(distr==1) { + aVaribaleName = h->GetVarParameter( "SetScaleFactor" ); + h_data.myScaleVarName = aVaribaleName.in(); + } + else + h_data.myScaleVarName = QString(""); + if( distr==2 ) { SMESH::double_array* a = h->GetTableFunction(); @@ -287,23 +379,31 @@ bool StdMeshersGUI_NbSegmentsCreator::storeParamsToHypo( const NbSegmentsHypothe try { if( isCreation() ) - SMESH::SetName( SMESH::FindSObject( h ), h_data.myName.latin1() ); + SMESH::SetName( SMESH::FindSObject( h ), h_data.myName.toUtf8().data() ); + h->SetVarParameter( h_data.myNbSegVarName.toUtf8().constData(), "SetNumberOfSegments" ); h->SetNumberOfSegments( h_data.myNbSeg ); + int distr = h_data.myDistrType; - h->SetDistrType( distr ); - - if( distr==1 ) + if ( distr == 0 ) + h->SetDistrType( distr ); // this is actually needed at non-uniform -> uniform switch + if( distr==1 ) { + h->SetVarParameter( h_data.myScaleVarName.toUtf8().constData(), "SetScaleFactor" ); h->SetScaleFactor( h_data.myScale ); - + } if( distr==2 || distr==3 ) h->SetConversionMode( h_data.myConv ); + if( distr==1 || distr==2 || distr==3 ) { + h->SetReversedEdges( myDirectionWidget->GetListOfIDs() ); + h->SetObjectEntry( myDirectionWidget->GetMainShapeEntry() ); + } + if( distr==2 ) h->SetTableFunction( h_data.myTable ); if( distr==3 ) - h->SetExpressionFunction( h_data.myExpr.latin1() ); + h->SetExpressionFunction( h_data.myExpr.toUtf8().data() ); //setting of function must follow after setConversionMode, because otherwise //the function will be checked with old conversion mode, so that it may occurs //unexpected errors for user @@ -320,17 +420,19 @@ bool StdMeshersGUI_NbSegmentsCreator::readParamsFromWidgets( NbSegmentsHypothesi { h_data.myName = myName ? myName->text() : ""; h_data.myNbSeg = myNbSeg->value(); - h_data.myDistrType = myDistr->currentItem(); - h_data.myConv = myConv->id( myConv->selected() ); + h_data.myNbSegVarName = myNbSeg->text(); + h_data.myScaleVarName = myScale->text(); + h_data.myDistrType = myDistr->currentIndex(); + h_data.myConv = myConv->checkedId(); h_data.myScale = myScale->value(); - myTable->table()->data( h_data.myTable ); + myTable->data( h_data.myTable ); h_data.myExpr = myExpr->text(); return true; } void StdMeshersGUI_NbSegmentsCreator::onValueChanged() { - int distr = myDistr->currentItem(); + int distr = myDistr->currentIndex(); /* if( distr==2 ) //table func myCutNeg->setText( tr( "SMESH_NO_CONV" ) ); @@ -339,44 +441,55 @@ void StdMeshersGUI_NbSegmentsCreator::onValueChanged() if( distr==2 && sender()==myConv ) //table func { - myTable->table()->funcValidator()->setBottom( myConv->id( myConv->selected() )==0 ? -1E20 : 0 ); + myTable->setFuncMinValue( myConv->checkedId()==0 ? -1E20 : 0 ); SMESH::double_array arr; - myTable->table()->data( arr ); - myTable->table()->setData( arr ); //update data in table + myTable->data( arr ); + myTable->setData( arr ); //update data in table } - myScale->setShown( distr==1 ); - myLScale->setShown( distr==1 ); + myScale->setVisible( distr==1 ); + myLScale->setVisible( distr==1 ); + myReversedEdgesBox->setVisible( distr!=0 ); + if ( myReversedEdgesHelper ) { + myReversedEdgesHelper->Clear(); + myReversedEdgesHelper->setVisible( distr!=0 ); + } + myDirectionWidget->ShowPreview( distr!=0 ); bool isFunc = distr==2 || distr==3; - myPreview->setShown( isFunc ); - myGroupLayout->setRowStretch( myPreviewRow, isFunc ? 1 : 0 ); - - myConv->setShown( isFunc ); - myLConv->setShown( isFunc ); - - if( distr==2 ) - myTable->show(); - else - myTable->hide(); - myLTable->setShown( distr==2 ); - myGroupLayout->setRowStretch( myTableRow, distr==2 ? 1 : 0 ); - - myExpr->setShown( distr==3 ); - myLExpr->setShown( distr==3 ); - myInfo->setShown( isFunc ); +#ifndef DISABLE_PLOT2DVIEWER + myPreview->setVisible( isFunc ); +#endif + myConvBox->setVisible( isFunc ); + + myTable->setVisible( distr==2 ); + myExpr->setVisible( distr==3 ); + myLExpr->setVisible( distr==3 ); + myInfo->setVisible( distr==3); +#ifndef DISABLE_PLOT2DVIEWER //change of preview int nbSeg = myNbSeg->value(); if( distr==2 ) //preview for table-described function { SMESH::double_array a; - myTable->table()->data( a ); + myTable->data( a ); myPreview->setParams( a, nbSeg, false ); } else if( distr==3 ) //preview for analytic-described function myPreview->setParams( myExpr->text(), nbSeg, 100, false ); if( isFunc ) - myPreview->setConversion( StdMeshersGUI_DistrPreview::Conversion( myConv->id( myConv->selected() ) ) ); + myPreview->setConversion( StdMeshersGUI_DistrPreview::Conversion( myConv->checkedId() ) ); +#endif + + if ( (QtxComboBox*)sender() == myDistr && dlg() ) { + QApplication::instance()->processEvents(); + myGroupLayout->invalidate(); + dlg()->layout()->invalidate(); + dlg()->updateGeometry(); + dlg()->setMinimumSize( dlg()->minimumSizeHint() ); + dlg()->resize( dlg()->minimumSize() ); + QApplication::instance()->processEvents(); + } }