・ OSNAPを使って選択したオブジェクト(セグメント)の両端点を取得
ユーザーに (entsel) (nentsel)
等で、オブジェクトを指示させておいて、選択したオブジェクト(またはそのセグメント)の両端点を取得したいことはよくある
今までは、オブジェクトのタイプごとに場合分けして、しかもネストされたオブジェクトだとマトリックス変換とかも駆使してがんばった
でも、こんな簡単な方法でも取得できるみたい・・・・(-_-;)
円・楕円は端点無いので当然ダメですが、楕円弧やスプラインでも取得できないのであしからず
(defun Jo_get_wendp ( / ent )
;***********************************************************************;
;ベクトルの長さを返す ;
;***********************************************************************;
(defun Jof_v_len (
v;ベクトル;
/ )
(sqrt (apply '+ (mapcar '(lambda (x) (expt x 2)) v)))
)
;***********************************************************************;
;ベクトルの内積(inner product) ;
; 2ベクトルが直交する場合 0 となる ;
;***********************************************************************;
(defun Jof_v_inp (
v1;ベクトル;
v2;ベクトル;
/ )
(apply '+ (mapcar '* v1 v2))
)
;***********************************************************************;
;正射影ベクトルを返す ;
; v2のv1への正射影ベクトルを取得 ;
;***********************************************************************;
(defun Jof_v_orth(
v1;ベクトル;
v2;ベクトル;
/ v3 )
(setq v3 (/ (Jof_v_inp v1 v2) (expt (Jof_v_len v1) 2)))
(mapcar '(lambda (x) (* v3 x)) v1)
)
(defun Jof_get_wendp ( ent / pn pc pm p1 p2 v_c1 v_1x v_1m lst_pt)
(mapcar '(lambda (x y) (set x (osnap (cadr ent) y))) '(pn pc pm p1) '("_nea" "_cen" "_mid" "_endp"))
(cond
((and pc (not p1))
(alert "\n円が選択されました\n端点は取得できません")
)
(pc
(setq v_c1 (mapcar '- p1 pc))
(setq v_1x (mapcar '- (Jof_v_orth (mapcar '- pm pc) v_c1) v_c1))
(setq p2 (mapcar '+ p1 (mapcar '* v_1x '(2.0 2.0 2.0))))
(setq lst_pt (list p1 p2))
)
(t
(setq v_1m (mapcar '- pm p1))
(setq p2 (mapcar '+ p1 (mapcar '* v_1m '(2.0 2.0 2.0))))
(setq lst_pt (list p1 p2))
)
)
lst_pt
)
(while (not ent)
(setq ent (entsel "\nオブジェクト選択"))
)
(if (setq lst_pt (Jof_get_wendp ent))
(progn
(grdraw (car lst_pt) (cadr lst_pt) -1 1)
(alert "\n端点取得しました")
(grdraw (car lst_pt) (cadr lst_pt) -1 1)
)
)
)