・ ポリラインを選択したときのピック点の直近の頂点座標を取得する
ポリラインの頂点というか辺を特定したいことがある
この場合図形タイプがPOLYLINEの場合は(nentselp)で VERTEXが返るため簡単なのだが、LWPOLYLINEはめんどくさい (ーー;)
以前はピックした点が連続する頂点座標の線分上にあるかどうかで判断していたが、これだと、円弧上の点はうまくいかない。
そこで、ポリラインの始点からのセグメント長さを比較することで取得できるようにしました。
VL関数を使用しているので、事前に(vl-load-com)を忘れずに!
追記 こちらでも取得可能です(もっと簡単) 2006/09/24
・ OSNAPを使って選択したオブジェクト(セグメント)の両端点を取得
;Jof_get_vertex.lsp ポリラインを選択して、ピックした点の頂点座標を取得 by Kamijo; ; 修正履歴 ; ; 2006/07/11 新規作成 ; (defun Jof_get_vertex ( / ent lst_vertex lst_lwpt dist ) ;************************************************************************************; ;サブルーチン(ポリラインのユーザー選択) ; ; 返値:(ポリラインの種類 図形名 指示点)のリスト ; (defun Jof_get_pline ( / ent flg) (while (not flg) (cond ((initget "")) ((not (setq ent (entsel "\nポリラインを選択")))) ((= ent "") (setq flg t) (setq ent nil)) ((= "POLYLINE" (cdr (assoc 0 (entget (car ent))))) (setq flg t) (setq ent (cons "POLYLINE" ent)) ) ((= "LWPOLYLINE" (cdr (assoc 0 (entget (car ent))))) (setq flg t) (setq ent (cons "LWPOLYLINE" ent)) ) ) ) ent ) ;************************************************************************************; ;サブルーチン(POLYLINEの頂点座標2点のリストを返す) ; ; 引数 pt:POLYLINEを(entsel)で選択した際のピック点 ; ; 返値:2頂点座標のリスト ; (defun Jof_vertex_pl ( pt / en ed lst_vertex ) (cond ((not (setq en (car (nentselp (osnap pt "_NEA")))))) ((not (setq ed (entget en)))) ((not (= "VERTEX" (cdr (assoc 0 ed))))) ((not (setq lst_vertex (cons (cdr (assoc 10 ed)) lst_vertex)))) ((not (setq en (entnext en)))) ((not (setq ed (entget en)))) (t (cond ((= (cdr (assoc 0 ed)) "VERTEX") (setq lst_vertex (cons (cdr (assoc 10 ed)) lst_vertex)) ) ((= (cdr (assoc 0 ed)) "SEQEND") (setq lst_vertex (cons (cdr (assoc 10 (entget (entnext (cdr (assoc -2 ed)))))) lst_vertex)) ) ) ) ) (if (= 2 (length lst_vertex)) (reverse lst_vertex) nil) ) ;************************************************************************************; ;サブルーチン(LWPOLYLINEの頂点座標のリストを返す) ; ; 引数 en:LWPOLYLINEの図形名 ; ; 返値:LWPOLYLINEの頂点座標リスト ; (defun Jof_lst_lwpt ( en / ed e_38 e_210 lst_pt) (setq ed (entget en)) (setq e_38 (list (cdr (assoc 38 ed)))) ;LWPOLYLINEの高さ; (setq e_210 (cdr (assoc 210 ed))) ;LWPOLYLINEの押出しベクトル; (setq ed (member (assoc 10 ed) ed)) (while ed (setq lst_pt (cons (cdr (car ed)) lst_pt)) (setq ed (member (assoc 10 (cdr ed)) ed)) ) (setq lst_pt (mapcar '(lambda (x) (append x e_38)) lst_pt)) (setq lst_pt (mapcar '(lambda (x) (trans x e_210 0)) lst_pt)) (reverse lst_pt) ) ;************************************************************************************; ;サブルーチン(LWPOLYLINEの頂点座標2点のリストを返す) ; ; 引数 en:LWPOLYLINEの図形名 ; ; dist:LWPOLYLINEの始点からのセグメント長さ ; ; lst_lwpt:LWPOLYLINEの頂点座標リスト ; ; 返値:2頂点座標のリスト ; (defun Jof_vertex_lwpl (en dist lst_lwpt / dist_st-vertex lst_vertex) (setq dist_st-vertex 0.0) (while (and dist_st-vertex lst_lwpt) (setq dist_st-vertex (vlax-curve-getDistAtPoint (vlax-ename->vla-object en) (car lst_lwpt))) (if (> dist_st-vertex dist) (progn (setq dist_st-vertex nil) (setq lst_vertex (list (car lst_vertex) (car lst_lwpt))) ) (progn (setq lst_vertex (cons (car lst_lwpt) lst_vertex)) (setq lst_lwpt (cdr lst_lwpt)) ) ) ) (if dist_st-vertex (list (car lst_vertex) (last lst_vertex)) lst_vertex) ) ;************************************************************************************; ;メインルーチン(Jof_get_vertex) ; (cond ((not (setq ent (Jof_get_pline)))) ((= (car ent) "POLYLINE") (setq lst_vertex (Jof_vertex_pl (caddr ent))) ) ((= (car ent) "LWPOLYLINE") (setq lst_lwpt (Jof_lst_lwpt (cadr ent))) (setq dist (vlax-curve-getDistAtPoint (vlax-ename->vla-object (cadr ent)) (osnap (caddr ent) "_NEA"))) (setq lst_vertex (Jof_vertex_lwpl (cadr ent) dist lst_lwpt)) ) ) lst_vertex )