Welcome to Our Company
HOME シェアウェア 講習 リンク

 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