This commit is contained in:
2026-10-23 15:34:33 +02:00
6 changed files with 273 additions and 0 deletions
+183
View File
@@ -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<NNNN>_<k>. 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 <csv> --read-jams (-> cfg/<csv>_jam_names.ini)
;; scl_skeleton.bat --json <csv>_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)
+17
View File
@@ -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<NNNN>_<k>.
((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_<Typ>) -> 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
+1
View File
@@ -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")
+52
View File
@@ -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;
}
+10
View File
@@ -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.",
+10
View File
@@ -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.",