「BricsCADのLISP」の版間の差分

提供:GizmoLabs - だいたい CAD LISP なサイト
編集の要約なし
(同じ利用者による、間の14版が非表示)
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 の詳細は、アプリサイト https://boa.bricsys.com/applications/ にある「LISP Developer Support Package」 を見ると良い。サンプルも付属しているので理解の助けになると思います。


* [[BricsCAD における AutoLISPの仕様追加・変更履歴]]


== BricsCAD で実装されている関数の概要 ==
== BricsCAD で実装されている関数の概要 ==
* [[AutoLISP]] : AutoCAD 互換の関数。細かな仕様の差もほとんどない。
* [[AutoLISP]] : AutoCAD 互換の関数。AutoLISP とほぼ同様に機能する。言語仕様に依存したトリッキーな使い方もほとんぼ同じように動く。
* [[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]] : BricsCAD PROにある土木機能と合わせて実装されている関数群。Tinサーフェスを作成・編集したりできる。AutoCAD Civil3D の読み込み関数なんかもある。
* [[bim関数-BricsCAD]] : BricsCAD BIM の製品用に実装されている関数群。BIM系のオブジェクトや定義を作成・編集したりできる。
* [[bim関数-BricsCAD]] : BricsCAD BIM の製品用に実装されている関数群。BIM系のオブジェクトや定義を作成・編集したりできる。
* [[mechanical関数-BricsCAD]]:BricsCAD Mechanical の製品用に実装されている関数群。Rhino の読み書き関数なんかもある。
* [[シートメタル関数-BricsCAD]]:BricsCAD Mechanical の製品用に実装されている関数群。板金オブジェクトや定義を作成・編集したりできる。
* [[シートメタル関数-BricsCAD]]:BricsCAD Mechanical の製品用に実装されている関数群。板金オブジェクトや定義を作成・編集したりできる。


==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エンジンメモリの両方の負荷軽減が提供される。
BricsCAD Linux/Mac用の vla, vlax, vlr機能セットを提供することが主目的なしくみだが、Windowsでも有効的に作用し、標準の Windows COM に比べて、通常50%、最大1000%(10倍)以上の著しい性能向上と、Windows および Lispエンジンメモリの両方の負荷軽減が提供される。
Lisp のメモリ負荷が軽減されることでガベージコレクションがが走る事自体が減少するため、間接的な性能向上にも寄与している。
Lisp のメモリ負荷が軽減されることでガベージコレクションがが走る事自体が減少するため、間接的な性能向上にも寄与している。


===使用方法===
BricsCAD に標準で組み込まれているので、無効化しなければ(切り替えられる)そのまま使える。(Lite から!)


Microsoft COM TypeLibraries (.tlb と .idl ファイル)と非常によく似た形で実装されていているので次のように使える。
Microsoft COM TypeLibraries (.tlb と .idl ファイル)と非常によく似た形で実装されていているので次のように使える。
24行目: 32行目:
* メソッド関数についても、専用の関数として呼び出し(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() など) をバイパスする。
33行目: 41行目:
BricsCADの各バージョンで、より多くのプロパティとメソッドがこのモードをサポートし、BricsCAD Linuxでも同様に利用できるようになる。
BricsCADの各バージョンで、より多くのプロパティとメソッドがこのモードをサポートし、BricsCAD Linuxでも同様に利用できるようになる。


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


43行目: 52行目:
</pre>
</pre>


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


これが原因で、AutoLISP アプリケーションのコードには非効率的なコードパターンが含まれることが多く、メモリと性能を浪費することになる。単に、よく使われる多くの機能を実装するのに他に方法がないため。
これが原因で、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 で書いとけば勝手に効率化されるケースが増えていくことが期待できる。

2022年11月23日 (水) 18:44時点における版

BricsCAD の LISP API は、AutoCAD の AutoLISP互換を維持しつつ、更に発展された API となっている。

BricsCAD の LISP API の詳細は、アプリサイト https://boa.bricsys.com/applications/ にある「LISP Developer Support Package」 を見ると良い。サンプルも付属しているので理解の助けになると思います。


BricsCAD で実装されている関数の概要

  • AutoLISP : AutoCAD 互換の関数。AutoLISP とほぼ同様に機能する。言語仕様に依存したトリッキーな使い方もほとんぼ同じように動く。
  • VLE-関数 : VLA関数の発展実装版。VLA関数は Windows でしか使えないけど、VLE-関数は Linux や Mac でも使えるように実装されている。
  • シートセット関数-BricsCAD:シートセット機能をコントロールするための関数群。
  • tin+civil関数-BricsCAD : BricsCAD PROにある土木機能と合わせて実装されている関数群。Tinサーフェスを作成・編集したりできる。AutoCAD Civil3D の読み込み関数なんかもある。
  • bim関数-BricsCAD : BricsCAD BIM の製品用に実装されている関数群。BIM系のオブジェクトや定義を作成・編集したりできる。
  • mechanical関数-BricsCAD:BricsCAD Mechanical の製品用に実装されている関数群。Rhino の読み書き関数なんかもある。
  • シートメタル関数-BricsCAD:BricsCAD Mechanical の製品用に実装されている関数群。板金オブジェクトや定義を作成・編集したりできる。

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倍)以上の著しい性能向上と、Windows および Lispエンジンメモリの両方の負荷軽減が提供される。

Lisp のメモリ負荷が軽減されることでガベージコレクションがが走る事自体が減少するため、間接的な性能向上にも寄与している。


使用方法

BricsCAD に標準で組み込まれているので、無効化しなければ(切り替えられる)そのまま使える。(Lite から!)

Microsoft COM TypeLibraries (.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 は、80年代半ばに開発された古い 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 で書いとけば勝手に効率化されるケースが増えていくことが期待できる。