IRESTE/CarController.py
2022-02-15 10:32:44 -08:00

99 lines
3.0 KiB
Python

import sumolib
from Car import Car
from carInfo import Ui_carInfo
from PySide6.QtWidgets import QWidget, QLabel
from PySide6.QtCore import Qt
from PySide6.QtCharts import QChart, QSplineSeries, QLineSeries
from math import ceil
class carInfo(QWidget):
def __init__(self):
super(carInfo,self).__init__()
self.ui = Ui_carInfo()
self.ui.setupUi(self)
self.maxV = 0
self.chart = self.ui.speedGraph.chart()
speedsNames = ["vmax","vsec","Vitesse (m.s^-1)"]
self.speedSeries = []
for ind,s in enumerate(speedsNames):
self.speedSeries.append(QLineSeries())
self.speedSeries[ind].setName(s)
self.chart.addSeries(self.speedSeries[ind])
self.chart.createDefaultAxes()
def addSpeedPoint(self,ind,t,val):
if(t>500):
self.speedSeries[ind].remove(0)
self.speedSeries[ind].append(t,val)
xAxis = self.chart.axes(Qt.Horizontal,self.speedSeries[ind])[0]
xAxis.setRange(max(t-500,0),t)
if(val>self.maxV):
self.maxV = val
yAxis = self.chart.axes(Qt.Vertical, self.speedSeries[ind])[0]
yAxis.setMax(ceil(val+1))
self.ui.speedGraph.update()
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.t=0
def fromPath(self,path):
self.cars=[]
self.t=0
while(self.infoWidget.count() != 0):
self.infoWidget.removeItem(0)
for vehicle in sumolib.xml.parse(path,"vehicle"):
route=vehicle.route[0].edges.split()
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:
cid=car.route[car.index].getID()
if(cid==edgeID):
res.append(car)
return res
def update(self):
if(self.map.net is None):
return
self.t+=1
for car in self.cars:
car.update(1.0/60)
def draw(self,painter):
for ind,car in enumerate(self.cars):
selectedId = self.infoWidget.currentIndex()
selectedCar = self.cars[selectedId]
if(ind == selectedId):
painter.setPen(Qt.green)
elif(selectedCar.leader is not None and selectedCar.leader.id == car.id):
painter.setPen(Qt.red)
else:
painter.setPen(Qt.white)
car.draw(painter)
def setInfoWidget(self, widget):
self.infoWidget = widget