;; ============================================================ ;; TRO_EDIT.LSP - TRO-Marker bearbeiten ;; ;; Bearbeitet die Attribute ID und TYPE eines TRO_*-Blocks. Die Marker ;; werden von sps_skel (lib/tro_annotate.py) in eine Kopie der Zeichnung ;; eingefuegt; ein Marker ist ein Block TRO_SYM_ mit den Attributen ;; ID, TYPE sichtbar ;; FB_BLOCK sichtbar (nur wenn mit --fb beschriftet) ;; ITEMS, CONFIDENCE, SEPARATORS unsichtbar, reine Daten ;; ;; Aufruf: ;; - Doppelklick auf den Marker -> ***DOUBLECLICK [INSERT] -> SSG_BLOCKEDIT ;; - EATTEDIT -> c:EATTEDIT -> SSG_BLOCKEDIT ;; - Menue SSG_LIB > TRO > Marker bearbeiten ;; - direkt: TRO_EDIT ;; Der Dispatcher SSG_BLOCKEDIT (SSG_LIB_Commands.lsp) leitet Blocknamen ;; "TRO_*" hierher. ;; ;; Die Auswahlliste der Typen kommt aus tro_types.lsp, die sps_skel mit ;; lib/tro_annotate.py --emit-lisp ;; nach DXFM_LISP schreibt. Fehlt die Datei, bleibt nur der aktuelle Typ des ;; Blocks in der Liste - der Dialog laeuft also weiter. ;; ;; Grenze: geaendert werden nur die Attribute. Die *Form* des Markers gehoert ;; zur Blockdefinition des Typs und FB_BLOCK ist aus dem Typ abgeleitet - ;; beides passt erst nach einem neuen Lauf von tro_annotate.py wieder. ;; ;; Setzt ssg_core.lsp (ssg-start/ssg-end, ssg-attrib-*) und ssg_lang.lsp voraus. ;; ============================================================ (setq *tro-block-prefix* "TRO_SYM_") ;; ------------------------------------------------------------ ;; Gueltige TRO-Typen laden (aus tro_types.lsp, erzeugt aus dem Katalog) ;; ------------------------------------------------------------ (defun tro-typen-laden ( / datei) (if (null *TRO-TYPES*) (progn (setq datei (cond ((and (boundp '*ssg-lisp-pfad*) *ssg-lisp-pfad* (findfile (strcat *ssg-lisp-pfad* "/tro_types.lsp"))) (strcat *ssg-lisp-pfad* "/tro_types.lsp")) ((getenv "DXFM_LISP") (findfile (strcat (vl-string-translate "\\" "/" (getenv "DXFM_LISP")) "/tro_types.lsp"))) (t (findfile "tro_types.lsp")) ) ) (if datei (load datei)) ) ) *TRO-TYPES* ) ;; ------------------------------------------------------------ ;; Position eines Elements in einer Liste (nil wenn nicht enthalten) ;; ------------------------------------------------------------ (defun tro-index (item lst / i pos) (setq i 0 pos nil) (foreach x lst (if (and (null pos) (= (strcase x) (strcase item))) (setq pos i)) (setq i (1+ i)) ) pos ) ;; ------------------------------------------------------------ ;; Auswahlliste aufbauen: Katalogtypen, der aktuelle Typ immer enthalten ;; ------------------------------------------------------------ (defun tro-typliste (aktueller / liste) (setq liste (tro-typen-laden)) (if (and aktueller (/= aktueller "") (null (tro-index aktueller liste))) (setq liste (append liste (list aktueller))) ) (if liste liste (list (if aktueller aktueller ""))) ) ;; ------------------------------------------------------------ ;; C:TRO_EDIT - Dialog fuer einen TRO-Marker ;; ------------------------------------------------------------ (defun c:TRO_EDIT ( / ss ent ed bname attribs alt-id alt-type alt-fb neu-id neu-type liste idx dcl-pfad dat ergebnis) ;; 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 "TRO_EDIT" nil) ;; Marker auswaehlen (falls nicht vorselektiert) (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 "TRO_*")) (progn (alert (ssg-textf "tro-edit-kein-tro" (list bname))) (ssg-end) (exit) ) ) ;; --- aktuelle Attribute lesen ---------------------------------------- (setq attribs (ssg-attrib-read ent) alt-id (cdr (assoc "ID" attribs)) alt-type (cdr (assoc "TYPE" attribs)) alt-fb (cdr (assoc "FB_BLOCK" attribs))) (if (null alt-id) (progn (alert (ssg-textf "tro-edit-kein-id-attribut" (list bname))) (ssg-end) (exit) ) ) (if (null alt-type) (setq alt-type "")) ;; --- Dialog ----------------------------------------------------------- (setq dcl-pfad (strcat (getenv "DXFM_DCL") "/tro_edit.dcl")) (setq dat (load_dialog dcl-pfad)) (if (not (new_dialog "tro_edit" dat)) (progn (alert (ssg-textf "tro-edit-dialog-fehlt" (list dcl-pfad))) (ssg-end) (exit) ) ) (setq liste (tro-typliste alt-type) idx (tro-index alt-type liste)) (set_tile "blockname" (ssg-textf "tro-edit-block" (list bname))) (set_tile "fb" (ssg-textf "tro-edit-fb" (list (if alt-fb alt-fb "-")))) (set_tile "hinweis" (ssg-text "tro-edit-hinweis")) (set_tile "id" alt-id) (start_list "type") (foreach typ liste (add_list typ)) (end_list) (set_tile "type" (itoa (if idx idx 0))) (setq neu-id alt-id neu-type alt-type) (action_tile "id" "(setq neu-id (get_tile \"id\"))") (action_tile "type" "(setq neu-type (nth (atoi (get_tile \"type\")) liste))") (action_tile "accept" (strcat "(setq neu-id (get_tile \"id\")" " neu-type (nth (atoi (get_tile \"type\")) liste))" "(done_dialog 1)")) (action_tile "cancel" "(done_dialog 0)") (setq ergebnis (start_dialog)) (unload_dialog dat) ;; --- zurueckschreiben ------------------------------------------------- (if (= ergebnis 1) (if (= (vl-string-trim " " neu-id) "") (alert (ssg-text "tro-edit-id-leer")) (progn (ssg-attrib-set-on ent (list (cons "ID" neu-id) (cons "TYPE" neu-type))) (entupd ent) (princ (ssg-textf "tro-edit-gespeichert" (list neu-id neu-type))) (if (/= neu-type alt-type) (princ (ssg-text "tro-edit-typ-geaendert")) ) ) ) ) (ssg-end) (princ) ) (prompt "\nTro_Edit.lsp geladen - Befehl: TRO_EDIT") (princ)