IRESTE/docs/mainPainter.md
2022-05-20 08:16:20 +02:00

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)