Probeladungsplatzierung hinzugefuegt, kleine verbesserungen

git-svn-id: http://svn.lsim.tuxzone.org/trunk@16 4bec179b-ab65-46ed-a5f8-55b8b5c735d0
This commit is contained in:
catdog2
2008-11-15 13:55:29 +00:00
parent 3dc80bdeb0
commit 12fd597883
9 changed files with 84 additions and 26 deletions

Binary file not shown.

View File

@@ -1,25 +1,40 @@
<?xml version = '1.0' encoding = 'UTF-8'?> <?xml version = '1.0' encoding = 'UTF-8'?>
<!DOCTYPE KDevPrjSession> <!DOCTYPE KDevPrjSession>
<KDevPrjSession> <KDevPrjSession>
<DocsAndViews NumberOfDocuments="6" > <DocsAndViews NumberOfDocuments="11" >
<Doc0 NumberOfViews="1" URL="file:///mnt/sdb1/c%2B%2B/lsim/src/simulscene.h" > <Doc0 NumberOfViews="1" URL="file:///mnt/sdb1/c%2B%2B/lsim/src/simulscene.h" >
<View0 Encoding="" line="90" Type="Source" /> <View0 Encoding="" line="62" Type="Source" />
</Doc0> </Doc0>
<Doc1 NumberOfViews="1" URL="file:///mnt/sdb1/c%2B%2B/lsim/src/simulscene.cpp" > <Doc1 NumberOfViews="1" URL="file:///mnt/sdb1/c%2B%2B/lsim/src/simulscene.cpp" >
<View0 Encoding="" line="691" Type="Source" /> <View0 Encoding="" line="44" Type="Source" />
</Doc1> </Doc1>
<Doc2 NumberOfViews="1" URL="file:///mnt/sdb1/c%2B%2B/lsim/src/graphicsellipseitem.h" > <Doc2 NumberOfViews="1" URL="file:///mnt/sdb1/c%2B%2B/lsim/src/fielditem.h" >
<View0 Encoding="" line="22" Type="Source" /> <View0 Encoding="" line="45" Type="Source" />
</Doc2> </Doc2>
<Doc3 NumberOfViews="1" URL="file:///mnt/sdb1/c%2B%2B/lsim/src/graphicsellipseitem.cpp" > <Doc3 NumberOfViews="1" URL="file:///mnt/sdb1/c%2B%2B/lsim/src/homobfielditem.h" >
<View0 Encoding="" line="205" Type="Source" /> <View0 Encoding="" line="29" Type="Source" />
</Doc3> </Doc3>
<Doc4 NumberOfViews="1" URL="file:///mnt/sdb1/c%2B%2B/lsim/src/homobfielditem.cpp" > <Doc4 NumberOfViews="1" URL="file:///mnt/sdb1/c%2B%2B/lsim/src/homobfieldwidget.h" >
<View0 Encoding="" line="57" Type="Source" /> <View0 Encoding="" line="32" Type="Source" />
</Doc4> </Doc4>
<Doc5 NumberOfViews="1" URL="file:///mnt/sdb1/c%2B%2B/lsim/src/lsim.cpp" > <Doc5 NumberOfViews="1" URL="file:///mnt/sdb1/c%2B%2B/lsim/src/lsim.h" >
<View0 Encoding="" line="58" Type="Source" /> <View0 Encoding="" line="81" Type="Source" />
</Doc5> </Doc5>
<Doc6 NumberOfViews="1" URL="file:///mnt/sdb1/c%2B%2B/lsim/src/homobfieldwidget.cpp" >
<View0 Encoding="" line="97" Type="Source" />
</Doc6>
<Doc7 NumberOfViews="1" URL="file:///mnt/sdb1/c%2B%2B/lsim/src/lsim.cpp" >
<View0 Encoding="" line="171" Type="Source" />
</Doc7>
<Doc8 NumberOfViews="1" URL="file:///mnt/sdb1/c%2B%2B/lsim/src/homoefielditem.h" >
<View0 Encoding="" line="62" Type="Source" />
</Doc8>
<Doc9 NumberOfViews="1" URL="file:///mnt/sdb1/c%2B%2B/lsim/src/homoefielditem.cpp" >
<View0 Encoding="" line="30" Type="Source" />
</Doc9>
<Doc10 NumberOfViews="1" URL="file:///mnt/sdb1/c%2B%2B/lsim/src/homobfielditem.cpp" >
<View0 Encoding="" line="36" Type="Source" />
</Doc10>
</DocsAndViews> </DocsAndViews>
<pluginList> <pluginList>
<kdevdebugger> <kdevdebugger>
@@ -38,7 +53,7 @@
<bookmarks/> <bookmarks/>
</kdevbookmarks> </kdevbookmarks>
<kdevvalgrind> <kdevvalgrind>
<executable path="" params="" /> <executable path="/mnt/sdb1/c++/lsim/src/../bin/lsim" params="" />
<valgrind path="/usr/bin/valgrind" params=" --tool=memcheck --leak-check=yes" /> <valgrind path="/usr/bin/valgrind" params=" --tool=memcheck --leak-check=yes" />
<calltree path="/usr/bin/valgrind" params="--tool=callgrind" /> <calltree path="/usr/bin/valgrind" params="--tool=callgrind" />
<kcachegrind path="/usr/bin/kcachegrind" /> <kcachegrind path="/usr/bin/kcachegrind" />

View File

@@ -30,8 +30,8 @@
#include "constants.h" #include "constants.h"
GraphicsEllipseItem::GraphicsEllipseItem() { GraphicsEllipseItem::GraphicsEllipseItem() {
setFlag(ItemIsMovable); //setFlag(ItemIsMovable);
setFlag(ItemIsSelectable); //setFlag(ItemIsSelectable);
setFlag(ItemIsFocusable); setFlag(ItemIsFocusable);
//setCacheMode(QGraphicsItem::DeviceCoordinateCache); //setCacheMode(QGraphicsItem::DeviceCoordinateCache);
//startTimer(100); //startTimer(100);

View File

@@ -23,7 +23,7 @@
GraphicsView::GraphicsView(): QGraphicsView() { GraphicsView::GraphicsView(): QGraphicsView() {
setMinimumSize(900,700); //setMinimumSize(900,700);
//setDragMode(QGraphicsView::RubberBandDrag); //setDragMode(QGraphicsView::RubberBandDrag);

View File

@@ -40,7 +40,6 @@
lsim::lsim() { lsim::lsim() {
gview = new GraphicsView(); gview = new GraphicsView();
setCentralWidget (gview); setCentralWidget (gview);
createScene(); createScene();
createActions(); createActions();
simulscene->setSceneMode(SimulScene::FieldItemEdit); simulscene->setSceneMode(SimulScene::FieldItemEdit);
@@ -82,11 +81,11 @@ void lsim::createActions() {
acts.calculate = new QAction (tr ("Berechnen"), this); acts.calculate = new QAction (tr ("Berechnen"), this);
acts.calculate->setStatusTip (tr ("Flugbahn berechnen")); 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 = new QAction (tr ("Timer Start"), this);
acts.timerStart->setStatusTip (tr ("Timer starten")); 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 = new QAction (tr ("Timer Stop"), this);
acts.timerStop->setStatusTip (tr ("Timer stoppen")); acts.timerStop->setStatusTip (tr ("Timer stoppen"));
@@ -112,11 +111,17 @@ void lsim::createActions() {
acts.insertBFieldItemAct->setStatusTip (tr ("B-Feld Einfuegen")); acts.insertBFieldItemAct->setStatusTip (tr ("B-Feld Einfuegen"));
acts.insertBFieldItemAct->setCheckable(true); acts.insertBFieldItemAct->setCheckable(true);
acts.insertBFieldItemAct->setData(QVariant(SimulScene::HomoBFieldItemInsert)); 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 = new QActionGroup(this);
modeChangeActGroup->addAction(acts.itemEditModeAct); modeChangeActGroup->addAction(acts.itemEditModeAct);
modeChangeActGroup->addAction(acts.insertEFieldItemAct); modeChangeActGroup->addAction(acts.insertEFieldItemAct);
modeChangeActGroup->addAction(acts.insertBFieldItemAct); modeChangeActGroup->addAction(acts.insertBFieldItemAct);
modeChangeActGroup->addAction(acts.probeChargeItemPlaceAct);
connect (modeChangeActGroup, SIGNAL (triggered(QAction*)), this, SLOT (actModeSwitcher(QAction*))); connect (modeChangeActGroup, SIGNAL (triggered(QAction*)), this, SLOT (actModeSwitcher(QAction*)));
connect (simulscene, SIGNAL(sceneModeChanged(int)) , this, SLOT(setSceneMode(int))); connect (simulscene, SIGNAL(sceneModeChanged(int)) , this, SLOT(setSceneMode(int)));
@@ -154,6 +159,7 @@ void lsim::createToolBars() {
editToolBar->addAction(acts.itemEditModeAct); editToolBar->addAction(acts.itemEditModeAct);
editToolBar->addAction(acts.insertEFieldItemAct); editToolBar->addAction(acts.insertEFieldItemAct);
editToolBar->addAction(acts.insertBFieldItemAct); editToolBar->addAction(acts.insertBFieldItemAct);
editToolBar->addAction(acts.probeChargeItemPlaceAct);
} }
void lsim::createStatusBar() { void lsim::createStatusBar() {
@@ -206,7 +212,7 @@ void lsim::createDocks() {
//timer laenge Box //timer laenge Box
QSpinBox *timer_box = new QSpinBox; QSpinBox *timer_box = new QSpinBox;
timer_box->setRange(1, 1e+10); timer_box->setRange(1.0, 1e+10);
timer_box->setKeyboardTracking(false); timer_box->setKeyboardTracking(false);
timer_box->setValue(simulscene->getTimeLineDuration()); timer_box->setValue(simulscene->getTimeLineDuration());
timer_box->setSuffix(" ms"); timer_box->setSuffix(" ms");
@@ -273,9 +279,7 @@ void lsim::createDocks() {
} }
void lsim::actModeSwitcher(QAction *action) { void lsim::actModeSwitcher(QAction *action) {
if (action->data().toInt() == SimulScene::FieldItemEdit) simulscene->setSceneMode(SimulScene::FieldItemEdit); simulscene->setSceneMode((SimulScene::SceneMode)action->data().toInt());
if (action->data().toInt() == SimulScene::HomoEFieldItemInsert) simulscene->setSceneMode(SimulScene::HomoEFieldItemInsert);
if (action->data().toInt() == SimulScene::HomoBFieldItemInsert) simulscene->setSceneMode(SimulScene::HomoBFieldItemInsert);
} }
void lsim::setSceneMode(int mode) { void lsim::setSceneMode(int mode) {
@@ -333,3 +337,12 @@ void lsim::updateDockFieldWidget() {
fieldItemEditDock->setWidget(currDockWidget); 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();
}

View File

@@ -54,6 +54,8 @@ class lsim: public QMainWindow {
void actModeSwitcher(QAction *action); void actModeSwitcher(QAction *action);
void setSceneMode(int mode); void setSceneMode(int mode);
void updateDockFieldWidget(); void updateDockFieldWidget();
void startCalculation();
void startTimer();
private: private:
void createActions(); void createActions();
@@ -86,6 +88,7 @@ class lsim: public QMainWindow {
QAction *itemEditModeAct; QAction *itemEditModeAct;
QAction *insertEFieldItemAct; QAction *insertEFieldItemAct;
QAction *insertBFieldItemAct; QAction *insertBFieldItemAct;
QAction *probeChargeItemPlaceAct;
}; };
Actions acts; Actions acts;

View File

@@ -48,6 +48,7 @@ void ProbeChargeWidget::createWidget()
startSpeedYBox->setDecimals(50); startSpeedYBox->setDecimals(50);
startSpeedYBox->setDisplayDecimals(3); startSpeedYBox->setDisplayDecimals(3);
startSpeedYBox->setRange(-3e+8, 3e+8); startSpeedYBox->setRange(-3e+8, 3e+8);
startSpeedYBox->setSuffix(" m/s");
startSpeedYBox->setKeyboardTracking(false); startSpeedYBox->setKeyboardTracking(false);
connect(startSpeedYBox, SIGNAL(valueChanged(double)), ellipseItem, SLOT(setStartSpeedY(double)) ); connect(startSpeedYBox, SIGNAL(valueChanged(double)), ellipseItem, SLOT(setStartSpeedY(double)) );
connect(ellipseItem, SIGNAL(startSpeedYChanged(double)), startSpeedYBox, SLOT(setValue(double)) ); connect(ellipseItem, SIGNAL(startSpeedYChanged(double)), startSpeedYBox, SLOT(setValue(double)) );
@@ -56,6 +57,7 @@ void ProbeChargeWidget::createWidget()
startSpeedXBox->setDecimals(50); startSpeedXBox->setDecimals(50);
startSpeedXBox->setDisplayDecimals(3); startSpeedXBox->setDisplayDecimals(3);
startSpeedXBox->setRange(-3e+8, 3e+8); startSpeedXBox->setRange(-3e+8, 3e+8);
startSpeedXBox->setSuffix(" m/s");
startSpeedXBox->setKeyboardTracking(false); startSpeedXBox->setKeyboardTracking(false);
connect(startSpeedXBox, SIGNAL(valueChanged(double)), ellipseItem, SLOT(setStartSpeedX(double)) ); connect(startSpeedXBox, SIGNAL(valueChanged(double)), ellipseItem, SLOT(setStartSpeedX(double)) );
connect(ellipseItem, SIGNAL(startSpeedXChanged(double)), startSpeedXBox, SLOT(setValue(double)) ); connect(ellipseItem, SIGNAL(startSpeedXChanged(double)), startSpeedXBox, SLOT(setValue(double)) );

View File

@@ -48,6 +48,7 @@ SimulScene::SimulScene ( QObject* parent ) : QGraphicsScene ( parent ) {
currHomoEfieldEditItem = 0; currHomoEfieldEditItem = 0;
currHomoBfieldInsertItem = 0; currHomoBfieldInsertItem = 0;
currHomoBfieldEditItem = 0; currHomoBfieldEditItem = 0;
ChargePlacementInProgress = false;
createResizeRects(); createResizeRects();
@@ -124,6 +125,11 @@ void SimulScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) {
addItem(currHomoBfieldInsertItem); addItem(currHomoBfieldInsertItem);
QApplication::setOverrideCursor(QCursor(Qt::SizeFDiagCursor)); QApplication::setOverrideCursor(QCursor(Qt::SizeFDiagCursor));
break; break;
case ProbeChargeItemPlace:
if (mouseEvent->button() != Qt::LeftButton) break; //benutze nur linke maustaste
ChargePlacementInProgress = true;
ellipse1->setPos(mouseEvent->scenePos());
break;
default: default:
if (itemAt(mouseEvent->scenePos())->data(0) == ResizeRectItem && mouseEvent->button()==Qt::LeftButton) { if (itemAt(mouseEvent->scenePos())->data(0) == ResizeRectItem && mouseEvent->button()==Qt::LeftButton) {
pressedResizeItem = itemAt(mouseEvent->scenePos()); pressedResizeItem = itemAt(mouseEvent->scenePos());
@@ -206,6 +212,11 @@ void SimulScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) {
//if(mouseEvent->scenePos() != mouseEvent->lastScenePos()) displayResizeRects(true); //if(mouseEvent->scenePos() != mouseEvent->lastScenePos()) displayResizeRects(true);
} }
else if (ChargePlacementInProgress) {
if (myMode == ProbeChargeItemPlace) {
ellipse1->setPos(mouseEvent->scenePos());
}
}
else { else {
QGraphicsScene::mouseMoveEvent(mouseEvent); QGraphicsScene::mouseMoveEvent(mouseEvent);
if (mouseEvent->buttons() == Qt::LeftButton) if (mouseEvent->buttons() == Qt::LeftButton)
@@ -295,6 +306,10 @@ void SimulScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) {
update(); update();
QApplication::restoreOverrideCursor(); QApplication::restoreOverrideCursor();
} }
else if (ChargePlacementInProgress) {
ChargePlacementInProgress = false;
setSceneMode(FieldItemEdit);
}
pressedResizeItem = 0; pressedResizeItem = 0;
currHomoEfieldInsertItem = 0; currHomoEfieldInsertItem = 0;
currHomoBfieldInsertItem = 0; currHomoBfieldInsertItem = 0;
@@ -585,6 +600,10 @@ void SimulScene::setTimePerStep(double time) {
\fn SimulScene::startCalculation() \fn SimulScene::startCalculation()
*/ */
void SimulScene::startCalculation() { void SimulScene::startCalculation() {
//evtl laufenden timer stoppen
stopTimer();
//leeren Pfad setezen
pathItem1->setPath(QPainterPath()); pathItem1->setPath(QPainterPath());
//Feld Item Listen erzeugen (viel schneller, als jedes mal items(point) durchlaufen) //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 currSteps = ellipse1->getCurrProbePath()->count();
int entry_step = ceil(currSteps/2500.0); //jeder entry_step(te) step wird eingetragen int entry_step = ceil(currSteps/2500.0); //jeder entry_step(te) step wird eingetragen
for (int i=0; i<currSteps; ++i) { for (int i=0; i<currSteps; ++i) {
if (i%entry_step == 0 || i==currSteps) { if (i%entry_step == 0 || i==currSteps) {
ani->setPosAt(i/(double)currSteps, ellipse1->getCurrProbePath()->at(i) ); ani->setPosAt(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 double PowerRadAngle; //Winkel des Lorentzkraftvektors zur x-Achse im Bogenmass
if (myHomoBFieldItem->getIsDirectionIntoPlane()) { if (myHomoBFieldItem->getIsDirectionIntoPlane()) {
PowerRadAngle = speedRadAngle + PI/2.0;
} else {
PowerRadAngle = speedRadAngle - PI/2.0; PowerRadAngle = speedRadAngle - PI/2.0;
} else {
PowerRadAngle = speedRadAngle + PI/2.0;
} }
//qDebug()<< PowerRadAngle; //qDebug()<< PowerRadAngle;

View File

@@ -38,7 +38,12 @@ class QPainterPath;
class SimulScene : public QGraphicsScene { class SimulScene : public QGraphicsScene {
Q_OBJECT Q_OBJECT
public: public:
enum SceneMode {HomoEFieldItemInsert, FieldItemEdit, HomoBFieldItemInsert }; enum SceneMode {
HomoEFieldItemInsert,
FieldItemEdit,
HomoBFieldItemInsert,
ProbeChargeItemPlace
};
enum ItemType {ResizeRectItem}; enum ItemType {ResizeRectItem};
SimulScene ( QObject* parent = 0); SimulScene ( QObject* parent = 0);
qreal getHighestZIndexVisible(); //hoechsten z-index der sichtbaren items ausgeben qreal getHighestZIndexVisible(); //hoechsten z-index der sichtbaren items ausgeben
@@ -109,6 +114,8 @@ class SimulScene : public QGraphicsScene {
HomoBFieldItem *currHomoBfieldInsertItem; //Aktuell erstelltes Item HomoBFieldItem *currHomoBfieldInsertItem; //Aktuell erstelltes Item
HomoBFieldItem *currHomoBfieldEditItem; HomoBFieldItem *currHomoBfieldEditItem;
bool ChargePlacementInProgress; //ladung wird gerade platziert
QGraphicsItem *pressedResizeItem; QGraphicsItem *pressedResizeItem;
GraphicsEllipseItem *ellipse1; GraphicsEllipseItem *ellipse1;