Zitat:
Original erstellt von woppi:
Hallo,leider stehe ich gerade ziemlich auf der Leitung.
Habe auch schon länger kein LISP Programm mehr geschrieben.
Ich möchte bei allen ausgewählten Kreisen den Ø ändern.
Auswählen geht, aber ich hänge am entmod.
Kann mir bitte einer weiterhelfen.
Code:
(defun c:X81-6 (/ data ) ;Durchmesser ändern
(setq data (ssget '((0 . "CIRCLE")))
zähler 0) (repeat (sslength data)
(setq objekt (ssname data zähler)
zähler (1+ zähler))
(entmod ;ab hier hängt es
(list
(assoc -1 objekt)
'(40 . 4.05)
))
)
)
Lisp-gerechter ist es, nicht für jedes kleine Problem eine eigene Funktion zu basteln, sondern eine, die eine große Zahl unterschiedlicher probleme löst, und diese in möglichst kleine, vielfältig nutzbare Funktionen zu unterteilen.
Mit der unten stehenden Funktion SSMODENT kannst Du für jeden DXF-Gruppenwertcode eines Entitys den Wert ändern. Du kannst bei einer Blockreferenz den referenzierten Blocknamen ändern, Du kannst den Zentrumspunkt eines Kreises ändern, und natürlich den Radius eines Kreises oder Kreisbogens. Und die Hilfsfunktionen AT-SUBST und SS->LIST kannst Du auch vielfältig in anderen Funktionen verwenden.
Alle Radien aller Kreise einer DWG änderst Du dann mit diesem Aufruf auf Radius 1.0:
(mapcar '(lambda (en) (ssmodent en 40 1.0)) (ssget "X" '((0 . "CIRCLE"))))
Code:
(defun ssmodent (ename dxf val)
(entmod (at-subst
(cons dxf val)
(entget ename)
)
)
)(defun at-subst (ntok lst / temp)
(cond
((not lst)
(list ntok)
)
((not (assoc (car ntok) lst))
(reverse (cons ntok (reverse lst)))
)
('T
(subst ntok (assoc (car ntok) lst) lst)
)
)
)
(defun ss->list (sset / eset counter)
(setq counter 0)
(if (= 'PICKSET (type sset))
(repeat (sslength sset)
(setq eset (cons (ssname sset counter) eset)
counter (1+ counter)
)
)
)
eset
)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP