Affichage des nodes et des edges sur un écran réticulé
Avant-propos
modulo
(%).pyqtgraph
D:\anaconda\envs\robot\Lib\site-packages\pyqtgraph\examples\__main__.py
Pycharm > External Libraries\Python\site-packages\pyqtgraph\examples\__main__.py
utils.py > DateTime.delay()
def delay(self, client_function, delay=20, *args, **kwargs):
""" Asynchrone (ne prend pas la main).
:param client_function: Cette fonction sera exécutée après un délai.
:param delay: Délai en ms (20ms par défaut).
:param args: Optionnel. Arguments dans l'appel de la fonction (tuple ou liste).
:param kwargs: Optionnel. Arguments dans l'appel de la fonction (dictionnaire).
:return: NA
"""
key = client_function.__name__
if key in self.d_tempo:
if self.d_tempo[key].isActive():
self.d_tempo[key].disconnect()
else:
self.d_tempo[key] = QTimer()
self.d_tempo[key].setSingleShot(True)
self.d_tempo[key].timeout.connect(lambda: client_function(*args, **kwargs))
self.d_tempo[key].start(delay)
Description
QGraphicsScene
QGraphicsView
QGraphicsItem
...QGraphicsPathItem
main
ainsi que du zoom.UiScene
dans le fichier /pc/ui_scene.py
from PyQt5.QtWidgets import QGraphicsScene
import pyqtgraph as pg
from PyQt5.QtCore import QLine
class UiScene(QGraphicsScene):
def __init__(self, o_scene):
super().__init__(parent=o_scene)
self.o_scene = o_scene
self.init_ui()
def init_ui(self):
self.setSceneRect(-32000, -32000, 64000, 64000) # x, y, w, h
self.setBackgroundBrush(pg.mkColor('#393939'))
def drawBackground(self, painter, rect): # https://doc.qt.io/qt-5/qgraphicsscene.html#drawBackground
super().drawBackground(painter, rect)
print('Draw background') # Provisoire, à supprimer.
# Dessin provisoire de 2 traits.
painter.setPen(pg.mkPen('#fff', width=.5)) # Couleur 'blanc', épaisseur 0.5
painter.drawLine(QLine(-10_000, 0, 10_000, 0)) # Trait horizontal de 20 000 points, passant par le centre.
painter.drawLine(QLine(0, -10_000, 0, 10_000)) # Trait vertical de 20 000 points, passant par le centre.
UiView
dans le fichier /pc/ui_view.py
from PyQt5.QtWidgets import QGraphicsView
class UiView(QGraphicsView):
def __init__(self, o_scene):
super().__init__()
self.o_scene = o_scene
CtrlScene
dans le fichier /pc/ctrl_scene.py
from PyQt5.QtWidgets import QWidget, QVBoxLayout
from ui_scene import UiScene
from ui_view import UiView
class CtrlScene(QWidget):
""" Contrôleur de la scène et de la vue. """
def __init__(self, dir_name):
super().__init__()
self.graph_name = dir_name # On donne au graphe le nom de son dossier.
self.o_gr_scene = None # Instance d'un GraphicsScene dérivé : UiScene.
self.o_gr_view = None # Instance d'un GraphicsView dérivé : UiView.
self.setup()
def setup(self):
""" Création de la scène. """
self.o_gr_scene = UiScene(self) # pyqtgraph.GraphicsScene.GraphicsScene dérivée.
""" Création de l'unique vue. """
self.o_gr_view = UiView(self) # pyqtgraph.GraphicsView dérivée.
""" Affectaion de la scène à visionner. """
self.o_gr_view.setScene(self.o_gr_scene) # Unique vue de la scène (il pourrait y en avoir plusieurs).
""" 'Boîte' container verticale - elle pourrait être horizontale car elle ne contient qu'un élément. """
box = QVBoxLayout() # Son but est d'étirer la vue sur toute sa surface.
""" On place la vue dans cette boîte. """
box.addWidget(self.o_gr_view)
box.setContentsMargins(0, 0, 0, 0) # Suppression des marges (10px par défaut)
""" Enfin, on place cette boîte dans l'onglet. """
self.setLayout(box)
main.py > UiMain.open_graph()
pour rechercher le "Todo : Coder la classe Scene"
CtrlScene
, de retirer le Todo et de supprimer le commentaire.o_scene = QWidget()
par o_scene = CtrlScene(graph_name)
# o_scene = QWidget() # Objet provisoire. Instance de la scène qui sera affichée dans l'onglet.
o_scene = CtrlScene(graph_name)
%
) dans vos calculs.ui_scene.py > UiScene.drawBackground()
, qui vous permet de connaître les coordonnées des côtés de la vue.
left = int(math.floor(rect.left())) # -32000 à (+32000 - l) l = largeur de la vue.
right = int(math.ceil(rect.right())) # (-32000 + l) à +32000
top = int(math.floor(rect.top())) # -32000 à (+32000 - h) h = hauteur de la vue.
bottom = int(math.ceil(rect.bottom())) # (-32000 + h) à +32000
Vérification
Pas de TDD, mais un simple contrôle visuel :
Snippets
Bonjour les codeurs !