|
Prev
Index
Next |
その他
UserFuncには、これまで述べてきた機能に加え、更に以下に2つの機能があります。
- ユーザーコマンドの登録
Kodatunoでは、システムが提供するコマンド(2.4 各コマンドの名称と機能 )以外に、 ユーザーが独自でコマンドを作成し、登録することができます。サンプルとして、(2.7 簡単なアプリケーションの作成 ) で示したプログラムをコンソールから実行できるようにしてみます。以上で、コマンド登録及び、コマンド入力後の応答を実装することができました。
- まず、コマンド名を登録します。コマンド名は"cross"とします。
UserFunc.cpp内にRegistUserCommand()関数があります。その関数内を次のように変更してください。// Userコマンドを登録 void USER::RegistUserCommand(CommandMap *CmdMap) { // 独自のコマンド情報をここに記述してください // 第5引数はNULLを指定 SetCmdList(CmdMap,"cross","",CMD_CROSS,NULL); }
SetCmdList()関数は、Command.cpp/.hに定義されています。第1引数はコマンドの名前やオプションの有無などを格納した構造体(実体はKodatuno.hで定義されています)への ポインタ(変更不可)、第2引数はコマンド名、第3引数はオプション指定、第4引数はこのコマンドのシンボル、第5引数はシステムコマンドでないことを明示するためにNULLを指定します。 第4引数であるコマンドのシンボルは、UserFunc.hでユーザーが定義しなければなりません。// コマンド登録番号(登録コマンドのシンボルを100〜199の数値で指定する) #define CMD_CROSS 100
- 次に、"cross"が入力されたときの処理をUserFunc.cpp内のCommand()関数に記述します。
// Userコマンドを実行 // 引数 *BodList:BODYリストの先頭アドレス *ObjList:セレクションされたエンティティの情報(セレクションの数だけリスト化) // pickcount:セレクション数 CmdNo:実行されたコマンド番号 argc,*argv[]:いつものアレ void USER::Command(BODYList *BodyList,OBJECTList *ObjList,int pickcount,int CmdNo,int argc,char *argv[]) { // 登録したコマンドごとに処理を記述してください if(CmdNo == CMD_CROSS){ ExecSampleFunc4(BodyList,ObjList,pickcount,UserStat.Prop); } }
コンソールに"cross"が入力されると、Command()の第4引数CmdNoに先ほど定義したcrossコマンドシンボル"CMD_CROSS"が渡されます。 よって、Command()内ではCMD_CORSSが入力されたことを条件として、ExecSampleFunc4()を実行するようにコーディングします。
- WideStudioが提供するダイアログの利用
例えば、ユーザー独自のファイルフォーマットの読み込みを行いたい場合などに便利です。 WideStudioの機能をUser Funcより用いる場合は、専用の関数ExecGUIFunc()を通して行う必要があります。 以下に、ユーザーボタン"User Func 5"にファイルをオープンするダイアログを適用する例を示します。
- まず、ExecWidgetFunc()にこれから作成する関数名を記述します。今回の例では、MyOpenFileFunc()という名前とします。
// UserがWSの機能を使い新たなDialogをポップアップさせたい場合は、ここにそのWS処理を記述 // 引数 val:Userボタンのシンボル(0〜7) int USER::ExecWidgetFunc(int val) { // Userボタン1が押された if(val == 0){ // 処理を追加できます } // Userボタン2が押された else if(val == 1){ // 処理を追加できます } // Userボタン3が押された else if(val == 2){ // 処理を追加できます } // Userボタン4が押された else if(val == 3){ // 処理を追加できます } // Userボタン5が押された else if(val == 4){ // 処理を追加できます MyOpenFileFunc(); } else if(val == 5){ // 処理を追加できます } else if(val == 6){ // 処理を追加できます } else if(val == 7){ // 処理を追加できます } return KOD_TRUE; }
MyOpenFileFunc()をvalが4となる位置に挿入しました。valは"User Func"ボタンのシンボルを示し、val=4の場合、"User Func 5"を示します。
- 次に、MyOpenFileFunc()を書いていきます。
void MyOpenFileFunc() { WSCfileSelect *fs=WSGIappFileSelect(); // ファイル選択ダイアログのアドレスを取得 fs->setProperty(WSNmaskFileName,"igs"); // igsファイルのみ選択可 long fchoice_dlg = fs->popup(); // ファイル選択ダイアログを開く if(fchoice_dlg == WS_DIALOG_OK){ // ダイアログのOKボタンが押されたら // ここに処理を追加します } }
WideStudioに関するコーディングはWideStudioのリファレンスを参照してください。 関数冒頭の3行でダイアログを開く処理を行っています。今回の例では、拡張子igsのみダイアログに表示されるようにしています。 次のif文以降で、ダイアログのOKが押された場合の処理を記述します。Qtが提供するダイアログの利用
次はQtを使って、WideStudioと同じようにユーザーボタン"User Func 5"にファイルをオープンするダイアログを適用する例を示します。以上で、UserFuncにおけるダイアログの表示が可能となります。
- まず、ExecGUIFunc()にこれから作成する関数名を記述します。今回も、MyOpenFileFunc()という名前とします。記述はWideStudioと同様のため 、前述を参考にしてください。
- 次に、MyOpenFileFunc()を書いていきます。
void USER::MyOpenFileFunc() { // ファイルのフィルタリスト QString fileFilter = QObject::tr("IGS (*.igs)"); // igsファイルのみ選択可 QString fileName = QFileDialog::getOpenFileName( 0, //親widget QObject::tr("Open File"), // ダイアログタイトル QDir::currentPath(), // 起動時のディレクトリ fileFilter // ファイルフィルター ); }
WideStudio版と同じようにigsファイルのみ表示されるようにしています。Qtに関するコーディングもQtに関するリファレンスを参照してください。
Copyright(C) Kodatuno Development Team, 2011 | Last modified: January 7, 2019 |