資料室 ページ指定表示
資料室 ページ指定表示
 ■Report Liblary..._____________
| HOME | | 最新3ページ | | 最新100リスト | | 10回毎一覧 | | ANDOR  | | 辞書 |

Close

Only
000044.Metasequoiaプラグイン「選択情報」と簡易解説 
  (2003年12月27日(土) 17:24)

Open
●「選択情報」プラグイン概要
 ・SelInfo.dll(2004/02/07)
 ※2004/02/07追記:LFオプションを追加
 metasequoia用selectプラグインです。
 メニューの選択部処理から「選択情報」を実行すると、フロートウィンドウが表示され、
 metasequoia上で選択しているオブジェクト等の情報が表示されます。
 metasequoia本体とは並行で動作するので、起動したままで作業を継続でき、
 一定間隔で選択部分の情報を更新します。
 

●導入方法/削除方法
 導入方法は2通りあり、どちらでもOKです。
 1.Metasequoiaを導入したフォルダのPlugins\Select\にSelInfo.dllをコピーする。
 2.Metasequoiaを起動し、ヘルプ>プラグイン>インストールで
   手順に従いSelInfo.dllを選択する。

 削除方法はMetasequoiaを導入したフォルダのPlugins\Select\にある
 SelInfo.dllを削除するだけです。
 レジストリは使用していません。

●制限事項
 ・VCLを使ったアプリケーションが他に起動されていると動作がおかしくなります。
 ・選択情報プラグインを2重起動すると、終了時にエラーが出ます。
 ・選択情報プラグインを起動したままmetasequoia本体を終了するとエラーが出ます。
 
  いづれも回避策が現段階では分かっていません。
  もし情報などあればご提供下さい。

●使用方法
 「コンパクト」
  全オブジェクトに対してMQDocument->Compact();を実行します。
 「フォント」
  情報を表示するフォントを変更します。
 「更新」
  選択部分の情報を更新します。
 「オブジェクト」
  オブジェクトの情報を表示します。
 「マテリアル」
  マテリアルの情報を表示します。
 「点」
  点の情報を表示します。
 「辺」
  辺の情報を表示します。
 「面」
  面の情報を表示します。
 「LF」 (2004/02/07追記)
  数値を%Fではなく、%LFで表示します。
 「TIMER」
  更新する間隔を設定します。
  初期値は500で、約0.5秒に相当します。
  1000だと約1秒になります。100未満は設定できません。

●技術情報
 今まではWM_KEYDOWNメッセージを受けたときに親ウィンドウへそのメッセージを送ってやる事は出来ても、
 ショートカットキーなど多数のコマンドが受け付けられず、操作が不便でしたが、
 効かなくなるコマンドは、VCLの仕様なのか「0xBC00」が加算されているとの情報をO.Mizno氏から頂き、
 試してみたところ動作するようになりました。
 ただし、推奨も、保証もされません。
 ということで予期しない不具合が発生しても各自対応になります。
 また、バージョン違いによる動作は不明です。ちなみに自分の環境はVer2.4β4です。
 その辺理解して頂いた上で開発、利用して下さい。
 
 実際のダイアログの作り方は以下の通り。
 通常通りMQModifySelect()関数からSelectInfo()を呼び出します。
ソースコード追記コメント
BOOL SelectInfo() {
    MSG msg;
    HWND hModelessDlg, Parent;
    WNDPROC DefStaticProc;
    char strClassName[64];
     
  
/*    Parent = GetWindow( MQ_GetWindowHandle(), GW_HWNDFIRST );
    while( Parent ) {
        if( Parent ) {
            memset( strClassName, 0x00, sizeof( strClassName ) );
            GetWindowText( Parent, strClassName, 9 );
            if( strcmp( strClassName, "選択情報" ) == 0 ) {
                return false;
                break;
            }
        } else {
            break;
        }
        Parent = GetNextWindow( Parent, GW_HWNDNEXT );
    }*/
    2重起動防止してみたが、結局エラーになってしまう。
  
    hModelessDlg
            =CreateDialogParam( hInstance,
                                MAKEINTRESOURCE( IDD_DIALOG ),
                                MQ_GetWindowHandle(),
                                (DLGPROC)ModelessDialogBox,
                                (LPARAM)NULL);
    if( hModelessDlg == NULL )  return FALSE;

    ShowWindow( hModelessDlg, SW_SHOWNORMAL );
    モードレスダイアログを作成する。
    ModelessDialogBox()関数の中で各情報の取得更新処理を行っている。
  
    Parent = GetWindow( MQ_GetWindowHandle(), GW_HWNDFIRST );
    while( Parent ) {
        if( Parent ) {
            GetClassName( Parent, strClassName, sizeof( strClassName ) );
            if( strcmp( strClassName, "TFormMain" ) == 0 ) {
                DefStaticProc = (WNDPROC)GetWindowLong( Parent, GWL_WNDPROC );
                break;
            }
        } else {
            break;
        }
        Parent = GetNextWindow( Parent, GW_HWNDNEXT );
    }
    metasequoia本体のWindowHandleを探す。
    "TFormMain"という名称で探しているので、
    他にVCLのアプリがあると誤動作するかも。
    ParentがWindowHandleになる。
  
    while( GetMessage( &msg, NULL, 0, 0 ) ) {
    GetMessageループ開始
  
        if( msg.message == 0x00a1 && msg.wParam == 0x0014 ) {
            if( msg.hwnd == Parent ) {
                //ここでmetasequoia本体が終了されたかどうか判断可能だが・・・
            }
        }
    metasequoiaの閉じるボタンが押された。
    エラーが出ないようにここでうまく処理したいが、
    現段階では方法不明。
  
        if( GetDlgItem( hModelessDlg, IDC_TIMER ) != GetFocus() ) {
            if( msg.message == WM_KEYUP ) {
                if( !CallWindowProc( DefStaticProc, Parent, WM_KEYUP+0xBC00, msg.wParam, msg.lParam ) ) {
                    CallWindowProc( DefStaticProc, Parent, WM_KEYUP, msg.wParam, msg.lParam );
                }
            } else
            if( msg.message == WM_KEYDOWN ) {
                if( !CallWindowProc( DefStaticProc, Parent, WM_KEYDOWN+0xBC00, msg.wParam, msg.lParam ) ) {
                    CallWindowProc( DefStaticProc, Parent, WM_KEYDOWN, msg.wParam, msg.lParam );
                }
            } else {
                if( !IsDialogMessage( hModelessDlg, &msg ) ) {
                    TranslateMessage( &msg );
                    DispatchMessage( &msg );
                }
            }
        } else {
            if( !IsDialogMessage( hModelessDlg, &msg ) ) {
                TranslateMessage( &msg );
                DispatchMessage( &msg );
            }
        }
    IDC_TIMER(TIMERテキストボックス)以外にフォーカスがあるならば
    WM_KEYUP、WM_KEYDOWNメッセージを受けたときに、metasequoia本体にメッセージを送る。
    このとき0xBC00を足して送り、帰り値が0ならば、0xBC00を足さずに送る。
  
    }
    return TRUE;
}
    GetMessageループ終了。
    SelectInfo()関数終了。
  
 試しに以下のようにもやってみたのですが、エラーが出てしまいました。   if( !CallWindowProc( DefStaticProc, MQ_GetWindowHandle(), WM_KEYDOWN+0xBC00, msg.wParam, msg.lParam ) ) {    CallWindowProc( DefStaticProc, MQ_GetWindowHandle(), WM_KEYDOWN, msg.wParam, msg.lParam );   }    とりあえず今回は選択情報を表示するだけだが、  フロートウィンドウプラグインでのショートカットへの影響が解消できたっぽいので、  今後、いろんな方面で活用が可能と思います。  ただ、推奨されない方法ですので、その点気をつけましょう。 関連リンク: ・SelInfo.dll(2004/02/07) ・metasequoia

| HOME | | 最新3ページ | | 最新100リスト | | 10回毎一覧 |
■0x112 ■0x227 ■0x55F ■0xDDF ■0xF36 ■0xF8B ■0xEBC ■0x114 ■0x33F ■0x77F ■0xAAF ■0xEEF
____________Report Library Ver2.00β 2003/08/27_bomber@xps.jp_http://bomber.xps.jp/_