・ 平行かどうかの判定

2つのベクトルが平行であるなら、その単位方向ベクトルは同じか、180°反対向きである。
図面上では、ある程度の誤差を許容しなくてはならないので、(equal) の fuzz オプションを適当に設定しましょう。

(defun Jo_chk_para ( / lst_pt uv1 uv2 )
  (defun Jof_chk_para(;ベクトルが平行かどうか判定 平行:T / 違う:nil ;
		      v1;ベクトル;
		      v2;ベクトル;
		      / uv1 uv2 fuz Jof_uv)
    (defun Jof_uv (;ベクトルから単位方向ベクトルを取得;
		   v;ベクトル;
		   / dist)
      (setq dist (sqrt (apply '+ (mapcar '(lambda (x) (expt x 2)) v))));ベクトル長さ;
      (mapcar '/ v (list dist dist dist))
      )
    (setq fuz 1e-6)
    (setq uv1 (Jof_uv v1))
    (setq uv2 (Jof_uv v2))
    (or
      (equal uv1 uv2 fuz)
      (equal uv1 (mapcar '* uv2 (list -1.0 -1.0 -1.0) ) fuz);反対向きも平行なので;
      )
    )
  
  (defun Jof_v_sept(;線分を選択して始点・終点のベクトルを返す;
		      / ed v)
    (while (not ed)
      (setq ed (entget (car (entsel "\n線分を選択"))))
      (if (= "LINE" (cdr (assoc 0 ed)))
	(setq v (mapcar '- (cdr (assoc 11 ed)) (cdr (assoc 10 ed))))
	(progn (setq ed nil) (princ "\n選択したオブジェクトは線分ではありません"))
	)
      )
    v
    )   

  ;メインルーチン;
  (setq v1 (Jof_v_sept))
  (setq v2 (Jof_v_sept))
  (if (Jof_chk_para v1 v2)
    (princ "\n平行です")
    (princ "\n平行ではありません")
    )
  (princ)
  )