EDF 1575 SMESH: Filters and precision preferences

This commit is contained in:
vsr 2010-09-24 13:08:23 +00:00
parent 7615037388
commit d4f9cc5a79
3 changed files with 121 additions and 30 deletions

View File

@ -37,6 +37,7 @@
#include <SMESH_Actor.h>
#include <SMESH_NumberFilter.hxx>
#include <SMESH_TypeFilter.hxx>
#include <SMESHGUI_SpinBox.h>
// SALOME GEOM includes
#include <GEOMBase.h>
@ -160,30 +161,32 @@ public:
virtual void SetString(const int, const QString&);
void SetEditable(const int, const bool);
void SetEditable(const bool);
void SetPrecision(const int, const char* = 0);
private:
QMap< int, QLineEdit* > myLineEdits;
QMap< int, QWidget* > myWidgets;
};
SMESHGUI_FilterTable::AdditionalWidget::AdditionalWidget (QWidget* theParent)
: QWidget(theParent)
{
QLabel* aLabel = new QLabel(tr("SMESH_TOLERANCE"), this);
myLineEdits[ Tolerance ] = new QLineEdit(this);
QDoubleValidator* aValidator = new QDoubleValidator(myLineEdits[ Tolerance ]);
aValidator->setBottom(0);
myLineEdits[ Tolerance ]->setValidator(aValidator);
SMESHGUI_SpinBox* sb = new SMESHGUI_SpinBox(this);
sb->setAcceptNames( false ); // No Notebook variables allowed
sb->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
sb->RangeStepAndValidator( 0., 1.e20, 0.1, "len_tol_precision" );
myWidgets[ Tolerance ] = sb;
QHBoxLayout* aLay = new QHBoxLayout(this);
aLay->setSpacing(SPACING);
aLay->setMargin(0);
aLay->addWidget(aLabel);
aLay->addWidget(myLineEdits[ Tolerance ]);
aLay->addWidget(myWidgets[ Tolerance ]);
aLay->addStretch();
QString aText = QString("%1").arg(Precision::Confusion());
myLineEdits[ Tolerance ]->setText(aText);
SetDouble( Tolerance, Precision::Confusion() );
}
SMESHGUI_FilterTable::AdditionalWidget::~AdditionalWidget()
@ -205,11 +208,16 @@ bool SMESHGUI_FilterTable::AdditionalWidget::IsValid (const bool theMsg) const
QList<int> aParams = GetParameters();
QList<int>::const_iterator anIter;
for (anIter = aParams.begin(); anIter != aParams.end(); ++anIter) {
const QLineEdit* aWg = myLineEdits[ *anIter ];
int p = 0;
QString aText = aWg->text();
if (aWg->isEnabled() && aWg->validator()->validate(aText, p) != QValidator::Acceptable) {
if (theMsg)
if ( !myWidgets.contains( *anIter ) ) continue;
bool valid = true;
if ( qobject_cast<QLineEdit*>( myWidgets[ *anIter ] ) ) {
valid = qobject_cast<QLineEdit*>( myWidgets[ *anIter ] )->hasAcceptableInput();
}
else if ( qobject_cast<SMESHGUI_SpinBox*>( myWidgets[ *anIter ] ) ) {
QString foo;
valid = qobject_cast<SMESHGUI_SpinBox*>( myWidgets[ *anIter ] )->isValid( foo, false );
}
if (!valid && theMsg) {
SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"),
tr("SMESHGUI_INVALID_PARAMETERS"));
return false;
@ -221,41 +229,78 @@ bool SMESHGUI_FilterTable::AdditionalWidget::IsValid (const bool theMsg) const
double SMESHGUI_FilterTable::AdditionalWidget::GetDouble (const int theId) const
{
return myLineEdits.contains(theId) ? myLineEdits[ theId ]->text().toDouble() : 0;
double retval = 0;
if ( myWidgets.contains( theId ) ) {
if ( qobject_cast<QLineEdit*>( myWidgets[ theId ] ) )
retval = qobject_cast<QLineEdit*>( myWidgets[ theId ] )->text().toDouble();
if ( qobject_cast<SMESHGUI_SpinBox*>( myWidgets[ theId ] ) )
retval = qobject_cast<SMESHGUI_SpinBox*>( myWidgets[ theId ] )->GetValue();
}
return retval;
}
int SMESHGUI_FilterTable::AdditionalWidget::GetInteger (const int theId) const
{
return myLineEdits.contains(theId) ? myLineEdits[ theId ]->text().toInt() : 0;
int retval = 0;
if ( myWidgets.contains( theId ) ) {
if ( qobject_cast<QLineEdit*>( myWidgets[ theId ] ) )
retval = qobject_cast<QLineEdit*>( myWidgets[ theId ] )->text().toInt();
if ( qobject_cast<SMESHGUI_SpinBox*>( myWidgets[ theId ] ) )
retval = (int)( qobject_cast<SMESHGUI_SpinBox*>( myWidgets[ theId ] )->GetValue() );
}
return retval;
}
QString SMESHGUI_FilterTable::AdditionalWidget::GetString (const int theId) const
{
return myLineEdits.contains(theId) ? myLineEdits[ theId ]->text() : QString("");
QString retval = "";
if ( myWidgets.contains( theId ) ) {
if ( qobject_cast<QLineEdit*>( myWidgets[ theId ] ) )
retval = qobject_cast<QLineEdit*>( myWidgets[ theId ] )->text();
if ( qobject_cast<SMESHGUI_SpinBox*>( myWidgets[ theId ] ) )
retval = QString::number( qobject_cast<SMESHGUI_SpinBox*>( myWidgets[ theId ] )->GetValue() );
}
return retval;
}
void SMESHGUI_FilterTable::AdditionalWidget::SetDouble (const int theId, const double theVal)
{
if (myLineEdits.contains(theId))
myLineEdits[ theId ]->setText(QString("%1").arg(theVal));
if ( myWidgets.contains( theId ) ) {
if ( qobject_cast<QLineEdit*>( myWidgets[ theId ] ) )
qobject_cast<QLineEdit*>( myWidgets[ theId ] )->setText( QString::number( theVal ) );
if ( qobject_cast<SMESHGUI_SpinBox*>( myWidgets[ theId ] ) )
qobject_cast<SMESHGUI_SpinBox*>( myWidgets[ theId ] )->SetValue( theVal );
}
}
void SMESHGUI_FilterTable::AdditionalWidget::SetInteger (const int theId, const int theVal)
{
if (myLineEdits.contains(theId))
myLineEdits[ theId ]->setText(QString("%1").arg(theVal));
if ( myWidgets.contains( theId ) ) {
if ( qobject_cast<QLineEdit*>( myWidgets[ theId ] ) )
qobject_cast<QLineEdit*>( myWidgets[ theId ] )->setText( QString::number( theVal ) );
if ( qobject_cast<SMESHGUI_SpinBox*>( myWidgets[ theId ] ) )
qobject_cast<SMESHGUI_SpinBox*>( myWidgets[ theId ] )->SetValue( (double)theVal );
}
}
void SMESHGUI_FilterTable::AdditionalWidget::SetString (const int theId, const QString& theVal)
{
if (myLineEdits.contains(theId))
myLineEdits[ theId ]->setText(theVal);
if ( myWidgets.contains( theId ) ) {
if ( qobject_cast<QLineEdit*>( myWidgets[ theId ] ) )
qobject_cast<QLineEdit*>( myWidgets[ theId ] )->setText( theVal );
if ( qobject_cast<SMESHGUI_SpinBox*>( myWidgets[ theId ] ) )
qobject_cast<SMESHGUI_SpinBox*>( myWidgets[ theId ] )->SetValue( theVal.toDouble() );
}
}
void SMESHGUI_FilterTable::AdditionalWidget::SetEditable (const int theId, const bool isEditable)
{
if (myLineEdits.contains(theId))
myLineEdits[ theId ]->setReadOnly(!isEditable);
if ( myWidgets.contains( theId ) ) {
if ( qobject_cast<QLineEdit*>( myWidgets[ theId ] ) )
qobject_cast<QLineEdit*>( myWidgets[ theId ] )->setReadOnly( !isEditable );
if ( qobject_cast<SMESHGUI_SpinBox*>( myWidgets[ theId ] ) )
qobject_cast<SMESHGUI_SpinBox*>( myWidgets[ theId ] )->setReadOnly( !isEditable );
}
}
void SMESHGUI_FilterTable::AdditionalWidget::SetEditable (const bool isEditable)
@ -266,6 +311,19 @@ void SMESHGUI_FilterTable::AdditionalWidget::SetEditable (const bool isEditable)
SetEditable( *anIter, isEditable );
}
void SMESHGUI_FilterTable::AdditionalWidget::SetPrecision(const int theId, const char* precision)
{
if ( myWidgets.contains( theId ) ) {
if ( qobject_cast<SMESHGUI_SpinBox*>( myWidgets[ theId ] ) ) {
SMESHGUI_SpinBox* sb = qobject_cast<SMESHGUI_SpinBox*>( myWidgets[ theId ] );
double val = sb->GetValue();
double min = pow(10, -(sb->decimals()));
sb->RangeStepAndValidator( 0., 1.e20, 0.1, precision ? precision : "len_tol_precision" );
sb->SetValue( qMax( val, min ) );
}
}
}
/*
Class : SMESHGUI_FilterTable::ComboItem
Description : Combo table item. Identificator corresponding to string may be assigned
@ -1279,9 +1337,41 @@ void SMESHGUI_FilterTable::updateAdditionalWidget()
}
myWgStack->setCurrentWidget(myAddWidgets[ anItem ]);
myAddWidgets[ anItem ]->SetPrecision( AdditionalWidget::Tolerance, getPrecision( aCriterion ) );
myWgStack->setEnabled(toEnable);
}
const char* SMESHGUI_FilterTable::getPrecision( const int aType )
{
const char* retval = 0;
switch ( aType ) {
case SMESH::FT_AspectRatio:
case SMESH::FT_AspectRatio3D:
case SMESH::FT_Taper:
retval = "parametric_precision"; break;
case SMESH::FT_Warping:
case SMESH::FT_MinimumAngle:
case SMESH::FT_Skew:
retval = "angle_precision"; break;
case SMESH::FT_Area:
retval = "area_precision"; break;
case SMESH::FT_BelongToGeom:
case SMESH::FT_BelongToPlane:
case SMESH::FT_BelongToCylinder:
case SMESH::FT_BelongToGenSurface:
case SMESH::FT_LyingOnGeom:
retval = "len_tol_precision"; break;
case SMESH::FT_Length:
case SMESH::FT_Length2D:
retval = "length_precision"; break;
case SMESH::FT_Volume3D:
retval = "vol_precision"; break;
default:
break;
}
return retval;
}
//=======================================================================
// name : SMESHGUI_FilterTable::removeAdditionalWidget
// Purpose : Remove widgets containing additional parameters from widget

View File

@ -168,6 +168,7 @@ private:
void updateBtnState();
void removeAdditionalWidget( QTableWidget*, const int );
void updateAdditionalWidget();
const char* getPrecision( const int );
const QMap<int, QString>& getSupportedTypes() const;

View File

@ -66,7 +66,7 @@ void SMESHGUI_SpinBox::SetStep( double newStep )
//=================================================================================
void SMESHGUI_SpinBox::SetValue( double v )
{
setValue(v);
setValue(valueFromText(textFromValue(v)));
editor()->setCursorPosition( 0 );
}
@ -113,7 +113,7 @@ void SMESHGUI_SpinBox::RangeStepAndValidator( double min,
setPrecision(precision); // PAL8769. Minus is for using 'g' double->string conversion specifier,
// see QtxDoubleSpinBox::mapValueToText( double v )
// san: this can be achieved using preferences
setDecimals(qAbs(precision));
setDecimals( 20 ); // qAbs(precision)
setRange(min, max);
setSingleStep( step );
setDefaultValue( min );