feat: AR-VMS-Seaman initial commit — Python FastAPI + PySide6 (runtime server + desktop studio client)

This commit is contained in:
2026-07-03 12:16:31 -04:00
parent 7390d5cd51
commit 2302e963b2
12 changed files with 1144 additions and 136 deletions
+17 -2
View File
@@ -73,22 +73,37 @@ class SymbolSpec:
class _BaseSymbol(QGraphicsItemGroup):
"""Símbolo base. Subclases dibujan en `_build()`."""
"""Símbolo base. Subclases dibujan en `_build()`.
Cuando el usuario arrastra el símbolo, `itemChange` propaga la nueva
posición al `SymbolSpec` para que sobreviva a re-renders del editor.
"""
KIND: ClassVar[str] = "base"
def __init__(self, spec: SymbolSpec) -> None:
super().__init__()
# NOTA: asignar self.spec ANTES de setPos para que itemChange tenga
# acceso al spec cuando Qt dispare ItemPositionHasChanged durante init.
self.spec = spec
self.setFlag(QGraphicsItem.ItemIsMovable, True)
self.setFlag(QGraphicsItem.ItemIsSelectable, True)
self.setFlag(QGraphicsItem.ItemSendsGeometryChanges, True)
self.setPos(spec.x, spec.y)
self.setRotation(spec.rotation_deg)
self.spec = spec
self._build()
if spec.label:
self._add_label(spec.label)
def itemChange(self, change, value): # type: ignore[override]
"""Propaga la posición arrastrada al SymbolSpec en vivo."""
if change == QGraphicsItem.GraphicsItemChange.ItemPositionHasChanged:
spec = getattr(self, "spec", None)
if spec is not None:
spec.x = float(self.pos().x())
spec.y = float(self.pos().y())
return super().itemChange(change, value)
def _build(self) -> None:
raise NotImplementedError