Lisp

作図設定用のLISPルーチンの作成方法

BricsCAD Lisp

AutoCADのからの移行

移行を開始する準備が整ったら、BricsCADのLISPと他のLISPの違いはほとんどありません。コードをロードおよび実行でき、機能も同じです。アプリを「ポーティング」(移植)する際のおもな違いとしては、セットアップ手順がやや異なる他、コマンドライン構造とおそらくファイルの場所が異なるでしょう。開始するには、BricsCADの既存のプログラムの設定と起動を確認しましょう。

Acad.lspまたはAcaddoc.lspを使用してプログラムを自動起動する場合は、それぞれon_start.lspまたはon_doc_load.lspと名前を変更するだけです。最適な解決策は、on_doc_load.lspを使用することです。

BricsCADの設定パネル
プログラムの自動起動を有効にするには、ACADLSPASDOCシステム変数を1に設定するか、ettings / Program options / Systemにチェックを入れてオプションを単純に切り替えます。
また、BricsCAD のオプション/設定メニューには、BricsCAD 環境に特有の設定やオプションがありますので、少し時間をかけてよく理解しておくことをお勧めします。
設定ダイアログの次のステップとして、[設定]‐ [プログラムオプション]- [ファイル]で、[ファイルサーチパス]にフォルダサポートを追加します。
上記の方法で追加されたサポートパスは、現在のプロジェクトフォルダーの1つ下の階層にあるものを使用することをお勧めします。以下の方法のように、コマンドを実行する前にfindfile関数を使用してファイルの存在を確認するのは良い方法です。
(if (findfile "custom-code.lsp")(load "custom-code")) 
これはon_doc_load.lspファイル内で関数をデマンドロードするために使用できる方法の1つです。

これは、on_start.lsp ファイル内で関数を要求ロードするために使用できる方法の1つです。

DEFUNコマンド(DEFINE FUNction)は、on_doc_load.lspファイル内の関数と同じ名前で、その関数は起動時に呼び出し元の関数を再定義するものです。

BricsCADのための図面設定 Lispルーチン

コードサンプル
以下のシンプルな図面設定ルーチンは、最小限の変更でお客様のニーズに合わせることができます。
(defun C:MYSETUP ( / )                    ;define the command line function "mysetup"
  (setvar "cmdecho" 0)
  (command "_audit" "_y")                 ;audit current drawing
  (command "_-purge" "_all" "*" "_n")     ;purge all unused styles, etc
  (command "_-layer" "_m" "1" "_c" "1" "" "")  ; create layer "1" color "1"
  (command "_-layer" "_m" "2" "_c" "2" "" "")
  (command "_-layer" "_m" "3" "_c" "3" "" "")
  (command "_-layer" "_m" "4" "_c" "4" "" "")
  (command "_viewres" "_y" "20000")        ;set view resolution to maximum
  (setvar "filedia" 1)                     ;turn file dialogs on
  (setvar "attdia" 1)                      ;turn attribute dialogs on
  (setvar "attreq" 1)                      ;enable attribute editing on placement
  (setvar "cecolor" "bylayer")             ;set current color bylayer
  (setvar "clayer" "0")                    ;set current layer to "0"
  (setvar "maxsort" 5000)                  ;set maximum layer sort to 5,000
  (command "_zoom" "_e" "_zoom" "0.95x");zoom extents, then out a little
  (setvar "cmdecho" 1)
  (princ)
)
この図面設定ルーチンの各行は、BricsCADのコマンドラインで入力することができました。これらをLispルーチン入れることで、defun(関数を定義する)は、図面設定ルーチンをメニューから「呼び出し可能」にする、またはBricsCADのコマンドラインにルーチン名を入力して呼び出せるようにします。

defunを含めない場合、プログラムをファイル名でロードすると1回実行されます。defunを使い、このルーチンをLSPでロードすると、関数名mysetupを入力することで、いつでも機能を利用できるようになります。

ダッシュで始まるコマンド(例:-layer-purge)は、コマンドのダイアログボックスが起動しないようにするため使用されます。

Note: ローカライズされた(英語以外の)BricsCADバージョンでの失敗を避けるために、コマンドやオプションの名前は常に英語で表記してください。

他の人のファイルを開くときには、監査の後にPURGEコマンドを実行して未使用のアイテムを削除するのが良い方法です。

PURGEコマンドを複数回実行して、入れ子になっているアイテムを削除できることがありました。以下の例をご参照ください:

(repeat 3 (command "-purge" "all" "*" "n"))
Note: PURGEコマンドは、新しい空の画層を追加する前に実行される点に注意してください。追加後にパージを実行すると、追加した画層が削除されてしまいます。

画層を設定するコマンドの呼び出しは、1つのコマンド文にまとめることもできますが、各行が独立している方が読みやすいです。

SETVARはシステム変数を指定された値に設定するよう呼び出すことができます。例えば、寸法や文字スタイル設定、単位設定などです。

MAXSORT設定が導入された理由は2つあります。
  1. MAXSORTによって、ダイアログボックスでソートされるエントリの最大数を制御します。
  2. MAXSORTのデフォルト値は1,000です。現在のコンピューターでは、プロジェクトファイルのサイズが大きくなると、この数字が低くなりすぎることがあります。
図面を開いた時に画層名がアルファベット順にソートされない場合、その理由はデフォルトのMAXSORT値のせいかもしれません。
図面設定ルーチンのためのより汎用性の高い画層メーカー
次の例は、mysetup.lsp のバージョンに追加することができます。シンプルなテキストファイル「Layers.txt 」をメモ帳のようなエディターで作成すると、ルーチンの実行時に作成される画層名のリストを追加できます。これは、上記のハードコーディングされたプロセスに代わるものです。ファイル検索機能を使用することで、BricsCADはLayers.txt ファイルを見つけるため、まず現在のディレクトリを検索してから、定義されたサポートフォルダを順次検索します。デフォルトの画層設定テキストファイルをサポートパスに置き、その代替バージョンを個々のプロジェクトフォルダに置くことができます。

(if (not (findfile "Layers.txt"));"not" = looking for no result from findfile
(alert "Can't find Layers.txt!")                    ;No file?Yell at the user and exit!
(progn                                              ;Otherwise, do the stuff in the progn group
(setq layerfile (open (findfile "Layers.txt")"r")) ;open layers.txt to "read"
(while (setq layername (read-line layerfile))       ;while reading each line, store the text to layername
(command "-layer" "m" layername "")                 ;make layer with the layername
)                                                   ;end the while loop
(close layerfile)                                   ;close the Layers.txt file
)                                                   ;end the progn
)                                                   ;end the if