・ OSNAPを指定して指示したポイントの誤差を修正する

ユーザーに (entsel) (nentsel) 等で、オブジェクトを指示させておいて、返ってきたリストの中の、指示したポイントを利用したい場合、指示点が、オブジェクト上に無い場合があります。
こういった場合指定したポイントを (osnap) によって、誤差を修正できます。

構文: (osnap point Oスナップ識別子)
        端点       : endp
        交点       : int
        仮想交点: appint
        中点       : mid
        近接点    : nea

例: (setq pt (osnap pt "nea") )

たとえば、LWPOLYLINE を指示させて、指示した線分の頂点座標を得たい場合など、指示したポイントの誤差を修正しなくてはなりません。

(defun sample ()
  (setq ent (nentsel "\nLWPOLYLINEを選択")) 
  (setq ed (entget (car ent)))
  (while (setq pt (assoc 10 ed)) ; 頂点座標リストを取得
    (setq pt_list (append pt_list (list pt)))
    (setq ed (cdr (member pt ed)))
    )
  (setq ent_pt (cadr ent)) ; 指示したポイントの取得
  (setq ent_pt (osnap ent_pt "nea")) ; 指示したポイントの誤差修正
  (setq x2 (car ent_pt))
  (setq y2 (cadr ent_pt))
  (setq n 0)
  (repeat (1- (length pt_list)) ; 指示点と頂点が一直線上にあるか判定
    (setq sp (nth n pt_list))
    (setq ep (nth (1+ n) pt_list))
    (setq x1 (car sp))
    (setq y1 (cadr sp))
    (setq x3 (car ep))
    (setq y3 (cadr ep))
    (setq hantei (+ (* y1 (- x2 x3))(* y2 (- x3 x1))(* y3 (- x1 x2))))
    (if (equal 0 hantei 1e-6) ; さらに判定に誤差を許容しています
      (setq pt1 sp pt2 ep)
      )
    (setq n (1+ n))
    )
  (if (and pt1 pt2)
    (princ "\n指示点は頂点を結ぶ線分上の点です"))
    (princ "\n頂点座標は得られませんでした")
    )
  )