BricsCADのLISP
BricsCAD の LISP API は、AutoCAD の AutoLISP互換を維持しつつ、更に発展している API となっている。
BricsCAD の LISP API の詳細は、アプリサイト https://boa.bricsys.com/applications/ にある「LISP Developer Support Package」 を見ると良い。サンプルも付属しているので理解の助けになると思います。
BricsCAD で実装されている関数の概要
- AutoLISP : AutoCAD 互換の関数。vl関数も含め言語仕様に依存したトリッキーな使い方もほぼ同じように動く。
- VLE-関数 : VLA関数の発展実装版。VLA関数は Windows でしか使えないけど、VLE-関数は Linux や Mac でも使えるように実装されている。しかも早い。
- シートセット関数:シートセット機能をコントロールするための関数群。
- Tin+Civil関数 : BricsCAD PROにある(Civil3Dライクな)土木機能と合わせて実装されている関数群。Tinサーフェスを作成・編集したりできる。AutoCAD Civil3D データの読み込み関数なんかもある。
- GEO関数 : BricsCAD PRO にある土木機能の GEO連携システムと合わせて実装されている関数群。測量座標の測地系を変換したりできる。
- BIM関数 : BricsCAD BIM の製品用に実装されている関数群。BIM系のオブジェクトや定義を作成・編集したりできる。BricsCAD
だとLISP+BIMで開発できる。
- Mechanical関数:BricsCAD Mechanical の製品用に実装されている関数群。Rhino の読み書き関数なんかもある。
- シートメタル関数:BricsCAD Mechanical の製品用に実装されている関数群。板金オブジェクトや定義を作成・編集したりできる。
- Expresstools関数: ExpressTools で使用されている関数群。BricsCAD V14 時に追加された。
- Doslib関数:VisualLisp が無い時代から提供されている DosLib ツールの拡張関数群。BricsCAD ではマルチプラットフォーム用に再実装されてきている。
BricsCAD Lispのメモリ構成
BricsCAD LISPエンジンは、LISPヒープとページデータ、および特定のマシンにインストールされているRAMメモリの量に基づいた最大メモリブロックのために、最適化された内部メモリ管理を使用してる。しかし、ごく稀に LISP のメモリブロックのサイズが足りずにメモリ不足になることがありえる(その場合、LISPが動作しなくなる)。
BricsCAD の LISPエンジンは、BricsCAD のインストールフォルダにある "lispex.dll.cfg "というファイルを使用して、いくつかのメモリ設定値を調整することができる(テキストファイルで3つの設定があり、メモ帳などのエディタで編集が可能)。
以下が、"lispex.dll.cfg "で調整可能な設定。
基本的に適宜調整はされるので、マニュアルで調整する必要はないので変態的な使い方が必要になる人向けといえる。
Fast-COM
実装の背景
BricsCAD の Fast-COM は BricsCAD が Linux に移植された際、Linux には COM がないため、COMベースのLISP関数(vla、vlax、vlr関数セット)をLinux(後のMacも同様)でも提供する問題に直面したところから実装され始めた仕組み。
BricsCAD Linux/Mac用の vla, vlax, vlr機能セットを提供することが主目的だが、Windowsでも有効的に作用し、標準の Windows COM に比べて 通常50%、最大1000%(10倍)以上の著しい性能向上(データの変換が通常のCOMでは3回発生するが、Fast-COMだと1回のみになるため)と、Windows および Lispエンジンメモリの両方の負荷軽減が提供される。
Lisp のメモリ負荷が軽減されることでガベージコレクションが走る事自体が減少するため、間接的な性能向上にも寄与している。
使用方法
BricsCAD に標準で組み込まれているので、無効化しなければ(切り替えられる)そのまま使える。(Lite から!)
Microsoft COM Type Libraries (.tlb と .idl ファイル)と非常によく似た形で実装されていているので次のように使える。
- プロパティ関数は、専用関数(vla-get-<property> ...)または汎用関数(vlax-get-property '<property> ...)両方に対応している。
- メソッド関数についても、専用の関数として呼び出し(vla-<method> ...)、汎用的な呼び出し(vlax-invoke-method '<method> ...)両方に対応している。
効果
- Windows COM のデータラッピングやマーシャリングは、パフォーマンスやメモリ消費に大きな影響を与えるため、これを回避する。
- ターゲット関数と引数が TypeLibrary の記述と照合されるため、比較的遅い Windows COM 関数呼び出しメカニズム (::DispInvoke(), IDispatch::Invoke() など) をバイパスする。
- データ型のラッピング/マーシャリングと動的なCOM関数呼び出しの解決は前方および後方で処理される。
- Lispエンジンは、COMオブジェクト記述の効果的なキャッシュを使用し、Teigha(TX)およびBricsCAD(内部)のインターフェイスとC/C++レベルで直接動作するため、ARX/BRXコードに非常に近いパフォーマンス(約80%〜90%)を実現している。
BricsCADの各バージョンで、より多くのプロパティとメソッドがこのモードをサポートし、BricsCAD Linuxでも同様に利用できるようになる。
利用のON/OFF
Fast-COM 実装は、vle-fastcom関数によって実行時に有効/無効を切り替えることができる。
; Colorプロパティ値は通常のWindows COMアクセスで取得し、Layerプロパティは "Fast-COM "モードを使用してアクセスする例。 (if vle-fastcom (vle-fastcom nil)) (setq res (vla-get-color <object>)) (if vle-fastcom (vle-fastcom t)) (setq res (vla-get-layer <object>))
統合LISPオプティマイザ
背景と仕組み
AutoCAD の AutoLISP は、1980年代半ばに開発された古い XLisp方言をベースにしていて大きなイノベーションと言える改良がなされていないため、最近のLisp方言では標準となっている基本的なLispコア機能が大幅に欠落している。そのため、AutoLISP を用いたアプリケーションは、AutoLISP の制限された組み込み機能を用いて、この基本機能の多くを独自に実装しなければならない。(うちのGzLibもある意味これを緩和するために作ってる。)
これが原因で、AutoLISP アプリケーションのコードには非効率的なコードパターンが含まれることが多く、メモリと性能を浪費することになる。単に、よく使われる多くの機能を実装するのに他に方法がないため。
BricsCAD の Lispエンジンは、最新の OpenLispコアエンジンを使用しており、優れたパフォーマンスと最新の Lisp言語機能をフルに備えているものだが、OpenLispコアのパワーは AutoLISP の互換性を保つために隠され使用されていない。
このようなもったいない状況に対する回答として、多くのコア機能、快適性、性能(さらには他のAutoLISP互換システムとの互換性)を提供する VLE-関数ライブラリのアイデアが生まれた。
ただ、Lisp の開発者が VLEのライブラリを使ってアプリケーションを調整する心理的・時間的な敷居が高いという状況があることも認識されているため、別方向からの解決策として自動Lispコード最適化ツール(統合LISPオプティマイザ)が爆誕した。
統合LISPオプティマイザは、Lispコードをロード時に解析して非効率なコードパターンを検出し、より効率的なコードパターンに置き換えるもので、完全に透過的で開発者側の努力は不要になっている。(要は勝手に高効率なコードに最適化してくれる。AutoCAD のコンパイル時に行われる最適化とは別のアプローチ。)
「Lisp Optimiser は、今後の BricsCAD のバージョンアップにより、より多くのコードパターンに拡張される予定」とアナウンスされていて、LISP で書いとけば勝手に効率化されるケースが増えていくことが期待できる。
BricsCAD 用に LISP プログラムの秘匿化
BricsCAD 用に Lisp を秘匿化する場合は
- V18.2 以前では、コンパイル用の encryptgui.exe、encryptconsole.exe が搭載されているのでそれを使ってコンパイルできる。
- V18.2 より BLADE という開発環境(IDE)が搭載され、追加の方法としてそこからプロジェクトをまとめて、またはファイルを個別にコンパイルできる。(descoder.exe)
- descoder.exe だと日本語絡みでコンパイル結果がバグることがあるのでその場合は、旧来の encryptgui.exe で対応すると良い。
- AutoCAD の PROTECT.EXE で暗号化されたものも利用可能。