この投稿では、DCL(Dialog Control Language)を使用してLISPルーチンのカスタムダイアログボックスを作成する方法を学びます。の中に 基本的なダイアログボックスを作成した最後の投稿、この投稿では、ベルとホイッスルを追加します。

BricsCADのDCLコマンドの完全な概要については、公式、 BricsCAD DCL開発者ガイド.


この投稿では、次のトピックについて説明します。


DCLメタキャラクターの概要

DCL メタキャラクター 意味
// (スラッシュスラッシュ) コメント行を示します
/* (スラッシュ-アスタリスク) コメントセクションを開始します
*/ (アスタリスクスラッシュ) コメントセクションを終了します
: (結腸) タイル定義を開始します。スペーサーのような定義済みのタイルはコロンを使用しません
{ (ブレース) ダイアログとタイル属性を開始します
(スペース) 記号を分離する
= (等しい) 属性値を定義します
“” (ストレート見積もり) テキスト属性を囲みます
; (セミコロン) 属性定義を終了します。すべての属性はセミコロンで終了する必要があります
} (ブレース) タイルとダイアログの属性を終了します

 


開始ダイアログボックスの定義

すべての.dclファイルの内容は、name属性で始まります。これは、関連するLISPルーチンがダイアログコードを呼び出すときに使用する名前です。 name関数は次のようになります。

名前:ダイアログ{

LISPと同様に、開き中かっこには、ダイアログボックス定義の終わりを示すために閉じ中かっこが必要です。

}

2つの中括弧の間に、すべてのコードを記述して、BricsCADにダイアログボックスの外観を指示します。

このチュートリアルでは、次のようにダイアログボックスに「lastInput」という名前を付けます。

lastInput:ダイアログ{

}

DCL名では大文字と小文字が区別されるため、「lastInput」は「LastINPUT」または「lastinput」と同じではありません。

ダイアログボックスのタイトル

ダイアログボックスのタイトルバーのテキストは、 ラベル 次のようなプロパティ:

名前:ダイアログ{

label =“ダイアログボックスのタイトル”;

}

このダイアログボックスに次のように「最終入力」のラベルを付けます。

lastInput:ダイアログ{

ラベル=「最終入力“;

}

タイトルテキストは引用符(”)で囲む必要があります。 labelプロパティはセミコロン(;)で終了する必要があります。また、コードをインデントして読みやすくすることは役に立ちます。

OKボタン

すべてのダイアログボックスには、少なくとも[OK]の終了ボタンが必要です。 (WindowsはデフォルトのXボタンを
DCLで作成されたダイアログボックスを終了するためにも機能する、すべてのダイアログボックスの右上隅!)

ボタンは、 ボタン プロパティ、続いて囲まれたボタンのプロパティ
中括弧:

:ボタン{

}

ダイアログボックスには複数のボタンを設定できるため、すべてのボタンをプロパティで識別する必要があります
「キー」と呼ばれる。重要なのは、LISPがボタンに指示を与える方法です。次のように、key属性を使用して、このOKボタンを「okButton」として識別します。

key =“ okButton”;

ボタンは、ユーザーが読むためのラベルを表示する必要があります。これは[OK]ボタンなので、「OK」というラベルを付けます ラベル 次のような属性:

ラベル =” OK“;

これらすべてを組み合わせてみましょう。 OKボタンに追加されたコードはここに示されています 、key、label、is_default属性を使用します。 (デフォルト属性については、以下を参照してください。)「okButton」として識別され、「OK」というラベルの付いたボタンがあり、デフォルトタイルに設定されています。

lastInput:ダイアログ{

label =“最終入力”;

:ボタン{

key =“ okButton”;

label =” OK“;

is_default = true;

}

}

ヒント のDCLコード OK ボタンはサブルーチンのようなものです。同じコードは、ダイアログボックスで必要なときにいつでも再利用できます。 OK ボタン、それはほとんど常にです。後で、DCLコードを使用してサブルーチンを作成する方法について説明します。

デフォルトのタイル

ユーザーの生活を楽にするために、ダイアログボックスの1つのタイルは常に デフォルト タイル。ユーザーは押すだけです 入る デフォルトのタイルをアクティブにします。ダイアログボックスは、破線または色付きのアウトラインなど、何らかの方法で既定のタイルを強調表示します。ユーザーは押すことができます タブ デフォルトを移動するには フォーカス (現在ハイライトされているタイル)をダイアログボックスの他の領域に移動します。

タイルは、 is_default 次のような属性:

is_default = true;


ダイアログボックスをロードおよび実行するためのLISPコード

次のLISPコードは、lastInput.dclダイアログボックス定義ファイルをロード、実行、終了するために使用するものです。

(defun C:xx()

(setq dlg-id(load_dialog“ c:\\ lastInput”))

(new_dialog“ lastInput” dlg-id)

(action_tile“ accept”“(done_dialog)”)

(start_dialog)

(unload_dialog dlg-id)

)

LISPコードの意味を理解するために、それを分解してみましょう。この関数は、LISPのdefun関数で「xx」として定義されています。プログラミング=デバッグなので、LISPルーチンには、「xx」のように入力しやすい名前を使用します。

(defun C:xx()

lastInput.dclファイルは、load_dialog関数でロードされます。 「.dcl」拡張子を指定する必要はありません。これは、この機能の唯一の目的であるDCLファイルをロードするためです。

  • Windowsでは、ドライブの名前C:\\を含めます。 LISPでは、フォルダー名を区切るために\ではなく\\を使用する必要があることを思い出してください。

    (setq dlg-id(load_dialog“ c:\\ lastInput”))

  • Linuxでは、ドライブの名前を省略します。

    (setq dlg-id(load_dialog“ lastInput”))

DCLファイルには複数のダイアログボックス定義を含めることができるため、次のステップは、new_dialog関数を使用して、アクセスするファイルをBricsCADに指示することです。この場合、「lastInput」のみです。

(new_dialog“ lastInput” dlg-id)

ダイアログボックスには「okButton」という名前のボタンが含まれており、その目的はDCLではなくLISPによって定義されています。ここでは、action_tile関数を使用して、「okButton」タイルにアクションを割り当てます。ボタンの目的は、ダイアログボックスを終了するdone_dialog関数を実行することです。つまり、[OK]をクリックしてダイアログボックスを閉じます。これは次のように読むことができます。「okButtonという名前のタイルのアクションは…」です。

(action_tile“ okButton”“(done_dialog)”)

これらすべての予選の後で、大きな瞬間が到着します。 start_dialog関数はダイアログボックスを起動し、ボタンがクリックされるのを待ちます。

(start_dialog)

きちんとしたプログラマーとして、私たちはunload_dialog関数を使ってメモリからダイアログボックスをアンロードします。

(unload_dialog dlg-id)

そして、最後の括弧はxx関数を終了します。

)


DCLコードのテスト

これで、テストするのに十分なDCLコードがあり、ダイアログボックスの開発状況を確認できます。コードをテストするには、次の手順を実行します。

  1. メモ帳を開き、 テキスト編集、 または別のASCIIテキストエディタ。
  2. 前に開発したDCLコードを入力します。
    bricscadをカスタマイズするdclコーディング
    DCLコードをテキストエディターに入力する

    重要:このDCLファイルとLSPファイルで次のような引用符が使用されていることを確認してください。カーリークォーテーションマーク(“または”)が含まれている場合、ルーチンは失敗します。 LISPは「エラー:引数のタイプが間違っています。 DCLは文句を言うダイアログボックスを表示しますが、構文エラー:予期しない「」を予期しました。

  3. ファイルをlastinput.dclとして保存します。 LISP xx.lspルーチンで簡単に見つけられるように、ファイルを最上位のフォルダーに保存します。
    • Windowsでは、DCLファイルをC:\ドライブに保存します。
    • LinuxおよびMacでは、DCLファイルをホームフォルダーに保存します。たとえば、「ralphg」というユーザー名でLinuxにログインするため、ファイルをralphgフォルダーに保存しました。
  4. 次に、新しいファイルを開き、次のページの「ボックス化されたテキストで説明されているLISPコードを入力します:「ダイアログボックスをロードして実行するLISPコード」。
    LISPコードをテキストエディタに入力する
  5. ファイルをxx.lspとして保存します。これもDCLファイルと同じフォルダーにあります。
  6. BricsCADに切り替えてから、xx.lspファイルをBricsCADで開きます。
    • Windowsでは、エクスプローラーを使用してxx.lspファイルをBricsCAD図面ウィンドウにドラッグします。 (ファイルのドラッグは、AppLoadコマンドを入力したり、LISPロード関数を使用したりするよりもはるかに高速です!)
    • Linuxでは、ファイルをLinuxバージョンのBricsCADにドラッグできないため、ロード機能を使用する必要があります。 「:」プロンプトで次のように入力します。

      :(「xx」をロード)

  7. タイプ xx ルーチンを実行すると、ダイアログボックスが読み込まれます。

    :xx

    ダイアログボックスが表示されます。まあ、それはあなたがコーディングエラーをしていなければ、そうするべきです。

    LinuxおよびWindowsのカスタムダイアログボックス
    左: Windows 7のダイアログボックス。
    右: Linux Mintのダイアログボックス
  8. クリック OK ダイアログボックスを終了します。
    DCLコードがダイアログボックスを作成した方法のマップを次に示します。

    コードがBricsCADのダイアログボックスに与える影響
    DCLコードによって作成されたダイアログボックス

システム変数からのデータの表示

ダイアログボックスの基本構造が整っています。ラベルと[OK]ボタンです。次に、システム変数で表示するデータを追加します。

sysvarsからのデータは、ダイアログボックスでは次のようになります。

最後の角度: 45
最後のポイント: 1,2,3
最後のプロンプト: ライン

私は 静的 テキストイン 。それは決して変わらない。このテキストは、数値が何を意味するかをユーザーに知らせるプロンプトのように機能します。

黒いテキストは 変数;その表示は変化し、関連するsysvarの値に依存します。

テキスト tileはダイアログボックスにテキストを表示するもので、コードは次のようになります。

:テキスト{

label =“最後の角度:“;

key =“ lastAngle”;

}

このテキストタイルの属性を認識できますか?

このタイルでテキストを開始します。

: テキスト {

次に、 ラベル 属性はプロンプト「最後の角度:」を提供します。

ラベル =“最後の角度:“;

次に、 ラベル 属性はプロンプト「最後の角度:」を提供します。

ラベル =“最後の角度:“;

キー 属性は、テキストタイルを「lastAngle」として識別します。

キー =“ lastAngle”;

最後に、テキストタイルは中括弧で閉じます。

}

ヒント テキストタイルには次の属性があります。

  • 整列
  • fixed_height
  • fixed_width
  • 高さ
  • is_bold
  • キー
  • ラベル
  •  幅

強調表示されたコードをDCLファイルに追加…

BricsCAD DCLのカスタムダイアログボックスのコード
テキストエディターでのDCLコードの追加

…そして次に xx.lsp 再びルーチン。ダイアログボックスに「最後の角度:」というテキストが表示されます。

DCLが追加したコードから生成されるダイアログボックス

次のステップは、LastAngleシステム変数によって保存された値を表示することです。 2番目のテキストタイルを追加します。

:テキスト{

値=“”;

key =“ lastAngleData”;

}

このタイルのはラベルも値もないため、最初は空白です。テキストタイルを完成させるには、LISP関数を使用して、 LastAngle システム変数を入力して、ダイアログボックスに入力します。

LISPコードとDCLファイル間のリンクは、 キー、ここでは「lastAngleData」という名前です。 (LISPコードについては後で説明します。)DCLファイルは次のようになります。新しいコードは 。このコードをコピーして、テキストエディターに貼り付けることができます。

lastInput:ダイアログ{

label =“最終入力”;

:テキスト{

label =“最後の角度:“;

key =“ lastAngle”;

}

:テキスト{

値=“”;

key =“ lastAngleData”;

}

:ボタン{

key =“ okButton”;

label =“ OK”;

is_default = true;

}

}

(このDCLコードを今すぐ実行すると、ダイアログボックスは同じように見えます。
最後の角度の値を伝えます。これは次の予定です。)

無料のLISPコードを追加する

DCLコードの記述は、常に仕事の半分にすぎません。残りの半分は、LISPで補足コードを書くことです。 LastAngleから値を抽出するには、次の2つの手順を実行します。

ステップ1: 使用 getvar sysvar LastAngleの値にアクセスし、取得した値を変数lang(「最後の角度」の略)に格納する関数 setq 次のような関数:

(setq lang(getvar 「LastAngle」))

ステップ2: set_tile関数を使用して、langの値を「lastAngleData」タイルに設定します。

(set_tile 「lastAngleData」(rtos lang 2 2))

ヒント タイルはテキストでのみ機能し、数字では機能しません。ただし、 LastAngle は数値なので、テキストに変換する必要があります。これは rtos 関数:

(rtos lang 2 2))

ここでは、モード2(10進数)と精度2(小数点以下2桁)を使用して実数を文字列(別名テキスト)に変換しています。

に示す新しいコード行を使用して 、LSPファイルは次のようになります。

(defun C:xx()

(setq dlg-id(load_dialog“ c:\\ lastInput”))

(new_dialog“ lastInput” dlg-id)

(setq lang(getvar“ lastangle”))

(set_tile“ lastAngleData”(rtos lang 2 2))

(action_tile“ okButton”“(done_dialog)”)

(start_dialog)

(unload_dialog dlg-id)

)

.dclファイルと.lspファイルを保存してから、BricsCADでxx.lspをリロードして実行します。

ダイアログボックスは次のようになります。

角度の値を報告するダイアログボックス

テキストのクラスタリング

うーん…2つのテキストが互いに重なり合っており、それが問題です。それらは水平でなければなりません。 DCLはタイルを配置するため、テキストは縦に積み上げられます コラム デフォルトでは。

解決策は、2つのテキストタイルを、 タイル:

:行{

:テキスト{

label =“最後の角度:“;

key =“ lastAngle”;

}

:テキスト{

値=“”;

key =“ lastAngleData”;

}

}

行タイルを追加してDCLファイルを変更してから、LISPファイルを再実行します。結果は次のようになります。

ダイアログボックスを変更する
1行にフォーマットされた角度付きテキスト

最後の角度のテキストは適切に見えたので、他の2行で使用するためにそのコードをコピーして貼り付け、適切な変更を加えることができます。必要な変更を以下の色で示します。

:行{

:テキスト{

label =“最後 ポイント: “;

キー=“lastPoint“;

}

:テキスト{

値=“”;

キー=「最後ポイントデータ";

}

}

そして最後のプロンプトについて:

:行{

:テキスト{

label =“最後 促す: “;

キー=「最後促す“;

}

:テキスト{

値=“”;

キー=「最後促すデータ";

}

}

ランニング xx.lsp ダイアログボックスに3つのプロンプトをすべて表示しますが、2つの新しいプロンプトにはデータがありません。

BricsCADの変更とカスタマイズ
情報の行を追加しました

可変テキストの提供

データはLISPコードによって提供されます。ここでは、3D座標とテキストの処理方法について説明します。

LISPは、ポイントの値を次のように3つの数値のリストとして返すことを思い出してください。

(1.0000 2.0000 3.0000)

数値はそれぞれx、y、z座標を表します。 3つの数値のリストを文字列に変換する必要があります—なぜそんなに難しいのですか?変数lptに(1.0000 2.0000 3.0000)が含まれていることを前提とする次のコードを使用します。

( lpt)

関数は、リストからx座標を1.0000などの実数として抽出します。同様に:

(Cadr lpt)

(caddr lpt)

Cadr caddr 関数は、y(2.0000)座標とz(3.0000)座標をそれぞれ抽出します。実数を文字列に変換するには、次のようにrtos関数を使用します。

(rtos (車lpt))

(rtos (cadr lpt))

(rtos (caddr lpt))

そして、3つの個別の文字列を1つの文字列に結合するには、 strcat (文字列連結)関数。

(strcat

(rtos(車lpt))

(rtos(cadr lpt))

(rtos(caddr lpt))

)

このコードは1.000 2.000 3.000を表示します。数字の間にカンマを入れるのはいい感じでしょう:

(strcat

(rtos(car lpt))“、”

(rtos(cadr lpt))“、”

(rtos(caddr lpt))

)

両方のコード行をまとめて、LastPointシステム変数の値をダイアログボックスに埋め込むために必要なLISPに到達します。

(setq lpt (getvar“ lastポイント“))

(set_tile“最後ポイントデータ" (strcat(rtos(car lpt))“、”(rtos(cadr lpt))“、”(rtos 

(caddr lpt))))

コードを xx.lsp、それをBricsCADで実行して結果を確認します。

最後のポイントデータの追加

可変テキストのための余地

エラーが発生しました。 BricsCADは、LISPコードがデータを挿入する前にダイアログボックスのサイズを変更するため、x、y、z座標に対応するためにダイアログボックスを大きくする必要があることがわかりません。

解決策は、 次のように、各テキストタイルの属性:

:テキスト{

値=“”;

key =“ lastAngleData”;

幅= 33;

}

DCLファイルに追加すると、結果は次のようになります。

ダイアログボックスはBricsCADでカスタマイズ可能
最後のX、Yポイントデータの追加

ボタンの幅を修正する

おっとっと。 OKボタンが広すぎます。幅を狭くするには(つまり、幅を固定するには)、 fixed_width DCLファイルの属性:

fixed_width = true;

trueに設定すると、ボタンはラベルと同じ幅になります。

その他の変更

ボタンの中央揃え

おっとっと!これでボタンは中央に配置されなくなりました。デフォルトでは、ボタンは左揃えです。中央に配置するには、 整列 属性:  整列 =中央揃え。

DCLファイルのボタン部分に新しいコードを追加…

:ボタン{

key =“ okButton”;

label =“ OK”;

is_default = true;

配置=中央揃え。

fixed_width = true;

}

…そしてxx.lspファイルを再実行して、適切なサイズのOKボタンが中央に配置されていることを確認します。

ダイアログボックスのテスト

多くの場合、ダイアログボックスをテストすることをお勧めします。 Lineコマンドを使用する
数本の線を引きます。このアクションにより、3つのシステム変数の値が変更されます。 xx.lspルーチンを再実行します。
ダイアログボックスに表示される値は異なる必要があります。

適切にフォーマットされたダイアログボックス

コマンドの定義

これまで、ダイアログボックスの開発とテストのためにxx.lspを実行してきました。正しく実行されたので、「xx」の名前をよりわかりやすい名前に変更する必要があります。 LISPファイルの名前をlast.lspに変更し、内部の関数名を C:最後、 次のように、変数をローカルにします。

(defun c:最後(/ dlg-id lang lpt lcmd)

(setq dlg-id(load_dialog“ c:\\ lastInput”))

(new_dialog“ lastInput” dlg-id)

(setq lang(getvar“ lastangle”))

(set_tile“ lastAngleData”(rtos lang))

(setq lpt(getvar“ lastpoint”))

(set_tile“ lastPointData”(strcat(rtos(car lpt))“、”(rtos(cadr lpt))“、”

(rtos(caddr lpt))))

(setq lcmd(getvar“ lastprompt”))

(set_tile“ lastPromptData” lcmd)

(action_tile“ okButton”“(done_dialog)”)

(start_dialog)

(unload_dialog dlg-id)

)

DCLファイル全体は次のようになります。

lastInput:ダイアログ{

label =“最終入力”;

:行{

:テキスト{

label =“最後の角度:“;

key =“ lastAngle”;

}

:テキスト{

値=“”;

key =“ lastAngleData”;

幅= 33;

}

}

:行{

:テキスト{

label =“最後のポイント:“;

key =“ lastPoint”;

}

:テキスト{

値=“”;

key =“ lastPointData”;

幅= 33;

}

}

:行{

:テキスト{

label =“最終プロンプト:“;

key =“ lastPrompt”;

}

:テキスト{

値=“”;

key =“ lastPromptData”;

幅= 33;

}

}

:ボタン{

key =“ okButton”;

label =“ OK”;

is_default = true;

配置=中央揃え。

fixed_width = true;

}

}

BricsCADを起動するたびにこのコマンドが自動的にロードされるようにするには、次を追加します。 last.lsp AppLoad コマンドのスタートアップリスト。

DCLタイルの例

基本的なチュートリアルが背後にあるので、他のタイプのダイアログボックス機能をコーディングする方法を見てみましょう。

この投稿のこの最後の部分では、次のタイルのコーディング方法を見ていきます。

常に2つのコードが必要であることを思い出してください。

  1. ダイアログボックスのレイアウトを指定するDCLコード
  2. ダイアログボックスをアクティブにするLISPコード。

ボタン

の中に 前のチュートリアルでは、「OK」ボタンをコーディングしました これにより、ダイアログボックスを終了できます。 BricsCADは多くのボタンやその他のダイアログボックス要素をコーディングするため、コーディングを行う必要がないことがわかります。これらは、 base.dcl 通常は自動的にBricsCADにロードされます。

事前作成されたタイルの名前は次のとおりです。

ビルド済みタイル 表示されるボタン
ok_only OK
ok_cancel OKキャンセル
ok_cancel_help OKキャンセルヘルプ
ok_cancel_help_info OKヘルプ情報をキャンセルします。 。 。
Ok_Cancel_Help_Errtile OKキャンセルヘルプ、およびエラーメッセージ用のスペース。

これらのビルド済みタイルを使用して、ダイアログボックスの外観の一貫性を確保します。 DCLファイルでこれらのボタンを使用する方法の例を次に示します。

ok_only;

とても簡単です!

タイル名には従来のコロン(:)プレフィックスがありませんが、セミコロン(;)ターミネーターが必要です。

DCLを使用すると、テキスト(ボタン タイル)または画像(image_button タイル)。

ボタンが別のダイアログボックスを開くことを示すには、次のように省略記号(…)を使用します。 情報….

テキストと画像のボタンに加えて、設定はチェックボックス(トグル タイル)とラジオボタン(ラジオボタン タイル)次に説明します。

ボタンを機能させる

OK キャンセル それらの機能はすでに定義されているため、簡単です。ダイアログボックスにボタンを配置することは1つです。それらにコマンドを実行させることは別です。

ボタンにコマンドを実行させる方法を見てみましょう。このチュートリアルでは、次のようなダイアログボックスを作成します プロット プレビュー ボタン。次の図は、Linuxでの外観を示しています(Windowsでも同様です)。

カスタムLinuxダイアログボックス

プロットボタンの目的は、 プロット コマンド、および実行するプレビューボタン プレビュー コマンド。

簡単な解決策は、 アクション 次のようなLISP関数を実行するための各ボタンの属性 (コマンド「プロット」)。しかし、DCLは非常に有用な コマンド action属性で使用する関数!

問題を解決する鍵は キー 属性。次のようなLISP関数が参照できる名前を識別するボタンが表示されます。

key =“ plot”;

次に、LISPファイルで、 action_tile プロットコマンドを実行する関数。まあ、そうではない。の使用に対して同じ制限があります コマンド 関数なので、取得することで間接的にこれにアプローチする必要があります action_tile 参照する 二番目 (などのLISPルーチンaction_tile 「プロット」「(cmd-plot)”).

しかし、カスタムダイアログボックスを画面から非表示にし、プロットダイアログボックスに置き換える必要があるため、これでも機能しません。解決策はさらに間接的になることです:

(action_tile“ plot”“(setq nextDlg 1)(done_dialog)」)

"プロット" —「プロット」というキーでプロットボタンを識別します。

(setq nextDlg 1) -ユーザーが後でさらに処理するために[プロット]ボタンをクリックしたことを記録します。

(done_dialog) —ダイアログボックスを閉じます。

これは、ユーザーが[プロット]ボタンまたは[プレビュー]ボタンをクリックするたびに1回ずつ、2回行われます。 [プレビュー]ボタンのコードは似ています。変更は太字で示されています。

(action_tile“下見”“(setq nextDlg 2)(done_dialog)”)

次に、nextDlgが1または2に設定されている場合の処理を決定するコードが必要です。

(if(= nextDlg 1)(cmd-plot))

(if(= nextDlg 2)(cmd-preview))

nextDlg = 1の場合、次のサブルーチンが実行されます。

(defun cmd-plot()

(コマンド「print」)

)

nextDlg = 2の場合、代わりに次のサブルーチンが実行されます。

(defun cmd-preview ()

(コマンド「プレビュー」)

)

計画を立てて、すべてのコードを見てみましょう。まず、x.dclファイルで、各ボタンにキー属性を追加します。に関連するコード プロットボタン 示されています 太字プレビュー関連のコード に示されています :

x:ダイアログ{label =“ Plot”;

:行{

:ボタン{label =“ Plot”;ニーモニック=「P」;キー=プロット; }

:ボタン{ラベル=「プレビュー」;ニーモニック= "v";キー=「プレビュー」; }

cancel_button;

} }

第二に、 xx.lsp ファイルに、プロットおよびプレビューコマンドを実行するコードを追加します。

(defun c:xx(/)

(setq dlg-id(load_dialog“ c:\\ x”))

(new_dialog“ x” dlg-id)

(action_tile“ plot”“(setq nextDlg 1)(done_dialog)”)

(action_tile“プレビュー”“(setq nextDlg 2)(done_dialog)”)

(start_dialog)

(unload_dialog dlg-id)

(if(= nextDlg 1)(cmd-plot))

(if(= nextDlg 2)(cmd-preview))

)

(defun cmd-plot()

(コマンド「print」)

)

(defun cmd-preview()

(コマンド「プレビュー」)

)

Linuxでは、「c:\\」を必ず削除して、load_dialog行が次のようになるようにします。

(setq dlg-id(load_dialog“ x”))

ダイアログボックスが表示されたら、各ボタンをクリックして、関連するコマンドが実行されることを確認します。

チェックボックス

チェックボックス 1つ以上のオプションをオンにすることができます。彼らは対照的です ラジオボタン、1つの選択肢に制限されます。チェックボックスは、 トグル タイル。

このチュートリアルでは、ポイントオブジェクトの形状を変更するチェックボックスを作成します。これは、 PdMode システム変数。はい、あります DdPType 同じことをするコマンドですが、これは別のアプローチです。

PdModeシステム変数は、次の値を取ることができます。

  • 0ドット(。)
  • 1何もない
  • 2プラス(+)
  • 3クロス(x)
  • 4短い縦線(|)
  • 32サークル
  • 64スクエア

さらに、これらの数値は加算によって組み合わせることができます。たとえば、34 (32 + 2) プラス記号(2)に円(32)を追加します。

左から右へ: PdMode = 32、33、および34。

注意すべきポイントの特徴は次のとおりです。32は実際にはドット(32 + 0)のある円です。0はドットを描画するためです。比較すると、33 (32 + 1) 1は何も表示しないため、円だけです。

プラス記号、円記号、正方形点記号の組み合わせを選択できるダイアログボックスの作成方法を見てみましょう。次のようなダイアログボックスはどうでしょう…

ダイアログボックスの構造

ダイアログボックスを生成するために必要なコードは次のとおりです。

x:ダイアログ{ラベル=「ポイントスタイル」;

:column {label =“ポイントスタイルを選択:”;

:トグル{key =“ plus”; label =“ Plus”;値=“ 1”; }

:トグル{key =“ circle”; label =“ Circle”; }

:トグル{key =“ square”; label =“ Square”; }

}

ok_cancel;

}

そのことに注意してください 値=「1」 プラスオプションをオンにして(チェックマークを表示する)、それをデフォルト値にします。

次に、ダイアログボックスを機能させるためのLISPファイルを記述します。 (action_tile“ plus”“(setvar“ pdmode” 2)”)のような単純なものは機能しません。これは、ユーザーが複数のオプション(トグルの要点)を選択する可能性があるためです。次の3つのステップを実行するためのコードが必要です。

ステップ1: ユーザーがチェックしたオプションを確認します。
ステップ2: 設定を合計します。
ステップ3: PdModeを設定して、目的のポイントスタイルを表示します。

それを実装しましょう:

  1. ダイアログボックスからユーザー入力を読み取るには、LISPの $value プラストグルの変数:

    (action_tile“プラス」「(setq plusVar $value)」)

    他の2つのトグル、CircleとSquareのコードを繰り返します。

    (action_tile“サークル」「(setq circleVar $value)」)

    (action_tile“平方「(setq squareVar $value)」)

  2. $value 変数には1と0のみが含まれます。後で、ルックアップテーブルを使用して、1と0を期待される値に変換します。 PdMode。たとえば、Plusが選択されている場合(「1」)、PdModeは2の値を予期します。ルックアップテーブルはif関数を使用して、次のように数値を修正します。

    (if(= plusVar“ 1”)(setq plusNum 2)(setq plusNum 0))

    これは次のように読むことができます:

    plusVar = 1の場合、設定 plusNum = 2;

    それ以外の場合は設定 plusNum = 0.

    他の2つのトグル、CircleとSquareのルックアップコードを繰り返します。

    (if(= squareVar“ 1”)(setq squareNum 64)(setq squareNum 0))

    (if(= circleVar“ 1”)(setq circleNum 32)(setq circleNum 0))

    ヒント get_tileによって取得される$値は、実際には「1」のような文字列です。ただし、PdModeシステム変数には整数が必要です。したがって、ルックアップテーブルは、文字列を整数に変換する2次的な機能を実行します。

    PdModeが期待する値に設定された値で、+関数を使用してそれらを追加します。

    (setq vars (+ plusNum circleNum squareNum))

  3. の値を変更するには PdMode、あなたはLISPを採用しています setvar このような関数:

    (setvar 「pdmode」 vars)

    すべてのLISPコードは次のとおりです。

    (defun c:xx(/)

    (setq dlg-id(load_dialog“ c:\\ x”))

    (new_dialog“ x” dlg-id)

    ;;各トグルタイルから現在の値を取得します。

    (setq plusVar(get_tile“ plus”))

    (setq circleVar(get_tile“ circle”))

    (setq squareVar(get_tile“ square”))

    ;;ユーザーがクリックしたトグルを確認します。

    (action_tile“ plus”“(setq plusVar $value)”)

    (action_tile“ circle”“(setq circleVar $value)”)

    (action_tile“ square”“(setq squareVar $value)”)

    (start_dialog)

    (unload_dialog dlg-id)

    ;;ルックアップテーブルは、「0」/「1」の文字列を正しい整数に変換します。

    (if(= plusVar“ 1”)(setq plusNum 2)(setq plusNum 0))

    (if(= circleVar“ 1”)(setq circleNum 32)(setq circleNum 0))

    (if(= squareVar“ 1”)(setq squareNum 64)(setq squareNum 0))

    ;;整数を合計して、システム変数を変更します

    (setq vars(+ plusNum circleNum squareNum))

    (setvar“ pdmode” vars)

    )

ラジオボタン

ラジオボタンは、一度に1つしかアクティブにできないため、トグルよりもコーディングが簡単です。
このチュートリアルでは、ラジオボタンを使用して等値面を変更するダイアログボックスを作成します。ダイアログボックスは、次の値を取るSnapIsoPairシステム変数の値を変更します。

  • 0 左等値面(デフォルト)
  • 1 上部等値面
  • 2 右等値面

このようなダイアログボックスを作成するには…

…このコードを取ります:

x:ダイアログ{label =“ Isoplane”;

:column {label =“等値面を次に変更:”;

:radio_button {key =“ left”; label =“左等値面”;値=“ 1”; }

 

:radio_button {key =“ top”; label =“ Top isoplane”; }

:radio_button {key =“ right”; label =“ Right isoplane”; }

スペーサー;

}

ok_cancel;

}

そのことに注意してください 値=「1」 左の横のチェックボックスのXをオンにします。

付属のLISPファイルに進む前に、最初にBricsCADを設定してアイソメモードを表示します。

  1. 入力します 設定 コマンド。
  2. [検索]フィールドに「スナップスタイル」と入力します。カスタムダイアログボックス
  3. [スナップタイプ]ドロップリストで、 アイソメトリックスナップ.
  4. クリック バツ ダイアログボックスを閉じます。

BricsCADがアイソメトリックモードになりました。

以下で説明するダイアログボックスを使用すると、カーソルの向きが変わります。

アイソメトリックスナップモードのカーソル
左から右へ:左、上、右の等値面のカーソル。

次に、このダイアログボックスを機能させるLISPファイルを見てみましょう。それはのために使用されるコードに似ています
トグル;主な違いは、値が加算されないことです。

(defun c:xx(/)

(setq dlg-id(load_dialog“ c:\\ x”))

(new_dialog“ x” dlg-id)

;;ユーザーがどのラジオボタンをクリックするかを確認します。

(action_tile“ left”“(setq leftVar $value)”)

(action_tile“ top”“(setq topVar $value)”)

(action_tile“ right”“(setq rightVar $value)”)

(start_dialog)

(unload_dialog dlg-id)

;;ルックアップテーブル:

(if(= leftVar“ 1”)(setq vars 0))

(if(= topVar“ 1”)(setq vars 1))

(if(= rightVar“ 1”)(setq vars 2))

;;システム変数を変更:

(setvar“ snapisopair” vars)

)

ダイアログボックスに左アイソプレーンをデフォルトとして表示するように強制しているため、少し不正を行っています。これは必ずしも本当ではありません。 DCLとLISPのコードを実際に変更して、ダイアログボックスにデフォルトの等値面(左、上、または右)が最初に表示されるようにする必要があります。

デフォルトの設定はLISPで行われます set_tile 関数。まず、左の等値面がデフォルトにならないようにDCLコードを変更します。 値=「1」 に:

値=「」

LISPコードでは、次のことを行う必要があります。(a)SnapIsoPairの値を抽出する getvar、次に(b)使用 set_tile コールバックとして。

  1. 現在の値を抽出 SnapIsoPair getvar関数を使用:

    getvar“ snapisopair”))

  2. set_tile関数を使用してデフォルトボタンを設定します。

    set_tile「左」「1」))

これは次のようになります。

SnapIsoPairの値が0(= vars 0)の場合、

次に、左アイソプレーンラジオボタンをオンにします(set_tile“ left”“ 1”)。

他の2つのラジオボタンに同様のコードを記述します。

(if(= vars 1)(set_tile“ top”“ 1”))

(if(= vars 2)(set_tile“ right”“ 1”))

必要なもう1つの変更は、一部の変数をローカルに変更することです。

(defun c:xx(/ leftVar topVar rightVar)

これにより、LISPルーチンの終了時に3つの変数の値が強制的に失われます。さもないと、 rightVar その値を保持し(最後の値です)、ダイアログボックスが開かれるたびに、右アイソプレーンをデフォルトにします。

これらの変更が適切に行われると、改善されたコードは次のようになり、変更が太字で強調表示されます。

(defun c:xx (/ leftVar topVar rightVar)

(setq vars(getvar“ snapisopair”))

(setq dlg-id(load_dialog“ c:\\ x”))

(new_dialog“ x” dlg-id)

;;デフォルトのボタンを設定します。

(if(= vars 0)(set_tile“ left”“ 1”))

(if(= vars 1)(set_tile“ top”“ 1”))

(if(= vars 2)(set_tile“ right”“ 1”))

;;ユーザーがどのラジオボタンをクリックするかを確認します。

(action_tile“ left”“(setq leftVar $value)”)

(action_tile“ top”“(setq topVar $value)”)

(action_tile“ right”“(setq rightVar $value)”)

(start_dialog)

(unload_dialog dlg-id)

;;ルックアップテーブル:

 (if(= leftVar“ 1”)(setq vars 0))

(if(= topVar“ 1”)(setq vars 1))

(if(= rightVar“ 1”)(setq vars 2))

;;システム変数を変更:

(setvar“ snapisopair” vars)

)

これで、ダイアログボックスが起動するたびに、以下に示すように、「右」などのデフォルトの等値面が正しく表示されます。

クラスター

クラスター 関連するコントロールのグループを組み合わせるのに役立ちます。 DCLでは、垂直、水平、ボックス化、およびボックス化されていないクラスターを指定できます。加えて、 無線クラスター 2つのラジオボタンを同時にオンにする場合に必要です。他のすべての場合では、クラスターは視覚的および組織的な目的でのみ必要です。

BricsCADはあたかもあるかのように見せます 8 クラスターを作成するためのタイル:

カラム
Boxed_Column Boxed_Row
Radio_Column Radio_Row
Boxed_Radio_Column Boxed_Radio_Row

ただし、次の点を考慮すると、これらの8つを3つに減らすことができます。

  • カラム BricsCADは自動的にタイルを垂直方向に列に積み重ねるため、タイルは必要ありません。
  • カラム タイルには、ラベルを追加するとすぐにボックスが表示されます。
  • タイル 無線 名前のは、ラジオボタンのクラスタリング専用です。

列と行

BricsCADは通常タイルを積み重ねるので、 カラム 次のDCLコードで示されているように、タイルが必要です。

x:ダイアログ{

:ボタン{label = "&Button"; }

:ボタン{label = "&Click"; }

:ボタン{label = "&Pick"; }

ok_only;

}

(アンパサンド— -キーボードからボタンにアクセスするショートカットキーを指定します Alt 押すなどのキー Alt + B.)

タイルの水平行を作成するには、 行{} 以下の太字で示されているタイル:

x:ダイアログ{

:行{

:ボタン{label = "&Button";}

:ボタン{label = "&Click"; }

:button {label = "&Pick";}

}

ok_only;

}

水平行のボクシングは見えないので、青い長方形で強調表示しました。

ボタンのカスタムダイアログボックス

なぜなら ok_only タイルは外にあります 行{} タイルは、クラスターの外側にあり、3つのボタンの列の下に垂直に積み重ねられています。

ボックス化された行

3つのボタンの周りに実際に長方形(ボックス)を表示するには、「行」を boxed_row、 次のように:

x:ダイアログ{

:boxed_row {

//その他

}

ok_only;

}

ラベル付きボックス化行

ボックス付きボタンの目的を説明するテキストを追加して、 ラベル 以下の太字で示されている属性:

x:ダイアログ{

:boxed_row {label =“ Three Buttons”;

//その他

}

ok_only;

}

奇妙なことは、あなたが boxed_row または タイル。そうです。ラベルを タイル、BCLは自動的にクラスターの周りにボックスを追加します。

ボックスを削除するには、行の前に テキスト 次のようなタイトルのタイル:

x:ダイアログ{

:text {label =“ Three Buttons”;}

:行{

//その他

}

ok_only;

}

ダイアログボックス

ラジオボタンの特別なタイル

複数のラジオボタンをオンにする必要がある場合を除いて、ラジオボタンで通常の行と列のタイルを使用できます。一度に1つのラジオボタンしかオンにできない(黒い点が表示される)ことを思い出してください。 BricsCADは、オンに設定されている可能性がある他のすべてのラジオボタンを自動的にオフにします(= “1”).

解決策は2つ以上を使用することです radio_column オンにする必要のあるラジオボタンセットの1つを保持するタイル。

この水平構成はユーザーにとって心理的に難しいため、ラジオボタンに行を使用することはお勧めしません。

DCLのデバッグ

最も一般的なDCLコーディングエラーは、終了セミコロンや引用符の省略などの句読点のエラーが原因です。これらの問題は、このセクションの後半で説明するエラーメッセージダイアログボックスによって通知されます。

DCL_SETTINGS

DCLには、特定のコーディングエラーを見つけるためのデバッガーが含まれています。デバッガーをアクティブにするには、 audit_level DCLファイルの先頭、 ダイアログ タイル:

dcl_settings:defalut_dcl_settings { audit_level = 3; } x:ダイアログ{//など

デバッガーは4つのレベルで動作します。

監査レベル 意味 
0 デバッグは行われません
1 (デフォルト)未定義のタイルや円形のプロトタイプ定義など、BricsCADを終了する可能性のあるDCLエラーをチェックします
2 欠けている属性や間違った属性値などの望ましくないレイアウトと動作をチェックします
3 冗長な属性定義をチェックします

DCLエラーメッセージ

BricsCADはDCL関連のエラーメッセージをダイアログボックスに表示します。次のいくつかが発生する可能性があります。

セマンティックエラーはDCLファイルです

エラーダイアログボックスで、 acad.dce file — DCLエラーファイル。問題は、ダイアログボックスに表示されないことです。 どこ このファイルはあります。コンピューターのC:およびD:ドライブでWindows Searchを実行した後、ついにファイルを D:\ documents and settings \ administrator \ my documents フォルダ。

ファイルには、次のようなエラーに関する情報が含まれています。

====== c:\ x ======のDCLセマンティック監査

エラー。 「asdfasfads」というウィジェットは未定義です。

一部のエラーがメッセージダイアログボックスに直接表示されるのに、他のエラーが acad.dce ファイル。

ダイアログに[OK]ボタンも[キャンセル]ボタンもありません

ダイアログボックスは、 OK または キャンセル ボタン。少なくとも、 ok_only DCLファイルにタイルします。 DCLは、Windowsが自動的に バツ (キャンセル)ボタンをすべてのダイアログボックスに追加すると、オートデスクはDCLの更新に失敗し、この革新を考慮に入れました。

ダイアログファイル「filename.dcl」のエラー、n行目

DCLファイルには、BricsCADにとって未知のタイルの名前が含まれています。スペルを確認してください。この例では、 ok_only コロン(:)が前に付きますが、これは事前に作成されたタイルでは正しくありません。

間違った例::ok_only;

正しい:ok_only;

ダイアログが大きすぎて画面に収まりません

DCLファイルのタイルが、コンピューターの画面に合わないダイアログボックスを作成しています。これは、 edit_edith, 、または 高さ 属性が大きすぎます。

追加のリソース

次のDCLチュートリアルなど、DCLを使用したダイアログボックスの作成についてさらに学習する必要があります。

AfraLisp スポーツチュートリアルで詳細情報dclコーディング

これらのトピックを含む:

  • 入門
  • DCL Primer –ダウンロード
  • ダイアログボックスのレイアウト
  • ステップごとのダイアログボックス
  • 対話ボックスの動作
  • ダイアログのネストと非表示
  • 再び対話を隠す
  • LISPメッセージボックス
  • LISP入力ボックス
  • DCLファイルの参照
  • ダイアログコントロール言語(DCL)のLISP関数
  • DCLファイルの機能の概要
  • DCL属性
  • ダイアログボックスのデフォルトデータ
  • DCLモデル
  • DCLプログレスバー
  • 属性とダイアログボックス
  • DCLファイルなしのDCL
  • AfraLisp DCLチュートリアル
  • 編集ボックスに入る

BricsCAD体験版を
ダウンロード

今すぐBricsCADを使ってみましょう

多言語、広範囲で使える永久ライセンスとサブスクリプションです。


  1. 前書き
  2. BricsCADユーザーのための55のヒント
  3. 設定
  4. 環境を変える
  5. カスタムユーザーインターフェース
  6. [カスタマイズ]ダイアログボックスの概要
  7. メニューバーとコンテキストメニューをカスタマイズする
  8. ツールバーとボタンアイコン
  9. マクロとディーゼルコードの記述
  10. リボンのタブとパネル
  11. キーストロークのショートカット、エイリアス、シェルコマンド
  12. マウス、ダブルクリック、タブレットボタン
  13. クワッドについて知っておくべきすべてのこと
  14. ロールオーバープロパティ
  15. ワークスペースとユーザーインターフェイス
  16. 設計ツールと構造パネル
  17. シンプルで複雑な線種の作成
  18. ハッチングのパターン化
  19. 形状とフォントのデコード
  20. フィールドテキストでのコーディング
  21. スクリプトを書く
  22. LISPによるプログラミング(はじめに)
  23. LISP関数
  24. 簡単なLISPプログラムを書く
  25. LISPプログラミングの7つのヒント
  26. DCLを使用したダイアログボックスの設計
  27. カスタムダイアログボックスの作成