anfaengliche z-index vertauschung

git-svn-id: http://svn.lsim.tuxzone.org/trunk@17 4bec179b-ab65-46ed-a5f8-55b8b5c735d0
This commit is contained in:
catdog2
2008-11-16 22:18:15 +00:00
parent 12fd597883
commit 7c332f2358
8 changed files with 172 additions and 61 deletions

View File

@@ -20,13 +20,16 @@
#include "fielditem.h"
#include "homoefielditem.h"
#include "homobfielditem.h"
#include "simulscene.h"
#include <QGraphicsSceneWheelEvent>
#include <QDebug>
#include <QMenu>;
FieldItem::FieldItem()
: QGraphicsItem() {
myRotation = 0;
myScenePos = QPointF(0,0);
mySimulScene = dynamic_cast<SimulScene*> (scene());
}
@@ -131,11 +134,13 @@ void FieldItem::wheelEvent(QGraphicsSceneWheelEvent * event) {
setRotation(getRotation()+( (event->delta()/abs(event->delta()))*5 ));
}
}
void FieldItem::contextMenuEvent ( QGraphicsSceneContextMenuEvent * event ){
}
/*!
\fn FieldItem::getRotation()
*/
int FieldItem::getRotation()
{
int FieldItem::getRotation() {
return myRotation;
}
}

View File

@@ -29,6 +29,7 @@
*/
class QPointF;
class QGraphicsSceneWheelEvent;
class SimulScene;
class FieldItem :public QObject, public QGraphicsItem {
Q_OBJECT
public:
@@ -57,10 +58,11 @@ class FieldItem :public QObject, public QGraphicsItem {
protected:
virtual void wheelEvent(QGraphicsSceneWheelEvent * event);
virtual void contextMenuEvent ( QGraphicsSceneContextMenuEvent * event );
QPointF myScenePos;
int myRotation;
QRectF sizeRect;
SimulScene* mySimulScene;
public slots:
virtual void handleSceneChange(const QList<QRectF> & region);

View File

@@ -19,6 +19,7 @@
***************************************************************************/
#include "homobfieldwidget.h"
#include "homobfielditem.h"
#include "simulscene.h"
#include "expdoublespinbox.h"
#include <QVBoxLayout>
#include <QtDebug>
@@ -27,6 +28,7 @@
#include <QLabel>
#include <QRadioButton>
#include <QButtonGroup>
#include <QPushButton>
HomoBFieldWidget::HomoBFieldWidget(QWidget* parent, Qt::WindowFlags f, HomoBFieldItem* bField):QWidget(parent, f) {
homoBField = bField;
@@ -108,6 +110,7 @@ void HomoBFieldWidget::createWidget() {
connect(homoBField ,SIGNAL(directionChanged(bool)),intoPlaneButton, SLOT(setChecked(bool)) );
connect(intoPlaneButton, SIGNAL(toggled(bool)),homoBField ,SLOT(setIsDirectionIntoPlane(bool)) );
QButtonGroup* directionGroup = new QButtonGroup();
directionGroup->addButton(intoPlaneButton);
directionGroup->addButton(outOfPlaneButton);
@@ -120,14 +123,16 @@ void HomoBFieldWidget::createWidget() {
QGroupBox* fieldDirectionBox = new QGroupBox(tr("Feldrichtung"));
fieldDirectionBox->setLayout(directionGridLayout);
//SimulScene* theScene = dynamic_cast<SimulScene*>(homoBField->scene());
//qDebug()<<theScene;
//QPushButton* downButton = new QPushButton("down");
//connect( downButton,SIGNAL(clicked()),theScene, SLOT(moveSelectedFieldItemDown()) );
QVBoxLayout * mainLayout = new QVBoxLayout(this);
mainLayout -> addWidget(geometryBox);
mainLayout -> addWidget(fieldDirectionBox);
mainLayout -> addWidget(fieldConstantsBox);
//mainLayout -> addWidget(downButton);
mainLayout -> addStretch();
QWidget::setTabOrder (posXBox, posYBox);

View File

@@ -36,6 +36,9 @@ HomoEFieldItem::HomoEFieldItem(QRectF sizeRect)
setOuterPenWidth (2);
//rotateslot(66);
//QGraphicsRectItem * testItem = new QGraphicsRectItem(QRectF(-10,-10,6,6), this);
//testItem->setBrush(Qt::SolidPattern);

View File

@@ -33,6 +33,7 @@
#include <QStringListModel>
#include <QLabel>
#include <QGridLayout>
#include <QListWidget>
#include "expdoublespinbox.h"
#include "homoefieldwidget.h"
@@ -95,6 +96,13 @@ void lsim::createActions() {
acts.exitAct->setStatusTip (tr ("Die Anwendung beenden"));
connect (acts.exitAct, SIGNAL (triggered()), qApp, SLOT (quit()));
acts.moveItemDown = new QAction (tr ("runter"), this);
acts.moveItemDown->setStatusTip (tr ("runter"));
connect (acts.moveItemDown, SIGNAL (triggered()), simulscene, SLOT (moveSelectedFieldItemDown()));
acts.moveItemUp = new QAction (tr ("rauf"), this);
acts.moveItemUp->setStatusTip (tr ("rauf"));
connect (acts.moveItemUp, SIGNAL (triggered()), simulscene, SLOT (moveSelectedFieldItemUp()));
//Edit, insert, Modechange
acts.itemEditModeAct = new QAction (tr ("Edit"), this);
@@ -153,13 +161,17 @@ void lsim::createToolBars() {
fileToolBar->addAction(acts.timerStart);
fileToolBar->addAction(acts.timerStop);
editToolBar = addToolBar (tr ("Edit"));
editToolBar->addAction(acts.itemEditModeAct);
editToolBar->addAction(acts.insertEFieldItemAct);
editToolBar->addAction(acts.insertBFieldItemAct);
editToolBar->addAction(acts.probeChargeItemPlaceAct);
upDownToolBar=addToolBar(tr("updown"));
upDownToolBar->addAction(acts.moveItemDown);
upDownToolBar->addAction(acts.moveItemUp);
}
void lsim::createStatusBar() {
@@ -253,6 +265,7 @@ void lsim::createDocks() {
sceneDock = new QDockWidget(tr("Allgemeines"), this);
sceneDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea);
sceneDock->setWidget((allgWidget));
//sceneDock->setFeatures(QDockWidget::NoDockWidgetFeatures);
addDockWidget(Qt::LeftDockWidgetArea, sceneDock);
//**************************************************************************
@@ -261,6 +274,7 @@ void lsim::createDocks() {
fieldItemEditDock = new QDockWidget(tr("Feldeinstellungen"), this);
fieldItemEditDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea);
fieldItemEditDock->setWidget(new QWidget);
//fieldItemEditDock->setFeatures(QDockWidget::NoDockWidgetFeatures);
addDockWidget(Qt::LeftDockWidgetArea, fieldItemEditDock);
connect (simulscene, SIGNAL(selectionChanged ()) , this, SLOT(updateDockFieldWidget()));
updateDockFieldWidget();
@@ -268,6 +282,7 @@ void lsim::createDocks() {
probeItemDock = new QDockWidget(tr("Probleladung"), this);
probeItemDock->setWidget(simulscene->getProbeDockWidget());
//probeItemDock->setFeatures(QDockWidget::NoDockWidgetFeatures);
addDockWidget(Qt::LeftDockWidgetArea, probeItemDock);
@@ -316,17 +331,11 @@ lsim::~lsim() {
\fn lsim::updateDockFieldWidget()
*/
void lsim::updateDockFieldWidget() {
QStringListModel *model = new QStringListModel();
QStringList list;
list << "a" << "b" << "c";
model->setStringList(list);
QListView * lview = new QListView;
lview->setModel(model);
QLabel* currLabel = new QLabel(tr("Bitte ein Feld ausw\344hlen"));
currLabel->setWordWrap(true);
currLabel->setAlignment(Qt::AlignCenter);
QWidget *currDockWidget =currLabel;
QWidget *currDockWidget =simulscene->getFieldListWidget();
if(simulscene->selectedItems().count() == 1) {
QGraphicsItem *currItem = simulscene->selectedItems().first();
if (FieldItem::isFieldItem(currItem)) {
@@ -346,3 +355,6 @@ void lsim::startTimer() {
if( qApp->focusWidget() !=0) qApp->focusWidget()->clearFocus();
simulscene->startTimer();
}
void lsim::handleDockLocationChange() {
}

View File

@@ -56,6 +56,7 @@ class lsim: public QMainWindow {
void updateDockFieldWidget();
void startCalculation();
void startTimer();
void handleDockLocationChange();
private:
void createActions();
@@ -74,6 +75,7 @@ class lsim: public QMainWindow {
QToolBar *fileToolBar;
QToolBar *editToolBar;
QToolBar *upDownToolBar;
struct Actions {
QAction *aboutAct;
@@ -85,6 +87,9 @@ class lsim: public QMainWindow {
QAction *timerStart;
QAction *timerStop;
QAction *moveItemDown;
QAction *moveItemUp;
QAction *itemEditModeAct;
QAction *insertEFieldItemAct;
QAction *insertBFieldItemAct;

View File

@@ -35,6 +35,7 @@
#include <QGraphicsItemGroup>
#include <QPainterPath>
#include <QGraphicsPathItem>
#include <QListWidget>
SimulScene::SimulScene ( QObject* parent ) : QGraphicsScene ( parent ) {
@@ -44,6 +45,8 @@ SimulScene::SimulScene ( QObject* parent ) : QGraphicsScene ( parent ) {
//setMeterPerPx(1/1000.0);
setMeterPerPx(0.01);
fieldListWidget = new QListWidget();
currHomoEfieldInsertItem = 0;
currHomoEfieldEditItem = 0;
currHomoBfieldInsertItem = 0;
@@ -100,6 +103,7 @@ SimulScene::SimulScene ( QObject* parent ) : QGraphicsScene ( parent ) {
ani->setItem(ellipse1);
ani->setTimeLine(timer);
}
void SimulScene::startTimer() {
@@ -127,6 +131,7 @@ void SimulScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) {
break;
case ProbeChargeItemPlace:
if (mouseEvent->button() != Qt::LeftButton) break; //benutze nur linke maustaste
clearSelection();
ChargePlacementInProgress = true;
ellipse1->setPos(mouseEvent->scenePos());
break;
@@ -249,6 +254,7 @@ void SimulScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) {
//das neue item auswaehlen
clearSelection();
currHomoEfieldInsertItem->setSelected(true);
currHomoEfieldInsertItem->setZValue(getHighestZIndexFieldItems()+FieldZStep);
//die resize items aus und einblenden bei rotation
connect( currHomoEfieldInsertItem, SIGNAL(rotationChanged()), this, SLOT(displayResizeRects()));
@@ -285,6 +291,7 @@ void SimulScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) {
//das neue item auswaehlen
clearSelection();
currHomoBfieldInsertItem->setSelected(true);
currHomoBfieldInsertItem->setZValue(getHighestZIndexFieldItems()+FieldZStep);
//die resize items aus und einblenden bei rotation
connect( currHomoBfieldInsertItem, SIGNAL(rotationChanged()), this, SLOT(displayResizeRects()));
@@ -496,6 +503,22 @@ qreal SimulScene::getHighestZIndexVisible() {
}
return highestZValue;
}
qreal SimulScene::getHighestZIndexFieldItems() {
bool highestZValueSet = false;
qreal highestZValue = FieldDefaultZValue; //default value
for (int i = 0; i < items().count() ; ++i ) {
if (FieldItem::isFieldItem(items().at(i))) {
if (!highestZValueSet) {
highestZValue = items().at(i)->zValue();
highestZValueSet = true;
}
else if (highestZValue < items().at(i)->zValue()) {
highestZValue = items().at(i)->zValue();
}
}
}
return highestZValue;
}
void SimulScene::deleteSelectedFieldItems() {
QList<QGraphicsItem *> currSelectedItems = selectedItems();
@@ -619,7 +642,8 @@ void SimulScene::startCalculation() {
calcBFieldList << qgraphicsitem_cast<HomoBFieldItem*>(items().at(i));
}
}
//berechnung starten
ellipse1->calculateProbePath(ellipse1->pos());
@@ -657,50 +681,10 @@ void SimulScene::setSteps(int steps) {
double SimulScene::getPowerAt(QPointF point, double charge, double speedX, double speedY, char xy) {
double dPower = 0;
/*for(int i = 0; i < items(point).size(); ++i) {
//HomoEFieldItems Abarbeiten
if (qgraphicsitem_cast<HomoEFieldItem*> (items(point).at(i)) != 0) {
HomoEFieldItem* myHomoEFieldItem = qgraphicsitem_cast<HomoEFieldItem*> (items(point).at(i));
double power = (myHomoEFieldItem->getFieldPower() * charge);
double degAngle = myHomoEFieldItem->getRotation();
double radAngle = degAngle/180.0*PI;
if(xy == 'x') {
if (degAngle != 180.0) dPower += power * -sin(radAngle);
}
if(xy == 'y') {
if (degAngle != 90.0 && degAngle != 270.0) dPower += power * cos(radAngle);
}
}
//HomoBFieldItems Abarbeiten
if (qgraphicsitem_cast<HomoBFieldItem*> (items(point).at(i)) != 0) {
HomoBFieldItem* myHomoBFieldItem = qgraphicsitem_cast<HomoBFieldItem*>(items(point).at(i));
double absSpeed = sqrt(speedX * speedX + speedY * speedY); // Geschwindigkeit im Betrag |v|=sqrt(vx^2+vy^2)
double absLorentzPower = (charge * absSpeed * myHomoBFieldItem->getFluxDensity() ); //Kraft im Betrag: |F| = q*v*B
double speedRadAngle = atan2(speedY,speedX); //Winkel des Geschwindigkeitsvekors zur x-Achse im Bogenmass
double PowerRadAngle; //Winkel des Lorentzkraftvektors zur x-Achse im Bogenmass
if (myHomoBFieldItem->getIsDirectionIntoPlane()) {
PowerRadAngle = speedRadAngle + PI/2.0;
} else {
PowerRadAngle = speedRadAngle - PI/2.0;
}
//qDebug()<< PowerRadAngle;
if (xy == 'x') {
dPower += absLorentzPower * cos(PowerRadAngle);
}
if (xy == 'y') {
dPower += absLorentzPower * sin(PowerRadAngle);
}
}
}*/
for (int i=0; i<calcEFieldList.size(); ++i) {
//HomoEFieldItems Abarbeiten
HomoEFieldItem* myHomoEFieldItem = calcEFieldList[i];
HomoEFieldItem* myHomoEFieldItem = calcEFieldList.at(i);
if (myHomoEFieldItem->contains(myHomoEFieldItem->mapFromScene(point))) {
double power = (myHomoEFieldItem->getFieldPower() * charge);
double degAngle = myHomoEFieldItem->getRotation();
double radAngle = degAngle/180.0*PI;
@@ -713,9 +697,10 @@ double SimulScene::getPowerAt(QPointF point, double charge, double speedX, doubl
}
}
}
for (int i=0; i<calcBFieldList.size(); ++i) {
//HomoBFieldItems Abarbeiten
HomoBFieldItem* myHomoBFieldItem = calcBFieldList[i];
HomoBFieldItem* myHomoBFieldItem = calcBFieldList.at(i);
if (myHomoBFieldItem->contains(myHomoBFieldItem->mapFromScene(point))) {
double absSpeed = sqrt(speedX * speedX + speedY * speedY); // Geschwindigkeit im Betrag |v|=sqrt(vx^2+vy^2)
double absLorentzPower = (charge * absSpeed * myHomoBFieldItem->getFluxDensity() ); //Kraft im Betrag: |F| = q*v*B
@@ -779,4 +764,84 @@ void SimulScene::setTimeLineDuration(int duration) {
int SimulScene::getTimeLineDuration() {
return timer->duration();
}
QListWidget* SimulScene::getFieldListWidget() {
return fieldListWidget;
}
QList<QGraphicsItem*> SimulScene::getItemsInZOrder() {
QList<QGraphicsItem*> currItems = items();
bool swapNeeded;
for (int i=0;i< currItems.count();++i) {
swapNeeded=false;
for (int j=0; j< currItems.count() -i -1; ++j){
if(currItems[j]->zValue() > currItems[j+1]->zValue()) {
QGraphicsItem* swapper = currItems[j];
currItems[j]= currItems[j+1];
currItems[j+1] = swapper;
swapNeeded = true;
}
}
if(!swapNeeded) break;
}
return currItems;
}
QList<QGraphicsItem*> SimulScene::getFieldItemsInZOrder() {
QList<QGraphicsItem*> currItems;
for (int i = 0; i< items().size();++i) {
if(FieldItem::isFieldItem(items().at(i))) currItems.append(items().at(i));
}
bool swapNeeded;
for (int i=0;i< currItems.count();++i) {
swapNeeded=false;
for (int j=0; j< currItems.count() -i -1; ++j){
if(currItems[j]->zValue() > currItems[j+1]->zValue()) {
QGraphicsItem* swapper = currItems[j];
currItems[j]= currItems[j+1];
currItems[j+1] = swapper;
swapNeeded = true;
}
}
if(!swapNeeded) break;
}
return currItems;
}
void SimulScene::moveFieldItemDown(QGraphicsItem* fieldItem) {
if (!FieldItem::isFieldItem(fieldItem)) return;
qreal currFieldItemZValue = fieldItem->zValue();
QList<QGraphicsItem*> FieldItemsInZOrder = getFieldItemsInZOrder();
for (int i = 1; i< FieldItemsInZOrder.count();++i) {
if (FieldItemsInZOrder.at(i) == fieldItem) {
fieldItem->setZValue(FieldItemsInZOrder.at(i-1)->zValue());
FieldItemsInZOrder.at(i-1)->setZValue(currFieldItemZValue);
return;
}
}
}
void SimulScene::moveFieldItemUp(QGraphicsItem* fieldItem) {
if (!FieldItem::isFieldItem(fieldItem)) return;
qreal currFieldItemZValue = fieldItem->zValue();
QList<QGraphicsItem*> FieldItemsInZOrder = getFieldItemsInZOrder();
for (int i = 0; i< FieldItemsInZOrder.count()-1;++i) {
if (FieldItemsInZOrder.at(i) == fieldItem) {
fieldItem->setZValue(FieldItemsInZOrder.at(i+1)->zValue());
FieldItemsInZOrder.at(i+1)->setZValue(currFieldItemZValue);
return;
}
}
}
void SimulScene::moveSelectedFieldItemDown() {
if (selectedItems().isEmpty()) return;
moveFieldItemDown(selectedItems().first());
}
void SimulScene::moveSelectedFieldItemUp() {
if (selectedItems().isEmpty()) return;
moveFieldItemUp(selectedItems().first());
}

View File

@@ -31,6 +31,8 @@ class GraphicsEllipseItem;
class QGraphicsItemAnimation;
class QGraphicsPathItem;
class QPainterPath;
class QListWidget;
class FieldItem;
/**
@author Peter Dahlberg <pdahlberg@gmail.com>
@@ -46,7 +48,8 @@ class SimulScene : public QGraphicsScene {
};
enum ItemType {ResizeRectItem};
SimulScene ( QObject* parent = 0);
qreal getHighestZIndexVisible(); //hoechsten z-index der sichtbaren items ausgeben
qreal getHighestZIndexVisible(); //hoechsten z-index der sichtbaren items
qreal getHighestZIndexFieldItems(); //hoechsten z-index der Felder ausgeben
~SimulScene();
double getTimePerStep();
@@ -66,6 +69,9 @@ class SimulScene : public QGraphicsScene {
bool isFlightPathVisible();
int getTimeLineDuration();
QListWidget* getFieldListWidget();
QList<QGraphicsItem*> getItemsInZOrder();
QList<QGraphicsItem*> getFieldItemsInZOrder();
public slots:
void setSceneMode(SceneMode mode);
@@ -82,7 +88,10 @@ class SimulScene : public QGraphicsScene {
void setFlightPathVisible(bool visible = true);
void setTimeLineDuration(int duration);
void moveFieldItemDown(QGraphicsItem* fieldItem);
void moveSelectedFieldItemDown();
void moveFieldItemUp(QGraphicsItem* fieldItem);
void moveSelectedFieldItemUp();
private slots:
void displayResizeRects(bool move = false);
@@ -122,6 +131,7 @@ class SimulScene : public QGraphicsScene {
QGraphicsItemAnimation *ani;
QGraphicsPathItem *pathItem1;
QListWidget* fieldListWidget;
//rechtecke zur groesenaenderung
@@ -149,7 +159,11 @@ class SimulScene : public QGraphicsScene {
QList<HomoEFieldItem*> calcEFieldList;
QList<HomoBFieldItem*> calcBFieldList;
static const qreal FieldDefaultZValue = 10; //default z-value fuer Felder
static const qreal FieldZStep = 1e-50; //schritt, um den der z-index erhoeht wird
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent);