2.9 KiB
mainPainter.py
La classe qui gére l'affichage (de la partie principale, pas les ui d'infos)
Imports
Comme d'hab les imports de Qt
from PySide6.QtOpenGLWidgets import QOpenGLWidget
from PySide6.QtCore import Qt, QThread
from PySide6.QtGui import QPainter, QFont, QColor, QTransform, QOpenGLContext, QOpenGLFunctions
from PySide6 import QtOpenGL
mainPainter
La classe principale, c'est un sous-classe de QOpenGLWidget
class mainPainter(QOpenGLWidget):
__init__
Notre initialisation, on récupère les deux classe de la carte et des voitures parce que c'est eux qui sont responsables de leurs affichage. Le QTransform sert à calculer/stocker la transformation pour passer de coordonnées dans le monde réél->coords sur l'écran
def __init__(self, parent=None):
super(mainPainter, self).__init__(parent)
self.map = None
self.carController = None
self.transform = QTransform()
addMap
Juste un fonction pour passer la carte, on pourrait probablement le faire passer dans le constructeur plutôt
def addMap(self, netMap):
self.map = netMap
addCarController
Comme addMap
def addCarController(self, cc):
self.carController = cc
generateTransform
La fonction qui genere la transformation monde->écran. On récupere les limites du réseau, puis on translate/scale en fonction Pour avoir un peu de marge on rajoute 10 de tout les côtés Comme l'origine est en haut à gauche et les y decroissant on scale de -1 sur y pour remettre l'image à l'endroit
def generateTransform(self):
bounds = self.map.getBounds()
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]))
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())
resizeGL
Fonction appelé quand le widget est redimensionné (ça inclut la création), le cas échéant on recalcule la transformation avec la nouvelle taille
def resizeGL(self,w,h):
self.generateTransform()
paintEvent
Fonction appelé à chaque appel sur update. On crée notre QPainter, on active l'anti-aliasing (marche pas en openGL apparement), on clear l'écran, on applique la transformation et on demande à notre carte et nos voitures de se dessiner.
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)