ラベル AutoLISP の投稿を表示しています。 すべての投稿を表示
ラベル AutoLISP の投稿を表示しています。 すべての投稿を表示

2024年6月10日月曜日

画層状態管理をLISPで

 画層設定を保存し、別の図面で読み込む方法

LAYER[画層設定]コマンドでは画層の新規作成、設定の変更、削除を行える。

複数の画層のフリーズやロックや色の設定をまとめて保存、復元する画層状態管理という機能がある。


図面に保存した画層状態を拡張子.lasのテキストファイルに出力し他の図面に読み込むことで、画層の設定を他の図面に適用できる。

現在の画層状態を保存 

(layerstate-save  name flag [viewport])
現在の画層状態を name という名前で保存する。
フラグ flag はどのプロパティを保存するかビット和で指定する。
オプションのビューポート viewport の図形名を指定すると、指定したビューポートの画層設定を保存する。

フラグの意味

1 表示/非表示 設定
2 フリーズ 設定
4 ロック 設定
8 印刷 設定
16 ビューポート フリーズ初期設定
32 線色
64 線種
128 線幅 

(layerstate-save "test" 255) は画層のすべての設定を test という名前で保存する。

現在の画層状態を復元 

(layerstate-restore  name [viewport flag])
画層状態 name を図面に復元する。
オプションのビューポート viewport の図形名を指定すると、指定したビューポートの画層優先設定をして復元する。
復元フラグ flag は画層状態に含まれていない画層をどう処理するかを指定する。

復元フラグの意味

1 含まれていない画層は非表示にする
2 含まれていない画層はフリーズにする
4 ビューポートの優先設定にする

(layerstate-restore "test") で画層状態 test を図面に復元する

現在の画層状態を書き出し 

(layerstate-export name file)
画層状態 name をテキストファイル file に書き出す。
書き出されたファイルは、他の図面の画層設定に流用できる。
(layerstate-export "test" "c:/temp/test.las") で c:\temp\test.las ファイルを作成する。

現在の画層状態を読み込み 

(layerstate-import file)
画層状態テキストファイル file を図面に読み込む。
画層状態名は file の2番目のデータに含まれる。
(layerstate-import "c:/temp/test.las") で c:\temp\test.las ファイルを読み込む。
設定が図面に取り込まれるだけで、その復元には (layerstate-restore) の呼び出しが必要。


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 関数の使用法
  • 可変長のコマンド引数の渡し方


Visual LISP ~ 図形を画層に振り分けたら線種尺度を設定する

画層のプロパティとして、線色、線種、線幅、印刷スタイルなどはありますが、線種尺度はありません。線種尺度=ByLayerという設定の代わりになりそうなものを考えてみました。 

Visual LISP で作成したので、AutoCAD 系の他のCAD でも使えると思います。

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

;;; LayLScale.lsp

;;; 画層毎に線種尺度を設定する

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

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


;; 画層名と線種尺度のペアを設定(いくらでも追加可能)

(setq #LayLScale '(

    ("MODEL" . 1.0)

    ("MODEL2" . 2.0)

    ("MODEL4" . 4.0)

    ("MODEL8" . 8.0)

    ))


;; 線種尺度を書き換えるコールバック関数

(defun layLscaleReactor( cb data / obj item )

    ; 図形名をVLAオブジェクトに変換

    (if (setq obj (vlax-ename->vla-object (last data)))

        ; VLAオブジェクトは画層と線種尺度が使用できるか

        (if (and (vlax-property-available-p obj 'Layer)

            (vlax-property-available-p obj 'LinetypeScale T))

            ; 図形の画層から線種尺度のペアを取得できるか

            (if (setq item (assoc (vla-get-Layer obj) #LayLScale))

                ; 線種尺度がペアの設定値と一致していないとき

                (if (/= (cdr item) (vla-get-LinetypeScale obj))

                    ; 線種尺度を修正する

                    (vla-put-LinetypeScale obj (cdr item))

                )

            )

        )

    )

    ; VLAオブジェクトを解放する

    (setq obj nil)

)


;; Visual LISP データベース リアクターを設定

(vlr-acdb-reactor nil '(

    (:vlr-objectappended . layLscaleReactor)

    (:vlr-objectmodified . layLscaleReactor)

))

使い方は、図面を開いたときに自動的に読み込まれるLISPファイルとしてどこかに登録してください。AutoCADなら、acad2025doc.lsp ファイルに、(load "LayLScale.lsp") と書くとかですね。 

2021年3月31日水曜日

異尺度注釈図形にアタッチされている尺度を知る

 異尺度注釈図形が持っている尺度(文字列)を表示する


;;;

;;; LISTANNOSCALE.LSP

;;;

(defun C:LISTANNOSCALE ( / el id f)

  (setq f T)

  ;異尺度注釈図形を選択

  (if (setq el (entget (car (entsel "異尺度注釈を選択:"))))

    ;拡張ディクショナリを選択

    (if (setq id (cdr (assoc 360 el)))

      ;AcDbContextDataManagerデータを選択

      (if (setq id (cdr (assoc -1 (dictsearch id "AcDbContextDataManager"))))

        ;ACDBANNOTATIONSCALESデータを選択

        (if (setq id (cdr (assoc -1 (dictsearch id "ACDB_ANNOTATIONSCALES"))))

          ;オブジェクトコンテキストデータを取得

          (while (setq el (dictnext id f))

            (if (setq sl (entget (cdr (assoc 340 el))))

              (princ (strcat (cdr (assoc 300 sl)) ","))

              (princ "\nSCALEがありません")

            )

            (setq f nil)

          )

          (princ "\nAcDbObjectContextDataがありません")

        )

        (princ "\nAcDbContextDataManagerがありません")

      )

      (princ "\n拡張ディクショナリがありません")

    )

    (princ "\n図形選択エラー")

  )

  (princ)   

)


2021年1月5日火曜日

定義されているシンボルをテキストファイルとして書き出す

AutoLISP (他、AutoCAD 互換CADのLISP)で、定義されているシンボルをテキストファイルとして書き出します。 


(defun list-all-symbols ( / file fd ls )

  (setq file (getstring T "filename: "))

  (setq fd (open file "w"))

  (foreach it (atoms-family 0)

    (princ it fd) (princ "\n" fd) 

  )

  (close fd)

  (terpri)

)

実行

コマンド: (list-all-symbols )

filename: c:\temp\ijcad.lst

テキストファイルは1行1関数(変数、オートメーションの定数、etc.)になります。

 用途

シンボルの衝突(コンフリクト)がおきていないかチェックするとか

隠し機能を探すとか

関数の説明

atoms-family によって、現在登録されているすべてのシンボルのリストを返します。

type 引数が 0 のときはシンボルのリスト、1のときは文字列のリストになります。

open princ close は、データをテキストファイルとして出力する方法です。

open 関数がファイルをオープンし、戻り値の ファイル識別子を、princ 関数や close 関数に渡すと、開いたファイルへの操作になります。


Gitリポジトリの一括更新

 こんなバッチファイルはいかがでしょうか。 REM gitall.bat - update repositries. for /D %%i in (*.*) do pushd %%i & git stash & git pull & popd コマンドプロ...