メガソフト製品をご利用いただき、ありがとうございます。SDKを使って、画面の操作ができます。
目次
はじめに
COM
COM オートメーション機能により、アプリケーションの画面操作ができます。
JavaScript
JavaScriptの実行により、アプリケーションの画面操作ができます。
使用条件と免責事項
- このSDKは無償で提供されますが、欠陥がないことを保証をするものではありません。
- SDKに含まれるドキュメントやサンプルは、「現状のまま(as is)」の状態で提供されます。誤り、抜け落ち、不正確な記述などがある可能性があり、それらについてメガソフトは明示的、黙示的、その他いかなる保証もいたしかねます。
- SDKはサポートセンターのサポート対象外です。質問に対してお答えすることはできません。
- 予告なく、仕様を変更することがあります。
- SDKのご利用および使用結果につきましては、お客様の責任とさせていただきます。ご利用によって生じたあらゆる損害に対して、メガソフトは一切の責任を負いません。
動作要件
3Dアーキデザイナー、3D医療施設デザイナー、3Dオフィスデザイナー11以降および3DマイホームデザイナーPRO7 Ver.7.0.11以降で対応しています。それ以前の3DマイホームデザイナーPRO7をお使いの場合は、リビジョンアップしてください。
JavaScriptの実行は、3Dアーキデザイナー、3D医療施設デザイナー、3Dオフィスデザイナー11以降、インテリアデザイナーNeo2以降、3DマイホームデザイナーPRO8 Ver.8.0.8以降で対応しています。
使い方
アプリケーションでの使い方
COM クライアント アプリケーションより先に本アプリケーション(3Dアーキデザイナーなど)を起動しておきます。
Running Object Table(ROT)からオブジェクトを探して、接続します。
本アプリケーションは、複数のexeやdllで構成されています。CreateObject などで
madori2017.exeやArchi3D.exe単体を起動した場合、本アプリケーションの全機能が使えません。
ご注意ください。
Visual Basicの場合
プロジェクトの設定
- [プロジェクト]メニュー/[参照の追加]を実行してください。
- 参照の追加ダイアログの[参照設定]タブを選択します。
- [プログラムインストール先]\Wizard\madori\Program\madori2017.exeを選択します。
- [OK]をクリックして、ダイアログを閉じます。
madori2017.exeへ接続
GetObjectで、Running Object Table(ROT)からオブジェクトを探して、接続します。
Dim madoriDoc As MyHomeDesignerMadori.MadoriDoc
Private Sub GetMadoriDoc()
If madoriDoc Is Nothing Then
madoriDoc = GetObject(,
"MyHomeDesignerMadori.MadoriDoc")
End If
End Sub
Private Sub Func()
Dim nRet As Integer
nRet = madoriDoc.AddPart(
"C:\Users\Public\Documents\3DMHPRO8\PARTS\Kagu\01キッチン\04食器棚\DKボードL02.m3d",
_
1000, 2000, 0, True, 0, 0, 0, False,
0, 0, 0, 0, True, False)
If nRet <> 0 Then
MsgBox("OK")
Else
MsgBox("失敗")
End If
End Sub
Visual C++の場合
プロジェクトの設定
-
[プロジェクト]メニュー/[クラスの追加]を実行してください。
Visual Studio 2019以降では、[プロジェクト]メニュー/[新しい項目の追加]を実行してください。 - [TypeLib からの MFC クラス]を選択して、[追加]ボタンをクリックします。
- レジストリ/MyHomeDesignerMadori、または、ファイル/[プログラムインストール先]\Wizard\madori\Program\madori2017.exeを選択します。
- 使用するインターフェースを選択します。
- [完了]をクリックして、ダイアログを閉じます。
madori2017.exeへ接続
GetActiveObjectで、Running Object Table(ROT)からオブジェクトを探して、接続します。
// 接続
BOOL CMyApp::CreateMadoriDoc()
{
LPUNKNOWN pUnk = NULL;
LPDISPATCH pDisp = NULL;
CLSID clsid;
BOOL bRet = TRUE;
if(!m_MadoriDoc){
// 1回だけオブジェクト作成
m_MadoriDoc = new CMadoriDoc();
}
if (m_MadoriDoc->m_lpDispatch == NULL){
// 未接続なら、接続する
// CLSIDを取得
if (S_OK != CLSIDFromProgID
(L"MyHomeDesignerMadori.MadoriDoc", &clsid))
{
// MadoriDoc が未登録
return FALSE;
}
// Running Object Table (ROT) から、madoriをさがす
if (S_OK == GetActiveObject (clsid, NULL, &pUnk))
{
// 見つかった
pUnk->QueryInterface (IID_IDispatch, (void**)(&pDisp));
}
if (pDisp)
{
// 接続
m_MadoriDoc->AttachDispatch (pDisp);
}
else
{
// MadoriDoc
は見つかりませんでした
// 新規作成。メインメニューに戻ったり、立体化など3Dと連携する機能は使えません。
COleException* pe = new COleException;
try{
if(m_MadoriDoc->CreateDispatch (clsid, pe)){
}else{
throw pe;
}
}
catch(COleDispatchException* pe)
{
CString cStr;
if (!pe->m_strSource.IsEmpty())
cStr = pe->m_strSource + TEXT(" - ");
if (!pe->m_strDescription.IsEmpty())
cStr += pe->m_strDescription;
else
cStr += TEXT("unknown error");
AfxMessageBox(cStr, MB_OK,
(pe->m_strHelpFile.IsEmpty()) ? 0 : pe->m_dwHelpContext);
pe->Delete();
bRet = FALSE;
}
catch(COleException* pe)
{
pe->Delete();
bRet = FALSE;
}
catch (CException* pe)
{
pe->Delete();
bRet = FALSE;
}
pe->Delete();
}
if(pUnk) pUnk->Release();
}
return bRet;
}
void
CMyApp::AddPart()
{
CreateMadoriDoc();
BOOL bRet =
m_MadoriDoc->AddPart(
L"C:\\Users\\Public\\Documents\\3DMHPRO8\\PARTS\\Kagu\\01キッチン\\04食器棚\\DKボードL02.m3d",
1000,2000,0,TRUE,0,0,0,FALSE, 0,0,0,0,TRUE,FALSE);
if(bRet) AfxMessageBox(TEXT("OK"), MB_ICONINFORMATION);
else AfxMessageBox(TEXT("失敗"));
}
複数起動時のmadori2017.exeへ接続
GetActiveObjectで、Running Object Table(ROT)からオブジェクトを探して、接続します。
モニカの表示名が、"!MyHomeDesignerMadori.MadoriDoc:" で始まっていて、数値がついています。
数値は、madori2017.exe のコマンドライン引数の/COOP:に続く数値と同じものです。
例)
コマンドライン「C:\Program Files\3DAD2017\Wizard\Madori\program\madori2017.exe /COOP:1123510305」のとき、
モニカの表示名「!MyHomeDesignerMadori.MadoriDoc:1123510305」
// 接続
if(m_MadoriDoc->m_lpDispatch != NULL) return;
IBindCtx *pbc;
HRESULT hr = CreateBindCtx(0, &pbc);
if(FAILED(hr)) {
TRACE(TEXT("CreateBindCtx error"));
return;
}
IRunningObjectTable *prot;
hr = pbc->GetRunningObjectTable(&prot);
if(FAILED(hr)) {
TRACE(TEXT("GetRunningObjectTable ERror"));
pbc->Release();
return;
}
IEnumMoniker *pem;
hr = prot->EnumRunning(&pem);
if(FAILED(hr)) {
TRACE(TEXT("EnumRunning error"));
prot->Release();
pbc->Release();
return;
}
pem->Reset();
ULONG fetched;
IMoniker *pmon;
while(pem->Next(1, &pmon, &fetched) == S_OK) {
LPOLESTR pName;
pmon->GetDisplayName(pbc, NULL, &pName);
char szName[512];
WideCharToMultiByte(CP_ACP, 0, pName, -1, szName, 512, NULL, NULL);
const char * pClsid2 = "!MyHomeDesignerMadori.MadoriDoc:";
if(!strncmp(szName, pClsid2, strlen(pClsid2)))
{
IDispatch *pDisp;
IUnknown *pUnknown;
hr = prot->GetObject(pmon, &pUnknown);
if(!FAILED(hr)) {
TRACE(TEXT("ok\n"));
pUnknown->QueryInterface (IID_IDispatch, (void**)(&pDisp));
if(pDisp){
m_MadoriDoc->AttachDispatch (pDisp);
}
}else{
TRACE(TEXT("error\n"));
}
}
pmon->Release();
if(m_MadoriDoc->m_lpDispatch != NULL) break;
}
pem->Release();
prot->Release();
pbc->Release();
その他の言語の場合
COMサーバーの使い方については、各言語やツールのリファレンスを参照してください。
クライアントアプリケーションより先に本アプリケーション(3Dアーキデザイナーなど)を起動しておき、Running Object Table(ROT)からオブジェクトを探して、接続する点は、
Visual BasicやVisual C++と同様です。
JavaScriptの呼び出し方
ファイル名を選択して実行
[ツール]メニューの[SDKスクリプトを実行]を選択、または、Shift+Rキーを押して、実行したいファイルを選んでください。
文字コード
JavaScriptのソースファイルは、UTF-8で記述してください。
JavaScript用関数について
JavaScriptではポインタによる値の取得ができないため、Get系関数の一部ではJavaScript用の関数が用意されています。
詳しくは、各関数の「使用例」をご覧ください。
リファレンス
サンプル
トラブルシューティング
参考資料
サポート
サポートセンターでは、SDKのサポートはおこなっておりません。
※記載されている会社名、商品名は、各社の商標または登録商標です。