・ 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頂点座標は得られませんでした")
)