Lisp

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

BricsCAD Lisp

AutoCAD®からの移行
BricsCADへの移行を開始すると、BricsCAD LISP と OtherLISP の間には実質的な違いがほとんどないことが分かります。コードをそのまま読み込んで実行することができ、機能も同じです。アプリを移植する際の主な違いは、いくつかの軽微なセットアップ手順、コマンドラインの構成、および場合によってはファイルの保存場所です。まずは、既存のプログラムを BricsCAD でセットアップして起動する方法を確認しましょう。

Acad.lspまたはAcaddoc.lspを使用してプログラムを自動起動する場合は、それぞれon_start.lspまたはon_doc_load.lspに名前を変更してください。最適な解決策は、on_start.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コマンドをBAtch allオプションで実行します以下の例をご参照ください:

(コマンド "-purge" "Batch all")
注: 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  

詳細については、BricsCAD V27 の開発者向けリファレンス Web ページ開発者向けドキュメントを参照してください。