Remplacé pygame par QT, j'aime pas pygame

This commit is contained in:
leo 2022-02-12 23:50:41 +01:00
parent a1b063047a
commit e0132fa617
Signed by: leo
GPG Key ID: 0DD993BFB2B307DB
8 changed files with 223 additions and 72 deletions

12
Car.py
View File

@ -1,6 +1,7 @@
import sumolib import sumolib
import pygame as pg
import math import math
from PySide6.QtGui import QPainter
from PySide6.QtCore import QPointF
class Car: class Car:
def initPath(self): def initPath(self):
@ -18,7 +19,7 @@ class Car:
print(f"{self.id} : {startEdge.getID()} -> {nextEdge.getID()} via {laneId}") print(f"{self.id} : {startEdge.getID()} -> {nextEdge.getID()} via {laneId}")
def __init__(self,carID,route,parentMap,parentController,surface): def __init__(self,carID,route,parentMap,parentController):
self.id=carID self.id=carID
self.map=parentMap self.map=parentMap
self.controller=parentController self.controller=parentController
@ -49,10 +50,9 @@ class Car:
self.a=10 self.a=10
self.b=20 self.b=20
self.surf=surface def draw(self,painter):
pt = QPointF(*self.pos)
def draw(self,col): painter.drawEllipse(pt,3,3)
pg.draw.circle(self.surf,col,self.map.convertPos(self.pos),5)
def conduite(self,vmax,leader,dt): def conduite(self,vmax,leader,dt):
if(leader==None): if(leader==None):

View File

@ -2,16 +2,14 @@ import sumolib
from Car import Car from Car import Car
class CarController: class CarController:
def __init__(self,path,parentMap,surface): def __init__(self,parentMap):
self.map=parentMap self.map=parentMap
self.surf=surface
self.cars=[] self.cars=[]
self.fromPath(path)
def fromPath(self,path): def fromPath(self,path):
for vehicle in sumolib.xml.parse(path,"vehicle"): for vehicle in sumolib.xml.parse(path,"vehicle"):
route=vehicle.route[0].edges.split() route=vehicle.route[0].edges.split()
self.cars.append(Car(vehicle.id,route,self.map,self,self.surf)) self.cars.append(Car(vehicle.id,route,self.map,self))
def getCarsOnEdge(self,edgeID): # on devrai probablement utiliser une map ici (dict en python?) mais flemme def getCarsOnEdge(self,edgeID): # on devrai probablement utiliser une map ici (dict en python?) mais flemme
res=[] res=[]
@ -25,7 +23,6 @@ class CarController:
for car in self.cars: for car in self.cars:
car.update(1.0/60) car.update(1.0/60)
def draw(self,screen): def draw(self,painter):
for car in self.cars: for car in self.cars:
car.draw((255,255,255)) car.draw(painter)
screen.blit(self.surf,(0,0))

33
Map.py
View File

@ -3,35 +3,27 @@
# mais si on se decide à utiliser notre propre format dans le futur ça facilitera la transition # mais si on se decide à utiliser notre propre format dans le futur ça facilitera la transition
import sumolib import sumolib
import pygame as pg from PySide6.QtGui import QPainter, QPolygonF
from PySide6.QtCore import Qt, QPointF
class Map: class Map:
def __init__(self,path,surface): def __init__(self,path=None):
if path!=None:
self.fromPath(path) self.fromPath(path)
self.surf=surface
def fromPath(self,path): def fromPath(self,path):
self.net = sumolib.net.readNet(path,withInternal=True,withConnections=True) self.net = sumolib.net.readNet(path,withInternal=True,withConnections=True)
def text(self,text,pos,font): def draw(self, painter):
img = font.render(text,True,(255,255,255))
self.surf.blit(img,pos)
def draw(self,screen,debug=False,font=None):
for edge in self.net.getEdges(): for edge in self.net.getEdges():
color=(255,255,255) color=Qt.white
if(edge.getFunction()=="internal"): if(edge.getFunction()=="internal"):
color=(255,0,0) color=Qt.red
painter.setPen(color)
for lane in edge.getLanes(): for lane in edge.getLanes():
pts=lane.getShape() pts=[QPointF(*p) for p in lane.getShape()]
pts=map(self.convertPos,pts) poly = QPolygonF.fromList(pts)
pg.draw.lines(self.surf,color,False,list(pts)) painter.drawPolyline(poly)
if(debug):
for node in self.net.getNodes():
self.text(node.getID(),self.convertPos(node.getCoord()),font)
screen.blit(self.surf,(0,0))
def getEdge(self,edgeID): def getEdge(self,edgeID):
return self.net.getEdge(edgeID) return self.net.getEdge(edgeID)
@ -42,6 +34,9 @@ class Map:
def getLane(self,laneID): def getLane(self,laneID):
return self.net.getLane(laneID) return self.net.getLane(laneID)
def getBounds(self):
return self.net.getBBoxXY()
def convertPos(self,pos): def convertPos(self,pos):
bounds=self.net.getBoundary() bounds=self.net.getBoundary()
bounds[0]-=200 bounds[0]-=200

64
main.py
View File

@ -6,47 +6,41 @@ if 'SUMO_HOME' in os.environ:
else: else:
print("please declare environment variable 'SUMO_HOME'") print("please declare environment variable 'SUMO_HOME'")
import pygame as pg from PySide6.QtCore import Qt, QTimer
from pygame.locals import * from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtGui import QSurfaceFormat
from window import Ui_MainWindow
from Map import Map from mainLoop import mainLoop
from CarController import CarController
pg.init() class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
font = pg.font.SysFont(None, 20) self.mainLoop = mainLoop(self.ui.mainSurf)
screen = pg.display.set_mode((1280, 480), pg.SCALED) timer = QTimer(self)
pg.display.set_caption("Traffic") timer.timeout.connect(self.mainLoop.update)
timer.start(1.0/60)
clk = pg.time.Clock() def keyPressEvent(self, e):
if e.key() == Qt.Key_Escape or e.key() == Qt.Key_Q:
self.close()
netSurf = pg.Surface(screen.get_size(),pg.SRCALPHA) if __name__ == "__main__":
netSurf = netSurf.convert() app = QApplication()
m = Map("test2.net.xml",netSurf)
carSurf = pg.Surface(screen.get_size()) format = QSurfaceFormat()
carSurf.set_colorkey((0, 0, 0)) format.setDepthBufferSize(24)
carSurf = carSurf.convert() format.setStencilBufferSize(8)
cc = CarController("test5.rou.xml",m,carSurf) format.setVersion(3, 2)
format.setSamples(16)
format.setProfile(QSurfaceFormat.CoreProfile)
QSurfaceFormat.setDefaultFormat(format)
time.sleep(10) window = MainWindow()
window.show()
running = True
while running:
for event in pg.event.get():
if event.type == pg.QUIT:
running = False
elif event.type == pg.KEYDOWN and event.key == pg.K_ESCAPE:
running = False
elif event.type == pg.KEYDOWN and event.key == pg.K_q:
running = False
carSurf.fill((0,0,0))
m.draw(screen,debug=False,font=font)
cc.update()
cc.draw(screen)
pg.display.flip()
clk.tick(60)
sys.exit(app.exec())

19
mainLoop.py Normal file
View File

@ -0,0 +1,19 @@
from Map import Map
from CarController import CarController
class mainLoop():
def __init__(self, painter):
self.painter = painter
self.map = Map()
self.map.fromPath("test2.net.xml")
self.controller = CarController(self.map)
self.controller.fromPath("test5.rou.xml")
self.painter.addMap(self.map)
self.painter.addCarController(self.controller)
def update(self):
self.controller.update()
self.painter.update()

39
mainPainter.py Normal file
View File

@ -0,0 +1,39 @@
from PySide6.QtOpenGLWidgets import QOpenGLWidget
from PySide6.QtCore import Qt
from PySide6.QtGui import QPainter, QFont, QColor, QTransform
class mainPainter(QOpenGLWidget):
def __init__(self, parent=None):
super(mainPainter, self).__init__(parent)
self.map = None
self.carController = None
self.transform = QTransform()
def addMap(self, netMap):
self.map = netMap
def addCarController(self, cc):
self.carController = cc
def generateTransform(self):
bounds = self.map.getBounds()
bounds[0] = list(map(lambda b: b-10,bounds[0]))
bounds[1] = list(map(lambda b: b+10, bounds[1]))
self.transform.reset()
tr = QTransform()
tr.translate(-bounds[0][0],-bounds[0][1])
scale=min(self.width()/(bounds[1][0]-bounds[0][0]),self.height()/(bounds[1][1]-bounds[0][1]))
sc = QTransform()
sc.scale(scale,-scale)
self.transform = tr * sc * QTransform(1, 0, 0, 1, 0, self.height())
def resizeGL(self,w,h):
self.generateTransform()
def paintEvent(self, e):
painter = QPainter(self)
painter.RenderHint(QPainter.Antialiasing)
painter.eraseRect(e.rect());
painter.setTransform(self.transform)
self.map.draw(painter)
self.carController.draw(painter)

59
window.py Normal file
View File

@ -0,0 +1,59 @@
# -*- coding: utf-8 -*-
################################################################################
## Form generated from reading UI file 'window.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, QGridLayout, QHBoxLayout, QMainWindow,
QMenuBar, QSizePolicy, QStatusBar, QWidget)
from mainPainter import mainPainter
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.gridLayout = QGridLayout(self.centralwidget)
self.gridLayout.setObjectName(u"gridLayout")
self.horizontalLayout = QHBoxLayout()
self.horizontalLayout.setObjectName(u"horizontalLayout")
self.mainSurf = mainPainter(self.centralwidget)
self.mainSurf.setObjectName(u"mainSurf")
self.horizontalLayout.addWidget(self.mainSurf)
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))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QStatusBar(MainWindow)
self.statusbar.setObjectName(u"statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QMetaObject.connectSlotsByName(MainWindow)
# setupUi
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
# retranslateUi

48
window.ui Normal file
View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="mainPainter" name="mainSurf"/>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>27</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<customwidgets>
<customwidget>
<class>mainPainter</class>
<extends>QOpenGLWidget</extends>
<header>mainPainter</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>