diff --git a/Car.py b/Car.py index e7c37aa..c0ffd36 100644 --- a/Car.py +++ b/Car.py @@ -17,18 +17,33 @@ class Car: if(inverted): self.laneShape.reverse() - print(f"{self.id} : {startEdge.getID()} -> {nextEdge.getID()} via {laneId}") + self.infoWidg.setVal("Index",f"{self.index}/{len(self.route)}") + self.infoWidg.setVal("Edge",self.route[self.index]) + + #print(f"{self.id} : {startEdge.getID()} -> {nextEdge.getID()} via {laneId}") - def __init__(self,carID,route,parentMap,parentController): + def __init__(self,carID,route,parentMap,parentController,infoWidg): self.id=carID self.map=parentMap self.controller=parentController + self.infoWidg=infoWidg self.index=0 self.laneInd=0 self.route=[] + + self.pos=[0,0] + self.v=0 + self.a=10 + self.b=20 - route=list(map(self.map.getEdge,route)) + self.infoWidg.setVal("Position",self.pos) + self.infoWidg.setVal("Vitesse",self.v) + self.infoWidg.setVal("Index",f"{self.index}/{len(route)}") + self.rawRoute = route + + def prepareRoute(self): + route = list(map(self.map.getEdge,self.rawRoute)) for r,rn in zip(route,route[1:]): self.route.append(r) conn=r.getConnections(rn) @@ -46,16 +61,13 @@ class Car: self.initPath() self.pos=list(self.laneShape[0]) - self.v=0 - self.a=10 - self.b=20 def draw(self,painter): pt = QPointF(*self.pos) painter.drawEllipse(pt,3,3) def conduite(self,vmax,leader,dt): - if(leader==None): + if(leader is None): self.v=vmax return else: @@ -107,3 +119,7 @@ class Car: self.pos[0]+=(endPos[0]-self.pos[0])*adv self.pos[1]+=(endPos[1]-self.pos[1])*adv lgt=0 + + self.infoWidg.setVal("Position", self.pos) + self.infoWidg.setVal("Vitesse", self.v) + self.infoWidg.setVal("Leader", leader if leader is None else leader.id) diff --git a/CarController.py b/CarController.py index 91b633d..b98075f 100644 --- a/CarController.py +++ b/CarController.py @@ -1,25 +1,37 @@ import sumolib from Car import Car +from carInfo import Ui_carInfo +from PySide6.QtWidgets import QWidget, QLabel + +class carInfo(QWidget): + def __init__(self): + super(carInfo,self).__init__() + self.ui = Ui_carInfo() + self.ui.setupUi(self) + + def setVal(self,key,val): + obj = self.findChild(QLabel,key) + if(obj is None): + return + obj.setText(f"{key} : {val}") + obj.update() class CarController: def __init__(self,parentMap): self.map=parentMap self.cars=[] - self.path = None - def setPath(self,path): - self.path = path - - def fromPath(self,path=None): - if(path == None): - if(self.path == None): - return - else: - path = self.path + def fromPath(self,path): + self.cars=[] for vehicle in sumolib.xml.parse(path,"vehicle"): route=vehicle.route[0].edges.split() - self.cars.append(Car(vehicle.id,route,self.map,self)) + wId=self.infoWidget.addItem(carInfo(), vehicle.id) + self.cars.append(Car(vehicle.id,route,self.map,self,self.infoWidget.widget(wId))) + def prepareRoute(self): + for car in self.cars: + car.prepareRoute() + def getCarsOnEdge(self,edgeID): # on devrai probablement utiliser une map ici (dict en python?) mais flemme res=[] for car in self.cars: @@ -29,9 +41,15 @@ class CarController: return res def update(self): + if(self.map.net is None): + return for car in self.cars: car.update(1.0/60) def draw(self,painter): for car in self.cars: car.draw(painter) + + def setInfoWidget(self, widget): + self.infoWidget = widget + diff --git a/Map.py b/Map.py index dac02da..e64b372 100644 --- a/Map.py +++ b/Map.py @@ -8,7 +8,7 @@ from PySide6.QtCore import Qt, QPointF class Map: def __init__(self,path=None): - if path!=None: + if path is not None: self.fromPath(path) self.net = None @@ -16,7 +16,7 @@ class Map: self.net = sumolib.net.readNet(path,withInternal=True,withConnections=True) def isLoaded(self): - return not (self.net == None) + return not (self.net is None) def safeCall(func): def inner(*args, **kwargs): diff --git a/carInfo.py b/carInfo.py new file mode 100644 index 0000000..652ba5d --- /dev/null +++ b/carInfo.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'carInfo.ui' +## +## Created by: Qt User Interface Compiler version 6.2.3 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, + QFont, QFontDatabase, QGradient, QIcon, + QImage, QKeySequence, QLinearGradient, QPainter, + QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtWidgets import (QApplication, QLabel, QSizePolicy, QVBoxLayout, + QWidget) + +class Ui_carInfo(object): + def setupUi(self, carInfo): + if not carInfo.objectName(): + carInfo.setObjectName(u"carInfo") + carInfo.resize(378, 472) + self.verticalLayout = QVBoxLayout(carInfo) + self.verticalLayout.setObjectName(u"verticalLayout") + self.Position = QLabel(carInfo) + self.Position.setObjectName(u"Position") + + self.verticalLayout.addWidget(self.Position) + + self.Vitesse = QLabel(carInfo) + self.Vitesse.setObjectName(u"Vitesse") + + self.verticalLayout.addWidget(self.Vitesse) + + self.Index = QLabel(carInfo) + self.Index.setObjectName(u"Index") + + self.verticalLayout.addWidget(self.Index) + + self.Edge = QLabel(carInfo) + self.Edge.setObjectName(u"Edge") + + self.verticalLayout.addWidget(self.Edge) + + self.Leader = QLabel(carInfo) + self.Leader.setObjectName(u"Leader") + + self.verticalLayout.addWidget(self.Leader) + + + self.retranslateUi(carInfo) + + QMetaObject.connectSlotsByName(carInfo) + # setupUi + + def retranslateUi(self, carInfo): + carInfo.setWindowTitle(QCoreApplication.translate("carInfo", u"Form", None)) + self.Position.setText(QCoreApplication.translate("carInfo", u"TextLabel", None)) + self.Vitesse.setText(QCoreApplication.translate("carInfo", u"TextLabel", None)) + self.Index.setText(QCoreApplication.translate("carInfo", u"TextLabel", None)) + self.Edge.setText(QCoreApplication.translate("carInfo", u"TextLabel", None)) + self.Leader.setText(QCoreApplication.translate("carInfo", u"TextLabel", None)) + # retranslateUi + diff --git a/carInfo.ui b/carInfo.ui new file mode 100644 index 0000000..dfb9a13 --- /dev/null +++ b/carInfo.ui @@ -0,0 +1,56 @@ + + + carInfo + + + + 0 + 0 + 378 + 472 + + + + Form + + + + + + TextLabel + + + + + + + TextLabel + + + + + + + TextLabel + + + + + + + TextLabel + + + + + + + TextLabel + + + + + + + + diff --git a/main.py b/main.py index d693cae..65d3183 100644 --- a/main.py +++ b/main.py @@ -19,11 +19,10 @@ class MainWindow(QMainWindow): self.ui = Ui_MainWindow() self.ui.setupUi(self) - self.setAttribute(Qt.WA_TranslucentBackground) - self.setAttribute(Qt.WA_NoSystemBackground, False) - self.mainLoop = mainLoop(self) + self.mainLoop.addInfosDisplay(self.ui.infos) + fileMenu = self.menuBar().addMenu("&File") openMenu = fileMenu.addMenu("&Open") diff --git a/mainLoop.py b/mainLoop.py index 24c6d45..fb95668 100644 --- a/mainLoop.py +++ b/mainLoop.py @@ -26,13 +26,15 @@ class mainLoop(): self.map.fromPath(fileName[0]) self.painter.generateTransform() - self.controller.fromPath() + self.controller.prepareRoute() def openVehicles(self): fileName = QFileDialog.getOpenFileName(self.parent,"Open Vehicle trip description", "./", "Route File (*.rou.xml)") if(fileName[0] == ''): return - self.controller.setPath(fileName[0]) + self.controller.fromPath(fileName[0]) if(self.map.isLoaded()): - self.controller.fromPath() + self.controller.prepareRoute() + def addInfosDisplay(self, widget): + self.controller.setInfoWidget(widget) diff --git a/mainPainter.py b/mainPainter.py index 1690918..7957d75 100644 --- a/mainPainter.py +++ b/mainPainter.py @@ -19,7 +19,7 @@ class mainPainter(QOpenGLWidget): def generateTransform(self): bounds = self.map.getBounds() - if(bounds == None): + if(bounds is None): return bounds[0] = list(map(lambda b: b-10,bounds[0])) bounds[1] = list(map(lambda b: b+10, bounds[1])) diff --git a/window.py b/window.py index 2a2d6cc..a15c94b 100644 --- a/window.py +++ b/window.py @@ -16,7 +16,8 @@ from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QImage, QKeySequence, QLinearGradient, QPainter, QPalette, QPixmap, QRadialGradient, QTransform) from PySide6.QtWidgets import (QApplication, QGridLayout, QHBoxLayout, QMainWindow, - QMenuBar, QSizePolicy, QStatusBar, QWidget) + QMenuBar, QSizePolicy, QStatusBar, QToolBox, + QWidget) from mainPainter import mainPainter @@ -24,7 +25,8 @@ class Ui_MainWindow(object): def setupUi(self, MainWindow): if not MainWindow.objectName(): MainWindow.setObjectName(u"MainWindow") - MainWindow.resize(800, 600) + MainWindow.setEnabled(True) + MainWindow.resize(540, 360) self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName(u"centralwidget") self.gridLayout = QGridLayout(self.centralwidget) @@ -33,16 +35,33 @@ class Ui_MainWindow(object): self.horizontalLayout.setObjectName(u"horizontalLayout") self.mainSurf = mainPainter(self.centralwidget) self.mainSurf.setObjectName(u"mainSurf") + self.mainSurf.setEnabled(True) + sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(2) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.mainSurf.sizePolicy().hasHeightForWidth()) + self.mainSurf.setSizePolicy(sizePolicy) self.horizontalLayout.addWidget(self.mainSurf) + self.infos = QToolBox(self.centralwidget) + self.infos.setObjectName(u"infos") + self.infos.setEnabled(True) + sizePolicy1 = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred) + sizePolicy1.setHorizontalStretch(1) + sizePolicy1.setVerticalStretch(0) + sizePolicy1.setHeightForWidth(self.infos.sizePolicy().hasHeightForWidth()) + self.infos.setSizePolicy(sizePolicy1) + + self.horizontalLayout.addWidget(self.infos) + self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(MainWindow) self.menubar.setObjectName(u"menubar") - self.menubar.setGeometry(QRect(0, 0, 800, 27)) + self.menubar.setGeometry(QRect(0, 0, 540, 27)) MainWindow.setMenuBar(self.menubar) self.statusbar = QStatusBar(MainWindow) self.statusbar.setObjectName(u"statusbar") @@ -50,6 +69,9 @@ class Ui_MainWindow(object): self.retranslateUi(MainWindow) + self.infos.setCurrentIndex(-1) + + QMetaObject.connectSlotsByName(MainWindow) # setupUi diff --git a/window.ui b/window.ui index d2248e6..f3b6012 100644 --- a/window.ui +++ b/window.ui @@ -2,12 +2,15 @@ MainWindow + + true + 0 0 - 800 - 600 + 540 + 360 @@ -18,7 +21,33 @@ - + + + true + + + + 2 + 0 + + + + + + + + true + + + + 1 + 0 + + + + -1 + + @@ -29,7 +58,7 @@ 0 0 - 800 + 540 27