import sys from PyQt5.QtWidgets import QApplication, QGraphicsItemGroup ,QGraphicsItem, QGraphicsScene, QGraphicsView, QMainWindow, QHBoxLayout, QVBoxLayout,QPushButton, QWidget, QFileDialog from PyQt5.QtCore import Qt from PyQt5.QtGui import QPainter,QImage from graphics_rect_item import GraphicsRectItemWithTable, GraphicsRectItemWithTable2x2 from draggable_diamond import DraggableDiamond from draggable_group import DraggableGroup class LogigrammeApp(QMainWindow): def __init__(self, parent=None): super().__init__() self.setWindowTitle("Créateur de Logigrammes avec Tableau Dynamique") self.setGeometry(100, 100, 800, 600) # Initialisation de la scène graphique self.scene = QGraphicsScene() self.view = QGraphicsView(self.scene) # Configuration de la vue self.view.setRenderHint(QPainter.Antialiasing) self.view.setRenderHint(QPainter.SmoothPixmapTransform) self.view.setDragMode(QGraphicsView.ScrollHandDrag) # Barre d'outils self.init_toolbar() # Layout principal layout = QVBoxLayout() layout.addWidget(self.view) container = QWidget() container.setLayout(layout) self.setCentralWidget(container) def init_toolbar(self): toolbar_layout = QHBoxLayout() btn_add_table = QPushButton("Ajouter Tableau") btn_add_table.clicked.connect(self.add_table) toolbar_layout.addWidget(btn_add_table) btn_add_table_2x2 = QPushButton("Ajouter Tableau 2x2") btn_add_table_2x2.clicked.connect(self.add_table_2x2) toolbar_layout.addWidget(btn_add_table_2x2) btn_add_diamond = QPushButton("Ajouter Losange") btn_add_diamond.clicked.connect(self.add_diamond) toolbar_layout.addWidget(btn_add_diamond) btn_add_group = QPushButton("Créer Groupe") btn_add_group.clicked.connect(self.create_group) toolbar_layout.addWidget(btn_add_group) btn_save = QPushButton("Exporter en Image") btn_save.clicked.connect(self.export_image) toolbar_layout.addWidget(btn_save) toolbar_container = QWidget() toolbar_container.setLayout(toolbar_layout) self.menuBar().setCornerWidget(toolbar_container) def add_table(self): table = GraphicsRectItemWithTable() self.scene.addItem(table) def add_table_2x2(self): # Créer un autre rectangle avec un tableau de 2x2 table = GraphicsRectItemWithTable2x2() self.scene.addItem(table) def add_diamond(self): # Ajout d'un cercle représentant une étape diamond = DraggableDiamond(0, 0, 150, 100,"Texte CentrÚ qui peut être long et peut dépasser") self.scene.addItem(diamond) def create_group(self): items = self.scene.selectedItems() if items: group = DraggableGroup() for item in items: if isinstance(item, DraggableGroup): # Ajouter un groupe existant au nouveau groupe for child in item.childItems(): group.add_item(child) self.scene.removeItem(item) # Supprimer le groupe parent de la scène else: group.add_item(item) self.scene.clearSelection() self.scene.addItem(group) group.select_group_only() print("Groupe créé avec succès, y compris les groupes imbriqués.") else: print("Aucun élément sélectionné pour créer un groupe.") def export_image(self): file_path, _ = QFileDialog.getSaveFileName(self, "Exporter en Image", "", "Images (*.png *.jpg *.bmp)") if file_path: image = self.scene_to_image() image.save(file_path) def scene_to_image(self): rect = self.scene.itemsBoundingRect() image = QImage(rect.size().toSize(), QImage.Format_ARGB32) image.fill(Qt.white) painter = QPainter(image) self.scene.render(painter, target=rect) painter.end() return image def adjust_group_size(self): if self.childItems(): # Calculer la bounding box de tous les éléments enfants bounding_rect = self.childItems()[0].boundingRect() for item in self.childItems()[1:]: bounding_rect = bounding_rect.united(item.boundingRect().translated(item.pos())) # Redimensionner les limites du groupe self.prepareGeometryChange() # Nécessaire pour notifier le changement de géométrie self.setBoundingRect(bounding_rect) print("Groupe redimensionné automatiquement.") if __name__ == "__main__": app = QApplication(sys.argv) window = LogigrammeApp() window.show() sys.exit(app.exec_())