Zestawienie zaznaczonych elementów.  Cz1.


W poniższym przykładzie przedstawię jak można zliczyć elementy zaznaczone w rysunku. Wygenerowana lista będzie zawierała nazwę typu obiektu oraz ilość elementów tego typu. Dla bloków oddzielne wpisy powstawną dla każdego typu bloku.


Zestawienie zaznaczonych elementów.
W poniższym przykładzie przedstawię jak można zliczyć elementy zaznaczone w rysunku. Wygenerowana lista będzie zawierała nazwę typu obiektu oraz ilość elementów tego typu. Dla bloków oddzielne wpisy powstawną dla każdego typu bloku.
Załączam również przykład rysunku, na którym możliwe jest zobrazowania wykonania funkcji.

Wykonanie funkcji Sumaelementow dla tego rysunku zwróci następujący wynik.
W kolejnym przykładzie przedstawię, jak można taki wynik wyświetlić w rysunku albo w oknie dialogowym.


(vl-load-com)

(setq *ZWCAD* (vlax-get-acad-object))
(setq *Rysunek* (vla-get-activedocument *ZWCAD* ))
(setq *Model* (vla-get-Modelspace *Rysunek* ))


(defun XSSGet (tresc / selElems elementy )
(setq selElems(ssgetfirst ))
(if (car selElems)
(setq elementy (sel2list (car selElems)))
(progn
;(princ tresc )
(setq elementy(vl-catch-all-apply 'ssget (list )))
(if (not(vl-catch-all-error-p elementy))
(progn
(setq elementy (sel2list elementy ))
)
)
)
)
elementy
)

(defun sel2list (selset / Wynik ileelementow i)

(setq ileelementow(sslength selset) )
(setq i 0 )
(repeat ileelementow
(setq Wynik (append Wynik (list (vlax-ename->vla-object(ssname selset i) ) )))
(setq i (1+ i ))
)
Wynik
)

(defun Dodaj (nazwa Wynik / wybrany element)
(setq wybrany(assoc nazwa Wynik ))
(if wybrany
(progn
(setq Wynik (subst (cons nazwa (1+(cdr wybrany))) wybrany Wynik))
)
(progn
(setq element (cons nazwa 1))
(setq Wynik (append Wynik(list element )))
)
)
Wynik
)

(defun Zlicz (elems / wynik % nazwa)
(setq wynik (list))
(foreach % elems
(setq nazwa(vlax-get-property % 'ObjectName))
(if (eq nazwa "AcDbBlockReference") (setq nazwa (vlax-get-property % 'Name )))
(setq wynik (Dodaj nazwa wynik))
)
)

(defun C:Sumaelementow ( / elementy zliczone)
(setq elementy (XSSGet "Wskaż elementy do zestawienia" ))
(setq zliczone (Zlicz elementy)) ;w zliczaniu posłużymy się tzw listami asocjacyjnymi . W lista ta łączy dwa elementy. Nazwę elementu oraz ilość wystąpienia.
; w jednym z kolejnych przykładów przedstawię w jaki sposób wyświetlić takie zestawienie w rysunku
)

W jednym z kolejnych przykładów przedstawię, jak można taki wynik wyświetlić w rysunku albo w oknie dialogowym.

 

Wykonanie w ZWCAD 2015+LISP SumaElementow 2015

 

Wykonanie w ZWCAD ClassicLISP SumaElementow Classic