OpenDCL

提供:GizmoLabs - だいたい CAD LISP なサイト

OpenDCL ( https://opendcl.com/ )は、AutoCAD の AutoLISP で利用される DCL(ダイアログ制御言語)の代替となるGPLライセンスのプロダクト。 ツリーやタブ、グリッド、スプリッタなど Windows で一般的な UIコントロールがあり、LISP + DCL では心もとない UI周りを補完した開発をすることができる。


OpenDCL は、ObjectDCL(http://www.objectdcl.com/ : 2006年に GNU GPLライセンスにて、オープンソースとしてリリースされた 3rd day Software の市販アプリケーション by オーナー Chad Wanless.)をベースにしている。


尚、OpenDCL は GPL v2 であるため OpenDCL 自体に手を入れて頒布・販売したい利用したい場合は、同様に GPL v2 としてソースコードを公開する必要があるが、OpenDCL に手を入れずに利用する形であれば他のライセンスと組み合わせで組み込んで利用可能。

You can use any license you want for your own application.  If you were to modify OpenDCL or distribute its source code, then you would need to distribute it under a GPL license.
独自のアプリケーションに必要な任意のライセンスを使用できます。 OpenDCL を変更したり、そのソースコードを配布したりする場合は、GPLライセンスの下で配布する必要があります。

I'm not sure that it's legally required, but I would advise that you mention OpenDCL in your license agreement and include the copyright notice (Copyright 2009 OpenDCL Consortium) to ensure that your customers know what it is.
法的に義務付けられているかどうかはわかりませんが、ライセンス契約に OpenDCL について言及し、著作権表示(Copyright 2009 OpenDCL Consortium)を含めて、顧客に OpenDCL が何であるかを確実に知らせることをお勧めします。

ライセンスの細かな部分に関してはあまり頓着していない雰囲気なので、正確を期すなら専門家を交えて確認したほうがいいでしょう。


利用可能な CAD (Runtime.9.1.3.0 - 2021年3月時点)

  • AutoCAD (2016 以降)… ARX アプリなので LT では使えない
  • BicsCAD (V13 以降) … BRX アプリなので Lite(旧Classic)では使えない
  • GstarCAD (2015 以降)… GRX アプリなので LT では使えない
  • IJCAD (2015 以降)… GRX アプリなので LT では使えない
  • ZWCAD (2014 以降)… ZRX アプリなので STD では使えない


超ざっくりな作り方&使い方

  • ▼ 作る
    1. OpenDCL Studio をダウンロードしてインストールする。
    2. OpenDCL Studio 上でインターフェス作ったり関連 LISP のファイルやイベントに対応する関数を追加したりする。(LISPのコーディングは別のエディタ等でやる形。)
  • ▼ 使う
    1. OpenDCL の Runtime をダウンロードして利用したい PC にインストールする。
    2. OpenDCL の Runtime を CAD で読みこむ。(32bit/64bit で読み込むファイルが違う 64bit 用は x64 と付いてるやつ)
    3. OpenDCL を使った LISP のプログラムを読み込み、実行する。
  • ▼ 頒布する
    1. OpenDCL の Runtime は各PC環境にインストールして CAD でロードしておく。
    2. .odcl のファイルと .lsp のファイルを頒布する。 .odcl を lisp ファイル中に組み込んで 1ファイルで頒布する形も取れないこともない。(使用する CAD による)


関数

UIコントロールのイベントに割り当てる関数とは別で使えるやつ。

関数 概要
( dcl-activateemail emailaddress [as string] {parameters [as string]}) この関数は、電子メールを送信するためにデフォルトの電子メールクライアントを開きます。「emailaddress」は受信者のメールアドレス、「parameters」はメールのurlに付加されるオプションのパラメータです。例えば、"subject=hello&body=how are you? "とすると、メールの件名が "hello"、本文が "how are you? "となります。
( dcl-attachxref dwgfilepath [as string] {blockname [as string]} {insertionpoint [as 3dpoint]} {rotation [as float]}) この関数は、dwgfilepath を xref として現在の図面に添付します。insertionpoint が指定されていない場合、xref は原点に挿入される。rotation が指定されていない場合、xrefは回転角0で挿入されます。blockname が指定されていない場合は、図面ファイル名が現 在の図面の xref 名として使用されます。この関数は、xref コマンドが使用できない場合(例えば、同期イベントハンドラ関数から)に、xrefをアタッチするために使用することができます。
( dcl-delayedinvoke delaymilliseconds [as long] lispfunctionname [as string]) この関数は、指定されたミリ秒が経過すると autolisp 関数を呼び出すバックグラウンド タイマーを開始します。この関数は、時間の経過を待たずにすぐに戻ります。lispfunctionname には、引数のない autolisp 関数の名前を指定してください。
( dcl-dirfiles folderpath [as string] {filter [as string]}) この関数は、folderpathディレクトリ内のファイルのうち、filterで指定されたワイルドカードにマッチするファイルのリストを返します。filterが指定されていない場合は、すべてのファイルが返されます。
( dcl-forcedwgredraw ) この関数は、cad の図面ウィンドウを再描画します。再描画は、redraw コマンドによる再描画とは異なることに注意してください。
( dcl-getblocksize blockname [as string]) この関数は、指定されたブロックのエクステント(幅、高さ)を返す。そのブロックが現在の図面で定義されていない場合、この関数はnilを返します。
( dcl-getdwgmousecoords ) この関数は、アクティブなビューポートの現在のマウスの位置を cad の図面座標で返します。
( dcl-getfocus ) この関数は、現在のキーボード入力にフォーカスしているコントロールのプロジェクト、ダイアログ、およびコントロールキーを返します。フォーカスコントロールが opendcl コントロールでない場合、この関数はnilを返します。
( dcl-getharddrivesize driveletter [as string]) この関数は、指定されたドライブのサイズ(バイト単位)を返します。
( dcl-getmousecoords ) この関数は、仮想ディスプレイの左上隅を基準とした、現在のマウス座標を windows ディスプレイ座標で返します。
( dcl-getolecolorvalue acadcolor [as color]) この関数は、cad のカラーまたはシステムカラーを、activex のプロパティおよびメソッドで使用するために olecolor に変換します。
( dcl-getprojects ) このメソッドは、読み込まれたすべてのプロジェクトのリストを返します。
( dcl-getscreensize ) この関数は、プライマリモニタ上のwindowsの「作業領域」(タスクバー領域は含まず)のサイズ(ピクセル)を返します。
( dcl-getversion ) このメソッドは、ロードされた opendcl runtime のインスタンスの略式ビルドバージョンを、メジャーバージョンを整数部、マイナーバージョンを小数部とした実数で返します。
( dcl-getversionex) このメソッドは、ロードされた opendcl runtime のインスタンスの完全なビルド・バージョンを "major.minor.third.fourth" という形式の文字列で返します。
( dcl-insertblock dwgfilepath [as string] {insertionpoint [as 3dpoint]} {rotation [as float]} {blockname [as string]}) この関数は、dwgfilepath のモデル空間を、現在の図面のアクティブなレイアウトに挿入します。insertionpoint が指定されていない場合、ブロックは原点に挿入される。rotation が指定されていない場合、ブロックは回転角0で挿入されます。blockname が指定されていない場合は、図面ファイル名が現在の図面のブロック名として使用されます。 この関数は、insert コマンドが使用できない場合(例えば、同期イベントハンドラ関数から)に、ブロックを挿入するために使用できます。
( dcl-invoke lispfunctionname [as string]) この関数は、指定された autolisp 関数を呼び出し、関数呼び出しの結果を返します。
( dcl-messagebox message [as string] {title [as string]} {buttonstyle [as integer]} {iconstyle [as integer]} {showhelpbutton [as boolean]}) windows 標準のメッセージボックスに message で指定したメッセージテキストを表示します。titleにはメッセージボックスのタイトルを指定し、残りの引数ではボタンの数や種類、メッセージの横に表示するアイコンを指定します。デフォルトのメッセージボックスでは、[ok]ボタンのみが表示され、アイコンは表示されません。戻り値は、どのボタンを押してメッセージボックスを閉じたかを示します。
( dcl-navigatetourl url [as string]) この関数は、指定された url を、その url に含まれるプロトコルのデフォルトハンドラを使用して開きます。
( dcl-registeractivexctrl filepath [as string]) この関数は、activex コントロールまたはその他の com コンポーネントをシステムレジストリに登録します。comコンポーネントの登録は、通常、アプリケーションのインストール時に行う必要があるため、この関数は特殊な状況下でのみ必要となります。* 管理者権限必要かも
( dcl-selectfiles {filetypes [as list of strings]} {title [as string]} {defaultdirectory [as string]}) filter "の形式の文字列としてフォーマットされます(typenameは、ドロップダウンのファイルタイプ選択リストに表示されるファイルタイプで、filterは、そのタイプのファイルに対するワイルドカードの指定です)。オプションの title 引数は、ファイルダイアログのカスタムタイトルを指定します。defaultdirectoryが指定されている場合、ダイアログはそのディレクトリで開かれます。この関数は、選択されたファイルのリスト(その完全なパスを含む)を返し、ダイアログがキャンセルされた場合はnilを返します。
( dcl-selectfolder title [as string] {defaultdirectory [as string]} {rootfolder [as string]} {flags [as bitflag]}) この関数は、ユーザーにフォルダの選択を促します。この関数は、選択されたフォルダの名前を返し、ダイアログがキャンセルされた場合は nil を返します。flags が省略された場合のデフォルト値は1です。
( dcl-selectlinetype {allowmetatypes [as boolean]}) この関数は、cad の線種選択ダイアログを表示し、選択された線種を返します。allowmetatypes が nil の場合、bylayer と byblock の線種は選択できません。
( dcl-selectlineweight {defaultlineweight [as integer]} {allowmetatypes [as boolean]}) この関数は、cad の線種選択ダイアログを表示し、選択された線種を返す。allowmetatypes が nil の場合、bylayer と byblock の線種は選択できません。線の太さは、論理値またはミリメートル単位の実際の線の太さに100を掛けた整数値で表されます。
( dcl-sendstring string [as string]) この関数は、任意の文字列を、現在の図面ドキュメントの cad コマンドラインに送信します。この関数は、文字列が cad で処理される前に戻ります。したがって、この関数を使用して、同期イベント ハンドラ中のコマンドや関数をトリガし、イベント ハンドラが戻った後に実行することができます。
( dcl-setautoupdatecheck {enable [as boolean]}) この機能は、opendcl ランタイムのロード時に行われる自動アップデートチェックを有効または無効にします(enable が nil の場合)。自動更新チェックの設定は、現在のユーザーの windows プロファイルに保存されます。自動更新チェックが有効な場合、opendcl runtimeの新しいビルドが利用可能になると、システムトレイにアイコンが表示されてユーザーに警告されます。新しいバージョンが利用可能かどうかを判断するために、インターネットを介して www.opendcl.com のスクリプトをコールします。
( dcl-setcmdbarfocus ) この関数は、入力フォーカスを cad のコマンドラインに設定します。モデレス ダイアログ イベント ハンドラから非同期に送信されたコマンド ライン入力を cad で処理できるようにするために、この処理が必要な場合があります。
( dcl-suppressmessages {suppress [as boolean]}) opendclのエラーメッセージやステータスメッセージを表示しないようにする機能です。suppress が nilの場合、エラーメッセージは有効になり、そうでない場合は抑制されます。エラーメッセージは、問題の原因を迅速に診断するのに役立ちますので、自動化されたスクリプトやその他の異常な状況で必要な場合にのみ表示しないようにしてください。
( dcl-updatecheck ) この関数は、バックグラウンド・スレッドで www.opendcl.com に接続して手動更新チェックを開始し、opendcl runtime の新しいビルドが利用可能かどうかを確認します。この関数は、バックグラウンド・スレッドの開始時にエラーが発生した場合は nil を、それ以外の場合は t を返します。
( dcl-updatevarnames ) この関数は、現在アクティブなすべてのフォームとコントロールのハンドルを表す autolisp シンボルを設定します。通常、この設定は opendcl ランタイムによって自動的に行われますので、この関数は、ランタイム中に変数名がリセットされたり破損したりするような異常な状況でのみ使用してください。
( dcl-xpixelstotwips pixels [as long]) この関数は、ピクセル単位のサイズを「twip」に変換します。
( dcl-xtwipstopixels twips [as long]) この関数は、"twip "単位のサイズをピクセルに変換する。
( dcl-ypixelstotwips pixels [as long]) この関数は、ピクセル単位のサイズを「twip」に変換します。
( dcl-ytwipstopixels twips [as long]) この関数は、"twip "単位のサイズをピクセルに変換する。
  • twipは、タイポグラフィの単位で、タイポグラフィの「ポイント」の1/20に相当(ポイントは1インチの1/72)。


HelloWorld (BricsCAD 64bit の場合)

特に

; OpenDCL.x64.<<ver>>.brx とHello.odcl (Form1のダイアログが定義されている)が CAD の検索パス上にあることが前提。

(defun OpenDCL_Load_Runtime ()
  (if (not (member "OpenDCL.x64.v23.brx" (arx)))
    (arxload "OpenDCL.x64.v23.brx" "OpenDCL.x64.v23.brx がないっす。")
  )
)

(defun c:Hello ()
  ; OpenDCL のランタイムを読み込む
  (OpenDCL_Load_Runtime)
  ;; Hello.odcl ファイルを読み込む
  ;; プロジェクトの変更を確認しやすくするために、T の引数で毎回プロジェクトをリロード。
  ( dcl-Project-Load "Hello.odcl" T)
  ;; メソッドを呼び出し、Hello ダイアログボックスを表示します。xボタンで終了。
  ( dcl-Form-Show "Hello" "Form1" 0 0)
;  ( dcl-Form-Show "Hello" "Form1") ;  中央表示
  (princ)
)

HelloWorld (IJCAD 2020 64bit の場合)

IJCAD は、ほぼ GstarCAD なので、GstarCAD での読み込み方法で読み込めます。

; OpenDCL.x64.2020.grx とHello.odcl (Form1のダイアログが定義されている)が CAD の検索パス上にあることが前提。

(defun OpenDCL_Load_Runtime ()
  (if (not (member "OpenDCL.x64.2020.grx" (arx)))
    (arxload "OpenDCL.x64.2020.grx" "OpenDCL.x64.2020.grx がないっす。")
  )
)

(defun c:Hello ()
  ; OpenDCL のランタイムを読み込む
  (OpenDCL_Load_Runtime)
  ;; Hello.odcl ファイルを読み込む
  ;; プロジェクトの変更を確認しやすくするために、T の引数で毎回プロジェクトをリロード。
  ( dcl-Project-Load "Hello.odcl" T)
  ;; メソッドを呼び出し、Hello ダイアログボックスを表示します。xボタンで終了。
  ( dcl-Form-Show "Hello" "Form1" 0 0)
;  ( dcl-Form-Show "Hello" "Form1") ;  中央表示
  (princ)
)