Hallo zusammen, und einen schönen Sommerabend.
Ich habe mir via ChatGPT einen LISP-Code schreiben lassen, der leider nicht das gewünschte Ergebnis bringt. Könnt Ihr mir eventuell helfen?
Problem: Ich habe Blöcke von 10 x 10mm mit zwei Attributen auf der rechten Seite. Beim Einsetzen des Block kommt es vor, dass die Attribute in andere Zeichnungsteile hineinragen so dass ich sie verschieben muss. Um das zu vereinfachen möchte ich gern einen Lisp-Befehl aufrufen, der mich den Block auswählen lässt und mich dann fragt, wohin ich die Attribute verschieben möchte (links, rechts, oben oder unten) Wenn sie nach links geschoben werden, sollen sie rechtsbündig sein. Für oben oder unten sollen sie zentriert sein.
Mit dem folgenden Code kann ich den Block auswählen und anschließend die Richtung eingeben. Bei "Rechts" bleiben die Attribute natürlich wo sie sind. Wenn ich aber "Links" "Oben" oder "Unten" eingebe, verschiebt ACAD die Attribute zum Nullpunkt der Seite:
(defun c:MoveBlockAttributes (/ ss blk blkData blkName blkScale blkPos attrList attrData newPos side distance xOffset yOffset attr)
(setq distance 2.0) ; Abstand von der Kante des Blocks
;; Auswahl des Blocks
(prompt "\nWählen Sie einen Block aus: ")
(setq ss (ssget '((0 . "INSERT"))))
(if (not ss)
(progn
(prompt "\nKeine Blöcke ausgewählt.")
(exit)
)
)
(setq blk (ssname ss 0))
(setq blkData (entget blk))
(setq blkName (cdr (assoc 2 blkData)))
(setq blkScale (cdr (assoc 41 blkData))) ; Annahme: Uniforme Skalierung
(setq blkPos (cdr (assoc 10 blkData)))
;; Abfrage der Attribute
(setq attrList nil)
(setq attr (entnext blk))
(while (and attr (/= (cdr (assoc 0 (entget attr))) "SEQEND"))
(if (eq (cdr (assoc 0 (entget attr))) "ATTRIB")
(setq attrList (cons attr attrList))
)
(setq attr (entnext attr))
)
;; Debugging-Ausgabe
(print (strcat "\nAnzahl der Attribute gefunden: " (itoa (length attrList))))
;; Sicherstellen, dass genau zwei Attribute vorhanden sind
(if (/= (length attrList) 2)
(progn
(prompt "\nDer Block muss genau zwei Attribute enthalten.")
(exit)
)
)
;; Abfrage der gewünschten Seite
(setq side (strcase (getstring "\nGeben Sie die Seite ein (oben, unten, links, rechts): ")))
;; Berechnung der neuen Positionen und Ausrichtung der Attribute
(cond
((or (equal side "OBEN") (equal side "UNTEN"))
(setq yOffset (* distance blkScale))
(if (equal side "UNTEN")
(setq yOffset (- yOffset))
)
(foreach attr attrList
(setq attrData (entget attr))
(setq newPos (list (car blkPos) (+ (cadr blkPos) yOffset) (caddr blkPos)))
(entmod (subst (cons 10 newPos) (assoc 10 attrData) attrData))
(entmod (subst (cons 72 1) (assoc 72 attrData) attrData)) ; Zentriert
(entupd attr) ; Aktualisieren des Attributs
)
)
((or (equal side "LINKS") (equal side "RECHTS"))
(setq xOffset (* distance blkScale))
(if (equal side "LINKS")
(setq xOffset (- xOffset))
)
(foreach attr attrList
(setq attrData (entget attr))
(setq newPos (list (+ (car blkPos) xOffset) (cadr blkPos) (caddr blkPos)))
(entmod (subst (cons 10 newPos) (assoc 10 attrData) attrData))
(if (equal side "LINKS")
(entmod (subst (cons 72 2) (assoc 72 attrData) attrData)) ; Rechtsbündig
(entmod (subst (cons 72 0) (assoc 72 attrData) attrData))) ; Linksbündig
(entupd attr) ; Aktualisieren des Attributs
)
)
(t
(prompt "\nUngültige Eingabe."))
)
(princ)
)
Habt Ihr da einen Lösungsansatz?
Vielen Dank schon mal.
Gruß 100dpi
------------------
I like to move it...
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP