trans
The trans function translates coordinates from one coordinate system to another. See on-line help for details.
This can be confusing because "from one coordinate system to another" is difficult if you only have a choice between the current UCS (1) and World UCS (0). Plan of approach in Lisp:
- Save current UCS.
- Make WCS active.
- Get all the points you need.
- As an option: You can now even create another UCS based on these points.
- Use trans to be able to use points in the active UCS, for example a function such as angle.
- When everything is done: Activate the saved UCS.
If we convert those steps into code, the following sample fragments can help:
Save current UCS:
(if (not current-ucs-tmp) (setq current-ucs-tmp (list (getvar "ucsorg") (trans (list 1 0 0) 1 0) (trans (list 0 1 0) 1 0))) )
WCS:
(command "._ucs" "_w")
Collect points:
(setq pt-a (getpoint (tra "\nSpecify apex point: ")) pt-1 (getpoint (tra "\nSpecify end point 1: ")) pt-2 (getpoint (tra "\nSpecify end point 2: ")) )
Create a new UCS:
(command "._ucs" "_3p" "_non" pt-a "_non" pt-1 "_non" pt-2)
Do something with the points, below shows how points behave and how they can be manipulated.
(princ (strcat "\nAngle from apex to point 2 in WCS is: " (rtos (angle pt-a pt-2)) ".")) (princ (strcat "\nAngle from apex to point 2 in plane trough points with point 1 on x-axis is: " (rtos (angle (trans pt-a 0 1) (trans pt-2 0 1))) "."))
Back to where we started:
(if current-ucs-tmp ; restore ucs (progn (command "._ucs" "_3p" (trans (nth 0 current-ucs-tmp) 0 1) (trans (nth 1 current-ucs-tmp) 0 1) (trans (nth 2 current-ucs-tmp) 0 1)) (setq current-ucs-tmp nil) ) )