diff --git a/lsim.kdevelop.pcs b/lsim.kdevelop.pcs index a4d43f7..8187b46 100644 Binary files a/lsim.kdevelop.pcs and b/lsim.kdevelop.pcs differ diff --git a/lsim.kdevses b/lsim.kdevses index 3745896..ce2eaeb 100644 --- a/lsim.kdevses +++ b/lsim.kdevses @@ -3,25 +3,25 @@ - + - + - + - + - + - + - + diff --git a/src/graphicsellipseitem.cpp b/src/graphicsellipseitem.cpp index d0b0024..910a5b1 100644 --- a/src/graphicsellipseitem.cpp +++ b/src/graphicsellipseitem.cpp @@ -30,6 +30,7 @@ #include "constants.h" #include #include +#include GraphicsEllipseItem::GraphicsEllipseItem() { //setFlag(ItemIsMovable); @@ -79,6 +80,22 @@ void GraphicsEllipseItem::handleSceneChange(const QList & /*region*/) { emit ScenePosChanged(myScenePos); emit ScenePosXChanged(myScenePos.x()); emit ScenePosYChanged(myScenePos.y()); + + SimulScene* myScene = dynamic_cast(scene()); + if (myScene != 0) { + QString ScenePosPxStringX(QLocale().toString(myScenePos.x(),'g',3)); + ScenePosPxStringX.append(" px"); + QString ScenePosPxStringY(QLocale().toString(myScenePos.y(),'g',3)); + ScenePosPxStringY.append(" px"); + QString ScenePosMStringX(QLocale().toString(myScenePos.x()*myScene->getMeterPerPx(),'g',3)); + ScenePosMStringX.append(" m"); + QString ScenePosMStringY(QLocale().toString(myScenePos.y()*myScene->getMeterPerPx(),'g',3)); + ScenePosMStringY.append(" m"); + emit ScenePosXChangedPixel(ScenePosPxStringX); + emit ScenePosYChangedPixel(ScenePosPxStringY); + emit ScenePosXChangedMeter(ScenePosMStringX); + emit ScenePosYChangedMeter(ScenePosMStringY); + } } } @@ -122,17 +139,16 @@ void GraphicsEllipseItem::calculateProbePath(QPointF startPoint) { double powerX = myScene->getPowerAt(currProbePath->at(i-1), charge, speedListX->at(i-1),speedListY->at(i-1), 'x'); double powerY = myScene->getPowerAt(currProbePath->at(i-1), charge, speedListX->at(i-1),speedListY->at(i-1), 'y'); - - //automatische Zeitschrittanpassung 0.008 - if (isAdaptiveStepControlEnabled()&&combinedSpeed != 0) timePerStep = getAdaptiveStepLength()/(combinedSpeed/meterPerPx); - //if (timePerStep < (1/10.0 * myScene->getTimePerStep())) timePerStep = 1/10.0 * myScene->getTimePerStep(); - //if (timePerStep > (19.0/10.0 * myScene->getTimePerStep())) timePerStep = 19.0/10.0 * myScene->getTimePerStep(); double combinedPower = sqrt(powerX*powerX+powerY*powerY); - if (isAdaptiveStepControlEnabled() && combinedPower !=0) { - timePerStep = fabs((-combinedSpeed + sqrt(combinedSpeed*combinedSpeed + 2*(combinedPower/myMasse)*getAdaptiveStepLength()*meterPerPx)) / (combinedPower/myMasse)); + + //automatische Zeitschrittanpassung + //if (isAdaptiveStepControlEnabled()&&combinedSpeed != 0) timePerStep = getAdaptiveStepLength()/(combinedSpeed/meterPerPx); + //if (isAdaptiveStepControlEnabled() && combinedPower !=0) { + // timePerStep = fabs((-combinedSpeed + sqrt(combinedSpeed*combinedSpeed + 2*(combinedPower/myMasse)*getAdaptiveStepLength()*meterPerPx)) / (combinedPower/myMasse)); + //} + if (isAdaptiveStepControlEnabled() && (combinedPower !=0||combinedSpeed != 0)) { + timePerStep = getAdaptiveStepLength()*meterPerPx/sqrt(2*(combinedPower/myMasse)*getAdaptiveStepLength()*meterPerPx+combinedSpeed*combinedSpeed); } - - //qDebug()<= 4) { - - - // double dvx = (-9*speedListX->at(i-4)+37*speedListX->at(i-3)-59*speedListX->at(i-2)+55*speedListX->at(i-1))/24.0; - // double dvy = (-9*speedListY->at(i-4)+37*speedListY->at(i-3)-59*speedListY->at(i-2)+55*speedListY->at(i-1))/24.0; - //double dvx = (xp) / timePerStep ; - //double dvy = (yp) / timePerStep ; - - // deltaDistX = timePerStep/24.0 *(speedListX->at(i-3)- 5*speedListX->at(i-2)+19*speedListX->at(i-1)+9*dvx); - // deltaDistY = timePerStep/24.0 *(speedListY->at(i-3)- 5*speedListY->at(i-2)+19*speedListY->at(i-1)+9*dvy); - //qDebug()<< deltaDistX<< " "<< deltaDistY; - - //} - - - - - - - -// double k1x = deltaDistX; -// double k1y = deltaDistY; -// QPointF k2point = QPointF(currProbePath->at(i-1).x() * meterPerPx + k1x/2.0,currProbePath->at(i-1).y()* meterPerPx + k1y/2.0); -// double k2x = myScene->getPowerAt( k2point , charge, k1x/timePerStep,k1y/timePerStep, 'x') /myMasse * timePerStep/2.0 * timePerStep; -// double k2y = myScene->getPowerAt( k2point , charge, k1x/timePerStep,k1y/timePerStep, 'y') /myMasse * timePerStep/2.0 * timePerStep; -// QPointF k3point = QPointF(currProbePath->at(i-1).x()* meterPerPx + k2x/2.0,currProbePath->at(i-1).y()* meterPerPx + k2y/2.0); -// double k3x = myScene->getPowerAt( k3point , charge, k2x/timePerStep,k2y/timePerStep, 'x') /myMasse * timePerStep/2.0 * timePerStep; -// double k3y = myScene->getPowerAt( k3point , charge, k2x/timePerStep,k2y/timePerStep, 'y') /myMasse * timePerStep/2.0 * timePerStep; -// QPointF k4point = QPointF(currProbePath->at(i-1).x() + k3x,currProbePath->at(i-1).y() + k3y); -// double k4x = myScene->getPowerAt( k4point , charge, k3x/timePerStep,k3y/timePerStep, 'x') /myMasse * timePerStep * timePerStep; -// double k4y = myScene->getPowerAt( k4point , charge, k3x/timePerStep,k3y/timePerStep, 'y') /myMasse * timePerStep * timePerStep; -// -// deltaDistX = (k1x +2*k2x+2*k3x+k4x)/6.0; -// deltaDistY = (k1y +2*k2y+2*k3y+k4y)/6.0; - - QPointF newPoint(currProbePath->at(i-1).x() + deltaDistX/meterPerPx ,currProbePath->at(i-1).y() + deltaDistY/meterPerPx); //Scrollbar int Probleme vermeiden @@ -205,7 +183,7 @@ void GraphicsEllipseItem::calculateProbePath(QPointF startPoint) { if (i%path_entry_step == 0 || i==currProbePath->count()) flightPath.lineTo(currProbePath->at(i)); } - qDebug()<< "Probe Path: " <<*currProbePath; + //qDebug()<< "Probe Path: " <<*currProbePath; //qDebug()<< "speed x: "<<*speedListX; //qDebug()<< "speed y: "<<*speedListY; //qDebug()<at(12); @@ -335,3 +313,13 @@ void GraphicsEllipseItem::setAdaptiveStepLength ( double theValue ) { adaptiveStepLength = theValue; emit adaptiveStepLengthChanged(theValue); } + + +QList< double >* GraphicsEllipseItem::getSpeedListX() const { + return speedListX; +} + + +QList< double >* GraphicsEllipseItem::getSpeedListY() const { + return speedListY; +} diff --git a/src/graphicsellipseitem.h b/src/graphicsellipseitem.h index 11670f4..8f389f7 100644 --- a/src/graphicsellipseitem.h +++ b/src/graphicsellipseitem.h @@ -54,6 +54,8 @@ class GraphicsEllipseItem : public QObject , public QGraphicsEllipseItem { double getRealSimulTime() const; bool isAdaptiveStepControlEnabled() const; double getAdaptiveStepLength() const; + QList< double >* getSpeedListX() const; + QList< double >* getSpeedListY() const; protected: @@ -111,7 +113,7 @@ class GraphicsEllipseItem : public QObject , public QGraphicsEllipseItem { void resetProbe(); void setAdaptiveStepControl ( bool theValue ); void setAdaptiveStepLength ( double theValue ); - + signals: void startSpeedXChanged(double speed); @@ -123,6 +125,11 @@ class GraphicsEllipseItem : public QObject , public QGraphicsEllipseItem { void ScenePosYChanged(double newY); void adaptiveStepControlChanged(bool truefalse); void adaptiveStepLengthChanged(double length); + + void ScenePosXChangedPixel(QString newX); + void ScenePosYChangedPixel(QString newY); + void ScenePosXChangedMeter(QString newX); + void ScenePosYChangedMeter(QString newY); diff --git a/src/lsim.cpp b/src/lsim.cpp index dd9f8fc..547e89a 100644 --- a/src/lsim.cpp +++ b/src/lsim.cpp @@ -301,6 +301,7 @@ void lsim::initWindowMode(WindowMode newMode) { removeDockWidget(probeItemDock); removeDockWidget(sceneDock); removeDockWidget(simulOptDock); + removeDockWidget(simulDataDock); gview->setDragMode(QGraphicsView::NoDrag); gview->setInteractive(true); @@ -310,9 +311,9 @@ void lsim::initWindowMode(WindowMode newMode) { addToolBar(sceneModeBar); addToolBar(upDownBar); - addDockWidget(Qt::LeftDockWidgetArea,fieldItemEditDock); addDockWidget(Qt::LeftDockWidgetArea,probeItemDock); addDockWidget(Qt::LeftDockWidgetArea,sceneDock); + addDockWidget(Qt::LeftDockWidgetArea,fieldItemEditDock); tabifyDockWidget(probeItemDock,sceneDock); tabifyDockWidget(sceneDock,fieldItemEditDock); sceneDock->show(); @@ -332,7 +333,10 @@ void lsim::initWindowMode(WindowMode newMode) { gview->setInteractive (false); addDockWidget(Qt::LeftDockWidgetArea,simulOptDock); + addDockWidget(Qt::LeftDockWidgetArea,simulDataDock); simulOptDock->setVisible(true); + simulDataDock->setVisible(true); + tabifyDockWidget(simulDataDock,simulOptDock); acts.itemEditModeAct->trigger(); simulscene->clearSelection(); @@ -501,6 +505,78 @@ void lsim::createDocks() { //************************************************************************ + //************************************************************************** + //simuldatadock + + //labels position + QLabel *xPxPosLabel = new QLabel("0,00 px"); + xPxPosLabel->setTextInteractionFlags(Qt::TextSelectableByMouse); + connect(simulscene->getProbeChargeItem(), SIGNAL(ScenePosXChangedPixel(QString)),xPxPosLabel, SLOT(setText(QString))); + + QLabel *yPxPosLabel = new QLabel("0,00 px"); + yPxPosLabel->setTextInteractionFlags(Qt::TextSelectableByMouse); + connect(simulscene->getProbeChargeItem(), SIGNAL(ScenePosYChangedPixel(QString)),yPxPosLabel, SLOT(setText(QString))); + + QLabel *xMPosLabel = new QLabel("0,00 m"); + xMPosLabel->setTextInteractionFlags(Qt::TextSelectableByMouse); + connect(simulscene->getProbeChargeItem(), SIGNAL(ScenePosXChangedMeter(QString)),xMPosLabel, SLOT(setText(QString))); + + QLabel *yMPosLabel = new QLabel("0,00 m"); + yMPosLabel->setTextInteractionFlags(Qt::TextSelectableByMouse); + connect(simulscene->getProbeChargeItem(), SIGNAL(ScenePosYChangedMeter(QString)),yMPosLabel, SLOT(setText(QString))); + //grid layout + QGridLayout *ProbePosGridLayout = new QGridLayout; + ProbePosGridLayout->addWidget(new QLabel("x:"),0,0,Qt::AlignCenter); + ProbePosGridLayout->addWidget(xPxPosLabel,0,1,Qt::AlignCenter); + ProbePosGridLayout->addWidget(xMPosLabel,0,2,Qt::AlignCenter); + ProbePosGridLayout->addWidget(new QLabel("y:"),1,0,Qt::AlignCenter); + ProbePosGridLayout->addWidget(yPxPosLabel,1,1,Qt::AlignCenter); + ProbePosGridLayout->addWidget(yMPosLabel,1,2,Qt::AlignCenter); + + QGroupBox *ProbePosGroupBox = new QGroupBox(tr("Position")); + ProbePosGroupBox->setLayout(ProbePosGridLayout); + + //labels speed + QLabel *xSpeedLabel = new QLabel("0,00 m/s"); + xSpeedLabel->setTextInteractionFlags(Qt::TextSelectableByMouse); + connect(simulscene, SIGNAL(probeSpeedXChanged(QString)),xSpeedLabel, SLOT(setText(QString))); + + QLabel *ySpeedLabel = new QLabel("0,00 m/s"); + ySpeedLabel->setTextInteractionFlags(Qt::TextSelectableByMouse); + connect(simulscene, SIGNAL(probespeedYChanged(QString)),ySpeedLabel, SLOT(setText(QString))); + + QLabel *gesSpeedLabel = new QLabel("0,00 m/s"); + gesSpeedLabel->setTextInteractionFlags(Qt::TextSelectableByMouse); + connect(simulscene, SIGNAL(probeSpeedChanged(QString)),gesSpeedLabel, SLOT(setText(QString))); + //grid layout + QGridLayout *ProbeSpeedGridLayout = new QGridLayout; + ProbeSpeedGridLayout->addWidget(new QLabel("x:"),0,0,Qt::AlignCenter); + ProbeSpeedGridLayout->addWidget(xSpeedLabel,0,1,Qt::AlignCenter); + ProbeSpeedGridLayout->addWidget(new QLabel("y:"),1,0,Qt::AlignCenter); + ProbeSpeedGridLayout->addWidget(ySpeedLabel,1,1,Qt::AlignCenter); + ProbeSpeedGridLayout->addWidget(new QLabel(tr("Betrag gesamt:")),2,0,Qt::AlignCenter); + ProbeSpeedGridLayout->addWidget(gesSpeedLabel,2,1,Qt::AlignCenter); + + QGroupBox *ProbeSpeedGroupBox = new QGroupBox(tr("Geschwindigkeit")); + ProbeSpeedGroupBox->setLayout(ProbeSpeedGridLayout); + + + + QVBoxLayout *simulDataVBoxLayout = new QVBoxLayout(); + simulDataVBoxLayout->addWidget(ProbePosGroupBox); + simulDataVBoxLayout->addWidget(ProbeSpeedGroupBox); + simulDataVBoxLayout->addStretch(); + + QWidget *simulDataWidget = new QWidget; + simulDataWidget->setLayout(simulDataVBoxLayout); + + simulDataDock = new QDockWidget(tr("Daten"), this); + simulDataDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea); + simulDataDock->setWidget(simulDataWidget); + + //************************************************************************ + + fieldItemEditDock = new QDockWidget(tr("Feldeinstellungen"), this); fieldItemEditDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea); diff --git a/src/lsim.h b/src/lsim.h index d9966b1..8c3e981 100644 --- a/src/lsim.h +++ b/src/lsim.h @@ -135,6 +135,8 @@ class lsim: public QMainWindow { QDockWidget *probeItemDock; QDockWidget *sceneDock; QDockWidget *simulOptDock; + QDockWidget *simulDataDock; + SimulScene *simulscene; diff --git a/src/simulscene.cpp b/src/simulscene.cpp index 57702c0..d41bfd1 100644 --- a/src/simulscene.cpp +++ b/src/simulscene.cpp @@ -38,6 +38,8 @@ #include #include #include +#include +#include SimulScene::SimulScene ( QObject* parent ) : QGraphicsScene ( parent ) { @@ -98,6 +100,8 @@ SimulScene::SimulScene ( QObject* parent ) : QGraphicsScene ( parent ) { ani->setTimeLine(timer); connect( timer, SIGNAL(finished()), this, SIGNAL(timeLineInRunningState()) ); + connect( timer, SIGNAL(valueChanged(qreal)), this, SLOT(handleTimeLineValueChange(qreal)) ); + setupVars(); @@ -107,6 +111,27 @@ void SimulScene::drawBackground ( QPainter * painter, const QRectF & rect ) { QGraphicsScene::drawBackground(painter,rect); } +void SimulScene::handleTimeLineValueChange(qreal value ) { + int step = 0; + QList > poslist = ani->posList(); + for(int i = 1;i poslist[i-1].first && value < poslist[i].first) { + step = floor((i-1) * ellipse1->getSpeedListY()->count()/poslist.count()); + break; + } + } + //qDebug()<"<getSpeedListY()->at(step); + double gesSpeed = sqrt(pow(ellipse1->getSpeedListX()->at(step),2) +pow(ellipse1->getSpeedListY()->at(step),2)); + QString newSpeedStringX(QLocale().toString(ellipse1->getSpeedListX()->at(step) ,'g',3)); + newSpeedStringX.append(" m/s"); + QString newSpeedStringY(QLocale().toString(ellipse1->getSpeedListY()->at(step),'g',3)); + newSpeedStringY.append(" m/s"); + QString newSpeedGes(QLocale().toString(gesSpeed,'g',3)); + newSpeedGes.append(" m/s"); + emit probeSpeedXChanged(newSpeedStringX); + emit probespeedYChanged(newSpeedStringY); + emit probeSpeedChanged(newSpeedGes); +} void SimulScene::setupVars() { //variablen initialisieren @@ -813,10 +838,13 @@ void SimulScene::startCalculation() { int currSteps = ellipse1->getCurrProbePath()->count(); int entry_step = ceil(currSteps/2500.0); //jeder entry_step(te) step wird eingetragen double totalTime = ellipse1->getElapsedTimeList()->at(currSteps-1); + aniStepList.clear(); for (int i=0; isetPosAt(ellipse1->getElapsedTimeList()->at(i)/totalTime, ellipse1->getCurrProbePath()->at(i) ); + //Zeianteil + double newStep = ellipse1->getElapsedTimeList()->at(i)/totalTime; + ani->setPosAt(newStep, ellipse1->getCurrProbePath()->at(i) ); + //aniStepList.insert(ani->, i); } } @@ -827,8 +855,6 @@ void SimulScene::startCalculation() { //brauchbare Animationsdauer bestimmen setTimeLineDuration(ellipse1->getFlightPath().length()/getPxPerSec() * 1000.0); - - } diff --git a/src/simulscene.h b/src/simulscene.h index 6050988..feea4f7 100644 --- a/src/simulscene.h +++ b/src/simulscene.h @@ -22,6 +22,7 @@ #include #include +#include class QTimeLine; class HomoEFieldItem; @@ -109,6 +110,7 @@ class SimulScene : public QGraphicsScene { void moveFieldItemOnBottom(QGraphicsItem* fieldItem); void moveSelectedFieldItemOnBottom(); void resetScene(); + void handleTimeLineValueChange(qreal value); private slots: void displayResizeRects(bool move = false); @@ -125,6 +127,10 @@ class SimulScene : public QGraphicsScene { void timeLineDurationChanged(int duration); void timeLineInRunningState(bool yesno = false); void realSimulTimeChanged(QString theString); + + void probeSpeedXChanged(QString text); + void probespeedYChanged(QString text); + void probeSpeedChanged(QString text); private: QTimeLine *timer; @@ -159,6 +165,7 @@ class SimulScene : public QGraphicsScene { QGraphicsPathItem *pathItem1; QListWidget* fieldListWidget; + QMap aniStepList; //rechtecke zur groesenaenderung struct resizeRects {