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に設定するか、設定 / プログラムオプション / システムでオプションを切り替えます。
また、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) は、コマンドのダイアログボックスが起動しないようにするため使用されます。

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

他の人のファイルを開く場合、監査を実行してからPURGEコマンドを実行すると、未使用のアイテムを削除できます。

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

(repeat 3 (command "-purge" "all" "*" "n"))
注: 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