|
|||||||||||||
L5.ポリラインの点列を取得する (defun c:ufl00005m ( / ents enna outm ) (setq ents (entsel "\n図形を選択:")) (if (/= ents nil) (progn (setq enna (nth 0 ents)) (if (/= enna nil) (setq outm (ufl00005 enna)) ) (print outm) ) ) (princ) ) (defun ufl00005 ( u_entn ;エンティティ名 / kdfg ;0:最適化ポリライン、1:ポリライン npfg ;最適化ポリラインの場合 ; ポリラインフラグ ; 0:既定値 ; 1:閉じたポリライン ; 128:PLINEGEN[頂点で線種をリセット] ;ポリラインの場合 ; ポリラインフラグ ; 0:既定値 ; 1:閉じたポリライン ; 他:AutoCADカスタムガイド参照 npsu ;最適化ポリラインまたはポリラインの頂点数 ppnt ;最適化ポリラインまたはポリラインの構成点 ; 出力リスト構造 ; (setq ppot (list kdfg npfg npsu (list ppnt ppnt ...)) ; ppot が nil:最適化ポリラインまたはポリラインではない enls nknd ppnl pstl nc lppnt ppot ) ;最適化ポリライン(LWPOLYLINE)及びポリライン(POLYLINE)の情報を得る (setq ppot nil) (if (/= u_entn nil) (progn (setq enls (entget u_entn)) (if (/= enls nil) (progn (setq nknd (cdr (assoc 0 enls))) (if (= nknd "LWPOLYLINE") (progn (setq kdfg 0) (setq npfg (cdr (assoc 70 enls))) (setq npsu (cdr (assoc 90 enls))) (setq npsu (fix (+ (float npsu) 0.1))) ;IntelliCAD用 実数+誤差 (setq pstl enls) (setq nc 0) (repeat npsu (setq ppnt (cdr (assoc 10 pstl))) (setq ppnl (assoc 10 pstl)) (setq pstl (member ppnl pstl)) (setq pstl (cdr pstl)) (if (= nc 0) (setq lppnt (list ppnt)) (setq lppnt (append lppnt (list ppnt))) ) (setq nc (+ nc 1)) ) (setq ppot (list kdfg npfg npsu lppnt)) ) ) (if (= nknd "POLYLINE") (progn (setq kdfg 1) (setq npfg (cdr (assoc 70 enls))) (setq pstl (entget (entnext (cdr (assoc -1 enls))))) (setq nc 0) (while (= "VERTEX" (cdr (assoc 0 pstl))) (setq ppnt (cdr (assoc 10 pstl))) (setq pstl (entget (entnext (cdr (assoc -1 pstl))))) (if (= nc 0) (setq lppnt (list ppnt)) (setq lppnt (append lppnt (list ppnt))) ) (setq nc (+ nc 1)) ) (setq npsu nc) (setq ppot (list kdfg npfg npsu lppnt)) ) ) ) ) ) ) ppot ) 上記AutoLISPファイル(ufl00005.lsp)のダウンロード 説明 fix:実数の小数点以下を切り捨てて整数に変換する。 float:数値を実数に変換する。 repeat:指定された回数繰り返す。 (repeat 整数 (処理) ) member:指定された式がリスト内に存在するかどうか検索し、 初めに検出した式以降のリストを得る。 (member (10 469.326 387.668) ((-1 . <図形名: 7ef5aef8>) (0 . "LWPOLYLINE") (330 . <図形名: 7ef5acf8>) (5 . "97") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbPolyline") (90 . 5) (70 . 0) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 469.326 387.668) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 276.827 579.974) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 605.208 760.967) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 997.001 584.499) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 870.178 383.143) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0 1.0))) は ((10 469.326 387.668) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 276.827 579.974) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 605.208 760.967) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 997.001 584.499) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 870.178 383.143) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0 1.0)) というぐあいに順にポイント座標を取得していく。 append:任意の数のリストを受け取り、それらを1つのリストにする。 (append ((469.326 387.668 0.0)) (list (276.827 579.974 0.0))) は ((469.326 387.668 0.0) (276.827 579.974 0.0)) となる。 while:テスト式を評価してnilでなければ、他の式を評価します。 テスト式の評価がnilになるまでこの処理を繰り返す。 (while (= "VERTEX" (cdr (assoc 0 pstl))) (処理) ) は(cdr (assoc 0 pstl))が"VERTEX"である限り繰り返す。 Presented By ユーザーフレンドリー E-mail:usrfr@yk.rim.or.jp |