feat: Eckrad-Dialog, Kreiselname, Hoehen-Neuberechnung beim Export
- Eckrad: eigener DCL-Dialog (eckrad_edit.dcl) beim Einfuegen und per Doppelklick (EckradEdit); Sivas-Merkmale am Kreisel ausgerichtet (2950, 3381, 3992 Ja/Nein); bei Sep./Scanner-Zaehlung ausgenommen - Kreisel: eigener Name bleibt in Bezeichnung + Beschriftung erhalten - Sivas: Kreisel/Eckrad unterschiedlicher Hoehe nicht mehr zusammengefasst - Export: Hoehen-Attribute in Z verschobener Kreisel/Eckrad/VF/GF neu berechnet - GF-Edit: Einfuegehoehe aus aktueller Z-Koordinate
This commit is contained in:
+240
-25
@@ -193,10 +193,35 @@
|
||||
(dbgreturn result)
|
||||
)
|
||||
|
||||
;; Beschriftungstext (reiner Kern, in tests/test_unit.lsp getestet):
|
||||
;; "KREISEL 1: Pufferkreisel PIN_4000" - mit eigenem Namen
|
||||
;; "KREISEL 1: PIN_4000" - Name leer oder Vorgabe "Kreisel1"
|
||||
(defun kreisel-label-text (nummer name kreiselart abstand)
|
||||
(strcat "KREISEL " (itoa nummer) ": "
|
||||
(if (or (null name) (= name "") (= name (strcat "Kreisel" (itoa nummer))))
|
||||
""
|
||||
(strcat name " "))
|
||||
kreiselart "_" (rtos abstand 2 0))
|
||||
)
|
||||
|
||||
;; Beschriftung in einer BESTEHENDEN Blockdefinition auf textStr setzen.
|
||||
;; draw-module verwendet eine vorhandene Definition KREISEL_n_TYP_ABSTAND
|
||||
;; wieder (Edit/Redraw) - ein geaenderter Name kaeme sonst nie in die
|
||||
;; Beschriftung. Wirkt auf alle Referenzen dieser Definition.
|
||||
(defun kreisel-label-aktualisieren (bname textStr / e ed)
|
||||
(setq e (tblobjname "BLOCK" bname))
|
||||
(while (setq e (entnext e))
|
||||
(setq ed (entget e))
|
||||
(if (and (= (cdr (assoc 0 ed)) "TEXT")
|
||||
(/= (cdr (assoc 1 ed)) textStr))
|
||||
(entmod (subst (cons 1 textStr) (assoc 1 ed) ed))
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;; Beschriftungstext erzeugen
|
||||
(defun kreisel-make-label (nummer abstand kreiselart / textStr insertPoint radius mitteX mitteY textHoehe lay)
|
||||
;; Text: "KREISEL 1: PIN_4000"
|
||||
(setq textStr (strcat "KREISEL " (itoa nummer) ": " kreiselart "_" (rtos abstand 2 0)))
|
||||
(defun kreisel-make-label (nummer abstand kreiselart name / textStr insertPoint radius mitteX mitteY textHoehe lay)
|
||||
(setq textStr (kreisel-label-text nummer name kreiselart abstand))
|
||||
|
||||
;; Geometrie berechnen
|
||||
(setq radius (/ *kreisel-durchmesser* 2.0))
|
||||
@@ -344,9 +369,11 @@
|
||||
)
|
||||
)
|
||||
|
||||
;; Bezeichnung automatisch setzen: "KreiselN"
|
||||
(setq attribs (subst (cons "Bezeichnung" (strcat "Kreisel" (itoa kreisel-nummer)))
|
||||
(assoc "Bezeichnung" attribs) attribs))
|
||||
;; Bezeichnung: eigener Name (KreiselEdit) bleibt erhalten, sonst Vorgabe "KreiselN"
|
||||
(if (member (cdr (assoc "Bezeichnung" attribs)) '(nil ""))
|
||||
(setq attribs (subst (cons "Bezeichnung" (strcat "Kreisel" (itoa kreisel-nummer)))
|
||||
(assoc "Bezeichnung" attribs) attribs))
|
||||
)
|
||||
|
||||
;; --- HÖHE BESTIMMEN ---
|
||||
;; Priorität 1: Aus basePoint (wenn 3D Punkt mit Z > 0)
|
||||
@@ -445,7 +472,8 @@
|
||||
)
|
||||
|
||||
;; BESCHRIFTUNG einfügen (vor Block-Erzeugung, damit sie im Block ist)
|
||||
(kreisel-make-label kreisel-nummer abstand (if is-pin "PIN" "STANDARD") )
|
||||
(kreisel-make-label kreisel-nummer abstand (if is-pin "PIN" "STANDARD")
|
||||
(cdr (assoc "Bezeichnung" attribs)))
|
||||
|
||||
;; Unsichtbare Attribut-Definitionen erzeugen
|
||||
(ssg-attrib-make-defs *kreisel-attrib-defs* 50.0)
|
||||
@@ -472,7 +500,13 @@
|
||||
|
||||
(princ (ssg-textf "kreisel-neue-blockdef" (list bname)))
|
||||
)
|
||||
(princ (ssg-textf "kreisel-bestehende-blockdef" (list bname)))
|
||||
(progn
|
||||
(princ (ssg-textf "kreisel-bestehende-blockdef" (list bname)))
|
||||
;; Beschriftung der wiederverwendeten Definition an den Namen anpassen
|
||||
(kreisel-label-aktualisieren bname
|
||||
(kreisel-label-text kreisel-nummer (cdr (assoc "Bezeichnung" attribs))
|
||||
(if is-pin "PIN" "STANDARD") abstand))
|
||||
)
|
||||
)
|
||||
|
||||
;; --- Block am Zielpunkt einfuegen (ohne Attribut-Dialog) ---
|
||||
@@ -1071,7 +1105,7 @@
|
||||
;; 4. Hoehe aus Z-Koordinate oder manuell
|
||||
;; --------------------------------------------
|
||||
(defun c:ILS_Eckrad ( / ptTangent ptDir dx dy dist ux uy radius
|
||||
centerPt rotation hoehe
|
||||
centerPt rotation hoehe hoehe-aus-z attribs ergebnis
|
||||
geruest-einzelmodul geruest-typ)
|
||||
(dbgf "c:ILS_Eckrad")
|
||||
|
||||
@@ -1114,30 +1148,205 @@
|
||||
(setq rotation (* (/ 180.0 pi) (atan dy dx)))
|
||||
(dbg 'rotation)
|
||||
|
||||
;; 4. Hoehe bestimmen
|
||||
(if (and (> (length ptTangent) 2) (caddr ptTangent) (> (caddr ptTangent) 0))
|
||||
;; 4. Hoehe vorbelegen: aus Z des Beruehrpunkts, sonst Default
|
||||
(setq hoehe-aus-z (and (> (length ptTangent) 2) (caddr ptTangent) (> (caddr ptTangent) 0)))
|
||||
(if hoehe-aus-z
|
||||
(progn
|
||||
(setq hoehe (caddr ptTangent))
|
||||
(princ (ssg-textf "kreisel-hoehe-aus-3dpunkt" (list (rtos hoehe 2 0))))
|
||||
)
|
||||
(progn
|
||||
(setq hoehe (getreal (ssg-textf "kreisel-prompt-hoehe-z" (list (rtos *eckrad-default-hoehe* 2 0)))))
|
||||
(if (null hoehe) (setq hoehe *eckrad-default-hoehe*))
|
||||
)
|
||||
(setq hoehe *eckrad-default-hoehe*)
|
||||
)
|
||||
(dbg 'hoehe)
|
||||
|
||||
;; 5. Geruest fuer Einzelmodul + Geruestoption abfragen
|
||||
(setq geruest-einzelmodul (if (ssg-ques (ssg-text "kreisel-eckrad-geruest-frage") T) "1" "0"))
|
||||
(setq geruest-typ (ssg-ask-geruest-typ))
|
||||
(if (ssg-gui-p)
|
||||
;; 5a. Dialog: Bezeichnung, Hoehe, Drehung, Drehrichtung, Geruest
|
||||
(progn
|
||||
(setq attribs (ssg-attrib-merge (list (cons "HOEHE" (rtos hoehe 2 0)))
|
||||
*eckrad-attrib-defs*))
|
||||
(setq ergebnis (eckrad-dialog attribs rotation))
|
||||
(if (null ergebnis)
|
||||
(progn (princ (ssg-text "kreisel-abgebrochen")) (dbgreturn nil) (exit))
|
||||
)
|
||||
(setq attribs (car ergebnis)
|
||||
rotation (cdr ergebnis)
|
||||
hoehe (atof (cdr (assoc "HOEHE" attribs))))
|
||||
)
|
||||
;; 5b. Ohne GUI (Tests): Konsolenabfrage wie bisher
|
||||
(progn
|
||||
(if (not hoehe-aus-z)
|
||||
(progn
|
||||
(setq hoehe (getreal (ssg-textf "kreisel-prompt-hoehe-z" (list (rtos *eckrad-default-hoehe* 2 0)))))
|
||||
(if (null hoehe) (setq hoehe *eckrad-default-hoehe*))
|
||||
)
|
||||
)
|
||||
(setq geruest-einzelmodul (if (ssg-ques (ssg-text "kreisel-eckrad-geruest-frage") T) "1" "0"))
|
||||
(setq geruest-typ (ssg-ask-geruest-typ))
|
||||
(setq attribs (list (cons "GERUEST_EINZELMODUL" geruest-einzelmodul)
|
||||
(cons "GERUEST_TYP" geruest-typ)))
|
||||
)
|
||||
)
|
||||
|
||||
;; 6. Einfuegen (centerPt ist der Kreismittelpunkt)
|
||||
(ils-eckrad-insert (list (car centerPt) (cadr centerPt) hoehe) rotation
|
||||
(list (cons "GERUEST_EINZELMODUL" geruest-einzelmodul)
|
||||
(cons "GERUEST_TYP" geruest-typ)))
|
||||
(ils-eckrad-insert (list (car centerPt) (cadr centerPt) hoehe) rotation attribs)
|
||||
(dbgreturn nil)
|
||||
)
|
||||
|
||||
|
||||
;; --------------------------------------------
|
||||
;; eckrad-dialog-werte: Dialogeingaben -> (attribs . rotation)
|
||||
;; Reiner Kern (ohne DCL/Zeichnung, in tests/test_unit.lsp getestet).
|
||||
;; Parameter:
|
||||
;; attribs - bisherige Attribut-alist ((TAG . WERT) ...)
|
||||
;; name - Bezeichnung (String)
|
||||
;; hoehe-str - Hoehe in mm (String aus edit_box)
|
||||
;; drehung-str - Drehung in Grad (String aus edit_box)
|
||||
;; drehr-idx - popup_list-Index Drehrichtung ("0"=UZS, "1"=GUZ)
|
||||
;; einzelmodul - toggle-Wert "0"/"1"
|
||||
;; geruest-idx - popup_list-Index in *ssg-geruest-optionen* (String)
|
||||
;; Rueckgabe: (attribs-neu . rotation) oder nil bei ungueltiger Zahl.
|
||||
;; Drehung wird auf [0, 360) normiert.
|
||||
;; --------------------------------------------
|
||||
(defun eckrad-dialog-werte (attribs name hoehe-str drehung-str drehr-idx
|
||||
einzelmodul geruest-idx / hoehe drehung neu)
|
||||
(setq hoehe (distof hoehe-str 2)
|
||||
drehung (distof drehung-str 2))
|
||||
(if (and hoehe drehung)
|
||||
(progn
|
||||
(setq drehung (rem (+ (rem drehung 360.0) 360.0) 360.0))
|
||||
(setq neu (list (cons "Bezeichnung" name)
|
||||
(cons "HOEHE" (rtos hoehe 2 0))
|
||||
(cons "DREHUNG" (rtos drehung 2 1))
|
||||
(cons "DREHRICHTUNG" (if (= drehr-idx "1") "GUZ" "UZS"))
|
||||
(cons "GERUEST_EINZELMODUL" (if (= einzelmodul "1") "1" "0"))
|
||||
(cons "GERUEST_TYP" (ssg-geruest-idx-to-typ (atoi geruest-idx)))))
|
||||
;; Neue Werte ueber die bestehenden legen (attribs als Default-Schema)
|
||||
(cons (ssg-attrib-merge neu (mapcar '(lambda (p) (list (car p) (cdr p))) attribs))
|
||||
drehung)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;; --------------------------------------------
|
||||
;; eckrad-dialog: DCL-Dialog fuer Einfuegen und Bearbeiten
|
||||
;; Parameter:
|
||||
;; attribs - Attribut-alist zur Vorbelegung (mit *eckrad-attrib-defs* gemergt)
|
||||
;; rotation - aktuelle Drehung in Grad
|
||||
;; Rueckgabe: (attribs-neu . rotation-neu) oder nil (Abbruch/DCL fehlt)
|
||||
;; --------------------------------------------
|
||||
(defun eckrad-dialog (attribs rotation / dcl-pfad dat eckrad-dlg-ergebnis)
|
||||
(setq attribs (ssg-attrib-merge attribs *eckrad-attrib-defs*))
|
||||
(setq dcl-pfad (strcat (getenv "DXFM_DCL") "/eckrad_edit.dcl"))
|
||||
(setq dat (load_dialog dcl-pfad))
|
||||
(if (or (< dat 0) (not (new_dialog "eckrad_edit" dat)))
|
||||
(progn
|
||||
(if (>= dat 0) (unload_dialog dat))
|
||||
(alert (ssg-textf "kreisel-edit-dialog-fehlt" (list dcl-pfad)))
|
||||
nil
|
||||
)
|
||||
(progn
|
||||
(set_tile "name" (cdr (assoc "Bezeichnung" attribs)))
|
||||
(set_tile "hoehe" (cdr (assoc "HOEHE" attribs)))
|
||||
(set_tile "drehung" (rtos rotation 2 1))
|
||||
|
||||
(start_list "drehrichtung")
|
||||
(add_list "UZS")
|
||||
(add_list "GUZ")
|
||||
(end_list)
|
||||
(set_tile "drehrichtung" (if (equal (cdr (assoc "DREHRICHTUNG" attribs)) "GUZ") "1" "0"))
|
||||
|
||||
(set_tile "geruest_einzelmodul"
|
||||
(if (equal (cdr (assoc "GERUEST_EINZELMODUL" attribs)) "1") "1" "0"))
|
||||
|
||||
(start_list "geruest_typ")
|
||||
(foreach opt *ssg-geruest-optionen* (add_list opt))
|
||||
(end_list)
|
||||
(set_tile "geruest_typ" (itoa (ssg-geruest-typ-to-idx (cdr (assoc "GERUEST_TYP" attribs)))))
|
||||
|
||||
;; OK nur bei gueltigen Zahlen, sonst Fehlerzeile und Dialog bleibt offen
|
||||
(action_tile "accept"
|
||||
(strcat
|
||||
"(setq eckrad-dlg-ergebnis (eckrad-dialog-werte attribs"
|
||||
" (get_tile \"name\") (get_tile \"hoehe\") (get_tile \"drehung\")"
|
||||
" (get_tile \"drehrichtung\") (get_tile \"geruest_einzelmodul\")"
|
||||
" (get_tile \"geruest_typ\")))"
|
||||
"(if eckrad-dlg-ergebnis (done_dialog 1)"
|
||||
" (set_tile \"error\" (ssg-text \"kreisel-eckrad-ungueltige-zahl\")))"
|
||||
)
|
||||
)
|
||||
(action_tile "cancel" "(setq eckrad-dlg-ergebnis nil) (done_dialog 0)")
|
||||
|
||||
(start_dialog)
|
||||
(unload_dialog dat)
|
||||
eckrad-dlg-ergebnis
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;; -----------------------------------------------
|
||||
;; EckradEdit: Bestehendes Eckrad per Dialog bearbeiten
|
||||
;; (Doppelklick auf ECKRAD_n ueber SSG_BLOCKEDIT)
|
||||
;;
|
||||
;; Ablauf:
|
||||
;; 1. Eckrad-Block auswaehlen (oder vorselektiert)
|
||||
;; 2. Dialog mit aktuellen Werten oeffnen
|
||||
;; 3. Bei OK: Block loeschen und mit gleicher Nummer neu einfuegen
|
||||
;; -----------------------------------------------
|
||||
(defun c:EckradEdit ( / ss sel ent ed attribs basePoint rotation 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 (ssg-text "kreisel-start-eckrad-edit") '(("OSMODE") ("CECOLOR") ("ATTREQ") ("ATTDIA")))
|
||||
(setvar "OSMODE" 0)
|
||||
|
||||
(if (null ent)
|
||||
(progn
|
||||
(setq sel (entsel (ssg-text "kreisel-prompt-eckrad-auswaehlen")))
|
||||
(if sel (setq ent (car sel)))
|
||||
)
|
||||
)
|
||||
(if (null ent) (progn (ssg-end) (exit)))
|
||||
|
||||
(setq ed (entget ent))
|
||||
(if (or (/= (cdr (assoc 0 ed)) "INSERT")
|
||||
(not (wcmatch (strcase (cdr (assoc 2 ed))) "ECKRAD_*")))
|
||||
(progn (ssg-emsg (ssg-text "kreisel-emsg-kein-eckrad-block")) (ssg-end) (exit))
|
||||
)
|
||||
|
||||
;; Bestehende Werte auslesen, fehlende mit Defaults auffuellen
|
||||
(setq attribs (ssg-attrib-merge (ssg-attrib-read ent) *eckrad-attrib-defs*))
|
||||
(setq basePoint (cdr (assoc 10 ed)))
|
||||
(setq rotation (* (/ 180.0 pi) (cdr (assoc 50 ed))))
|
||||
|
||||
;; HOEHE immer aus Z-Koordinate des Einfuegepunkts
|
||||
(setq attribs (subst (cons "HOEHE" (rtos (if (caddr basePoint) (caddr basePoint) 0.0) 2 0))
|
||||
(assoc "HOEHE" attribs) attribs))
|
||||
|
||||
(setq ergebnis (eckrad-dialog attribs rotation))
|
||||
(if ergebnis
|
||||
(progn
|
||||
(setq attribs (car ergebnis)
|
||||
rotation (cdr ergebnis))
|
||||
(command "_.ERASE" ent "")
|
||||
(ils-eckrad-insert (list (car basePoint) (cadr basePoint)
|
||||
(atof (cdr (assoc "HOEHE" attribs))))
|
||||
rotation attribs)
|
||||
(princ (ssg-textf "kreisel-eckrad-edit-aktualisiert"
|
||||
(list (cdr (assoc "Bezeichnung" attribs))
|
||||
(cdr (assoc "HOEHE" attribs))
|
||||
(rtos rotation 2 1))))
|
||||
)
|
||||
(princ (ssg-text "kreisel-abgebrochen"))
|
||||
)
|
||||
|
||||
(ssg-end)
|
||||
)
|
||||
|
||||
;; --------------------------------------------
|
||||
;; ils-eckrad-insert: Erzeugt Eckrad als Compound-Block mit Attributen
|
||||
;; Parameter:
|
||||
@@ -1182,10 +1391,16 @@
|
||||
(dbg 'z-hoehe)
|
||||
(dbg 'block-hoehe)
|
||||
|
||||
;; Automatische Nummer vergeben
|
||||
(setq eckrad-nummer (eckrad-next-number))
|
||||
(setq attribs (subst (cons "NUMMER" (itoa eckrad-nummer))
|
||||
(assoc "NUMMER" attribs) attribs))
|
||||
;; NUMMER: Bestehende beibehalten (EckradEdit), sonst neue vergeben -
|
||||
;; so behaelt ein bearbeitetes Eckrad seinen Blocknamen ECKRAD_n
|
||||
(setq eckrad-nummer (atoi (cdr (assoc "NUMMER" attribs))))
|
||||
(if (<= eckrad-nummer 0)
|
||||
(progn
|
||||
(setq eckrad-nummer (eckrad-next-number))
|
||||
(setq attribs (subst (cons "NUMMER" (itoa eckrad-nummer))
|
||||
(assoc "NUMMER" attribs) attribs))
|
||||
)
|
||||
)
|
||||
(dbg 'eckrad-nummer)
|
||||
|
||||
;; Blockname: ECKRAD_1, ECKRAD_2, ...
|
||||
|
||||
Reference in New Issue
Block a user