Poniższy przykład prezentuje jak podzielić listę na mniejsze listy o określonej długości.

Bardzo dobrym przykładem zastosowania funkcji może być jej wykorzystanie na współrzędnych polilinii, które są zapisane jako jedna lista a w wielu przypadkach potrzebna jest znajomość wspołrzędnych poszczególnych wierzchołków. By przetestować przykład, proszę utworzyć plik i narysować w nim polilinię. Wczytać plik, program poprosi o wskazanie polilinii i wyświetli listę współrzędnych.

 

Podział Listy

 

Polecenie do uruchomienia skryptu LISP: PodzialListy

 

Kod źródłowy z opisem

 

;;; Podział listy
;;; zwcad.pl
;;; Polecenie do uruchomienia skryptu LISP: PodzialListy
;;; Opis: https://www.zwcad.pl/materialy-edukacyjne/kurs-lisp/przyklady-lisp/277-podzial-listy.html
(defun v2l (var / OutVal)
(setq OutVal(vlax-safearray->list(vlax-variant-value var)))
)
(defun SplitList (InList SubLen / ListLen i j OutList)
; funkcja dzieli listę na miejsze listy, z których każda ma dlugość określoną przez parametr SubLen
(setq ListLen (length InList )) ; zwraca długość całej listy
(setq i 0 ) ; ustawia indeks na pierwszy element listy
(while (< i ListLen) ; pętla przez elementy listy
(setq SubList nil )
(setq j 0) ; licznik elementów podlisty
(while (< j SubLen )
(setq SubList (append SubList (list(nth (+ i j) InList ) )))
; dodaje element do mniejszej listy
(setq j (1+ j ))
)
(setq OutList (append OutList (list SubList)))
; dodaje mniejsze listy do główej listy
(setq i (+ i SubLen )) ; zwiększenie indeksu aktualnego elementu
)
OutList
)
(defun C:PodzialListy (  / 
*error* ) (defun *error* ( msg / ) 
(if (not (null msg ) ) (progn (princ "\nC:TestLISP:*error*: " ) (princ msg ) (princ "\n") ) )
)
(setq Wybor (entsel "wskaż polilinie"))  
; prosi Użytkownika o wskazanie elementu i zwraca ten element oraz współrzędne klikniętego punktu
(setq ElemObj (vlax-ename->vla-object (car Wybor)))  
; na podstawie obiektu typu entity zwraca obiekt reprezentujący ten sam element
(setq wspolrzedne(v2l(vlax-get-property ElemObj 'Coordinates ))) 
; pobiera współrzędne wierzchołków wybranej polilinii. Dla innych typów obiektu
; potrzebna jest inna funkcja pobierająca współrzędne
(setq wierzcholki (SplitList wspolrzedne 2 ))  
; dzieli listę współrzędnych na mniejsze listy
(print wierzcholki) ; wyświetla w pasku poleceń wynik podziału

 

Wykonanie w ZWCAD 2023

podzial listy