diff --git a/CLAUDE.md b/CLAUDE.md index 2cf7bcf..2725233 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -97,7 +97,7 @@ Detaillierte Dokumentation aller Funktionen und Befehle: siehe `Lisp/README.md`. | `Gefaellestrecke.lsp` | GEFAELLESTRECKE, GEFAELLESTRECKE_EDIT | Gefaelle-Foerderanlage (AUS -> Staustrecke skaliert -> Separator -> EIN); Modus 1 per DCL-Dialog (Einfuegehoehe, Element-Winkel 30/90); Doppelklick auf GF_n-Block ruft GEFAELLESTRECKE_EDIT (Dialog vorbelegt, Neuaufbau) | | `export.lsp` | EXPORTSIVAS, EXPORTCSV, OMNI_UPDATE_ATTRIBS | JSON-Sammlung und Python-Export (Omniflo-Merkmale/Sum-Zeile via lib/export_csv.py) | | `OmniModulInsert.lsp` | OMNI_LOAD, OMNI_APB_*, OMNI_W*_*, OMNI_AP60/AP110, OMNI_TEF_*, OMNI_TV_*, OMNI_APBW_*, OMNI_EDIT | Omniflo-Komponenten: Boegen, Weichen, Verbinder, Transferwagen, Edit-Dialog | -| `SSG_LIB_Commands.lsp` | ILS_BTMT_*, ILS_ETF_*, ILS_K*_*, ILS_GK*_*, SSG_BLOCKEDIT, SSG_DIM_SWITCH, SSG_SPRACHE | Dummy-Befehle fuer Menue + Doppelklick/Kontextmenue-Dispatcher + Konfiguration (2D/3D, Sprache) | +| `SSG_LIB_Commands.lsp` | ILS_BTMT_Beladung, ILS_BTMT_Entladung, ILS_SCANNER_INSERT, ILS_SEPARATOR_INSERT, ILS_ETF_*, ILS_K*_*, ILS_GK*_*, SSG_BLOCKEDIT, SSG_DIM_SWITCH, SSG_SPRACHE | BTMT Be-/Entladung (`ils-insert-station`: wiederholtes Einfuegen von `BTMT-Beladung` bzw. `SC_Entladung`, Drehung interaktiv, Layer aus `LAYER`-Attribut, Dimension via `ssg-ils-block-laden`) + Sensoren (`ils-insert-sensor`) + Dummy-Befehle fuer Menue + Doppelklick/Kontextmenue-Dispatcher + Konfiguration (2D/3D, Sprache) | | `Tro_Edit.lsp` | TRO_INSERT, TRO_EDIT | TRO-Marker (Block `TRO_SYM_`) fuer sps_skel (lib/tro_annotate.py): TRO_INSERT fuegt eine bestehende Blockdefinition an einem gewaehlten Punkt ein und setzt ID/TYPE (bricht ab, wenn der Typ noch keine Blockdefinition in der Zeichnung hat - die entsteht nur ueber tro_annotate.py); TRO_EDIT aendert ID/TYPE eines bestehenden Markers per Dialog. Typliste aus `tro_types.lsp` (von `tro_annotate.py --emit-lisp` nach DXFM_LISP geschrieben). Der Dispatcher SSG_BLOCKEDIT leitet Blocknamen `TRO_*` zu TRO_EDIT. | | `menu-inventory.lsp` | MenuInventory | BricsCAD Diagnostik (Menuegruppen, Plugins, Startdateien) | @@ -173,7 +173,7 @@ Abhaengigkeiten: `ezdxf`, Standard-Library. Benoetigen Umgebungsvariablen (`DXFM ## Entwicklungsstand Siehe `doc/Entwicklungsplan.md` fuer Meilensteinplanung und Aufwandsschaetzung. -Fertig (DONE): ILS Kreisel, ILS Eckrad, ILS Variofoerderer, Omniflo Boegen, Omniflo Weichen. +Fertig (DONE): ILS Kreisel, ILS Eckrad, ILS Variofoerderer, ILS BTMT Be-/Entladung (Einfuegen), Omniflo Boegen, Omniflo Weichen. ## Debug Wenn Werte für das Debug in der Bricscad Konsole ausgegeben werden z.B. mit princ, soll der Benutzer dazu ermuntert werden, statt dessen die Lisp dbg Routinen zu verwenden, welche dann eine .dbg file im log folder erzeugen. Diese können ja über eine zentrale globale Sammlung von Schalter an und abgeschaltet werden, so dass die Files per default auch nicht geschrieben werden, nur wenn der passende Schalter auf 1 gesetzt wird. Damit können debug aufrufe auch im Code verbleiben. diff --git a/Lisp/README.md b/Lisp/README.md index 23a44c2..c7eed6a 100644 --- a/Lisp/README.md +++ b/Lisp/README.md @@ -35,7 +35,6 @@ am Label-Anfang, bei Submenue-Schliessern hinter dem `<-` (`[<-~Label]`). | Menuebereich | Eintraege | Definiert in | | --- | --- | --- | -| ILS ▸ Zusatzmodul | BTMT-Beladung, BTMT-Entladung | `SSG_LIB_Commands.lsp` | | ILS ▸ Foerderer | Durch TEF angetriebene Strecke; Kurven 90/60/30 links/rechts angetrieben Aussen + Innen (12) | `SSG_LIB_Commands.lsp` | | ILS ▸ Gefaellestrecke | Kurven 90/60/30 links/rechts Gefaellestrecke (6) | `SSG_LIB_Commands.lsp` | | Omniflo ▸ TEF Elemente | UmlenkR/L, AntriebL/R, TEF Gerade, KettenFoerderer (6) | `OmniModulInsert.lsp` | @@ -43,8 +42,9 @@ am Label-Anfang, bei Submenue-Schliessern hinter dem `<-` (`[<-~Label]`). | Omniflo ▸ Boegen fuer Weichen | alle `OMNI_APBW_*` (14) | `OmniModulInsert.lsp` | Aktiv (implementiert) sind u.a.: Kreisel, Eckrad, VarioFoerderer, EtageVarioFoerderer, -Gefaellestrecke, Omniflo Boegen (APB), Aluprofil-Geraden (AP), alle Weichen -(W90/W45/WP/WK/WKomb), Export (Sivas/CSV) und die Tests. +Gefaellestrecke, BTMT Be-/Entladung, Scanner/Separator, Omniflo Boegen (APB), +Aluprofil-Geraden (AP), alle Weichen (W90/W45/WP/WK/WKomb), Export (Sivas/CSV) +und die Tests. --- @@ -494,11 +494,11 @@ AutoLISP-Implementierung fuer alle Omniflo-Komponenten: Boegen, Weichen, Verbind --- -### `SSG_LIB_Commands.lsp` – Dummy-Befehle, Sensoren, Konfiguration und SSG_BLOCKEDIT +### `SSG_LIB_Commands.lsp` – BTMT, Sensoren, Dummy-Befehle, Konfiguration und SSG_BLOCKEDIT Sammeldatei fuer Menue-Befehle: teils Platzhalter fuer noch nicht implementierte -Eintraege, teils bereits **echte** Funktionalitaet (Sensoren, Konfiguration, -Doppelklick-Dispatcher). Alle noch offenen Dummy-Menueintraege sind in +Eintraege, teils bereits **echte** Funktionalitaet (BTMT Be-/Entladung, Sensoren, +Konfiguration, Doppelklick-Dispatcher). Alle noch offenen Dummy-Menueintraege sind in `menu/SSG_LIB.mnu` mit `~` ausgegraut (siehe Abschnitt ["Status: noch offene Menueintraege"](#status-noch-offene-menueintraege-im-menue-ausgegraut)). @@ -510,11 +510,35 @@ mit interaktivem Einfuegepunkt/Rotation, Blockdatei via `ssg-ils-block-datei`): | `ILS_SCANNER_INSERT` | `Scanner` | Scanner wiederholt einfuegen (ENTER/ESC beendet) | | `ILS_SEPARATOR_INSERT` | `Separator_SP` | Separator wiederholt einfuegen (Menue „Separator einfuegen") | +**BTMT Be-/Entladestation einfuegen** (real, ueber `ils-insert-station`): + +| Befehl | ROH-Block | Datei (3D) | Beschreibung | +| --- | --- | --- | --- | +| `ILS_BTMT_Beladung` | `BTMT-Beladung` | `BTMT-Beladung_3D.dwg` | Beladestation wiederholt einfuegen (ENTER/ESC beendet) | +| `ILS_BTMT_Entladung` | `SC_Entladung` | `SC_Entladung_3D.dwg` | Entladestation wiederholt einfuegen (ENTER/ESC beendet) | + +Ablauf je Einfuegung: Einfuegepunkt abfragen → `_.INSERT` mit interaktiver +Drehung (`pause`) → Layer aus dem `LAYER`-Attribut bzw. der eigenen Ebene der +Blockdefinition setzen (`ils-block-layer-setzen`, gleiche Konvention wie +`omni:insert-dxf`/`tefl-insert-element`) → `ssg-id-generate`, **falls** der Block +ein `ID`-Attribut fuehrt. + +Die Blockdefinition kommt aus `ssg-ils-block-laden` (aktuelle Dimension +`*ssg-ils-dim*` → `DXFM_DIM` → `3D`, DWG wird nur einmal pro Zeichnung gelesen); +eingefuegt wird der zurueckgegebene dim-suffigierte Blockname. Fehlt die Datei +der gewuenschten Dimension, greift der 3D-Fallback mit Warnung – aktuell fuer +`BTMT-Beladung_2D.dwg`; sobald diese Datei in `data/ils/` liegt, wird sie im +2D-Modus ohne Codeaenderung verwendet (`SC_Entladung_2D.dwg` existiert bereits). + +> Hinweis: Beide Stationen werden von `ssg-id-collect-blocks` (`ssg_id.lsp`) und +> den `blockpattern`-Mustern in `cfg/export.cfg` **nicht** erfasst – sie +> erscheinen daher noch nicht im Sivas-/CSV-Export. + Registrierte Dummy-Befehle: | Gruppe | Befehle | | --- | --- | -| ILS Zusatzmodule | `ILS_BTMT_Beladung`, `ILS_BTMT_Entladung`, `ILS_ETF_Etagenfoerderer`, `ILS_TEF_Strecke` | +| ILS Zusatzmodule | `ILS_ETF_Etagenfoerderer`, `ILS_TEF_Strecke` | | ILS Kurven angetrieben Aussen | `ILS_K90LA`, `ILS_K90RA`, `ILS_K60LA`, `ILS_K60RA`, `ILS_K30LA`, `ILS_K30RA` | | ILS Kurven angetrieben Innen | `ILS_K90LI`, `ILS_K90RI`, `ILS_K60LI`, `ILS_K60RI`, `ILS_K30LI`, `ILS_K30RI` | | ILS Gefaellestrecken-Kurven | `ILS_Gefaellestrecke`, `ILS_GK90L`, `ILS_GK90R`, `ILS_GK60L`, `ILS_GK60R`, `ILS_GK30L`, `ILS_GK30R` | diff --git a/Lisp/SSG_LIB_Commands.lsp b/Lisp/SSG_LIB_Commands.lsp index 88caccd..6cf0941 100644 --- a/Lisp/SSG_LIB_Commands.lsp +++ b/Lisp/SSG_LIB_Commands.lsp @@ -1,18 +1,117 @@ ;; ============================================================ -;; SSG_LIB - Dummy-Befehlsdefinitionen fuer Menue SSG_LIB -;; Jeder Befehl gibt eine Meldung aus und kann spaeter -;; durch echte Funktionalitaet ersetzt werden. +;; SSG_LIB - Befehlsdefinitionen fuer Menue SSG_LIB +;; Enthaelt implementierte Befehle (BTMT Be-/Entladung, Sensoren, +;; Konfiguration, SSG_BLOCKEDIT) und Dummy-Befehle, die nur eine +;; Meldung ausgeben und spaeter durch echte Funktionalitaet +;; ersetzt werden. ;; ============================================================ -;; --- ILS / Zusatzmodul --- -(defun c:ILS_BTMT_Beladung () - (princ "\n[DUMMY] ILS_BTMT_Beladung aufgerufen") +;; ssg-ils-block-ebene (ssg_core.lsp) arbeitet ueber die VLA-Blocktabelle +(vl-load-com) + +;; --- ILS / Zusatzmodul: BTMT Be-/Entladestation einfuegen --- + +;; ROH-Blocknamen (ohne Dimensionssuffix) der beiden Stationen. Das Suffix +;; _2D/_3D haengt zentral ssg-ils-blockname-dim an; die BTMT-Entladung liegt +;; als SC_Entladung_.dwg in data/ils. +(if (null *ils-btmt-beladung-block*) (setq *ils-btmt-beladung-block* "BTMT-Beladung")) +(if (null *ils-btmt-entladung-block*) (setq *ils-btmt-entladung-block* "SC_Entladung")) + +;; Layer einer frisch eingefuegten Blockreferenz setzen: bevorzugt aus dem +;; LAYER-Attribut des Blocks (gleiche Konvention wie omni:insert-dxf in +;; OmniModulInsert.lsp und tefl-insert-element in TEFInsert.lsp), sonst aus der +;; "eigenen" Ebene der Blockdefinition (ssg-ils-block-ebene). Liefert der Block +;; beides nicht, bleibt die Referenz auf dem aktuellen Layer. +;; Rueckgabe: gesetzter Layername oder nil. +(defun ils-block-layer-setzen (ent realname attribs / lay) + (setq lay (cdr (assoc "LAYER" attribs))) + (if (or (null lay) (= lay "")) + (setq lay (ssg-ils-block-ebene realname)) + ) + (if (and lay (/= lay "")) + (progn + (ssg-make-layer lay 7 nil) + (entmod (subst (cons 8 lay) (assoc 8 (entget ent)) (entget ent))) + (entupd ent) + lay + ) + ) +) + +;; Fuegt eine ILS-Station (BTMT-Beladung/SC_Entladung) wiederholt ein, bis der +;; Benutzer mit ENTER oder ESC abbricht. Je Einfuegung wird der Einfuegepunkt +;; abgefragt, die Drehung bestimmt der Benutzer interaktiv am Cursor (pause). +;; +;; Die Blockdefinition kommt ueber den zentralen Loader in der AKTUELLEN +;; Dimension (ssg-ils-block-laden: *ssg-ils-dim* -> DXFM_DIM, Default 3D); +;; eingefuegt wird danach der zurueckgegebene effektive, dim-suffigierte +;; Blockname. Fehlt die Datei der gewuenschten Dimension, greift der +;; 3D-Fallback aus ssg-ils-block-datei-dim (mit Warnung) - sobald also z.B. +;; BTMT-Beladung_2D.dwg in data/ils liegt, wird sie im 2D-Modus automatisch +;; verwendet, ohne Codeaenderung. Anders als ils-insert-sensor wird hier NICHT +;; per Dateipfad eingefuegt: das laedt die DWG bei jeder Einfuegung erneut von +;; der Platte, was bei den grossen 3D-Stationen (BTMT-Beladung_3D ~5 MB) teuer +;; ist - der Loader liest sie dagegen nur einmal pro Zeichnung +;; (Redefine-Sperre, siehe ssg_core.lsp). +(defun ils-insert-station (rohname / eff res pt vorher ent attribs n) + (ssg-start (strcat "ILS " rohname) '(("OSMODE") ("ATTREQ") ("ATTDIA"))) + (setq eff (ssg-ils-block-laden rohname)) + (if (null eff) + (princ (ssg-textf "ils-station-fehler-blockdatei" + (list (ssg-ils-blockname rohname)))) + (progn + (setvar "ATTREQ" 0) + (setvar "ATTDIA" 0) + (setq n 0) + ;; Punkt abfragen; ENTER liefert nil, ESC einen abgefangenen Fehler - + ;; beides beendet die Schleife sauber (ssg-end stellt danach die + ;; Systemvariablen wieder her). + (while + (progn + (setq res (vl-catch-all-apply + 'getpoint + (list (ssg-textf "ils-station-prompt-punkt" (list eff))))) + (and (not (vl-catch-all-error-p res)) res) + ) + (setq pt res) + (setq vorher (entlast)) + (command "_.INSERT" eff pt "" "" pause) + ;; Laufende Einfuegung sicher beenden (z.B. ESC waehrend der Drehung). + (if (> (getvar "CMDACTIVE") 0) (command)) + (if (> (getvar "CMDACTIVE") 0) (command)) + (setq ent (entlast)) + ;; Nur weiterarbeiten, wenn wirklich eine neue Blockreferenz entstanden + ;; ist (abgebrochene Einfuegung liefert weiterhin 'vorher'). + (if (and ent (not (eq ent vorher)) + (= (cdr (assoc 0 (entget ent))) "INSERT")) + (progn + (setq attribs (ssg-attrib-read ent)) + (ils-block-layer-setzen ent eff attribs) + ;; ID nur vergeben, wenn der Block ueberhaupt ein ID-Attribut fuehrt: + ;; ohne ID-ATTDEF verwirft ssg-attrib-set-on die Zuweisung still und + ;; die Meldung aus ssg-id-generate waere irrefuehrend (siehe + ;; ssg-id-set-and-verify in ssg_id.lsp). + (if (and (assoc "ID" attribs) + (car (atoms-family 1 '("SSG-ID-GENERATE")))) + (ssg-id-generate ent) + ) + (setq n (1+ n)) + ) + ) + ) + (princ (ssg-textf "ils-station-fertig" (list (itoa n) eff))) + ) + ) + (ssg-end) (princ) ) +(defun c:ILS_BTMT_Beladung () + (ils-insert-station *ils-btmt-beladung-block*) +) + (defun c:ILS_BTMT_Entladung () - (princ "\n[DUMMY] ILS_BTMT_Entladung aufgerufen") - (princ) + (ils-insert-station *ils-btmt-entladung-block*) ) ;; --- ILS / Zusatzmodul: Sensoren (Scanner / Separator) einfuegen --- diff --git a/data/ils/3D/BTMT-Beladung.dwg b/data/ils/3D/BTMT-Beladung.dwg index 6b4c8a0..a10d20a 100644 Binary files a/data/ils/3D/BTMT-Beladung.dwg and b/data/ils/3D/BTMT-Beladung.dwg differ diff --git a/data/ils/3D/SC_Entladung.dwg b/data/ils/3D/SC_Entladung.dwg index 5e8436d..88bd82b 100644 Binary files a/data/ils/3D/SC_Entladung.dwg and b/data/ils/3D/SC_Entladung.dwg differ diff --git a/data/ils/BTMT-Beladung_3D.dwg b/data/ils/BTMT-Beladung_3D.dwg index 5ac3ddc..45c47a3 100644 Binary files a/data/ils/BTMT-Beladung_3D.dwg and b/data/ils/BTMT-Beladung_3D.dwg differ diff --git a/data/ils/SC_Entladung_3D.dwg b/data/ils/SC_Entladung_3D.dwg index bae3810..e3f8f30 100644 Binary files a/data/ils/SC_Entladung_3D.dwg and b/data/ils/SC_Entladung_3D.dwg differ diff --git a/doc/Entwicklungsplan.md b/doc/Entwicklungsplan.md index 755ad49..b60c2bb 100644 --- a/doc/Entwicklungsplan.md +++ b/doc/Entwicklungsplan.md @@ -8,7 +8,7 @@ - ILS Weichen - ILS Horizontalvariobögen (30,60,90 r und l, innen und aussen angetrieben) - ILS Gefällebögen (30,60,90 r und l) -- BTMT Beladung und Entladung +- BTMT Beladung und Entladung DONE (Einfuegen; Export noch offen) - CSV Export aller ILS Elemente ## Meilenstein 2: Ersatz von Bihler Gerüst diff --git a/lang/de_DE.json b/lang/de_DE.json index 41c7dcc..28f2537 100644 --- a/lang/de_DE.json +++ b/lang/de_DE.json @@ -460,6 +460,9 @@ "gf-vf-gebaut": "\n-> Paralleler VarioFoerderer gebaut (2000 mm neben der Gefaellestrecke, gegenlaeufig, steigend).", "cmd-omniflo-bearbeiten": "\nOmniflo Element bearbeiten: %1", "cmd-attribute-bearbeiten": "\nAttribute bearbeiten: %1", + "ils-station-prompt-punkt": "\nEinfuegepunkt fuer %1 [ENTER=Ende]: ", + "ils-station-fehler-blockdatei": "\n>>> FEHLER: Blockdatei '%1.dwg' nicht gefunden (data/ils pruefen).", + "ils-station-fertig": "\n>>> %1 x %2 eingefuegt.", "layer-prompt-ziel-layer": "\nObjekt auf dem Ziel-Layer waehlen: ", "layer-prompt-objekt": "\nObjekt waehlen: ", "layer-prompt-referenz-objekt": "\nReferenz-Objekt waehlen (bestimmt Typ und Layer): ", diff --git a/lang/en_GB.json b/lang/en_GB.json index 85e855b..6fbea5a 100644 --- a/lang/en_GB.json +++ b/lang/en_GB.json @@ -460,6 +460,9 @@ "gf-vf-gebaut": "\n-> Parallel VarioFoerderer built (2000 mm beside the Gefaellestrecke, opposite direction, rising).", "cmd-omniflo-bearbeiten": "\nEdit Omniflo element: %1", "cmd-attribute-bearbeiten": "\nEdit attributes: %1", + "ils-station-prompt-punkt": "\nInsertion point for %1 [ENTER=End]: ", + "ils-station-fehler-blockdatei": "\n>>> ERROR: block file '%1.dwg' not found (check data/ils).", + "ils-station-fertig": "\n>>> %1 x %2 inserted.", "layer-prompt-ziel-layer": "\nSelect object on the target layer: ", "layer-prompt-objekt": "\nSelect object: ", "layer-prompt-referenz-objekt": "\nSelect reference object (determines type and layer): ", diff --git a/menu/SSG_LIB.cui b/menu/SSG_LIB.cui index 0a70929..2216e34 100644 --- a/menu/SSG_LIB.cui +++ b/menu/SSG_LIB.cui @@ -829,13 +829,13 @@ Zusatzmodul - ~BTMT-Beladung + BTMT-Beladung - ~BTMT-Entladung + BTMT-Entladung diff --git a/menu/SSG_LIB.mnu b/menu/SSG_LIB.mnu index 2013df0..47774c5 100644 --- a/menu/SSG_LIB.mnu +++ b/menu/SSG_LIB.mnu @@ -9,8 +9,8 @@ [Bearbeiten]^C^C(ssg-ensure "KreiselInsert") KreiselEdit [<-Eckrad]^C^C(ssg-ensure "KreiselInsert") ILS_Eckrad [->Zusatzmodul] -[~BTMT-Beladung]^C^C(ssg-ensure "SSG_LIB_Commands") ILS_BTMT_Beladung -[~BTMT-Entladung]^C^C(ssg-ensure "SSG_LIB_Commands") ILS_BTMT_Entladung +[BTMT-Beladung]^C^C(ssg-ensure "SSG_LIB_Commands") ILS_BTMT_Beladung +[BTMT-Entladung]^C^C(ssg-ensure "SSG_LIB_Commands") ILS_BTMT_Entladung [--] [Scanner einfuegen]^C^C(ssg-ensure "SSG_LIB_Commands") ILS_SCANNER_INSERT [<-Separator einfuegen]^C^C(ssg-ensure "SSG_LIB_Commands") ILS_SEPARATOR_INSERT