[FIX] Omniflo TEF einfügen entlang Gerade funktioniert wieder; Omniflo Gerade ist aus dem Menü entfernt worden, da entweder über das Menü Fahrstrecke oder nur als Linie gezeichnet wird
This commit is contained in:
1 parent
afc5dce13a
commit
98106a6af4
17 files changed
+59
-548
No files matched your search
@@ -481,263 +481,6 @@
|
||||
(princ)
|
||||
)
|
||||
|
||||
;; --- Omniflo / Aluprofil Gerade ---
|
||||
|
||||
;; Aluprofil-Fahrstrecke einfuegen.
|
||||
;;
|
||||
;; Ablauf:
|
||||
;; 1. Quell-Block (.dwg) temporaer einfuegen, Attribute lesen, loeschen
|
||||
;; 2. Nutzer waehlt Einfuegepunkt -> Text "blockname" wird horizontal platziert
|
||||
;; 3. Nutzer klickt Endpunkt -> Linie definiert Fahrstreckenlaenge und Richtung
|
||||
;; 4. Laenge wird gegen laengemax geprueft (Fehlermeldung bei Ueberschreitung)
|
||||
;; 5. Compound-Block aus Linie + ATTDEFs (mit Quell-Werten) wird erzeugt
|
||||
;; Blockname: blockname_YYYYMMDDHHMMSS
|
||||
;; 6. Text wird gedreht, oberhalb der Linie positioniert, Inhalt aktualisiert
|
||||
;; z.B. "APG110 L=2879"
|
||||
;;
|
||||
;; blockname = Profiltyp (z.B. "AP60", "AP110", "APG110")
|
||||
;; laengemax = Maximale Fahrstreckenlaenge in mm
|
||||
;; --- Quell-Attribute einer Aluprofil-.dwg lesen (mit ID-Feld) ---
|
||||
;; blockname = Profiltyp (z.B. "AP60", "AP110", "APG110")
|
||||
;;
|
||||
;; Seit dem ILS-Flach-Refactor tragen die Quell-Bloecke das Dimensionssuffix
|
||||
;; _2D/_3D und liegen flach unter data/ils/ (z.B. AP60_3D.dwg). Die Aufloesung
|
||||
;; laeuft daher ueber den zentralen Resolver ssg-ils-block-datei (mit
|
||||
;; automatischem 3D-Fallback) statt ueber *block-path* + Name. Nur wenn der
|
||||
;; Resolver nichts findet, wird als Rueckfall der alte Pfad (*block-path* +
|
||||
;; Name ohne Suffix) versucht.
|
||||
;; Rueckgabe: Attribut-Alist (mit angehaengtem leeren "ID"-Feld) oder nil,
|
||||
;; wenn keine Quell-.dwg gefunden wird bzw. sie keine Attribute hat.
|
||||
(defun omni:read-src-attribs (blockname / datei srcAttribs)
|
||||
(if (car (atoms-family 1 '("SSG-ILS-BLOCK-DATEI")))
|
||||
(setq datei (ssg-ils-block-datei blockname))
|
||||
)
|
||||
(if (and (null datei) (boundp '*block-path*) *block-path*)
|
||||
(setq datei (strcat *block-path* blockname ".dwg"))
|
||||
)
|
||||
(if datei
|
||||
(progn
|
||||
(setq srcAttribs (ssg-attrib-read-dwg datei))
|
||||
(if (and srcAttribs (not (assoc "ID" srcAttribs)))
|
||||
(setq srcAttribs (append srcAttribs (list (cons "ID" ""))))
|
||||
)
|
||||
)
|
||||
)
|
||||
srcAttribs
|
||||
)
|
||||
|
||||
|
||||
;; --- Aluprofil-Gerade non-interaktiv aus zwei Punkten erzeugen ---
|
||||
;;
|
||||
;; Skriptfaehiger Kern von omni:insert-block: baut aus zwei bekannten
|
||||
;; Punkten (Anfang pt, Ende pt2) den Compound-Block (Linie + ATTDEFs) und
|
||||
;; fuegt ihn ein. Fuehrt KEINE Nutzerabfrage und KEIN ssg-start/ssg-end aus -
|
||||
;; der Aufrufer sichert die Umgebung und setzt OSMODE/ATTREQ/ATTDIA=0.
|
||||
;;
|
||||
;; blockname = Profiltyp (z.B. "AP110")
|
||||
;; pt / pt2 = Anfangs-/Endpunkt (Liste x y [z])
|
||||
;; srcAttribs = Quell-Attribute (Alist) oder nil (dann Block ohne ATTDEFs)
|
||||
;; textHeight / textGap = Textparameter
|
||||
;; textEnt = optionaler, bereits erzeugter Vorschau-Text (Tag 1 = blockname);
|
||||
;; nil -> wird hier erzeugt
|
||||
;; Rueckgabe: Entity-Name des eingefuegten INSERT-Blocks oder nil.
|
||||
(defun omni:make-gerade (blockname pt pt2 srcAttribs textHeight textGap textEnt /
|
||||
laenge laengeStr dx dy angle angleDeg
|
||||
perpX perpY textPt ed lastEnt ss e bname blockEnt
|
||||
attribs attribDefs)
|
||||
(setq laenge (distance (list (car pt) (cadr pt))
|
||||
(list (car pt2) (cadr pt2))))
|
||||
(setq laengeStr (rtos laenge 2 0))
|
||||
(setq dx (- (car pt2) (car pt))
|
||||
dy (- (cadr pt2) (cadr pt)))
|
||||
(setq angle (atan dy dx))
|
||||
(setq angleDeg (* (/ 180.0 pi) angle))
|
||||
|
||||
;; 1. Vorschau-Text erzeugen, falls nicht vom Aufrufer uebergeben
|
||||
(if (null textEnt)
|
||||
(progn
|
||||
(entmake (list '(0 . "TEXT")
|
||||
(cons 8 (getvar "CLAYER"))
|
||||
(cons 10 (list (car pt) (cadr pt)
|
||||
(if (caddr pt) (caddr pt) 0.0)))
|
||||
(cons 40 textHeight)
|
||||
(cons 1 blockname)
|
||||
'(50 . 0.0)))
|
||||
(setq textEnt (entlast))
|
||||
)
|
||||
)
|
||||
(setq lastEnt textEnt)
|
||||
|
||||
;; 2. Compound-Block: Linie bei (0,0)..(laenge,0) + ATTDEFs aus Quell-Attributen
|
||||
(command "_.LINE" (list 0.0 0.0) (list laenge 0.0) "")
|
||||
(setq attribDefs (ssg-attrib-alist-to-defs srcAttribs))
|
||||
(ssg-attrib-make-defs attribDefs 50.0)
|
||||
|
||||
;; Neue Entities einsammeln (alles nach textEnt)
|
||||
(setq ss (ssadd))
|
||||
(setq e (entnext lastEnt))
|
||||
(while e (ssadd e ss) (setq e (entnext e)))
|
||||
|
||||
;; Block mit eindeutigem Zeitstempel-Namen erzeugen. ssg-timestamp hat nur
|
||||
;; Sekundenaufloesung - bei mehreren Aufrufen innerhalb derselben Sekunde
|
||||
;; (z.B. Streckenzug-Schleife) kollidiert der Name; dann einen laufenden
|
||||
;; Zaehler anhaengen, bis der Name frei ist. (Fruehere Variante haengte
|
||||
;; (itoa (fix (* CDATE 1000000))) an - das sprengt den 32-Bit-INT-Bereich
|
||||
;; von itoa und brach mit einem Lisp-Fehler ab.)
|
||||
(setq bname (strcat blockname "_" (ssg-timestamp)))
|
||||
(if (tblsearch "BLOCK" bname)
|
||||
(progn
|
||||
(if (null *omni-gerade-block-counter*) (setq *omni-gerade-block-counter* 0))
|
||||
(while (tblsearch "BLOCK" bname)
|
||||
(setq *omni-gerade-block-counter* (1+ *omni-gerade-block-counter*))
|
||||
(setq bname (strcat blockname "_" (ssg-timestamp) "_"
|
||||
(itoa *omni-gerade-block-counter*)))
|
||||
)
|
||||
)
|
||||
)
|
||||
;; Objektfang aus: sonst kann _.INSERT den Einfuegepunkt pt auf ein Objekt
|
||||
;; umfangen (z.B. den Text bei pt) und die Hoehe verfaelschen.
|
||||
(setvar "OSMODE" 0)
|
||||
(command "_.-BLOCK" bname (list 0.0 0.0 0.0) ss "")
|
||||
|
||||
;; Block einfuegen (ATTREQ/ATTDIA bereits auf 0)
|
||||
(command "_.INSERT" bname pt 1 1 angleDeg)
|
||||
(setq blockEnt (entlast))
|
||||
|
||||
;; 3. Attribute setzen: Quell-Werte + LAENGE/A aktualisieren
|
||||
(setq attribs srcAttribs)
|
||||
(if (assoc "LAENGE" attribs)
|
||||
(setq attribs (subst (cons "LAENGE" laengeStr)
|
||||
(assoc "LAENGE" attribs) attribs))
|
||||
(setq attribs (cons (cons "LAENGE" laengeStr) attribs))
|
||||
)
|
||||
(if (assoc "A" attribs)
|
||||
(setq attribs (subst (cons "A" laengeStr)
|
||||
(assoc "A" attribs) attribs))
|
||||
(setq attribs (cons (cons "A" laengeStr) attribs))
|
||||
)
|
||||
(ssg-attrib-set-on blockEnt attribs)
|
||||
|
||||
;; Layer aus dem LAYER-Attribut setzen - dieselbe Vorgabe-Konvention wie in
|
||||
;; omni:insert-dxf und c:OMNI_EDIT. Die Quell-Attribute (srcAttribs) tragen
|
||||
;; den Layer bereits, er wurde hier bisher nur nicht angewendet.
|
||||
(ssg-block-layer-vorgabe blockEnt bname attribs)
|
||||
|
||||
;; 4. Text oberhalb der Linie positionieren, um Linienwinkel drehen,
|
||||
;; Inhalt mit Laenge ergaenzen
|
||||
(setq perpX (* (- (sin angle)) textGap)
|
||||
perpY (* (cos angle) textGap))
|
||||
(setq textPt (list (+ (car pt) perpX)
|
||||
(+ (cadr pt) perpY)
|
||||
(if (caddr pt) (caddr pt) 0.0)))
|
||||
(setq ed (entget textEnt))
|
||||
(setq ed (subst (cons 10 textPt) (assoc 10 ed) ed))
|
||||
(if (assoc 50 ed)
|
||||
(setq ed (subst (cons 50 angle) (assoc 50 ed) ed))
|
||||
(setq ed (append ed (list (cons 50 angle))))
|
||||
)
|
||||
(setq ed (subst (cons 1 (strcat blockname " L=" laengeStr))
|
||||
(assoc 1 ed) ed))
|
||||
(entmod ed)
|
||||
(entupd textEnt)
|
||||
|
||||
;; 5. Eindeutige ID zuweisen
|
||||
(if (and blockEnt (atoms-family 1 '("ssg-id-generate")))
|
||||
(ssg-id-generate blockEnt)
|
||||
)
|
||||
|
||||
(princ (ssg-textf "omni-insert-block-eingefuegt" (list bname laengeStr)))
|
||||
blockEnt
|
||||
)
|
||||
|
||||
|
||||
;; Aluprofil-Fahrstrecke interaktiv einfuegen (siehe Ablaufbeschreibung oben).
|
||||
;; Fragt Einfuege- und Endpunkt ab und delegiert die Blockerzeugung an
|
||||
;; omni:make-gerade.
|
||||
(defun omni:insert-block (blockname laengemax /
|
||||
pt pt2 laenge textEnt textHeight textGap srcAttribs ok)
|
||||
|
||||
(setq textHeight (ssg-cfg-or "omniflo" "text_height" 100.0))
|
||||
(setq textGap (ssg-cfg-or "omniflo" "text_gap" 20.0))
|
||||
|
||||
;; 0. Attribute aus der Quell-.dwg lesen (vor ssg-start, da eigene INSERT/ERASE)
|
||||
(setq srcAttribs (omni:read-src-attribs blockname))
|
||||
(if (null srcAttribs)
|
||||
(progn (princ (ssg-text "omni-insert-keine-attribute")) nil)
|
||||
(progn
|
||||
;; LAENGEMAX aus Quell-Attribut lesen (falls vorhanden), sonst Parameter
|
||||
(if (and (assoc "LAENGEMAX" srcAttribs)
|
||||
(> (strlen (cdr (assoc "LAENGEMAX" srcAttribs))) 0))
|
||||
(setq laengemax (atof (cdr (assoc "LAENGEMAX" srcAttribs))))
|
||||
)
|
||||
|
||||
(setq pt (getpoint (ssg-text "omni-prompt-einfuegepunkt")))
|
||||
(if (null pt)
|
||||
(progn (princ (ssg-text "omni-abbruch-omni")) nil)
|
||||
(progn
|
||||
(ssg-start "OMNI Aluprofil" '(("OSMODE") ("ATTREQ") ("ATTDIA")))
|
||||
;; ATTREQ/ATTDIA auf 0 setzen (werden durch ssg-end wiederhergestellt)
|
||||
(setvar "ATTREQ" 0)
|
||||
(setvar "ATTDIA" 0)
|
||||
|
||||
;; Vorschau-Text horizontal am Einfuegepunkt (waehrend Endpunktwahl)
|
||||
(entmake (list '(0 . "TEXT")
|
||||
(cons 8 (getvar "CLAYER"))
|
||||
(cons 10 (list (car pt) (cadr pt)
|
||||
(if (caddr pt) (caddr pt) 0.0)))
|
||||
(cons 40 textHeight)
|
||||
(cons 1 blockname)
|
||||
'(50 . 0.0)))
|
||||
(setq textEnt (entlast))
|
||||
|
||||
;; Endpunkt fuer Fahrstrecke abfragen (Schleife bei Ueberschreitung)
|
||||
(setq ok nil)
|
||||
(while (not ok)
|
||||
(setq pt2 (getpoint pt (ssg-text "omni-prompt-endpunkt-fahrstrecke")))
|
||||
(if (null pt2)
|
||||
(progn
|
||||
;; Abbruch: Vorschau-Text loeschen
|
||||
(command "_.ERASE" textEnt "")
|
||||
(princ (ssg-text "omni-abbruch-omni"))
|
||||
(setq ok T pt nil)
|
||||
)
|
||||
(progn
|
||||
(setq laenge (distance (list (car pt) (cadr pt))
|
||||
(list (car pt2) (cadr pt2))))
|
||||
(if (> laenge laengemax)
|
||||
(alert (ssg-textf "omni-laenge-ueberschritten"
|
||||
(list (rtos laenge 2 0) (rtos laengemax 2 0))))
|
||||
(progn
|
||||
(omni:make-gerade blockname pt pt2 srcAttribs
|
||||
textHeight textGap textEnt)
|
||||
(setq ok T)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
(ssg-end)
|
||||
pt
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
(defun c:OMNI_AP60 ()
|
||||
(omni:insert-block "AP60" (ssg-cfg-or "omniflo" "laengemax_ap60" 7000.0))
|
||||
(princ)
|
||||
)
|
||||
(defun c:OMNI_AP110 ()
|
||||
(omni:insert-block "AP110" (ssg-cfg-or "omniflo" "laengemax_ap110" 6000.0))
|
||||
(princ)
|
||||
)
|
||||
(defun c:OMNI_APG110 ()
|
||||
(omni:insert-block "APG110" (ssg-cfg-or "omniflo" "laengemax_apg110" 6000.0))
|
||||
(princ)
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; OMNIFLO WEICHEN-DIALOG
|
||||
;; Generischer Dialog fuer Weichen-Auswahl nach Winkel/Typ
|
||||
|
||||
Reference in new issue
Block a user