# 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)