From a4357aba8589b47c016b315778fc682c8603e605 Mon Sep 17 00:00:00 2001 From: Samer Ayadi Date: Fri, 23 Oct 2026 12:47:12 +0200 Subject: [PATCH] [ADD] JAM_EDIT: Dialog fuer Staubereiche (JAM_AREA) aus sps_skel Neuer Befehl JAM_EDIT (Lisp/Jam_Edit.lsp, dcl/jam_edit.dcl): aendert Foerderer und laufende Nummer eines Staubereichs Jam_, den sps_skel (lib/tro_annotate.py --anlage) als Block JAM_AREA einzeichnet; Knopf zurueck auf den abgeleiteten Wert, Warnung bei doppeltem Namen. SSG_BLOCKEDIT leitet JAM_* per Doppelklick dorthin; ssg_load.lsp laedt das Modul; Texte in de_DE/en_GB. In die SCL kommt die Aenderung mit tro_annotate --read-jams. Co-Authored-By: Claude Opus 5.5 --- Lisp/Jam_Edit.lsp | 183 ++++++++++++++++++++++++++++++++++++++ Lisp/SSG_LIB_Commands.lsp | 17 ++++ Lisp/ssg_load.lsp | 1 + dcl/jam_edit.dcl | 52 +++++++++++ lang/de_DE.json | 10 +++ lang/en_GB.json | 10 +++ 6 files changed, 273 insertions(+) create mode 100644 Lisp/Jam_Edit.lsp create mode 100644 dcl/jam_edit.dcl diff --git a/Lisp/Jam_Edit.lsp b/Lisp/Jam_Edit.lsp new file mode 100644 index 0000000..e3f3e28 --- /dev/null +++ b/Lisp/Jam_Edit.lsp @@ -0,0 +1,183 @@ +;; ============================================================ +;; JAM_EDIT.LSP - Staubereich (JAM_AREA) bearbeiten +;; +;; Die Staubereiche zeichnet sps_skel (lib/tro_annotate.py --anlage) als +;; Block JAM_AREA: ein Rechteck, darin der Name Jam_. Attribute +;; NAME sichtbar - Jam0054_3 +;; CONVEYOR, NUMBER unsichtbar - Foerderer NNNN und laufende Nummer k +;; TRO, ENTRY unsichtbar - TRO und Eingang, in den er fuehrt +;; (stabiler Schluessel, nicht aendern) +;; AREA unsichtbar - Kennung der TRO-JSON (J0039) +;; AUTO unsichtbar - von sps_skel abgeleitete Nummer NNNN_k +;; +;; Aufruf JAM_EDIT: +;; - Doppelklick auf den Staubereich -> ***DOUBLECLICK [INSERT] -> SSG_BLOCKEDIT +;; - EATTEDIT -> c:EATTEDIT -> SSG_BLOCKEDIT +;; - direkt: JAM_EDIT +;; Der Dispatcher SSG_BLOCKEDIT (SSG_LIB_Commands.lsp) leitet Blocknamen +;; "JAM_*" hierher. +;; +;; Der Dialog aendert nur die Zeichnung. In die SCL kommt die Aenderung mit +;; tro_annotate.bat --file --read-jams (-> cfg/_jam_names.ini) +;; scl_skeleton.bat --json _anlage.json --templates +;; +;; Setzt ssg_core.lsp (ssg-start/ssg-end, ssg-attrib-*) und ssg_lang.lsp voraus. +;; ============================================================ + + +;; ------------------------------------------------------------ +;; Nur Ziffern, nicht leer +;; ------------------------------------------------------------ +(defun jam-ziffern-p (s) + (and s (/= s "") (not (wcmatch s "*[~0-9]*"))) +) + + +;; ------------------------------------------------------------ +;; Name aus Foerderer und Nummer: "0054" "3" -> "Jam0054_3" +;; ------------------------------------------------------------ +(defun jam-name (foerderer nummer) + (strcat "Jam" foerderer "_" nummer) +) + + +;; ------------------------------------------------------------ +;; Gibt es den Namen schon an einem anderen Staubereich? +;; Liefert die Kennung (AREA) des anderen Blocks oder nil. +;; ------------------------------------------------------------ +(defun jam-name-belegt (name eigener / ss i ent attribs treffer) + (setq treffer nil) + (if (setq ss (ssget "_X" (list '(0 . "INSERT") '(2 . "JAM_*")))) + (progn + (setq i 0) + (while (and (null treffer) (setq ent (ssname ss i))) + (if (not (eq ent eigener)) + (progn + (setq attribs (ssg-attrib-read ent)) + (if (= (strcase (cond ((cdr (assoc "NAME" attribs))) (""))) (strcase name)) + (setq treffer (cond ((cdr (assoc "AREA" attribs))) ("?"))) + ) + ) + ) + (setq i (1+ i)) + ) + ) + ) + treffer +) + + +;; ------------------------------------------------------------ +;; C:JAM_EDIT - Dialog fuer einen Staubereich +;; ------------------------------------------------------------ +(defun c:JAM_EDIT ( / ss ent ed bname attribs + alt-conv alt-nr auto tro entry area + neu-conv neu-nr auto-conv auto-nr pos + dcl-pfad dat ergebnis name andere) + + ;; Implied Selection VOR ssg-start pruefen (ssg-start hebt Selektion auf) + (setq ss (ssget "I")) + (if (and ss (= (sslength ss) 1) + (= (cdr (assoc 0 (entget (ssname ss 0)))) "INSERT")) + (setq ent (ssname ss 0)) + ) + + (ssg-start "JAM_EDIT" nil) + + (if (null ent) + (progn + (princ (ssg-text "cmd-block-auswaehlen")) + (setq ss (ssget ":S" '((0 . "INSERT")))) + (if ss (setq ent (ssname ss 0))) + ) + ) + (if (null ent) + (progn (princ (ssg-text "cmd-kein-block-ausgewaehlt")) (ssg-end) (exit)) + ) + + (setq ed (entget ent) + bname (cdr (assoc 2 ed))) + (if (not (wcmatch bname "JAM_*")) + (progn + (alert (ssg-textf "jam-edit-kein-jam" (list bname))) + (ssg-end) + (exit) + ) + ) + + ;; --- aktuelle Attribute lesen ---------------------------------------- + (setq attribs (ssg-attrib-read ent) + alt-conv (cond ((cdr (assoc "CONVEYOR" attribs))) ("")) + alt-nr (cond ((cdr (assoc "NUMBER" attribs))) ("")) + auto (cond ((cdr (assoc "AUTO" attribs))) ("")) + tro (cond ((cdr (assoc "TRO" attribs))) ("?")) + entry (cond ((cdr (assoc "ENTRY" attribs))) ("?")) + area (cond ((cdr (assoc "AREA" attribs))) ("?"))) + + ;; AUTO "0054_3" -> Foerderer "0054", Nummer "3" + (setq auto-conv "" auto-nr "") + (if (setq pos (vl-string-search "_" auto)) + (setq auto-conv (substr auto 1 pos) + auto-nr (substr auto (+ pos 2))) + ) + + ;; --- Dialog ----------------------------------------------------------- + (setq dcl-pfad (strcat (getenv "DXFM_DCL") "/jam_edit.dcl")) + (setq dat (load_dialog dcl-pfad)) + (if (not (new_dialog "jam_edit" dat)) + (progn + (alert (ssg-textf "jam-edit-dialog-fehlt" (list dcl-pfad))) + (ssg-end) + (exit) + ) + ) + + (set_tile "bereich" (ssg-textf "jam-edit-bereich" (list area tro entry))) + (set_tile "auto" (ssg-textf "jam-edit-auto" + (list (if (= auto "") "-" (jam-name auto-conv auto-nr))))) + (set_tile "hinweis" (ssg-text "jam-edit-hinweis")) + (set_tile "conveyor" alt-conv) + (set_tile "number" alt-nr) + (if (= auto "") (mode_tile "reset" 1)) + + (setq neu-conv alt-conv neu-nr alt-nr) + (action_tile "reset" + "(set_tile \"conveyor\" auto-conv) (set_tile \"number\" auto-nr)") + (action_tile "accept" + (strcat "(setq neu-conv (vl-string-trim \" \" (get_tile \"conveyor\"))" + " neu-nr (vl-string-trim \" \" (get_tile \"number\")))" + "(done_dialog 1)")) + (action_tile "cancel" "(done_dialog 0)") + + (setq ergebnis (start_dialog)) + (unload_dialog dat) + + ;; --- pruefen und zurueckschreiben ------------------------------------- + (if (= ergebnis 1) + (cond + ((not (and (jam-ziffern-p neu-conv) (= (strlen neu-conv) 4))) + (alert (ssg-text "jam-edit-foerderer-ungueltig"))) + ((not (and (jam-ziffern-p neu-nr) (> (atoi neu-nr) 0))) + (alert (ssg-text "jam-edit-nummer-ungueltig"))) + (t + (setq neu-nr (itoa (atoi neu-nr)) + name (jam-name neu-conv neu-nr)) + (ssg-attrib-set-on ent (list (cons "CONVEYOR" neu-conv) + (cons "NUMBER" neu-nr) + (cons "NAME" name))) + (entupd ent) + (princ (ssg-textf "jam-edit-gespeichert" (list name area))) + (if (setq andere (jam-name-belegt name ent)) + (princ (ssg-textf "jam-edit-doppelt" (list name andere))) + ) + ) + ) + ) + + (ssg-end) + (princ) +) + + +(prompt "\nJam_Edit.lsp geladen - Befehl: JAM_EDIT") +(princ) diff --git a/Lisp/SSG_LIB_Commands.lsp b/Lisp/SSG_LIB_Commands.lsp index 943e707..c01dd2b 100644 --- a/Lisp/SSG_LIB_Commands.lsp +++ b/Lisp/SSG_LIB_Commands.lsp @@ -382,6 +382,23 @@ ) ) + ;; Staubereiche (JAM_AREA) -> JAM_EDIT (DCL-Dialog) + ;; Ebenfalls aus der Beschriftung von sps_skel (tro_annotate.py --anlage); + ;; Foerderer und laufende Nummer des Staubereichs Jam_. + ((wcmatch bname "JAM_*") + (princ (ssg-textf "cmd-jam-bearbeiten" (list bname))) + (if (and (null *ssg-Jam_Edit-loaded*) (atoms-family 1 '("SSG-ENSURE"))) + (ssg-ensure "Jam_Edit") + ) + (if (atoms-family 1 '("C:JAM_EDIT")) + (c:JAM_EDIT) + (progn + (princ (ssg-textf "tro-edit-modul-fehlt" (list "Jam_Edit.lsp"))) + (command "_.EATTEDIT") + ) + ) + ) + ;; TRO-Marker (TRO_SYM_) -> TRO_EDIT (DCL-Dialog) ;; Die Marker kommen aus sps_skel (lib/tro_annotate.py) und tragen die ;; Attribute ID und TYPE. Modul bei Bedarf nachladen, damit der Doppelklick diff --git a/Lisp/ssg_load.lsp b/Lisp/ssg_load.lsp index 1790282..c282152 100644 --- a/Lisp/ssg_load.lsp +++ b/Lisp/ssg_load.lsp @@ -39,6 +39,7 @@ (load (strcat base-path "OmniModulInsert.lsp") "OmniModulInsert.lsp nicht gefunden") (load (strcat base-path "Tro_Edit.lsp") "Tro_Edit.lsp nicht gefunden") (load (strcat base-path "Connection_Edit.lsp") "Connection_Edit.lsp nicht gefunden") + (load (strcat base-path "Jam_Edit.lsp") "Jam_Edit.lsp nicht gefunden") (load (strcat base-path "SSG_LIB_Commands.lsp") "SSG_LIB_Commands.lsp nicht gefunden") ;; Werkzeuge: ssg_texttools nutzt ssg_blocktools, beide nutzen ssg_input (load (strcat base-path "ssg_blocktools.lsp") "ssg_blocktools.lsp nicht gefunden") diff --git a/dcl/jam_edit.dcl b/dcl/jam_edit.dcl new file mode 100644 index 0000000..3c1ef47 --- /dev/null +++ b/dcl/jam_edit.dcl @@ -0,0 +1,52 @@ +// ============================================================ +// jam_edit.dcl - Staubereich bearbeiten +// Aendert Foerderer und laufende Nummer eines JAM_AREA-Blocks, den die +// Beschriftung aus sps_skel (lib/tro_annotate.py --anlage) eingefuegt hat. +// Aufruf ueber c:JAM_EDIT (Lisp/Jam_Edit.lsp). +// ============================================================ + +jam_edit : dialog { + label = "Staubereich bearbeiten"; + + : column { + + : text { + key = "bereich"; + label = ""; + width = 50; + } + + : edit_box { + key = "conveyor"; + label = "Foerderer (NNNN):"; + edit_width = 8; + } + + : edit_box { + key = "number"; + label = "Laufende Nummer:"; + edit_width = 8; + } + + : row { + : text { + key = "auto"; + label = ""; + width = 30; + } + : button { + key = "reset"; + label = "Abgeleitet uebernehmen"; + } + } + + : text { + key = "hinweis"; + label = ""; + width = 50; + } + + } + + ok_cancel; +} diff --git a/lang/de_DE.json b/lang/de_DE.json index 2cdeedd..13c66d9 100644 --- a/lang/de_DE.json +++ b/lang/de_DE.json @@ -940,6 +940,16 @@ "tro-insert-kein-block": "Kein Symbol fuer diesen Typ in der Zeichnung (%1) - bitte tro_annotate.py mit diesem Typ laufen lassen.", "tro-insert-prompt-punkt": "\nEinfuegepunkt: ", "tro-insert-eingefuegt": "\nTRO eingefuegt: ID = %1, TYP = %2", + "cmd-jam-bearbeiten": "\nStaubereich bearbeiten: %1", + "jam-edit-kein-jam": "Block %1 ist kein Staubereich (erwartet JAM_*).", + "jam-edit-dialog-fehlt": "Dialogdatei nicht gefunden:\n%1\nDXFM_DCL pruefen (setenv.bat).", + "jam-edit-bereich": "Staubereich %1 vor %2 (Eingang %3)", + "jam-edit-auto": "Abgeleitet: %1", + "jam-edit-hinweis": "In die SCL: tro_annotate --read-jams, danach scl_skeleton.", + "jam-edit-foerderer-ungueltig": "Der Foerderer muss vierstellig sein (z. B. 0054) - nichts geaendert.", + "jam-edit-nummer-ungueltig": "Die laufende Nummer muss eine ganze Zahl ab 1 sein - nichts geaendert.", + "jam-edit-gespeichert": "\nStaubereich gespeichert: %1 (%2)", + "jam-edit-doppelt": "\nACHTUNG: %1 gibt es schon in dieser Zeichnung (%2).", "vfl-abbruch-gesichert": "\n>>> Linienzug abgebrochen: %1 Objekt(e) als Block gesichert (per Doppelklick editierbar/fortsetzbar).", "vfl-zurueck-glied-verworfen": "\n>>> Zurueck: letztes Kettenglied wird verworfen - bitte neu beantworten.", "vfl-abbruch-nichts-gebaut": "\n>>> Abgebrochen - es wurde noch keine Geometrie erzeugt.", diff --git a/lang/en_GB.json b/lang/en_GB.json index 7a115c0..d40c996 100644 --- a/lang/en_GB.json +++ b/lang/en_GB.json @@ -940,6 +940,16 @@ "tro-insert-kein-block": "No symbol for this type in the drawing (%1) - run tro_annotate.py with this type first.", "tro-insert-prompt-punkt": "\nInsertion point: ", "tro-insert-eingefuegt": "\nTRO inserted: ID = %1, TYPE = %2", + "cmd-jam-bearbeiten": "\nEdit jam area: %1", + "jam-edit-kein-jam": "Block %1 is not a jam area (expected JAM_*).", + "jam-edit-dialog-fehlt": "Dialog file not found:\n%1\nCheck DXFM_DCL (setenv.bat).", + "jam-edit-bereich": "Jam area %1 in front of %2 (entry %3)", + "jam-edit-auto": "Derived: %1", + "jam-edit-hinweis": "Into the SCL: tro_annotate --read-jams, then scl_skeleton.", + "jam-edit-foerderer-ungueltig": "The conveyor must have four digits (e.g. 0054) - nothing changed.", + "jam-edit-nummer-ungueltig": "The running number must be a whole number from 1 - nothing changed.", + "jam-edit-gespeichert": "\nJam area saved: %1 (%2)", + "jam-edit-doppelt": "\nWARNING: %1 already exists in this drawing (%2).", "vfl-abbruch-gesichert": "\n>>> Chain cancelled: %1 object(s) saved as a block (editable/resumable via double-click).", "vfl-zurueck-glied-verworfen": "\n>>> Back: discarding the last chain element - please answer it again.", "vfl-abbruch-nichts-gebaut": "\n>>> Cancelled - no geometry was created yet.",