anfaengliche z-index vertauschung
git-svn-id: http://svn.lsim.tuxzone.org/trunk@17 4bec179b-ab65-46ed-a5f8-55b8b5c735d0
This commit is contained in:
@@ -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());
|
||||
}
|
||||
Reference in New Issue
Block a user