「BricsCADのLISP」の版間の差分

提供:GizmoLabs - だいたい CAD LISP なサイト
 
(同じ利用者による、間の44版が非表示)
1行目: 1行目:
{{BCAD_LISP}}
{{BCAD_LISP}}
BricsCAD の LISP API は、AutoCAD の AutoLISP互換を維持しつつ、更に発展された API となっている。
 
BricsCAD の LISP API は、AutoCAD の AutoLISP互換を維持しつつ、更に発展している API となっている。
 
BricsCAD の LISP API の詳細は、アプリサイト https://boa.bricsys.com/applications/ にある「LISP Developer Support Package」 を見ると良い。サンプルも付属しているので理解の助けになると思います。
 
 
* [[BricsCAD における LISP API の仕様追加・変更履歴]]


== BricsCAD で実装されている関数の概要 ==
== BricsCAD で実装されている関数の概要 ==
* [[AutoLISP]] : AutoCAD 互換の関数。細かな仕様の差もほとんどない。
* [[AutoLISP]] : AutoCAD 互換の関数。vl関数も含め言語仕様に依存したトリッキーな使い方もほぼ同じように動く。
* [[VLE-関数]] : VLA関数はWindowsでしか使えないけど、それと対応する VLE関数はLINUXやMACでも使えるように実装されている。
* [[VLE-関数]] : VLA関数の発展実装版。VLA関数は Windows でしか使えないけど、VLE-関数は Linux や Mac でも使えるように実装されている。しかも早い。
* [[シートセット関数-BricsCAD]]:シートセット機能をコントロールするための関数群。AutoCADは他のAPIを使わせたいのか一向に実装されないが、BricsCAD では扱える。
* [[シートセット関数-BricsCAD|シートセット関数]]:シートセット機能をコントロールするための関数群。
* [[tin+civil関数-BricsCAD]] : BricsCAD PROにある土木機能と合わせて実装されている関数群。Tinサーフェスを作成・編集したりできる。AutoCAD Civil3Dの読み込み関数なんかもある。
* [[tin+civil関数-BricsCAD|Tin+Civil関数]] : BricsCAD PROにある(Civil3Dライクな)土木機能と合わせて実装されている関数群。Tinサーフェスを作成・編集したりできる。AutoCAD Civil3D データの読み込み関数なんかもある。
* [[bim関数-BricsCAD]] : BricsCAD BIM の製品用に実装されている関数群。BIM系のオブジェクトや定義を作成・編集したりできる。
* [[GEO関数-BricsCAD|GEO関数]] : BricsCAD PRO にある土木機能の GEO連携システムと合わせて実装されている関数群。測量座標の測地系を変換したりできる。
* [[シートメタル関数-BricsCAD]]:BricsCAD Mechanical の製品用に実装されている関数群。板金オブジェクトや定義を作成・編集したりできる。
* [[BIM関数-BricsCAD|BIM関数]] : BricsCAD BIM の製品用に実装されている関数群。BIM系のオブジェクトや定義を作成・編集したりできる。BricsCAD
だとLISP+BIMで開発できる。
* [[mechanical関数-BricsCAD|Mechanical関数]]:BricsCAD Mechanical の製品用に実装されている関数群。Rhino の読み書き関数なんかもある。
* [[シートメタル関数-BricsCAD|シートメタル関数]]: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 "で調整可能な設定。
* [[VM_MAXIMUM_MEM]]
* [[VM_PAGE_OVER_HEAP]]
* [[MDI_LISP_COMPRESS]]
 
 
基本的に適宜調整はされるので、マニュアルで調整する必要はないので変態的な使い方が必要になる人向けといえる。




==Fast-COM==
==Fast-COM==
===実装の背景===
BricsCAD の Fast-COM は BricsCAD が Linux に移植された際、Linux には COM がないため、COMベースのLISP関数(vla、vlax、vlr関数セット)をLinux(後のMacも同様)でも提供する問題に直面したところから実装され始めた仕組み。


BricsCAD が Linux に移植された際、Linux には COM がないため、COMベースのLISP関数(vla、vlax、vlr関数セット)をLinux(後のMacも同様)でも提供する問題に直面した際に実装され始めた仕組み。
BricsCAD Linux/Mac用の vla, vlax, vlr機能セットを提供することが主目的なしくみだが、Windowsでも有効的に作用し、標準の Windows COM に比べて、通常50%、最大1000%(10倍)以上の著しい性能向上と、Windows および Lispエンジンメモリの両方の負荷軽減が提供される。
Lisp のメモリ負荷が軽減されると、ガベージコレクションが減少するため、この点でも間接的に性能向上が得られる。


BricsCAD Linux/Mac用の vla, vlax, vlr機能セットを提供することが主目的だが、Windowsでも有効的に作用し、標準の Windows COM に比べて 通常50%、最大1000%(10倍)以上の著しい性能向上(データの変換が通常のCOMでは3回発生するが、Fast-COMだと1回のみになるため)と、Windows および Lispエンジンメモリの両方の負荷軽減が提供される。


Microsoft COM TypeLibraries (.tlb と .idl ファイル)と非常によく似た形で実装されていているので次のように使える。
 
Lisp のメモリ負荷が軽減されることでガベージコレクションが走る事自体が減少するため、間接的な性能向上にも寄与している。
 
 
===使用方法===
BricsCAD に標準で組み込まれているので、無効化しなければ(切り替えられる)そのまま使える。(Lite から!)
 
Microsoft COM Type Libraries (.tlb と .idl ファイル)と非常によく似た形で実装されていているので次のように使える。
* プロパティ関数は、専用関数(vla-get-<property> ...)または汎用関数(vlax-get-property '<property> ...)両方に対応している。
* プロパティ関数は、専用関数(vla-get-<property> ...)または汎用関数(vlax-get-property '<property> ...)両方に対応している。
* メソッド関数についても、専用の関数として呼び出し(vla-<method> ...)、汎用的な呼び出し(vlax-invoke-method '<method> ...)両方に対応している。
* メソッド関数についても、専用の関数として呼び出し(vla-<method> ...)、汎用的な呼び出し(vlax-invoke-method '<method> ...)両方に対応している。


===実装の背景===
 
===効果===
* Windows COM のデータラッピングやマーシャリングは、パフォーマンスやメモリ消費に大きな影響を与えるため、これを回避する。
* Windows COM のデータラッピングやマーシャリングは、パフォーマンスやメモリ消費に大きな影響を与えるため、これを回避する。
* ターゲット関数と引数が TypeLibrary の記述と照合されるため、比較的遅い Windows COM 関数呼び出しメカニズム (::DispInvoke(), IDispatch::Invoke() など) をバイパスする。
* ターゲット関数と引数が TypeLibrary の記述と照合されるため、比較的遅い Windows COM 関数呼び出しメカニズム (::DispInvoke(), IDispatch::Invoke() など) をバイパスする。
31行目: 64行目:
BricsCADの各バージョンで、より多くのプロパティとメソッドがこのモードをサポートし、BricsCAD Linuxでも同様に利用できるようになる。
BricsCADの各バージョンで、より多くのプロパティとメソッドがこのモードをサポートし、BricsCAD Linuxでも同様に利用できるようになる。


===利用のON/OFF===
Fast-COM 実装は、[[vle-fastcom]]関数によって実行時に有効/無効を切り替えることができる。
Fast-COM 実装は、[[vle-fastcom]]関数によって実行時に有効/無効を切り替えることができる。


41行目: 76行目:
</pre>
</pre>


==統合LISPオプティマイザ==
===背景と仕組み===
AutoCAD の AutoLISP は、1980年代半ばに開発された古い [[Wikipedia:XLISP|XLisp]]方言をベースにしていて大きなイノベーションと言える改良がなされていないため、最近のLisp方言では標準となっている基本的なLispコア機能が大幅に欠落している。そのため、AutoLISP を用いたアプリケーションは、AutoLISP の制限された組み込み機能を用いて、この基本機能の多くを独自に実装しなければならない。(うちの[[GzLib]]もある意味これを緩和するために作ってる。)


==統合LISPオプティマイザの仕組み==
これが原因で、AutoLISP アプリケーションのコードには非効率的なコードパターンが含まれることが多く、メモリと性能を浪費することになる。単に、よく使われる多くの機能を実装するのに他に方法がないため。
AutoCAD の AutoLISP は、80年代半ばに開発された古い XLisp方言をベースにしているため、最近のLisp方言では標準となっている基本的なLispコア機能が大幅に欠落している。そのため、AutoLISP を用いたアプリケーションは、AutoLISP の制限された組み込み機能を用いて、この基本機能の多くを独自に実装しなければならない。(うちの[[GzLib]]もある意味これを緩和するために作ってる。)


これが原因で、AutoLISP アプリケーションのコードには非効率的なコードパターンが含まれることが多く、メモリと性能を浪費することになる。単に、よく使われる多くの機能を実装するのに他に方法がないため。
BricsCAD の Lispエンジンは、最新の [[OpenLisp]]コアエンジンを使用しており、優れたパフォーマンスと最新の Lisp言語機能をフルに備えているものだが、[[OpenLisp]]コアのパワーは AutoLISP の互換性を保つために隠され使用されていない。


BricsCAD の Lispエンジンは、最新の OpenLispコアエンジンを使用しており、優れたパフォーマンスと最新の Lisp言語機能をフルに備えているもののすが、OpenLispコアのパワーは AutoLISP の互換性を保つために隠され使用されていない。
このようなもったいない状況に対する回答として、多くのコア機能、快適性、性能(さらには他のAutoLISP互換システムとの互換性)を提供する [[VLE-関数]]ライブラリのアイデアが生まれた。


このような「対立」に直面し、多くのコア機能、快適性、性能(さらには他のAutoLISP互換システムとの互換性)を提供する VLE関数ライブラリのアイデアが生まれた。
ただ、Lisp の開発者が VLEのライブラリを使ってアプリケーションを調整する心理的・時間的な敷居が高いという状況があることも認識されているため、別方向からの解決策として自動Lispコード最適化ツール(統合LISPオプティマイザ)が爆誕した。
ただ、Lisp の開発者が VLEのライブラリを使ってアプリケーションを調整する心理的・時間的な敷居が高いという状況があるため、これに対する別のアイデアとして、自動Lispコード最適化ツール(統合LISPオプティマイザ)が爆誕した。




統合LISPオプティマイザは、Lispコードをロード時に解析して非効率なコードパターンを検出し、より効率的なコードパターンに置き換えるもので、完全に透過的で開発者側の努力は不要になっている。
統合LISPオプティマイザは、Lispコードをロード時に解析して非効率なコードパターンを検出し、より効率的なコードパターンに置き換えるもので、完全に透過的で開発者側の努力は不要になっている。(要は勝手に高効率なコードに最適化してくれる。AutoCAD のコンパイル時に行われる最適化とは別のアプローチ。)
(要は勝手に高効率なコードに最適化してくれる。AutoCAD のコンパイル時に行われる最低化とは別のアプローチ。)


* [[Lispオプティマイザの動作-BricsCAD]]
* [[Lispオプティマイザの動作-BricsCAD]]
* [[最適化されたコードパターン-BricsCAD]]
* [[最適化されたコードパターン-BricsCAD]]
   
   
「Lisp Optimiser は、今後の BricsCAD のバージョンアップにより、より多くのコードパターンに拡張される予定」とアナウンスされているので、LISP で書いとけば勝手に効率化されるケースが増えていくことが期待できる。
「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 で暗号化されたものも利用可能。
 
[[Category:BricsCADのLISP]]

2024年11月10日 (日) 04:13時点における最新版

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 で暗号化されたものも利用可能。