2024年5月25日土曜日

ライトウェイトポリラインを3Dポリラインに変換するLISPコマンド

 AutoCAD Civil 3D には、2D ポリラインを3D ポリラインに変換するコマンドと、3D ポリラインを2D ポリラインに変換するコマンドがありますが、AutoCAD 他にはありません。

LISPでライトウェイトポリラインを3Dポリラインに変換するコマンドを作ってみました。

 ;;; ----------------------------------------------------------

;;; conv3dpoly.lsp

;;; (C) Copyrights 2024 Graebert Japan LLC.

;;; ----------------------------------------------------------


;;1個のライトウェイトポリラインを変換

(defun CONV3DPOLY ( en / el la fl i lp )

  ;図形リストを取得する

  (setq el (entget en)

   la (cdr (assoc 8 el))

   fl (cdr (assoc 70 el)))

  ;頂点の数を返す

  (setq i (vlax-curve-getendparam en))

  ;コマンドパラメータの最後はEnterである

  (setq lp '(""))

  ;閉じたポリラインを閉じたポリラインとして処理するとき

  ;(if (/= 0 (logand 1 fl))

  ;  (setq i (- i 1.0) lp '("C"))

  ;)

  ;頂点を最後から最初まで取得する

  (while (not (minusp i))

    ;頂点を前に詰めていく

    (setq lp (cons (vlax-curve-getpointatparam en i) lp))

    (setq i (- i 1.0))

  )

  ;コマンド名を前に詰める

  (setq lp (cons "3dpoly" lp))

  ;画層を切り替え

  (setvar "CLAYER" la)

  ;コマンドを実行

  (apply 'command lp)

  ;ライトウエイトポリラインは削除する

  (entdel en)

)


;;複数のライトウェイトポリラインをまとめて変換

(defun C:CONV3DPOLY ( / ss cl i n en )

  ; ライトウェイトポリラインのみ取得

  (if (setq ss (ssget '((0 . "LWPOLYLINE"))))

    (progn

      ;画層を元に戻すのに必要

      (setq cl (getvar "CLAYER"))

      ;選択したすべてのライトウェイトポリラインについて

      (setq i 0 n (sslength ss))

      (while (< i n)

        ;図形名を取得

        (setq en (ssname ss i))

        ;3Dポリラインに変換

        (CONV3DPOLY en)

        (setq i (1+ i))

      )

      (setvar "CLAYER" cl)

    )

  )

  (princ)

)

次の部分が見どころになります。
  • 特定の図形を複数選択する方法
  • コマンドと関数の切り分け
  • vlax-curve 関数の使用法
  • 可変長のコマンド引数の渡し方


0 件のコメント:

コメントを投稿

ARESのトリニティ(三位一体)

 ARESのトリニティ戦略、どこがトリニティなんでしょう。 まずはデスクトップCADが、WindowsにもMacにもLinux版もあるというトリニティ。 デスクトップCADと、モバイルCAD(ARES Touch)と、ブラウザとサーバーCAD(ARES Kudo)のトリニティ。 ...