00001 #include <qcombobox.h>
00002 #include <qspinbox.h>
00003 #include <qgroupbox.h>
00004 #include <qcheckbox.h>
00005 
00006 #include <animal/X3DTK/Qt/engineGUI/engineGUI.h>
00007 #include <animal/X3DTK/Qt/objectGUI/WFloatLineEdit.h>
00008 #include "massSpringEngineGUI.h"
00009 
00010 
00011 namespace X3DTK{
00012 namespace Qt{
00013 
00014 MassSpringEngineQt::MassSpringEngineQt( AMassSpringEngine * massSpringEngine)
00015   : MassSpringEngineDesigner(0,"main q object")
00016   , _massSpringEngine(massSpringEngine)
00017 {
00018   method_comboBox->insertItem( QString("euler") );
00019   method_comboBox->insertItem( QString("rk2") );
00020   method_comboBox->insertItem( QString("rk4") );
00021   method_comboBox->insertItem( QString("midpoint") );
00022   method_comboBox->insertItem( QString("velocity verlet") );
00023   method_comboBox->insertItem( QString("implicit euler") );
00024   connect(method_comboBox,SIGNAL(activated(int)),
00025           this, SLOT(setIntegrationMethod(int)));
00026   setIntegrationMethod( _massSpringEngine->getMethod() );
00027   method_comboBox->setCurrentItem( _massSpringEngine->getMethod() );
00028 
00029   
00030   cg_maxiter_spinBox->setValue(_massSpringEngine->maxCGiterations() );
00031   connect(cg_maxiter_spinBox,SIGNAL(valueChanged(int)),
00032           this, SLOT(setMaxCGiterations(int)));
00033 
00034   
00035   cg_damping_wFloatLineEdit->setFloatValue( _massSpringEngine->dampingRatio());
00036   cg_damping_wFloatLineEdit->setMinFloatValue( 0.0 );
00037   cg_damping_wFloatLineEdit->setMaxFloatValue( 1000.0 );
00038   connect(cg_damping_wFloatLineEdit,SIGNAL(floatValueChanged(float)),
00039           this, SLOT(setImplicitEulerDampingRatio(float)));
00040 
00041   
00042   cg_divider_wFloatLineEdit->setFloatValue( _massSpringEngine->smallDenominatorThreshold());
00043   cg_divider_wFloatLineEdit->setMinFloatValue( 0.0 );
00044   cg_divider_wFloatLineEdit->setMaxFloatValue( 1000.0 );
00045   connect(cg_divider_wFloatLineEdit,SIGNAL(floatValueChanged(float)),
00046           this, SLOT(setImplicitEulerDividerThreshold(float)));
00047 
00048 
00049   
00050   isotropy_spinBox->setValue( static_cast<int>(_massSpringEngine->getIsotropy()*100+0.5) );
00051   connect(isotropy_spinBox,SIGNAL(valueChanged(int)),
00052           this, SLOT(setIsotropy(int)));
00053 
00054 
00055   
00056   mmid_spinBox->setValue( _massSpringEngine->MMIDsteps() );
00057   connect(mmid_spinBox,SIGNAL(valueChanged(int)),
00058           this, SLOT(setMmidSubsteps(int)));
00059 
00060 
00061   
00062   connect(exponentialDamping_wFloatLineEdit,SIGNAL(floatValueChanged(float)),
00063           this, SLOT(setExponentialDamping(float)));
00064   
00065   exponentialDamping_wFloatLineEdit->setMinFloatValue( 0.0 );
00066   exponentialDamping_wFloatLineEdit->setMaxFloatValue( 1000.0 );
00067   exponentialDamping_wFloatLineEdit->setFloatValue( _massSpringEngine->get_exponentialDamping() );
00068 
00069   connect(exponentialDamping_checkBox,SIGNAL(toggled(bool)),
00070           this, SLOT(toggleExponentialDamping(bool)));
00071   exponentialDamping_checkBox->setChecked( _massSpringEngine->get_useExponentialDamping() );
00072 
00073  
00074  gravity_checkBox->setChecked( _massSpringEngine->get_useGravity() );
00075  connect(gravity_checkBox,SIGNAL(toggled(bool)),
00076           this, SLOT(toggleGravity(bool)));
00077  connect(gravity_x_wFloatLineEdit,SIGNAL(floatValueChanged(float)),
00078           this, SLOT(setXgravity(float)));
00079  connect(gravity_y_wFloatLineEdit,SIGNAL(floatValueChanged(float)),
00080           this, SLOT(setYgravity(float)));
00081  connect(gravity_z_wFloatLineEdit,SIGNAL(floatValueChanged(float)),
00082           this, SLOT(setZgravity(float)));
00083 
00084  gravity_x_wFloatLineEdit->setMinFloatValue( -1.0e+6 );
00085  gravity_x_wFloatLineEdit->setMaxFloatValue( +1.0e+6 );
00086  gravity_y_wFloatLineEdit->setMinFloatValue( -1.0e+6 );
00087  gravity_y_wFloatLineEdit->setMaxFloatValue( +1.0e+6 );
00088  gravity_z_wFloatLineEdit->setMinFloatValue( -1.0e+6 );
00089  gravity_z_wFloatLineEdit->setMaxFloatValue( +1.0e+6 );
00090  
00091  AMassSpringEngine::Vec g = _massSpringEngine->get_gravity();
00092  gravity_x_wFloatLineEdit->setFloatValue( g.x );
00093  gravity_y_wFloatLineEdit->setFloatValue( g.y );
00094  gravity_z_wFloatLineEdit->setFloatValue( g.z );
00095 
00096  
00097  mass_groupBox->setEnabled( false );
00098  
00099  
00100  connect(threshold_distancewFloatLineEdit,SIGNAL(floatValueChanged(float)),
00101           this, SLOT(setThresholdDistance(float)));
00102   threshold_distancewFloatLineEdit->setMinFloatValue( 1.0e-20 );
00103   threshold_distancewFloatLineEdit->setMaxFloatValue( 1 );
00104   threshold_distancewFloatLineEdit->setFloatValue(_massSpringEngine->get_thresholdDistance() );
00105   
00106   
00107   displayMScheckBox->setChecked( _massSpringEngine->get_displayMassSpring() );
00108   MS_colourgroupBox->setEnabled( _massSpringEngine->get_displayMassSpring() );
00109   connect(displayMScheckBox,SIGNAL(toggled(bool)),
00110     this, SLOT(setDisplayMassSpring(bool)));
00111   
00112   
00113   MS_colour_compressedcheck_Box->setChecked( _massSpringEngine->get_compressed_ok() );
00114   connect(MS_colour_compressedcheck_Box,SIGNAL(toggled(bool)),
00115      this, SLOT(setCompressed_ok(bool)));
00116   
00117   MS_colour_elongated_check_Box->setChecked( _massSpringEngine->get_elongated_ok() );
00118   connect(MS_colour_elongated_check_Box,SIGNAL(toggled (bool)),
00119      this, SLOT(setElongated_ok(bool)));
00120 
00121 
00122   
00123   width_points_spinBox->setValue( _massSpringEngine->get_pointSize() );
00124   connect( width_points_spinBox,SIGNAL(valueChanged(int)), this, SLOT(setPointWidth(int)));
00125   
00126   
00127   width_edges_spinBox->setValue( _massSpringEngine->get_lineWidth() );
00128   connect( width_edges_spinBox,SIGNAL(valueChanged(int)), this, SLOT(setLineWidth(int)));
00129   
00130      
00131   
00132   connect(debug_infocheckBox, SIGNAL(toggled(bool)),
00133     this, SLOT(toggleDebugInfo(bool)));
00134   debug_infocheckBox->setChecked(_massSpringEngine->get_debugInfo() );
00135 
00136 
00137 
00138 
00139 
00140 
00141 
00142 }
00143 
00144 MassSpringEngineQt::~MassSpringEngineQt()
00145 {
00146 }
00147 
00149 void MassSpringEngineQt::setIntegrationMethod( int methodID )
00150 {
00151   _massSpringEngine->setMethod( methodID );
00152   
00153 
00154   if( _massSpringEngine->getMethod()==AMassSpringEngine::IMPLICIT_EULER ){
00155     cg_groupBox->setEnabled(true);
00156   }
00157   else{
00158     cg_groupBox->setEnabled(false);
00159   }
00160 
00161   if( _massSpringEngine->getMethod()==AMassSpringEngine::MODMID ){
00162     mmid_groupBox->setEnabled(true);
00163   }
00164   else{
00165     mmid_groupBox->setEnabled(false);
00166   }
00167   emit changed();
00168 }
00169 
00171 void MassSpringEngineQt::setMaxCGiterations( int maxvalue )
00172 {
00173   
00174    _massSpringEngine->setMaxCGiterations( maxvalue );
00175   emit changed();
00176 }
00177 
00179 void MassSpringEngineQt::setIsotropy( int isotropy )
00180 {
00181   
00182    _massSpringEngine->setIsotropy( isotropy/100.0 );
00183   emit changed();
00184 }
00185 
00187 void MassSpringEngineQt::setMmidSubsteps( int nb )
00188 {
00189   
00190    _massSpringEngine->setMMIDsteps(nb);
00191   emit changed();
00192 }
00193 
00195 void MassSpringEngineQt::setImplicitEulerDampingRatio( float r )
00196 {
00197   
00198    _massSpringEngine->setDampingRatio(r);
00199   emit changed();
00200 }
00201 
00203 void MassSpringEngineQt::setImplicitEulerDividerThreshold( float d )
00204 {
00205   
00206    _massSpringEngine->setSmallDenominatorThreshold(d);
00207   emit changed();
00208 }
00209 
00211 void MassSpringEngineQt::setExponentialDamping( float value )
00212 {
00213   
00214    _massSpringEngine->set_exponentialDamping(value);
00215   emit changed();
00216 }
00217 
00219 void MassSpringEngineQt::toggleExponentialDamping( bool value )
00220 {
00221   
00222    _massSpringEngine->set_useExponentialDamping(value);
00223   emit changed();
00224 }
00225 
00227 void MassSpringEngineQt::toggleGravity( bool value )
00228 {
00229   
00230    _massSpringEngine->set_useGravity(value);
00231   emit changed();
00232 }
00233 void MassSpringEngineQt::setXgravity( float value )
00234 {
00235   
00236   AMassSpringEngine::Vec g = _massSpringEngine->get_gravity();
00237   g.x=value;
00238   _massSpringEngine->set_gravity(g);
00239   emit changed();
00240 }
00241 void MassSpringEngineQt::setYgravity( float value )
00242 {
00243   
00244   AMassSpringEngine::Vec g = _massSpringEngine->get_gravity();
00245   g.y=value;
00246   _massSpringEngine->set_gravity(g);
00247   emit changed();
00248 }
00249 void MassSpringEngineQt::setZgravity( float value )
00250 {
00251   
00252   AMassSpringEngine::Vec g = _massSpringEngine->get_gravity();
00253   g.z=value;
00254   _massSpringEngine->set_gravity(g);
00255   emit changed();
00256 }
00258 void MassSpringEngineQt::setThresholdDistance(float value)
00259 {
00260   
00261   _massSpringEngine->set_thresholdDistance(value);
00262   emit changed();
00263 }
00265 void MassSpringEngineQt::setCompressed_ok(bool b)
00266 {
00267   
00268   _massSpringEngine->set_compressed_ok(b);
00269   emit changed();
00270 }
00272 void MassSpringEngineQt::setElongated_ok(bool b)
00273 {  
00274   
00275   _massSpringEngine->set_elongated_ok(b);
00276   emit changed();
00277 }
00279 void MassSpringEngineQt::setDisplayMassSpring(bool b)
00280 {
00281   
00282   _massSpringEngine->set_displayMassSpring(b);
00283   MS_colourgroupBox->setEnabled(b);
00284   setElongated_ok(b); MS_colour_elongated_check_Box->setChecked(b);
00285   setCompressed_ok(b); MS_colour_compressedcheck_Box->setChecked(b);
00286   emit changed();
00287 }
00288 
00290 void MassSpringEngineQt::setPointWidth(int w)
00291 {  
00292     _massSpringEngine->set_pointSize(w);
00293   emit changed();
00294 }
00295 
00297 void MassSpringEngineQt::setLineWidth(int w)
00298 {  
00299     _massSpringEngine->set_lineWidth(w);
00300   emit changed();
00301 }
00302 
00304   void MassSpringEngineQt::toggleDebugInfo(bool b){
00305     _massSpringEngine->set_debugInfo(b);
00306   emit changed();
00307 }
00308 
00309 
00311 
00312 
00313 
00314 
00315 
00316 
00317 
00318 
00319 
00320 
00322 QWidget * createMassSpringNodeQWidget(X3D::MassSpringNode * node, QWidget * parent)
00323 {
00324   
00325 
00326   if (node)
00327   {
00328     MassSpringEngineQt * MSEQt = new MassSpringEngineQt(node);
00329     
00330 
00331     
00332     EngineGUI * engineGUI = static_cast<EngineGUI *>(createEngineNodeQWidget(node, parent));
00333     engineGUI->insertTab(MSEQt, "MassSpring",0);
00334     engineGUI->setCurrentPage(0);
00335     QWidget::connect( MSEQt, SIGNAL( changed() ), engineGUI, SLOT(ok()));
00336     
00337     return engineGUI;
00338   }
00339   
00340   std::cerr<<"Warning createMassSpringNodeQWidget(): impossible to create a X3DTK::Qt::EngineGUI because the associated animal::Engine is NULL."<<std::endl;
00341   std::cerr<<"        or the MainController is NULL."<<std::endl;
00342   return NULL;
00343 }
00344 
00345 }
00346 }
00347