Hi,
Translations of coordinates between ModelSpace and PaperSpace (or inverse) can be done only about a specific viewport.
If a PaperSpace is active, you can use the trans function to translate pt coordinates :
From PaperSpace to ModelSpace WCS: (trans (trans pt 3 2) 2 0)
From ModelSpace to WCS PaperSpace: (trans (trans pt 0 2) 2 3)
Without activating a viewport, it can be done using these routines. They need a viewport pointer as argument (ENAME or VLA-OBJECT)
EDIT : added some missing routines
EDIT 2 : added one more missing routine
;; WCS2PCS (gile)
;; Translates a point WCS coordinates to the PaperSpace CS according to
;; the specified Viewport
;;
;; (WCS2PCS pt vp) is the same as (trans (trans pt 0 2) 2 3) when vp is active
;;
;; Arguments
;; pt : a point
;; vp : the viewport (ename or vla-object)
(defun WCS2PCS (pt vp / elst ang nor scl mat)
(vl-load-com)
(and (= (type vp) 'VLA-OBJECT)
(setq vp (vlax-vla-object->ename vp))
)
(setq pt (trans pt 0 0)
elst (entget vp)
ang (cdr (assoc 51 elst))
nor (cdr (assoc 16 elst))
scl (/ (cdr (assoc 41 elst)) (cdr (assoc 45 elst)))
mat (mxm
(list (list (cos ang) (- (sin ang)) 0.0)
(list (sin ang) (cos ang) 0.0)
'(0.0 0.0 1.0)
)
(mapcar (function (lambda (v) (trans v nor 0 T)))
'((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
)
)
)
(mapcar '+
(vxs (mxv mat (mapcar '- pt (cdr (assoc 17 elst)))) scl)
(vxs (cdr (assoc 12 elst)) (- scl))
(cdr (assoc 10 elst))
)
)
;; PCS2WCS (gile)
;; Translates a point PaperSpace coordinates to WCS coordinates
;; according to the specified viewport
;;
;; (PCS2WCS pt vp) is the same as (trans (trans pt 3 2) 2 0) when vp is active
;;
;; Arguments
;; pt : a point
;; vp : the viewport (ename or vla-object)
(defun PCS2WCS (pt vp / ang nor scl mat)
(vl-load-com)
(and (= (type vp) 'VLA-OBJECT)
(setq vp (vlax-vla-object->ename vp))
)
(setq pt (trans pt 0 0)
elst (entget vp)
ang (- (cdr (assoc 51 elst)))
nor (cdr (assoc 16 elst))
scl (/ (cdr (assoc 45 elst)) (cdr (assoc 41 elst)))
mat (mxm
(mapcar (function (lambda (v) (trans v 0 nor T)))
'((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
)
(list (list (cos ang) (- (sin ang)) 0.0)
(list (sin ang) (cos ang) 0.0)
'(0.0 0.0 1.0)
)
)
)
(mapcar '+
(mxv mat
(mapcar '+
(vxs pt scl)
(vxs (cdr (assoc 10 elst)) (- scl))
(cdr (assoc 12 elst))
)
)
(cdr (assoc 17 elst))
)
)
;; VXS Multiply a vector by a scalar
;;
;; Arguments : a vector and a real
(defun vxs (v s) (mapcar (function (lambda (x) (* x s))) v))
;; VXV (gile)
;; Returns the dot product of two vectors (real)
;;
;; Arguments : two vectors
;; return : a real number
(defun vxv (v1 v2) (apply '+ (mapcar '* v1 v2)))
;; TRP
;; transposes a matrix -Doug Wilson-
;;
;; Argument : a matrix
;; return : a matrix
(defun trp (m) (apply 'mapcar (cons 'list m)))
;; MXV
;; Applies a transformation matrix to a vector -Vladimir Nesterovsky-
;;
;; Arguments : une matrice et un vecteur
;; return : a vector
(defun mxv (m v)
(mapcar '(lambda (r) (vxv r v)) m)
)
;; MXM
;; Multiplies (combinates) two matrices -Vladimir Nesterovsky-
;;
;; Arguments : deux matrices
;; return : a matrix
(defun mxm (m q)
(mapcar '(lambda (r) (mxv (trp q) r)) m)
)