connect patterns with single link
All checks were successful
CI/CD / wol (push) Successful in 0s
CI/CD / build (push) Successful in 14s

This commit is contained in:
2025-09-12 23:04:10 +02:00
parent 5a3b637582
commit f35b1c5d0b
3 changed files with 39 additions and 10 deletions

View File

@@ -2,9 +2,8 @@ import math
from typing import List, Tuple from typing import List, Tuple
from PySide6.QtCore import Qt
from PySide6.QtGui import QBrush, QPainter from PySide6.QtGui import QPainter
from PySide6.QtWidgets import QGraphicsItemGroup from PySide6.QtWidgets import QGraphicsItemGroup
from PySide6.QtWidgets import ( from PySide6.QtWidgets import (
@@ -16,6 +15,7 @@ from grid.ui.items import (
HPSphereGraphicsItem, HPSphereGraphicsItem,
ArcGraphicsItem, ArcGraphicsItem,
LineGraphicsItem, LineGraphicsItem,
SphereGraphicsItem,
random_sphere_factory, random_sphere_factory,
) )
@@ -31,6 +31,26 @@ class Pattern(QGraphicsItemGroup):
# center coordinates of the pattern # center coordinates of the pattern
self.center_x = top_left_corner_x + int(self.PATTERN_WIDTH / 2) self.center_x = top_left_corner_x + int(self.PATTERN_WIDTH / 2)
self.center_y = top_left_corner_y + int(self.PATTERN_WIDTH / 2) self.center_y = top_left_corner_y + int(self.PATTERN_WIDTH / 2)
self.external_connectors: List[SphereGraphicsItem] = []
def get_external_connectors(self) -> List[SphereGraphicsItem]:
"""Candidate spheres to connect with other patterns.
Returns:
List[SphereGraphicsItem]: List of spheres
"""
return self.external_connectors
def connect(self, other: "Pattern") -> None:
s1 = self.external_connectors[0]
s2 = other.external_connectors[1]
line_start_x = s1.x_pos + s1.SPHERE_WIDTH / 2
line_start_y = s1.y_pos + s1.SPHERE_WIDTH / 2
line_end_x = s2.x_pos + s2.SPHERE_WIDTH / 2
line_end_y = s2.y_pos + s2.SPHERE_WIDTH / 2
self.addToGroup(
LineGraphicsItem(line_start_x, line_start_y, line_end_x, line_end_y, self)
)
def paint( def paint(
self, self,
@@ -39,8 +59,8 @@ class Pattern(QGraphicsItemGroup):
widget: QWidget | None = ..., widget: QWidget | None = ...,
): ):
super().paint(painter, option, widget) super().paint(painter, option, widget)
brush = QBrush(Qt.GlobalColor.gray) # brush = QBrush(Qt.GlobalColor.gray)
painter.setBrush(brush) # painter.setBrush(brush)
painter.drawRect( painter.drawRect(
self.top_left_corner_x, self.top_left_corner_x,
self.top_left_corner_y, self.top_left_corner_y,
@@ -143,7 +163,9 @@ class LargeUltimaPattern(Pattern):
) )
) )
for x, y in points: for x, y in points:
self.addToGroup(random_sphere_factory(x, y)) external_sphere = random_sphere_factory(x, y)
self.addToGroup(external_sphere)
self.external_connectors.append(external_sphere)
# self.addToGroup( # self.addToGroup(
# ArcGraphicsItem( # ArcGraphicsItem(
# self.center_x, self.center_y, self.SPACE_BETWEEN_SPHERE * 2, 0, 90, self # self.center_x, self.center_y, self.SPACE_BETWEEN_SPHERE * 2, 0, 90, self
@@ -178,15 +200,21 @@ class SmallZPattern(Pattern):
self.center_x, self.center_y, self.SPACE_BETWEEN_SPHERE, sphere_on_circle self.center_x, self.center_y, self.SPACE_BETWEEN_SPHERE, sphere_on_circle
) )
self.addToGroup( self.addToGroup(
LineGraphicsItem(self.center_x, self.center_y, points[1][0], points[1][1], self) LineGraphicsItem(
self.center_x, self.center_y, points[1][0], points[1][1], self
)
) )
self.addToGroup( self.addToGroup(
LineGraphicsItem(self.center_x, self.center_y, points[4][0], points[4][1], self) LineGraphicsItem(
self.center_x, self.center_y, points[4][0], points[4][1], self
)
) )
# Remove left and right sphere # Remove left and right sphere
del points[0] del points[0]
del points[2] del points[2]
for x, y in points: for x, y in points:
self.addToGroup(random_sphere_factory(x, y)) external_sphere = random_sphere_factory(x, y)
self.addToGroup(external_sphere)
self.external_connectors.append(external_sphere)
self.addToGroup(HPSphereGraphicsItem(self.center_x, self.center_y)) self.addToGroup(HPSphereGraphicsItem(self.center_x, self.center_y))

View File

@@ -18,7 +18,8 @@ class Window(QWidget):
self.scene = QGraphicsScene(0, 0, 400, 400) self.scene = QGraphicsScene(0, 0, 400, 400)
pp1 = LargeUltimaPattern(0, 0) pp1 = LargeUltimaPattern(0, 0)
pp2 = SmallZPattern(401, 0) pp2 = SmallZPattern(351, 0)
pp1.connect(pp2)
self.scene.addItem(pp1) self.scene.addItem(pp1)
self.scene.addItem(pp2) self.scene.addItem(pp2)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 29 KiB