Here, this should do it, but something is wrong... CAD doesn't find result of computation... Anyway, here is code, so if someone can fix it, go ahead and take all the thanks...
;; TRP
;; Transposes a matrix -Doug Wilson-
;;
;; Argument : a matrix
(defun trp (m) (apply 'mapcar (cons 'list m)))
;; MXV
;; Applies a transformation matrix to a vector -Vladimir Nesterovsky-
;;
;; Arguments : a matrix and a vector
(defun mxv (m v)
(mapcar (function (lambda (r) (apply '+ (mapcar '* r v)))) m)
)
;; MXM
;; Multiplies (combinates) two matrices -Vladimir Nesterovsky-
;;
;; Arguments : two matrices
(defun mxm (m q)
(mapcar (function (lambda (r) (mxv (trp q) r))) m)
)
(defun c:npt3DS nil (c:nearestpointto3DSolid))
(defun c:nearestpointto3DSolid ( / aobj adoc mspc pt radpt rad obj1 obj11 obj2 obj22 obj3 k matrix scf matrixn ptn radn )
(vl-load-com)
(setq aobj (vlax-get-acad-object)
adoc (vla-get-activedocument aobj)
mspc (vla-get-modelspace adoc)
)
(setq pt (getpoint "\nPick point from witch to calculate nearest point to 3DSolid")
radpt (getpoint pt "\nPick point of radius of close sphere from witch to start calculation")
rad (distance pt radpt)
)
(setq obj1
(vla-addSphere mspc (vlax-3d-point pt) rad)
)
(defun dobj2 nil
(if
(not
(vl-catch-all-error-p
(vl-catch-all-apply 'vlax-ename->vla-object
(list
(setq obj2
(car
(entsel "\nSelect 3DSolid for finding closest point to picked one at start")
)
)
)
)
)
)
(setq obj2 (vlax-ename->vla-object obj2))
(progn
(prompt "\nWrong selection - nil selection - try once again")
(dobj2)
)
)
)
(dobj2)
(setq obj22 (vla-copy obj2))
(setq k 0)
(while
(vl-catch-all-error-p
(vl-catch-all-apply
'vla-Boolean
(list obj1 acintersection obj2)
)
)
(setq k (1+ k))
(setq matrix
(list
(list 1.0001 0. 0. (car pt))
(list 0. 1.0001 0. (cadr pt))
(list 0. 0. 1.0001 (caddr pt))
(list 0. 0. 0. 1.)
)
)
; (if (= k 1) (setq matirixn matrix))
; (setq matrixn (mxm matrix matrixn))
(vla-transformby obj1
(vlax-tmatrix matrix)
)
(vla-update obj1)
)
(setq scf (expt 1.0001 k))
(setq matrixn
(list
(list scf 0. 0. (car pt))
(list 0. scf 0. (cadr pt))
(list 0. 0. scf (caddr pt))
(list 0. 0. 0. 1.)
)
)
(setq obj1
(vla-addSphere mspc (vlax-3d-point pt) rad)
)
(setq obj11
(vla-transformby obj1
(vlax-tmatrix matrixn)
)
)
(vla-copy obj22)
(setq obj3
(vla-update
(vla-Boolean obj11 acintersection obj22)
)
)
(setq ptn
(vlax-safearray->list
(vlax-variant-value
(vla-get-Centroid obj3)
)
)
)
(prompt "\nNearest point on selected 3DSolid from point picked at start is : ")
(princ ptn)
(prompt "\nNearest distance to selected 3DSolid from point picked at start is : ")
(princ
(setq radn (distance pt ptn))
)
(vla-addSphere mspc (vlax-3d-point pt) radn)
(princ)
)
(prompt "\nShortcut to c:nearestpointto3DSolid is c:npt3DS")
(princ)
M.R.