160 lines
5.2 KiB
Python
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)
|