]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
Add FixMode parameter to DropSmallSolids operator for uses two threshold optional... imn/fix_optional_parameter_shape_reparation
authorimn <imn@opencascade.com>
Tue, 27 Jan 2015 09:33:12 +0000 (12:33 +0300)
committerimn <imn@opencascade.com>
Tue, 27 Jan 2015 09:33:12 +0000 (12:33 +0300)
resources/ShHealing
src/GEOMImpl/GEOMImpl_IHealingOperations.cxx
src/RepairGUI/RepairGUI_ShapeProcessDlg.cxx
src/RepairGUI/RepairGUI_ShapeProcessDlg.h

index 864e192a1fc30953658abefc95890bfde0b23328..aa5eac849aee7a56cc5d91399427951c509419a7 100644 (file)
@@ -18,6 +18,7 @@ ShapeProcess.FixFaceSize.Tolerance                    : 0.05
 
 ShapeProcess.DropSmallEdges.Tolerance3d                : 0.05
 
+ShapeProcess.DropSmallSolids.FixMode                    : 2
 ShapeProcess.DropSmallSolids.WidthFactorThreshold       : 1
 ShapeProcess.DropSmallSolids.VolumeThreshold            : 1000
 ShapeProcess.DropSmallSolids.MergeSolids                : 1
index 865867dac5a564a54f7fee39148eebbc7d9712ad..f42d02312fdef4b794156ea11937a69f4436deb4 100644 (file)
@@ -276,6 +276,7 @@ bool GEOMImpl_IHealingOperations::GetParameters (const std::string theOperation,
     theParams.push_back( "DropSmallEdges.Tolerance3d" );
 
   } else if( theOperation == "DropSmallSolids" ) {
+    theParams.push_back( "DropSmallSolids.FixMode" );
     theParams.push_back( "DropSmallSolids.WidthFactorThreshold" );
     theParams.push_back( "DropSmallSolids.VolumeThreshold" );
     theParams.push_back( "DropSmallSolids.MergeSolids" );
index dc32f058e203615d502b65b65fd98d5a447a1fad..613d380c31363722cbb98e5b7e230658a21ee807 100755 (executable)
 
 #include <QListWidget>
 #include <QStackedLayout>
-
+enum
+{
+  ALL_PARAMETERS,
+  ONLY_WIDTH_FACTOR_PARAMETER,
+  ONLY_VOLUME_PARAMETER
+};
 //=================================================================================
 // class    : RepairGUI_ShapeProcessDlg()
 // purpose  : Constructs a RepairGUI_ShapeProcessDlg  which is a child of 'parent', with the
@@ -169,10 +174,6 @@ void RepairGUI_ShapeProcessDlg::init()
       myDropSmallSolidsVolTol = new SalomeApp_DoubleSpinBox( w );
       initSpinBox( myDropSmallSolidsWidTol, 0., 1e3, 1., "len_tol_precision" );
       initSpinBox( myDropSmallSolidsVolTol, 0., 1e9, 1., "len_tol_precision" );
-      myDropSmallSolidsWidTol->setValue( 1 );
-      myDropSmallSolidsVolTol->setValue( 1e3 );
-      myDropSmallSolidsVolChk->setChecked( true );
-      myDropSmallSolidsWidTol->setEnabled( false );
       myDropSmallSolidsMergeChk = new QCheckBox( tr("TO_MERGE_SOLIDS"), w );
   
       aLay->addWidget( myDropSmallSolidsWidChk, 0, 0 );
@@ -366,6 +367,45 @@ void RepairGUI_ShapeProcessDlg::init()
   updateSelectAll();
 }
 
+//=================================================================================
+// function : getOptionalValues()
+// purpose  :
+//=================================================================================
+int RepairGUI_ShapeProcessDlg::getOptionalValues()
+{
+  bool anWidCheckState = myDropSmallSolidsWidChk->checkState() == Qt::Checked;
+  bool anVolCheckState = myDropSmallSolidsVolChk->checkState() == Qt::Checked;
+  if ( anWidCheckState && anVolCheckState )
+    return ALL_PARAMETERS;
+  else if (anWidCheckState)
+    return ONLY_WIDTH_FACTOR_PARAMETER;
+  else if (anVolCheckState)
+    return ONLY_VOLUME_PARAMETER;
+  return ALL_PARAMETERS;
+}
+//=================================================================================
+// function : getMapWithoutOptionalParameters()
+// purpose  :
+//=================================================================================
+QMap<QString,QStringList>  RepairGUI_ShapeProcessDlg::getMapWithoutOptionalParameters()
+{
+  int mode = getOptionalValues();
+  QMap<QString, QStringList> aValMap(myValMap);
+  if ( mode == ALL_PARAMETERS )
+    return aValMap;
+  QMap<QString, QStringList>::iterator it;
+  it = aValMap.find("DropSmallSolids");
+  if ( it != aValMap.end() ) {
+    if ( mode == ONLY_VOLUME_PARAMETER) {
+      it.value().removeOne("DropSmallSolids.WidthFactorThreshold");
+    }
+    else if ( mode== ONLY_WIDTH_FACTOR_PARAMETER) {
+      it.value().removeOne("DropSmallSolids.VolumeThreshold");
+    }
+  }
+  return aValMap;
+}
+
 //=================================================================================
 // function : onOk()
 // purpose  : Same than click on apply but close this dialog.
@@ -538,10 +578,32 @@ void RepairGUI_ShapeProcessDlg::loadDefaults()
     // set default values of parameters
     if ( aParams->length() != aValues->length() )
       continue;
-
     for ( int j = 0; j < aParams->length(); j++ ) {
       QWidget* aCtrl = getControl( (const char*)aParams[j] );
-      setValue( aCtrl, set_convert( (const char*)aParams[j], aValues[j] ));
+      if (aCtrl) {
+        setValue( aCtrl, set_convert( (const char*)aParams[j], aValues[j] ));
+      }
+      else if (!strcmp( (const char*)aParams[j], "DropSmallSolids.FixMode" )) {
+        int aDropSmallSolidsFixMode = QString(aValues[j].in()).toInt();
+        if ( aDropSmallSolidsFixMode == ALL_PARAMETERS ) {
+          myDropSmallSolidsWidChk->setChecked( true );
+          myDropSmallSolidsWidTol->setEnabled( true );
+          myDropSmallSolidsVolChk->setChecked( true );
+          myDropSmallSolidsVolTol->setEnabled( true );
+        }
+        else if ( aDropSmallSolidsFixMode == ONLY_WIDTH_FACTOR_PARAMETER ) {
+          myDropSmallSolidsWidChk->setChecked( true );
+          myDropSmallSolidsWidTol->setEnabled( true );
+          myDropSmallSolidsVolChk->setChecked( false );
+          myDropSmallSolidsVolTol->setEnabled( false );
+        }
+        else if ( aDropSmallSolidsFixMode == ONLY_VOLUME_PARAMETER ) {
+          myDropSmallSolidsWidChk->setChecked( false );
+          myDropSmallSolidsWidTol->setEnabled( false );
+          myDropSmallSolidsVolChk->setChecked( true );
+          myDropSmallSolidsVolTol->setEnabled( true );
+        }
+      }
     }
   }
 }
@@ -572,11 +634,6 @@ QString RepairGUI_ShapeProcessDlg::getValue( QWidget* theControl ) const
 {
   if ( theControl ) {
     if ( qobject_cast<SalomeApp_DoubleSpinBox*>( theControl )) {
-      if ( ( theControl == myDropSmallSolidsWidTol || theControl == myDropSmallSolidsVolTol ) && !theControl->isEnabled() ) {
-        // VSR: stupid workaround about ShapeProcessAPI:
-        // specific processing for optional parameters of DropSmallSolids operator
-        return QString::number( Precision::Infinite() );
-      }
       return QString::number( qobject_cast<SalomeApp_DoubleSpinBox*>( theControl )->value() );
     }
     else if ( qobject_cast<SalomeApp_IntSpinBox*>( theControl )) {
@@ -631,7 +688,7 @@ bool RepairGUI_ShapeProcessDlg::isValid( QString& msg )
     while( aListIter.hasNext() ) {
       const QString& aParam = aListIter.next();
       QWidget* aControl = getControl( aParam );
-      if ( !aControl->isEnabled() ) continue;
+      if ( !aControl || !aControl->isEnabled() ) continue;
       if ( qobject_cast<SalomeApp_DoubleSpinBox*>( aControl ))
         ok = qobject_cast<SalomeApp_DoubleSpinBox*>( aControl )->isValid( msg, !IsPreview() ) && ok;
       else if ( qobject_cast<SalomeApp_IntSpinBox*>( aControl ))
@@ -663,7 +720,6 @@ bool RepairGUI_ShapeProcessDlg::execute( ObjectList& objects )
   GEOM::string_array_var anOperators = getActiveOperators();
   GEOM::string_array_var aParams = getParameters( anOperators );
   GEOM::string_array_var aValues = getValues( aParams );
-
   /*//-- check --
   int z;
         MESSAGE("Objects : ");
@@ -790,6 +846,7 @@ void RepairGUI_ShapeProcessDlg::initParamsValues()
   myValMap["DropSmallEdges"] << "DropSmallEdges.Tolerance3d";
 
   myOpLst << "DropSmallSolids";
+  myValMap["DropSmallSolids"] << "DropSmallSolids.FixMode";
   myValMap["DropSmallSolids"] << "DropSmallSolids.WidthFactorThreshold";
   myValMap["DropSmallSolids"] << "DropSmallSolids.VolumeThreshold";
   myValMap["DropSmallSolids"] << "DropSmallSolids.MergeSolids";
@@ -835,17 +892,17 @@ GEOM::string_array* RepairGUI_ShapeProcessDlg::getParameters( const GEOM::string
 {
   GEOM::string_array_var aParams = new GEOM::string_array();
   int i = 0, j = 0;
-
+  QMap<QString, QStringList> aValMap = getMapWithoutOptionalParameters();
   // calculate the length of parameters
   for ( i = 0, j = 0; i < theOperators.length(); i++ )
-    j += myValMap[ QString( theOperators[i].in() ) ].size();
+    j += aValMap[ QString( theOperators[i].in() ) ].size();
   
   // set the new length of paremeters
   aParams->length( j );
 
   // fill the parameters
   for ( i = 0, j = 0; i < theOperators.length(); i++ ) {
-    QStringList aParamLst = myValMap[ QString( theOperators[i].in() ) ];
+    QStringList aParamLst = aValMap[ QString( theOperators[i].in() ) ];
     foreach ( QString aParam, aParamLst ) {
       aParams[j++] = CORBA::string_dup( aParam.toLatin1().constData() );
     }
@@ -856,7 +913,6 @@ GEOM::string_array* RepairGUI_ShapeProcessDlg::getParameters( const GEOM::string
   return aParams._retn();
 }
 
-
 //=================================================================================
 // function : getValues
 // purpose  :
@@ -868,8 +924,12 @@ GEOM::string_array* RepairGUI_ShapeProcessDlg::getValues( const GEOM::string_arr
 
   for ( int i = 0; i < theParams.length(); i++ ) {
     QWidget* aCtrl = getControl( (const char*)theParams[i] );
-    if ( aCtrl )
+    if ( aCtrl ) {
       aValues[i] = get_convert( (const char*)theParams[i], getValue( aCtrl ));
+    }
+    else if( !strcmp( (const char*)theParams[i], "DropSmallSolids.FixMode" ) ) {
+      aValues[i] = QString::number(getOptionalValues()).toLatin1().constData();
+    }
   }
 
   return aValues._retn();
@@ -891,6 +951,9 @@ QStringList RepairGUI_ShapeProcessDlg::getTexts( const GEOM::string_array& thePa
       if( !aText.isNull() )
         aTexts.append( aText );
     }
+    else if( !strcmp( (const char*)theParams[i], "DropSmallSolids.FixMode" ) ) {
+      aTexts.append( QString::number(getOptionalValues()) );
+    }
   }
     
   return aTexts;
index 61ce42c79077b567b7cc8d4477566ae827603a78..03167c3947ce5642303db4e2819f31efa2095d6b 100755 (executable)
@@ -77,6 +77,8 @@ private:
   QString                            getValue( QWidget* ) const; // retrieve value of the control in the proper way
   QString                            getText( QWidget* ) const; // retrieve text of the control (for spin-boxes only)
 
+  int                                getOptionalValues( );
+  QMap<QString,QStringList>          getMapWithoutOptionalParameters();
   //QDict<QString,QWidget*>            myCtrlMap;  // map of controls (values) of parameters
   void                               initParamsValues(); // initialize the data structures
   void                               initSelection();