00001 #include "SIGEL_SlaveGUI/SIG_SimulationWidget.h" 00002 00003 #include <qslider.h> 00004 #include <qspinbox.h> 00005 #include <qcheckbox.h> 00006 #include <qcombobox.h> 00007 #include <qpushbutton.h> 00008 #include <qmultilineedit.h> 00009 00010 #include <cmath> 00011 00012 #include "SIGEL_SlaveGUI/SIG_SimulationVisualisationWidget.h" 00013 00014 namespace SIGEL_SlaveGUI 00015 { 00016 00017 SIG_SimulationWidget::SIG_SimulationWidget( QWidget *parent=0, 00018 char const *name=0, 00019 WFlags f=0 ) 00020 : SIG_SimulationWidgetBase( parent, name, f ) 00021 { 00022 connect( yawSlider, 00023 SIGNAL(valueChanged(int)), 00024 SLOT(slotSetYaw(int)) ); 00025 00026 connect( pitchSlider, 00027 SIGNAL(valueChanged(int)), 00028 SLOT(slotSetPitch(int)) ); 00029 00030 connect( distanceSlider, 00031 SIGNAL(valueChanged(int)), 00032 SLOT(slotSetDistance(int)) ); 00033 00034 connect( visualisationWidget, 00035 SIGNAL(signalMouseRotation(int,int)), 00036 SLOT(slotMouseRotation(int,int)) ); 00037 00038 connect( visualisationWidget, 00039 SIGNAL(signalMouseZoom(int)), 00040 SLOT(slotMouseZoom(int)) ); 00041 00042 connect( visualisationWidget, 00043 SIGNAL(signalSimulationProgress(QTime)), 00044 SLOT(slotSetSimulationTime(QTime)) ); 00045 00046 connect( visualisationWidget, 00047 SIGNAL(signalPosition(DL_vector)), 00048 SLOT(slotSetPosition(DL_vector)) ); 00049 00050 connect( traceRobotCheckBox, 00051 SIGNAL(toggled(bool)), 00052 SLOT(slotSetTraceRobot(bool)) ); 00053 00054 QObject::connect( forwardPushButton, 00055 SIGNAL(pressed()), 00056 visualisationWidget, 00057 SLOT(slotNavigateForward()) ); 00058 00059 QObject::connect( backwardPushButton, 00060 SIGNAL(pressed()), 00061 visualisationWidget, 00062 SLOT(slotNavigateBackward()) ); 00063 00064 QObject::connect( rightPushButton, 00065 SIGNAL(pressed()), 00066 visualisationWidget, 00067 SLOT(slotNavigateRight()) ); 00068 00069 QObject::connect( leftPushButton, 00070 SIGNAL(pressed()), 00071 visualisationWidget, 00072 SLOT(slotNavigateLeft()) ); 00073 00074 QObject::connect( downPushButton, 00075 SIGNAL(pressed()), 00076 visualisationWidget, 00077 SLOT(slotNavigateDown()) ); 00078 00079 QObject::connect( upPushButton, 00080 SIGNAL(pressed()), 00081 visualisationWidget, 00082 SLOT(slotNavigateUp()) ); 00083 00084 QObject::connect( centerPushButton, 00085 SIGNAL(pressed()), 00086 visualisationWidget, 00087 SLOT(slotNavigateCenter()) ); 00088 00089 QObject::connect( frameDelaySpinBox, 00090 SIGNAL(valueChanged(int)), 00091 visualisationWidget, 00092 SLOT(slotSetFrameDelay(int)) ); 00093 00094 QObject::connect( showAncorPointsCheckBox, 00095 SIGNAL(stateChanged(int)), 00096 visualisationWidget, 00097 SLOT(setShowAncorPoints(int)) ); 00098 00099 QObject::connect( renderModeComboBox, 00100 SIGNAL(activated(const QString &)), 00101 visualisationWidget, 00102 SLOT(setRenderMode(const QString &)) ); 00103 00104 QObject::connect( traceRobotCheckBox, 00105 SIGNAL(toggled(bool)), 00106 visualisationWidget, 00107 SLOT(slotSetTraceRobot(bool)) ); 00108 00109 QObject::connect( ambientLightingSlider, 00110 SIGNAL(valueChanged(int)), 00111 visualisationWidget, 00112 SLOT(setAmbientLighting(int)) ); 00113 00114 QObject::connect( planecolorPushButton, 00115 SIGNAL(clicked()), 00116 visualisationWidget, 00117 SLOT(choosePlaneColor()) ); 00118 00119 QObject::connect( showPlaneCheckBox, 00120 SIGNAL(stateChanged(int)), 00121 visualisationWidget, 00122 SLOT(setShowPlane(int)) ); 00123 00124 QObject::connect( showGridCheckBox, 00125 SIGNAL(stateChanged(int)), 00126 visualisationWidget, 00127 SLOT(setShowGrid(int)) ); 00128 00129 QObject::connect( showRobotPathCheckBox, 00130 SIGNAL(stateChanged(int)), 00131 visualisationWidget, 00132 SLOT(setShowRobotPath(int)) ); 00133 }; 00134 00135 SIG_SimulationWidget::~SIG_SimulationWidget() 00136 { }; 00137 00138 void SIG_SimulationWidget::slotSetYaw( int yaw ) 00139 { 00140 visualisationWidget->setYaw( 360 - yaw ); 00141 }; 00142 00143 void SIG_SimulationWidget::slotSetPitch( int pitch ) 00144 { 00145 visualisationWidget->setPitch( pitch - 90 ); 00146 }; 00147 00148 void SIG_SimulationWidget::slotSetDistance( int distance ) 00149 { 00150 visualisationWidget->setDistance( static_cast<double>(distance) / 10 ); 00151 }; 00152 00153 void SIG_SimulationWidget::slotMouseRotation( int deltaX, int deltaY ) 00154 { 00155 int newYawValue = yawSlider->value() + deltaX; 00156 int newFittedYawValue = (newYawValue < 0) ? (360 - newYawValue % 360) : (newYawValue % 360); 00157 int newPitchValue = pitchSlider->value() + deltaY; 00158 00159 yawSlider->setValue( newFittedYawValue ); 00160 pitchSlider->setValue( newPitchValue ); 00161 }; 00162 00163 void SIG_SimulationWidget::slotMouseZoom( int deltaY ) 00164 { 00165 int newDistanceValue = distanceSlider->value() + deltaY; 00166 00167 distanceSlider->setValue( newDistanceValue ); 00168 }; 00169 00170 void SIG_SimulationWidget::slotSetSimulationTime( QTime simulationTime ) 00171 { 00172 simulationTimeTextLabel->setText( simulationTime.toString() ); 00173 }; 00174 00175 void SIG_SimulationWidget::visualizeThis(SIGEL_Robot::SIG_Robot const &robot, 00176 SIGEL_Environment::SIG_Environment const &environment, 00177 SIGEL_Simulation::SIG_SimulationParameters const &simulationParameters, 00178 SIGEL_Program::SIG_Program const &program) 00179 { 00180 visualisationWidget->visualizeThis(robot, environment, simulationParameters, program); 00181 00182 slotSetYaw( yawSlider->value() ); 00183 slotSetPitch ( pitchSlider->value() ); 00184 slotSetDistance( distanceSlider->value() ); 00185 00186 visualisationWidget->slotSetTraceRobot( traceRobotCheckBox->isChecked() ); 00187 visualisationWidget->setRenderMode( renderModeComboBox->currentText() ); 00188 visualisationWidget->setAmbientLighting( ambientLightingSlider->value() ); 00189 00190 QString programCode; 00191 SIGEL_Program::SIG_Program &varProgram = const_cast< SIGEL_Program::SIG_Program& >( program ); 00192 varProgram.printToString( programCode ); 00193 robotProgramView->setText( programCode ); 00194 }; 00195 00196 void SIG_SimulationWidget::slotSetTraceRobot( bool newValue ) 00197 { 00198 bool manualNavigation = !newValue; 00199 00200 downPushButton->setEnabled( manualNavigation ); 00201 upPushButton->setEnabled( manualNavigation ); 00202 rightPushButton->setEnabled( manualNavigation ); 00203 leftPushButton->setEnabled( manualNavigation ); 00204 backwardPushButton->setEnabled( manualNavigation ); 00205 forwardPushButton->setEnabled( manualNavigation ); 00206 centerPushButton->setEnabled( manualNavigation ); 00207 }; 00208 00209 void SIG_SimulationWidget::slotSetPosition( DL_vector position ) 00210 { 00211 QString xPosString = QString::number( position.get( 0 ) ); 00212 QString yPosString = QString::number( position.get( 1 ) ); 00213 QString zPosString = QString::number( position.get( 2 ) ); 00214 00215 xPosTextLabel->setText( xPosString ); 00216 yPosTextLabel->setText( yPosString ); 00217 zPosTextLabel->setText( zPosString ); 00218 }; 00219 00220 void SIG_SimulationWidget::slotStopSimulation() 00221 { 00222 visualisationWidget->slotStopSimulation(); 00223 00224 slotSetYaw( yawSlider->value() ); 00225 slotSetPitch ( pitchSlider->value() ); 00226 slotSetDistance( distanceSlider->value() ); 00227 00228 visualisationWidget->slotSetTraceRobot( traceRobotCheckBox->isChecked() ); 00229 visualisationWidget->setRenderMode( renderModeComboBox->currentText() ); 00230 00231 visualisationWidget->setShowPlane( showPlaneCheckBox->isChecked() ? 2 : 0 ); 00232 visualisationWidget->setShowGrid( showGridCheckBox->isChecked() ? 2 : 0 ); 00233 visualisationWidget->setShowRobotPath( showRobotPathCheckBox->isChecked() ? 2 : 0 ); 00234 00235 int showAnchorPointsState; 00236 00237 switch (showAncorPointsCheckBox->state()) 00238 { 00239 case QButton::Off: 00240 showAnchorPointsState = 0; 00241 break; 00242 case QButton::NoChange: 00243 showAnchorPointsState = 1; 00244 break; 00245 case QButton::On: 00246 showAnchorPointsState = 2; 00247 break; 00248 }; 00249 00250 visualisationWidget->setShowAncorPoints( showAnchorPointsState ); 00251 }; 00252 00253 }