Files
dxfmakros/lib/elemente/omniflo_boegen.py
T

160 lines
5.2 KiB
Python

# omniflo_boegen.py
# Omniflo Bogen-Auswahl-Dialog (wx) und Bogen-Commands
# Ersetzt die Bogen-Teile von OmniModulInsert.lsp + omniflo_boegen.dcl
# ============================================
import wx
import PyRx as Rx
from elemente.omniflo import (
load_boegen,
filter_by,
insert_from_entry,
sivasnr_to_str,
)
# ============================================================
# Bogen-Auswahl-Dialog (ersetzt omniflo_boegen.dcl)
# ============================================================
class BogenSelectDialog(wx.Dialog):
"""Bogen-Auswahl-Dialog.
Layout:
- Dropdown: Bogenart (ProfilTyp-Liste)
- Detail-Felder (readonly): SivasNr, Winkel, Radius, Breite, Laenge
- OK / Abbrechen
"""
def __init__(self, parent, boegen_liste):
super().__init__(parent, title="Omniflo Bogen auswaehlen",
size=(460, 260),
style=wx.DEFAULT_DIALOG_STYLE)
self._boegen = boegen_liste
self._selected_idx = 0
panel = wx.Panel(self)
sizer = wx.BoxSizer(wx.VERTICAL)
# Dropdown: Bogenart
row_art = wx.BoxSizer(wx.HORIZONTAL)
row_art.Add(wx.StaticText(panel, label="Bogenart:"), 0,
wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 5)
profil_list = [e.get("ProfilTyp", "?") for e in boegen_liste]
self.cb_bogenart = wx.Choice(panel, choices=profil_list)
self.cb_bogenart.SetSelection(0)
self.cb_bogenart.Bind(wx.EVT_CHOICE, self._on_selection)
row_art.Add(self.cb_bogenart, 1)
sizer.Add(row_art, 0, wx.EXPAND | wx.ALL, 5)
# Detail-Felder (2 Spalten)
grid = wx.FlexGridSizer(cols=4, hgap=10, vgap=5)
grid.AddGrowableCol(1)
grid.AddGrowableCol(3)
grid.Add(wx.StaticText(panel, label="SivasNr:"), 0, wx.ALIGN_CENTER_VERTICAL)
self.txt_sivasnr = wx.TextCtrl(panel, style=wx.TE_READONLY, size=(140, -1))
grid.Add(self.txt_sivasnr, 0)
grid.Add(wx.StaticText(panel, label="Winkel:"), 0, wx.ALIGN_CENTER_VERTICAL)
self.txt_winkel = wx.TextCtrl(panel, style=wx.TE_READONLY, size=(100, -1))
grid.Add(self.txt_winkel, 0)
grid.Add(wx.StaticText(panel, label="Radius:"), 0, wx.ALIGN_CENTER_VERTICAL)
self.txt_radius = wx.TextCtrl(panel, style=wx.TE_READONLY, size=(100, -1))
grid.Add(self.txt_radius, 0)
grid.Add(wx.StaticText(panel, label="Breite:"), 0, wx.ALIGN_CENTER_VERTICAL)
self.txt_breite = wx.TextCtrl(panel, style=wx.TE_READONLY, size=(100, -1))
grid.Add(self.txt_breite, 0)
grid.Add(wx.StaticText(panel, label="Laenge:"), 0, wx.ALIGN_CENTER_VERTICAL)
self.txt_laenge = wx.TextCtrl(panel, style=wx.TE_READONLY, size=(100, -1))
grid.Add(self.txt_laenge, 0)
sizer.Add(grid, 0, wx.EXPAND | wx.ALL, 5)
# OK / Cancel
btn_sizer = self.CreateStdDialogButtonSizer(wx.OK | wx.CANCEL)
sizer.Add(btn_sizer, 0, wx.EXPAND | wx.ALL, 10)
panel.SetSizer(sizer)
self.Fit()
self.CenterOnScreen()
# Startwerte
self._update_details(0)
def _on_selection(self, event):
self._selected_idx = self.cb_bogenart.GetSelection()
self._update_details(self._selected_idx)
def _update_details(self, idx):
if idx < 0 or idx >= len(self._boegen):
return
e = self._boegen[idx]
self.txt_sivasnr.SetValue(sivasnr_to_str(e.get("Sivasnr")))
wkl = e.get("KurvenWinkel", 0)
self.txt_winkel.SetValue(f"{wkl} Grad")
self.txt_radius.SetValue(str(e.get("Radius", "?")))
self.txt_breite.SetValue(str(e.get("Breite", "?")))
self.txt_laenge.SetValue(str(e.get("Länge", "?")))
def get_selected(self):
"""Gewaehlten Bogen-Eintrag zurueckgeben."""
if 0 <= self._selected_idx < len(self._boegen):
return self._boegen[self._selected_idx]
return None
# ============================================================
# Generische Bogen-Einfuege-Logik
# ============================================================
def _bogen_command(winkel):
"""Bogen-Dialog oeffnen, Auswahl einfuegen."""
boegen = filter_by(load_boegen(), "KurvenWinkel", winkel)
if not boegen:
wkl_str = f"{winkel}" if isinstance(winkel, int) else f"{winkel:.1f}"
print(f"\nKeine Boegen fuer {wkl_str} Grad gefunden.")
return
dlg = BogenSelectDialog(None, boegen)
if dlg.ShowModal() == wx.ID_OK:
eintrag = dlg.get_selected()
dlg.Destroy()
if eintrag:
insert_from_entry(eintrag)
else:
print("\n[BOGEN] Kein Eintrag ausgewaehlt.")
else:
dlg.Destroy()
print("\n[BOGEN] Abgebrochen.")
# ============================================================
# Bogen-Commands (gleiche Namen wie LISP)
# ============================================================
@Rx.command("OMNI_APB_630_90")
def cmd_bogen_90():
_bogen_command(90)
@Rx.command("OMNI_APB_550_675")
def cmd_bogen_675():
_bogen_command(67.5)
@Rx.command("OMNI_APB_630_45")
def cmd_bogen_45():
_bogen_command(45)
@Rx.command("OMNI_APB_550_225")
def cmd_bogen_225():
_bogen_command(22.5)
@Rx.command("OMNI_APB_650_180")
def cmd_bogen_180():
_bogen_command(180)