・ 任意の1点より1線分へ垂線をひく

ベクトルの内積を利用

p2 から p3 に垂線をひくには、ベクトルv3が判ればいいわけです。
このベクトルv3のことを、v2のv1への正射影ベクトルと呼ぶらしい。
さて、その求め方ですが、公式に頼ってますのであしからず。・・・ ^_^;

;**********************************************************;
;任意の1点より線分に垂線を引く                             ;
;ベクトルの内積を利用                                      ;
;**********************************************************;
(defun Jo_line_orth( / ed p0 p1 p2 p3 v1 v2 v3)
  
  (defun Jof_v_inp (;ベクトルの内積(inner product);
		    v1;ベクトル;
		    v2;ベクトル;
		    )
    (apply '+ (mapcar '* v1 v2 ))
    )
  (defun Jof_v_len (;ベクトルの長さ;
		    v;ベクトル;
		    )
    (sqrt (apply '+ (mapcar '(lambda(x) (expt x 2)) v)))
    )
  (defun Jof_orth_v(;v2のv1への正射影ベクトルを取得;
		    v1
		    v2
		    / v3 )
    (setq v3 (/ (Jof_v_inp v1 v2) (expt (Jof_v_len v1) 2)))
    (mapcar '(lambda (x) (* v3 x)) v1)
    )    
  
  (setq ed (entget (car (entsel "\n線分を選択"))))
  (setq p2 (getpoint "\n点を指示"))
  (setq p0 (cdr (assoc 10 ed)))
  (setq p1 (cdr (assoc 11 ed)))
  (setq v1 (mapcar '- p1 p0))
  (setq v2 (mapcar '- (trans p2 1 0) p0))
  (setq v3 (Jof_orth_v v1 v2));正射影ベクトル;
  (setq v3 (trans v3 0 1 t));正射影ベクトルの変位をUCSに変換;
  (setq p3 (mapcar '+ (trans p0 0 1) v3));p0をUCSに変換し変位を加える;
  (command "._LINE" p2 p3 "")
  )

任意の軸アルゴリズムの利用

p0:線分の始点
p1:線分の終点
p2:任意の点
p3:p2より線分p0-p1に降ろした垂線の交点

p0-p1をz軸方向とする座標系において、p2のz座標値は、p3のz座標値と同じです。
また、p0-p1の線分上の点は、すべてx座標値・y座標値は同一となります。
よって、p0-p1をz軸方向とする座標系において、
p3(x , y ,  z)=(p0x , p0y , p2z)
これを、現在のUCSに変換すればいいわけです。

;****************************************************************;
;任意の1点より線分に垂線を引く                                   ;
;任意の軸アルゴリズムの利用                                      ;
;****************************************************************;
(defun Jo_line_orth_z ()
  (defun Jof_uv (;2点より単位方向ベクトルを取得;
		 p0;始点;
		 p1;終点;
		 / dist)
    (setq dist (distance p0 p1))
    (mapcar '/ (mapcar '- p1 p0) (list dist dist dist))
    )

  (defun Jof_orth_pt (;垂直に降ろした点の座標を取得;
		      uv;線分の単位方向ベクトル;
		      p0;線分の始点;
		      pt;任意の点;
		      )
    (setq pt (trans pt 0 uv));任意の点を線分の始点→終点をZ方向とする座標系に変換;
    (setq pt_z (caddr pt));そのZ座標値;
    (setq p0 (trans p0 0 uv));始点→終点をZ方向とする座標系で線分の始点の座標;
    (list (car p0) (cadr p0) pt_z);始点→終点をZ方向とする座標系で垂直に降ろした点の座標;
    )
  
  (if (and
	(setq ed (entget (car (entsel "\n線分を選んでね"))))
	(= "LINE" (cdr (assoc 0 ed)))
	)
    (progn
      (setq p0 (cdr (assoc 10 ed)));線分の始点;
      (setq p1 (cdr (assoc 11 ed)));線分の終点;
      )
    (princ "\n線分を選んでね")
    )
  (if (and p0 p1 (setq p2 (getpoint "\n点を指示")))
    (progn
      (setq uv1 (Jof_uv p0 p1))
      (setq p3 (Jof_orth_pt uv1 p0 (trans p2 1 0)))      
      )
    )
  (if p3
    (progn
      (setq p3 (trans p3 uv1 1));交点を始点→終点をZ方向とする座標系からUCSに変換;
      (princ "\n垂直に降ろした点は")
      (princ p3)
      (command "._LINE" "none" p2 "none" p3 "")
      )
    )
  (princ)
  )