(vl-load-com

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

(defun UCS3Pts (P0 Px Py / )
;----------------------------------------------------------
;Funkcja ustawia aktualny układ współrzędnych na podstawie trzech punktów
;Argumenty:
; P0 - środek nowego układu współrzędnych
; Px - Kierunek osi X nowego układu
; Py - Kierunek osi Y nowego układu
;Wynik :brak
;----------------------------------------------------------

; najprostrzy sposób na ustawienie układu współrzędnych do trzech punktów to użycie wbudowanego w ZWCAD polecenia _UCS.
(command "_UCS" "_n" "3" P0 Px Py)
; jesli natomiast chcemy utworzyć nazwany układ współrzędnych konieczne jest dodanie nowej pozycji do kolekcji układów współrzędnych
(setq UCSs (vlax-get-property *Rysunek* 'UserCoordinateSystems))
(setq NewUCS(vlax-invoke-method UCSs 'Add (vlax-3d-point P0) (vlax-3d-point Px) (vlax-3d-point Py) "test" ) )
(vlax-put-property *Rysunek* 'ActiveUCS NewUCS)
; takie rozwiązanie posiada pewne ograniczenia:
; 1. Aby utworzyć układ współrzędnych musimy nadać mu nazwę. Jeśli układ o takiej nazwie już istnieje (został utworzony wcześniej ) jego ustawienia zostaną nadpisane.
; 2. Kąt rozpięty na wskazanych punktach musi być kątem prostym, W innym wypadku utworzenie układu współrzędnych nie powiedzie się.

nil
)

(defun PobierzUCS ( / )
;----------------------------------------------------------
;funkcja pobiera aktualny układ współrzędnych
;Argumenty: brak
;Wynik: lista: - Środek układu współrzędnych
; - Kierunek osi X
; - Kierunek osi Y
;----------------------------------------------------------
; Najłatwiejszym rozwiązaniem wydaje się być pobranie aktualnego układu współrzędnych
;! (setq ActiveUCS (vlax-get-property *Rysunek* 'ActiveUCS ))
; rozwiązanie takie jest dobre, ale w sytuacji, gdy aktywny jest nazwany ujkład współrzędnych, jeśli nie został żaden zdefiniowany funkcja zwróci błąd
; możemy jednak posłużyć się innym rozwiązaniem, czyli pobrać ze zmiennych systemowych współrzędne środka układu współrzędnych i kierunki osi X oraz Y
(list (getvar "UCSOrg") (getvar "UCSXDir") (getvar "UCSYDir"))

)
(defun C:XUCS ( / )
;----------------------------------------------------------
;Funkcja prosi Użytkownika o wskazanie trzech punktów. Następnie dopasowuje do nich układ współrzędnych.
; Pierwszy - Środek układu współrzędnych
; Drugi - Kierunek osi X
; Trzeci - Kierunek osi Y
;Argumenty: brak
;Wynik: brak
;----------------------------------------------------------

; jeśli żaden nazwany układ współrzędnych nie został utworzony przez użytkownika, kolekcja jest pusta.
(setq UCSs (vlax-get-property *Rysunek* 'UserCoordinateSystems))
(setq IloscUCS (vla-get-count UCSs ))
;Mimo to, jakiś układ jest aktualny i NIE ZAWSZE jest to układ globalny.
; Jeśli chcemy utoworzyć elementy na innym układzie współrzędnych powinniśmy na zakończenie powrócić do bierzącego układu, konieczne jest więc zapisanie stanu aktualnego układu współrzędnych, zmiana aktualnego na rządany a następnie przywrócenie poprzedniego układu.

(setq LastUCS (PobierzUCS))

(setq P0 (getpoint "Początek nowego układu współrzędnych"))
(setq Px (getpoint P0 "Kierunek osi X" ))
(setq Py (getpoint P0 "Kierunek osi Y"))

; funkcja getpoint zwraca wsółrzędne punku wskazanego przez użytkownika. Współrzędne te określone są w jednostkach aktualnego układu współrzędnych.
;Do tworzenia obiektów rysunkowych potrzebne są współrzędne w jednosktach układu globalnego.
;Przeliczenie pomiędzy układami możemy dokonać posługując się funkcją trans

(setq P0Glob (trans P0 1 0))
(setq PxGlob (trans Px 1 0))
(setq PyGlob (trans Py 1 0))

(UCS3Pts P0Glob PxGlob PyGlob)

(print "" )
)

Wykonanie w ZWCAD 2015+LISP XUCS 2015