
Шустрый

Профиль
Группа: Участник
Сообщений: 73
Регистрация: 18.10.2007
Репутация: нет Всего: нет
|
ну если только область по теме то можно, просто проблему наглядно не увидете же: | Код | class RailDiagram : public QWidget { Q_OBJECT
public: /** * @brief Sets parameters of consts and vars */ explicit RailDiagram(QWidget *parent = 0); ~RailDiagram();
public slots: /** * @brief Draws new scene * @param raildata - is not used here * @param diagram - data on speeds of train * @param profile - data on profiles of railway * @param traindata - is not used here */ void UpdateDiagram(RailwayDataStruct raildata, RailDiagramStruct diagram, RailProfileStruct profile, TrainDataStruct traindata);
private: /** * @brief draws coordinate axes and legends of y-axe */ void DrawAxes();
/** * @brief draws limits of speeds on railway */ void DrawSpeedLimits();
/** * @brief draws diagram of 10 points of speeds runned by train * and 51 calculated speeds needed to be runned by train */ void DrawSpeedDiagram();
/** * @brief draws semaphores, stations and train */ void DrawObjects();
/** * @brief draws labels of semaphores and stations */ void DrawLabels();
/** * @brief Removes collisions of labels, which makes effect of rearing labels from each other * Used by DrawLabels(); * @param labels - pointer on labels */ QList<QGraphicsTextItem*> RemoveCollisions(QList<QGraphicsTextItem*> labels, int h);
/** * @brief Draw milestones on the way, which also used as virtical grid on profile diagram */ void DrawMileStones();
/** * @brief Draws Horisontal grid on profile diagram * and its legends */ void DrawProfileScale();
/** * @brief Draws diagram of profile and train over it */ void DrawProfileDiagram();
/** * @brief Puts icons of rail objects except semaphores, stations, * and some ignored objects */ void PutObjectsIcons();
/** * @brief Replaces icons if they collides with others */ void RemoveIconsCollisions(QList<QGraphicsPixmapItem*>pixmaps);
/** * @brief Shows average values of profiles */ void ShowAverageProfiles();
/** * @brief Draws calculated speed limit by traction */ void DrawCalculatedSpeedLimit();
private: Ui::RailDiagram *ui; RailDiagramStruct diagramdata_; //!< data on diagram of speeds RailProfileStruct profile_; //!< data on diagram of profile RailwayDataStruct raildata; //!< does not used here, used as a part of slot TrainDataStruct traindata; //!< does not used here, used as a part of slot QGraphicsScene *sceneVis; QGraphicsScene *scene; QPen pen; int diagramH; //!< height of diagram of speeds const int profileH; //!< height of diagram of profile int sceneH; //!< height of scene int sceneW; //!< height of width int step; //!< width of 1 piket on scene const int headOfTrain; //!< points where is head of train const int numOfPikets; //!< number of pikets on screen const int leftTab; //!< width of left indention const int piket; //!< width of 1 piket on railway = 100m };
|
| Код | #include "raildiagram.h" #include "ui_raildiagram.h" #include <QTextCodec>
RailDiagram::RailDiagram(QWidget *parent) : QWidget(parent), ui(new Ui::RailDiagram), numOfPikets(50), leftTab(50), headOfTrain(11), piket(100), profileH(110) {
ui->setupUi(this);
diagramH = ui->graphicsView->height()-111; sceneW = ui->graphicsView->width()-1; sceneH = ui->graphicsView->height()-1; ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
//sceneVis = new QGraphicsScene(ui->graphicsView); //sceneVis->setBackgroundBrush(QBrush(Qt::black));
scene = new QGraphicsScene(ui->graphicsView); scene->setBackgroundBrush(QBrush(Qt::black));
pen = QPen(Qt::white); pen.setWidth(2);
//DrawAxes();
step = (sceneW-leftTab)/numOfPikets;
UpdateDiagram(raildata,diagramdata_,profile_,traindata);
//ui->graphicsView->setScene(sceneVis); ui->graphicsView->setScene(scene); }
RailDiagram::~RailDiagram() { delete ui; }
void RailDiagram::UpdateDiagram(RailwayDataStruct raildata, RailDiagramStruct diagram, RailProfileStruct profile, TrainDataStruct traindata) { diagramdata_ = diagram; profile_ = profile; //scene = new QGraphicsScene(ui->graphicsView); //scene->setBackgroundBrush(QBrush(Qt::black)); for(int i=0;i<scene->items().size();i++) scene->removeItem(scene->items().at(i));
DrawAxes(); DrawSpeedLimits(); DrawSpeedDiagram(); DrawCalculatedSpeedLimit(); DrawLabels(); DrawMileStones(); DrawObjects(); DrawProfileScale(); DrawProfileDiagram(); PutObjectsIcons(); ShowAverageProfiles();
//sceneVis = scene; //ui->graphicsView->setScene(sceneVis); ui->graphicsView->setScene(scene); }
void RailDiagram::DrawAxes() { scene->addLine(leftTab,0,leftTab,sceneH-5,pen); //y axe scene->addLine(leftTab,diagramH,sceneW,diagramH,pen); //x axe
for(int i=0;i<11;i++){//vertical scale int scale = diagramdata_.maxSpeed/10; QGraphicsTextItem* txt = new QGraphicsTextItem; if(i%2==0){ if(i==0)txt->setPos(5,diagramH - i*diagramH/10-20); else if(i<10)txt->setPos(5,diagramH - i*diagramH/10-15); else txt->setPos(5,0); txt->setTextWidth(40); txt->setFont(QFont("Arial",12)); txt->setDefaultTextColor(Qt::white); txt->setHtml("<div align='right'>"+QString::number(i*scale)+"</div>"); scene->addItem(txt); }
if(i>0 && i<10){ scene->addLine(leftTab,diagramH - i*diagramH/10,leftTab+15,diagramH - i*diagramH/10,pen); scene->addLine(leftTab,diagramH - i*diagramH/10-3,leftTab+15,diagramH - i*diagramH/10-3,pen); } } }
void RailDiagram::DrawSpeedLimits() { for(int i=0;i<diagramdata_.speedLimits.size();i++){ int x1 = leftTab+(headOfTrain*100+diagramdata_.speedLimits[i].distance)/100*step; int w1; if(i<diagramdata_.speedLimits.size()-1) w1 = (diagramdata_.speedLimits[i+1].distance - diagramdata_.speedLimits[i].distance)/100*step; else w1 = sceneW-leftTab-diagramdata_.speedLimits[i].distance/100*step; qreal h1 = diagramH-diagramH*diagramdata_.speedLimits[i].limitValue/diagramdata_.maxSpeed; QGraphicsRectItem* rect = new QGraphicsRectItem(x1,0,w1,h1); rect->setBrush(QBrush(Qt::lightGray)); rect->setPen(pen); scene->addItem(rect); scene->addLine(x1+w1,0,x1+w1,diagramH,pen); QGraphicsTextItem* txt = new QGraphicsTextItem; txt->setTextWidth(w1); txt->setDefaultTextColor(Qt::white); txt->setFont(QFont("Arial",24)); txt->setHtml("<div align='center'>"+QString::number(diagramdata_.speedLimits[i].limitValue)+"</div>"); txt->setPos(x1,h1/2-24); scene->addItem(txt); } }
void RailDiagram::DrawSpeedDiagram() { scene->addLine(headOfTrain*step+leftTab,0,headOfTrain*step+leftTab,sceneH,pen);//virtical line which shows current point QPen penGreen(Qt::green); penGreen.setWidth(2); for(int i=0;i<diagramdata_.backSpeedsMasiive.size()-1;i++){ if(diagramdata_.backSpeedsMasiive[i]!=quint8(0xFF)){ qreal y1 = diagramH-diagramH*(qreal)diagramdata_.backSpeedsMasiive[i]/diagramdata_.maxSpeed; qreal y2 = diagramH-diagramH*(qreal)diagramdata_.backSpeedsMasiive[i+1]/diagramdata_.maxSpeed; qreal x1 = leftTab+(headOfTrain-i)*step; qreal x2 = leftTab+(headOfTrain-i-1)*step; scene->addLine(x1,y1,x2,y2,penGreen); } }
QPen penGray(Qt::gray); penGray.setWidth(2); for(int i=0;i<diagramdata_.calcSpeedsMassive.size()-1;i++){ if(diagramdata_.calcSpeedsMassive[i]!=quint8(0xFF)){ qreal y1 = diagramH-diagramH*(qreal)diagramdata_.calcSpeedsMassive[i]/diagramdata_.maxSpeed; qreal y2 = diagramH-diagramH*(qreal)diagramdata_.calcSpeedsMassive[i+1]/diagramdata_.maxSpeed; qreal x1 = leftTab+i*step; qreal x2 = leftTab+(i+1)*step; scene->addLine(x1,y1,x2,y2,penGray); } } }
void RailDiagram::DrawCalculatedSpeedLimit() { if((diagramdata_.calculatedSpeedLimit<quint8(160))&&diagramdata_.calculatedSpeedLimit!=quint8(0xFF)){ QPen penYellow(Qt::yellow); QVector<qreal> dashes;
dashes << 8 << 5;
penYellow.setDashPattern(dashes); penYellow.setWidth(2); penYellow.setStyle(Qt::CustomDashLine); qreal x = diagramH-diagramH*(qreal)diagramdata_.calculatedSpeedLimit/diagramdata_.maxSpeed; scene->addLine(leftTab,x,sceneW,x,penYellow); } }
void RailDiagram::DrawObjects() { for(int i=0;i<diagramdata_.objects_.size();i++){ int distanceInPikets; if(diagramdata_.objects_[i].objectType==0){ distanceInPikets = diagramdata_.objects_[i].distance/piket; scene->addEllipse((headOfTrain+distanceInPikets)*step+leftTab,diagramH-21,6,6,QPen(Qt::black),QBrush(Qt::yellow)); scene->addEllipse((headOfTrain+distanceInPikets)*step+leftTab,diagramH-14,6,6,QPen(Qt::black),QBrush(Qt::green)); scene->addEllipse((headOfTrain+distanceInPikets)*step+leftTab,diagramH-7,6,6,QPen(Qt::black),QBrush(Qt::red)); } else{ distanceInPikets = diagramdata_.objects_[i].distance/piket; scene->addRect((headOfTrain+distanceInPikets-2)*step+leftTab,diagramH-5,step*4,5,QPen(Qt::darkGray),QBrush(Qt::darkGray)); } } int lenPoints = diagramdata_.trainLen/100; scene->addRect((headOfTrain-lenPoints)*step+leftTab,diagramH-7, lenPoints*step,7, QPen(Qt::lightGray),QBrush(Qt::lightGray));
}
void RailDiagram::DrawLabels() { QList<QGraphicsTextItem*> trafficLights; QList<QGraphicsTextItem*> stations;
for(int i=0;i<diagramdata_.objects_.size();i++){ int distanceInPikets = diagramdata_.objects_[i].distance/piket; QGraphicsTextItem* label = new QGraphicsTextItem; label->setDefaultTextColor(Qt::black);
QByteArray btr; for(int j=0;j<sizeof(diagramdata_.objects_[i].objectName);j++) btr += diagramdata_.objects_[i].objectName[j]; QTextCodec *codec = QTextCodec::codecForName("Windows-1251");
QString name = codec->toUnicode(btr);
label->setHtml("<div style='background-color:#FFFFFF;'>" + name.trimmed() + "</div>"); int wlbl = label->boundingRect().width();
if(diagramdata_.objects_[i].objectType==0){ label->setPos((headOfTrain+distanceInPikets)*step+leftTab-wlbl/2,diagramH-65); trafficLights.append(label); } else{ stations.append(label); label->setPos((headOfTrain+distanceInPikets)*step+leftTab-wlbl/2,diagramH-45); } //scene->addItem(&labels[i]); } trafficLights = RemoveCollisions(trafficLights,65); for(int i=0;i<trafficLights.size();i++){ scene->addItem(trafficLights[i]); } stations = RemoveCollisions(stations,45); for(int i=0;i<stations.size();i++){ scene->addItem(stations[i]); } }
QList<QGraphicsTextItem*> RailDiagram::RemoveCollisions(QList<QGraphicsTextItem*> labels, int h) { int i=0,j=labels.size(); int hasCollis=0; while(i<int(j/2)){ if(labels[i]->pos().x()+labels[i]->boundingRect().width()+2>labels[i+1]->pos().x()){ if(labels[i+1]->pos().x()-labels[i]->boundingRect().width()<leftTab){ labels.removeAt(i); j--; } else labels[i]->setPos(labels[i+1]->pos().x()-labels[i]->boundingRect().width()-2,diagramH-h); hasCollis++; } i++; j--; if(labels[j]->pos().x()<labels[j-1]->pos().x()+labels[j-1]->boundingRect().width()+2){ int x1 = labels[j-1]->pos().x()+labels[j-1]->boundingRect().width()+2; labels[j]->setPos(x1,diagramH-h); hasCollis++; }
} if(hasCollis>0)labels=RemoveCollisions(labels,h); return labels; }
void RailDiagram::DrawMileStones() { QPen penThin(Qt::white); for(int i=0;i<diagramdata_.fissuresMassive.size();i++){ int x=(headOfTrain+(diagramdata_.fissuresMassive[i].distance/100))*step+leftTab; if(diagramdata_.fissuresMassive[i].fissureType==2){ scene->addLine(x,sceneH-20,x,diagramH-20,pen); QGraphicsTextItem* txt = new QGraphicsTextItem; txt->setDefaultTextColor(Qt::white); txt->setFont(QFont("Arial",10)); txt->setPlainText(QString::number(diagramdata_.fissuresMassive[i].km)); if(x+txt->boundingRect().width()>sceneW) txt->setPos(x-txt->boundingRect().width(),diagramH-40); else txt->setPos(x-txt->boundingRect().width()/2,diagramH-40); scene->addItem(txt); } else if(diagramdata_.fissuresMassive[i].fissureType==3)scene->addLine(x,sceneH-20,x,diagramH-10,pen); else scene->addLine(x,sceneH-20,x,diagramH-6,penThin); } }
void RailDiagram::DrawProfileScale() { for(int i=0;i<5;i++){ int minHigh = sceneH-25; int maxHigh = sceneH-110; scene->addLine(leftTab,minHigh - i*(minHigh-maxHigh)/5,leftTab+15,minHigh - i*(minHigh-maxHigh)/5,pen); scene->addLine(leftTab,minHigh - i*(minHigh-maxHigh)/5-3,leftTab+15,minHigh - i*(minHigh-maxHigh)/5-3,pen); scene->addLine(leftTab+15,minHigh - i*(minHigh-maxHigh)/5-2,sceneW,minHigh-i*(minHigh-maxHigh)/5-2,QPen(Qt::white));
QGraphicsTextItem* txt = new QGraphicsTextItem; txt->setPos(5,minHigh); txt->setTextWidth(40); txt->setFont(QFont("Arial",12)); txt->setDefaultTextColor(Qt::white); txt->setHtml("<div align='right'>"+QString::number(profile_.minProfileHeight)+"</div>"); scene->addItem(txt);
QGraphicsTextItem* txt2 = new QGraphicsTextItem; txt2->setPos(5,maxHigh); txt2->setTextWidth(40); txt2->setFont(QFont("Arial",12)); txt2->setDefaultTextColor(Qt::white); txt2->setHtml("<div align='right'>"+QString::number(profile_.maxProfileHeight)+"</div>"); scene->addItem(txt2); } }
void RailDiagram::DrawProfileDiagram() { QPainterPath path; path.setFillRule(Qt::WindingFill); path.moveTo(leftTab,sceneH-20);
for(int i=0;i<=numOfPikets;i++){ qreal high = (profile_.heights[i]*profileH)/profile_.maxProfileHeight; path.lineTo(leftTab+i*step,sceneH-high); } path.lineTo(sceneW,sceneH-20); path.lineTo(leftTab,sceneH-20);
scene->addPath(path,QPen(Qt::lightGray),QBrush(Qt::lightGray));
QPainterPath train; train.setFillRule(Qt::OddEvenFill); int lenPoints = profile_.trainLen/100; qreal high = profile_.heights[headOfTrain-lenPoints]*profileH/profile_.maxProfileHeight; train.moveTo((headOfTrain-lenPoints)*step+leftTab,sceneH-high); for(int i=headOfTrain-lenPoints;i<=headOfTrain;i++){ qreal high = (profile_.heights[i]*profileH)/profile_.maxProfileHeight; train.lineTo(leftTab+i*step,sceneH-high); } QPen trainPen(Qt::green); trainPen.setWidth(5); scene->addPath(train, trainPen,QBrush(Qt::NoBrush)); }
void RailDiagram::PutObjectsIcons() { QList<QGraphicsPixmapItem*> pixmaps; for(int i=0;i<profile_.railObject.size();i++){ QString img; switch (profile_.railObject[i].objectType){ case 0: case 1: case 3: case 12: case 14:img = "";break; case 2: img = ":/autopilotimg/ktsm.png";break; case 4: img = ":/autopilotimg/autocrossing.png";break; case 5: img = ":/autopilotimg/bridge.png";break; case 6: img = ":/autopilotimg/tonnel.png";break; case 7: img = ":/autopilotimg/gas.png";break; case 8: img = ":/autopilotimg/danger.png";break; case 9: img = ":/autopilotimg/crossing.png";break; case 10:img = ":/autopilotimg/crossover.png";break; case 11:img = ":/autopilotimg/signal.png";break; case 13:img = ":/autopilotimg/controlkit.png";break; case 15:img = ":/autopilotimg/braketesting.png";break;
} if(img.size()>0){ QGraphicsPixmapItem* pixmap = scene->addPixmap(QPixmap(img)); int x = leftTab+(profile_.railObject[i].distance/100+headOfTrain)*step; pixmap->setPos(x,sceneH-70); pixmaps.append(pixmap); } } RemoveIconsCollisions(pixmaps); }
void RailDiagram::RemoveIconsCollisions(QList<QGraphicsPixmapItem*>pixmaps) { for(int i=0;i<pixmaps.size()-1;i++){ if(pixmaps[i]->pos().x()+pixmaps[i]->boundingRect().width()>pixmaps[i+1]->pos().x()){ int x = pixmaps[i+1]->pos().x(); pixmaps[i+1]->setPos(x, sceneH-100); i++; } } }
void RailDiagram::ShowAverageProfiles() { for(int i=0;i<profile_.averageProfileMassive.size()-1;i++){ int x = leftTab+(headOfTrain+profile_.averageProfileMassive[i].distance/100)*step; scene->addLine(x,sceneH,x,sceneH-profileH,QPen(Qt::white)); int x2 = leftTab+(headOfTrain+profile_.averageProfileMassive[i+1].distance/100)*step; QGraphicsTextItem* txt = new QGraphicsTextItem; txt->setTextWidth(x2-x); txt->setDefaultTextColor(Qt::white); txt->setFont(QFont("Arial",12)); txt->setHtml("<div align='center' size='5'>"+QString::number((qreal)profile_.averageProfileMassive[i].value/10)+"</div>"); txt->setPos(x,sceneH-25); scene->addItem(txt); } QGraphicsTextItem* txt = new QGraphicsTextItem; txt->setDefaultTextColor(Qt::white); txt->setFont(QFont("Arial",12)); txt->setHtml("<div align='center' size='5'>‰</div>"); txt->setPos(sceneW-20,sceneH-25); scene->addItem(txt); }
|
Такое ощущение что элементы может и удаляются, но на экране затираются частично. Это сообщение отредактировал(а) Atiskara - 26.6.2014, 07:16
|