LISP ten pozwala na narysowanie kopii zaznaczonych elementów o określonym odstępie po obu stornach wybranych obiektów. 

 

Odsunięcie osiowe

 

Polecenie do uruchomienia skryptu LISP: DOffset

 

Kod źródłowy z opisem

 

;;; Odsunięcie liniowe
;;; zwcad.pl
;;; Polecenie do uruchomienia skryptu LISP: DOffset
;;; Opis: https://www.zwcad.pl/materialy-edukacyjne/kurs-lisp/przyklady-lisp/155-odsuniecie-osiowe.html
(vl-load-com)
(setq *ZWCAD* (vlax-get-acad-object))
(setq *Rysunek* (vla-get-activedocument *ZWCAD* ))
(setq *Model* (vla-get-Modelspace *Rysunek* ))
(defun sel2list (selset / Wynik ileelementow i)
;----------------------------------------------------------
; funkcja zamienia zbiór wskazań na listę obiektów
; Argumenty: zbiór wskazań (selectionset)
; Wynik: lista
;----------------------------------------------------------
(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 XGetdist (tresc domyslny / Wynik Odl )
;----------------------------------------------------------
;funkcja prosi użytkownika o podanie odległości (może byc wpisanie wartości na klawiaturze
; lub wskazanie pary punktów
;Argumenty: komunikat, zachętę, który sie wyświetli w linii poleceń w chwili uruchomienia funkcji
;Wynik: wartość liczbowa jeśli Użytkownik wpisze wartość z klawiatury
; wartość liczbowa - odległość pomiędzy parą punktów jeśli użytkownik wskaże parę punktów
; wartość liczbowa domyślna jeśli Użytkownik na klawiaturze wciśnie [ENTER] [SPACJA]
; nil - jeśli Użytkownik na klawiaturze wciśnie [ESC]
;----------------------------------------------------------
(setq Odl(vl-catch-all-apply 'getdist (list tresc ))) ;wykonanie funkcji getdist proszącej
; o wskazanie odległości (z klawiatury lub przez podanie pary punktów) zwraca odległość lub obiekt błędu
(if (vl-catch-all-error-p Odl) ; sprawdzenie czy zwrócony został obiekt błędu
(progn ; wystąpił błąd
(prompt (vl-catch-all-error-message Odl)) ;wyświetla w pasku poleceń komunikat błędu
(setq Wynik nil )
)
(progn ; Użytkownik określił odległość poprawnie lub [ENTER]/[SPACE]
(if (null Odl)
(setq Wynik domyslny )
(setq Wynik Odl)
)
)
)
Wynik
)
(defun C:DOffset ( / elementy Odleglosc WyborLst % )
;----------------------------------------------------------
; funkcja tworzy odsunięcie jednocześnie w obu kierunkach
; Argumenty: nil
; Wynik: nil
;----------------------------------------------------------
(setq elementy(vl-catch-all-apply 'ssget (list ))) ; prosimy Użytkownika o wskazanie elementów
(if (not(vl-catch-all-error-p elementy))
(progn
(if elementy (progn
(setq Odleglosc (XGetdist "Podaj odległość odsunięcia" nil)) ; prosimy Użytkownika o podanie
; odległości odsunięcia
(if Odleglosc (progn
(setq WyborLst (sel2list elementy)) ; zamiana zbioru wskazań na listę, nie jest to niezbędne,
; ale ułatwia pracę, jeśli posiadamy funkcje, które operują na listach jako danych wejściowych
(foreach % WyborLst ; pętla przechodząca przez wszystkie elementy listy. W każdej iteracji zmiennej
; symbolu % przypisany jest kolejny element z listy, na którym później wykonujemy operacje
(if (vlax-method-applicable-p % 'Offset)(progn ; przed użyciem metody offset, musimy sprawdzić,
; czy jest ona wogóle dostępna. np punkty lub bloki nie posiadają tej metody.
(vlax-invoke-method % 'Offset Odleglosc ) ; odsunięcie elementu. Co ciekawe jako parametr podejemy
; tylko odległość odsunięcia a nie stronę, czy punkt przez który ma przechodzić odsunięta linia.
(vlax-invoke-method % 'Offset (- Odleglosc)) ; odsunięcie elementu w drugim kierunku.
))
)
))
))
))
nil
)

 

Wykonanie w ZWCAD 2023

 odsuniecie osiowe

 

Wykonanie w ZWCAD 2015

LISP DOffset 2015

 

Wykonanie w ZWCAD Classic

LISP DOffset Classic