Odsunięcie osiowe.

Elementy, na których będziemy pracowali

Odsunięcie osiowe przed

Widok po operacji

Odsunięcie osiowe po


(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 2015+LISP DOffset 2015

Wykonanie w ZWCAD ClassicLISP DOffset Classic