diff --git a/lsim.kdevelop.pcs b/lsim.kdevelop.pcs index a70ecdc..a70360a 100644 Binary files a/lsim.kdevelop.pcs and b/lsim.kdevelop.pcs differ diff --git a/lsim.kdevses b/lsim.kdevses index af47d5e..4dd1d24 100644 --- a/lsim.kdevses +++ b/lsim.kdevses @@ -1,25 +1,40 @@ - + - + - + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + @@ -38,7 +53,7 @@ - + diff --git a/src/graphicsellipseitem.cpp b/src/graphicsellipseitem.cpp index 7559cd2..156bd98 100644 --- a/src/graphicsellipseitem.cpp +++ b/src/graphicsellipseitem.cpp @@ -30,8 +30,8 @@ #include "constants.h" GraphicsEllipseItem::GraphicsEllipseItem() { - setFlag(ItemIsMovable); - setFlag(ItemIsSelectable); + //setFlag(ItemIsMovable); + //setFlag(ItemIsSelectable); setFlag(ItemIsFocusable); //setCacheMode(QGraphicsItem::DeviceCoordinateCache); //startTimer(100); diff --git a/src/graphicsview.cpp b/src/graphicsview.cpp index c3fc91f..38fc2d4 100644 --- a/src/graphicsview.cpp +++ b/src/graphicsview.cpp @@ -23,7 +23,7 @@ GraphicsView::GraphicsView(): QGraphicsView() { - setMinimumSize(900,700); + //setMinimumSize(900,700); //setDragMode(QGraphicsView::RubberBandDrag); diff --git a/src/lsim.cpp b/src/lsim.cpp index b7a0fb2..6ff7b41 100644 --- a/src/lsim.cpp +++ b/src/lsim.cpp @@ -40,7 +40,6 @@ lsim::lsim() { gview = new GraphicsView(); setCentralWidget (gview); - createScene(); createActions(); simulscene->setSceneMode(SimulScene::FieldItemEdit); @@ -82,11 +81,11 @@ void lsim::createActions() { acts.calculate = new QAction (tr ("Berechnen"), this); acts.calculate->setStatusTip (tr ("Flugbahn berechnen")); - connect (acts.calculate, SIGNAL (triggered()), simulscene, SLOT (startCalculation())); + connect (acts.calculate, SIGNAL (triggered()), this, SLOT (startCalculation())); acts.timerStart = new QAction (tr ("Timer Start"), this); acts.timerStart->setStatusTip (tr ("Timer starten")); - connect (acts.timerStart, SIGNAL (triggered()), simulscene, SLOT (startTimer())); + connect (acts.timerStart, SIGNAL (triggered()), this, SLOT (startTimer())); acts.timerStop = new QAction (tr ("Timer Stop"), this); acts.timerStop->setStatusTip (tr ("Timer stoppen")); @@ -112,11 +111,17 @@ void lsim::createActions() { acts.insertBFieldItemAct->setStatusTip (tr ("B-Feld Einfuegen")); acts.insertBFieldItemAct->setCheckable(true); acts.insertBFieldItemAct->setData(QVariant(SimulScene::HomoBFieldItemInsert)); + + acts.probeChargeItemPlaceAct = new QAction (tr ("Ladung setzen"), this); + acts.probeChargeItemPlaceAct->setStatusTip (tr ("Probeladung neu platzieren")); + acts.probeChargeItemPlaceAct->setCheckable(true); + acts.probeChargeItemPlaceAct->setData(QVariant(SimulScene::ProbeChargeItemPlace)); modeChangeActGroup = new QActionGroup(this); modeChangeActGroup->addAction(acts.itemEditModeAct); modeChangeActGroup->addAction(acts.insertEFieldItemAct); modeChangeActGroup->addAction(acts.insertBFieldItemAct); + modeChangeActGroup->addAction(acts.probeChargeItemPlaceAct); connect (modeChangeActGroup, SIGNAL (triggered(QAction*)), this, SLOT (actModeSwitcher(QAction*))); connect (simulscene, SIGNAL(sceneModeChanged(int)) , this, SLOT(setSceneMode(int))); @@ -154,6 +159,7 @@ void lsim::createToolBars() { editToolBar->addAction(acts.itemEditModeAct); editToolBar->addAction(acts.insertEFieldItemAct); editToolBar->addAction(acts.insertBFieldItemAct); + editToolBar->addAction(acts.probeChargeItemPlaceAct); } void lsim::createStatusBar() { @@ -206,7 +212,7 @@ void lsim::createDocks() { //timer laenge Box QSpinBox *timer_box = new QSpinBox; - timer_box->setRange(1, 1e+10); + timer_box->setRange(1.0, 1e+10); timer_box->setKeyboardTracking(false); timer_box->setValue(simulscene->getTimeLineDuration()); timer_box->setSuffix(" ms"); @@ -273,9 +279,7 @@ void lsim::createDocks() { } void lsim::actModeSwitcher(QAction *action) { - if (action->data().toInt() == SimulScene::FieldItemEdit) simulscene->setSceneMode(SimulScene::FieldItemEdit); - if (action->data().toInt() == SimulScene::HomoEFieldItemInsert) simulscene->setSceneMode(SimulScene::HomoEFieldItemInsert); - if (action->data().toInt() == SimulScene::HomoBFieldItemInsert) simulscene->setSceneMode(SimulScene::HomoBFieldItemInsert); + simulscene->setSceneMode((SimulScene::SceneMode)action->data().toInt()); } void lsim::setSceneMode(int mode) { @@ -333,3 +337,12 @@ void lsim::updateDockFieldWidget() { fieldItemEditDock->setWidget(currDockWidget); } + +void lsim::startCalculation() { + if( qApp->focusWidget() !=0) qApp->focusWidget()->clearFocus(); + simulscene->startCalculation(); +} +void lsim::startTimer() { + if( qApp->focusWidget() !=0) qApp->focusWidget()->clearFocus(); + simulscene->startTimer(); +} diff --git a/src/lsim.h b/src/lsim.h index d074dc5..9f37772 100644 --- a/src/lsim.h +++ b/src/lsim.h @@ -54,6 +54,8 @@ class lsim: public QMainWindow { void actModeSwitcher(QAction *action); void setSceneMode(int mode); void updateDockFieldWidget(); + void startCalculation(); + void startTimer(); private: void createActions(); @@ -86,6 +88,7 @@ class lsim: public QMainWindow { QAction *itemEditModeAct; QAction *insertEFieldItemAct; QAction *insertBFieldItemAct; + QAction *probeChargeItemPlaceAct; }; Actions acts; diff --git a/src/probechargewidget.cpp b/src/probechargewidget.cpp index 0986f5c..400a90d 100644 --- a/src/probechargewidget.cpp +++ b/src/probechargewidget.cpp @@ -48,6 +48,7 @@ void ProbeChargeWidget::createWidget() startSpeedYBox->setDecimals(50); startSpeedYBox->setDisplayDecimals(3); startSpeedYBox->setRange(-3e+8, 3e+8); + startSpeedYBox->setSuffix(" m/s"); startSpeedYBox->setKeyboardTracking(false); connect(startSpeedYBox, SIGNAL(valueChanged(double)), ellipseItem, SLOT(setStartSpeedY(double)) ); connect(ellipseItem, SIGNAL(startSpeedYChanged(double)), startSpeedYBox, SLOT(setValue(double)) ); @@ -56,6 +57,7 @@ void ProbeChargeWidget::createWidget() startSpeedXBox->setDecimals(50); startSpeedXBox->setDisplayDecimals(3); startSpeedXBox->setRange(-3e+8, 3e+8); + startSpeedXBox->setSuffix(" m/s"); startSpeedXBox->setKeyboardTracking(false); connect(startSpeedXBox, SIGNAL(valueChanged(double)), ellipseItem, SLOT(setStartSpeedX(double)) ); connect(ellipseItem, SIGNAL(startSpeedXChanged(double)), startSpeedXBox, SLOT(setValue(double)) ); diff --git a/src/simulscene.cpp b/src/simulscene.cpp index 0517191..612128d 100644 --- a/src/simulscene.cpp +++ b/src/simulscene.cpp @@ -48,6 +48,7 @@ SimulScene::SimulScene ( QObject* parent ) : QGraphicsScene ( parent ) { currHomoEfieldEditItem = 0; currHomoBfieldInsertItem = 0; currHomoBfieldEditItem = 0; + ChargePlacementInProgress = false; createResizeRects(); @@ -124,6 +125,11 @@ void SimulScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) { addItem(currHomoBfieldInsertItem); QApplication::setOverrideCursor(QCursor(Qt::SizeFDiagCursor)); break; + case ProbeChargeItemPlace: + if (mouseEvent->button() != Qt::LeftButton) break; //benutze nur linke maustaste + ChargePlacementInProgress = true; + ellipse1->setPos(mouseEvent->scenePos()); + break; default: if (itemAt(mouseEvent->scenePos())->data(0) == ResizeRectItem && mouseEvent->button()==Qt::LeftButton) { pressedResizeItem = itemAt(mouseEvent->scenePos()); @@ -206,6 +212,11 @@ void SimulScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) { //if(mouseEvent->scenePos() != mouseEvent->lastScenePos()) displayResizeRects(true); } + else if (ChargePlacementInProgress) { + if (myMode == ProbeChargeItemPlace) { + ellipse1->setPos(mouseEvent->scenePos()); + } + } else { QGraphicsScene::mouseMoveEvent(mouseEvent); if (mouseEvent->buttons() == Qt::LeftButton) @@ -295,6 +306,10 @@ void SimulScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) { update(); QApplication::restoreOverrideCursor(); } + else if (ChargePlacementInProgress) { + ChargePlacementInProgress = false; + setSceneMode(FieldItemEdit); + } pressedResizeItem = 0; currHomoEfieldInsertItem = 0; currHomoBfieldInsertItem = 0; @@ -585,6 +600,10 @@ void SimulScene::setTimePerStep(double time) { \fn SimulScene::startCalculation() */ void SimulScene::startCalculation() { + //evtl laufenden timer stoppen + stopTimer(); + + //leeren Pfad setezen pathItem1->setPath(QPainterPath()); //Feld Item Listen erzeugen (viel schneller, als jedes mal items(point) durchlaufen) @@ -611,7 +630,6 @@ void SimulScene::startCalculation() { int currSteps = ellipse1->getCurrProbePath()->count(); int entry_step = ceil(currSteps/2500.0); //jeder entry_step(te) step wird eingetragen for (int i=0; isetPosAt(i/(double)currSteps, ellipse1->getCurrProbePath()->at(i) ); } @@ -705,9 +723,9 @@ double SimulScene::getPowerAt(QPointF point, double charge, double speedX, doubl double PowerRadAngle; //Winkel des Lorentzkraftvektors zur x-Achse im Bogenmass if (myHomoBFieldItem->getIsDirectionIntoPlane()) { - PowerRadAngle = speedRadAngle + PI/2.0; - } else { PowerRadAngle = speedRadAngle - PI/2.0; + } else { + PowerRadAngle = speedRadAngle + PI/2.0; } //qDebug()<< PowerRadAngle; diff --git a/src/simulscene.h b/src/simulscene.h index a888f44..1e32828 100644 --- a/src/simulscene.h +++ b/src/simulscene.h @@ -38,7 +38,12 @@ class QPainterPath; class SimulScene : public QGraphicsScene { Q_OBJECT public: - enum SceneMode {HomoEFieldItemInsert, FieldItemEdit, HomoBFieldItemInsert }; + enum SceneMode { + HomoEFieldItemInsert, + FieldItemEdit, + HomoBFieldItemInsert, + ProbeChargeItemPlace + }; enum ItemType {ResizeRectItem}; SimulScene ( QObject* parent = 0); qreal getHighestZIndexVisible(); //hoechsten z-index der sichtbaren items ausgeben @@ -109,6 +114,8 @@ class SimulScene : public QGraphicsScene { HomoBFieldItem *currHomoBfieldInsertItem; //Aktuell erstelltes Item HomoBFieldItem *currHomoBfieldEditItem; + bool ChargePlacementInProgress; //ladung wird gerade platziert + QGraphicsItem *pressedResizeItem; GraphicsEllipseItem *ellipse1;