Forumda bu gün sorulan bir soruyu görünceye kadar ilgimi çekmemişti doğrusu.
Hem "Minserted Object" leri nasıl explode edeceğini soran arkadaşlarımızın işine yarar,
hem de Lisp ile ilgilenen yazar arkadaşlarımız için ilginç bir örnek olur düşüncesiyle,
fonksiyon kodunu ve temel işleyiş mantığını açıklamaya çalışıp, paylaşmak istedim.
MINSERT edilmiş obje ile INSERT edilmiş objeler arasında özünde çok fark yok.
Her iki objenin de verilerine bakarsak.
- ikisinin de obje türü "INSERT"
- INSERT objesinde (assoc 44, 45, 70 ve 71 değerleri 0 (sıfır) iken
MINSERT objesinde 44 ve 45 satır ve sütün aralıklarını,
70 ve 71 de satır ve sütun sayısını tanımlamak için kullanılmış.
- INSERT objesinde (assoc 100 "AcDbBlockReference" iken,
MINSERT objesinde (assoc 100 "AcDbMInsertBlock" halini alıyor.
Kod:
;;; Exploding Minserted Object(s) ;;;
(write-line "\nHazırlayan M. Sahin Güvercin - www.autocadokulu.com")
(defun c:MinEx (/ obj L o mob mxd myd mac mxe mye m n nip)
(setvar "cmdecho" 0) (command "undo" "group")
(setvar "modemacro" "Prepared by: M. Şahin Güvercin")
(princ "\nSelect Minserted Object(s) to be explode: ")
(while (not (setq obj (ssget (list (cons 0 "insert") (cons -4 "!=") (cons 70 0))))))
(setq L (sslength obj) o -1)
(while (< (setq o (1+ o)) L)
(setq mob (entget (ssname obj o))
mxd (cdr (assoc 44 mob)) myd (cdr (assoc 45 mob))
mac (cdr (assoc 50 mob)) mxe (cdr (assoc 70 mob))
mye (cdr (assoc 71 mob)) m -1)
(mapcar '(lambda (p1) (setq mob (subst (cons p1 0) (assoc p1 mob) mob))) '(44 45 70 71))
(setq mob (subst (cons 100 "AcDbBlockReference") (cons 100 "AcDbMInsertBlock") mob))
(entdel (cdr (assoc -1 mob)))
(while (< (setq n -1 m (1+ m)) mye)
(setq nip (polar (cdr (assoc 10 mob)) (- mac (* pi 1.5)) (* m myd)))
(while (< (setq n (1+ n)) mxe)
(entmake (subst (cons 10 (polar nip mac (* n mxd))) (assoc 10 mob) mob)))))
(princ (strcat "\n..." (itoa L) " Minserted Object(s) Exploded..."))
(setvar "modemacro" "") (command "undo" "e") (prin1)
)
Fonksiyonun algoritmik detaylarına girmedim, ilgi duyan arkadaşlar olursa açıklamaya çalışırım.
bu sabah başka bir başlık altında yazılanları görünce aklıma takıldı. önce transformation matrix kullanarak bir çözüm bulmuştum. yazdığım fonksiyonu toparlarken, bu kadar karmaşık yazmaya gerek olmadığını farkettim. bu hale geldi...