メガソフト製品をご利用いただき、ありがとうございます。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の場合

プロジェクトの設定
  1. [プロジェクト]メニュー/[参照の追加]を実行してください。
  2. 参照の追加ダイアログの[参照設定]タブを選択します。
  3. [プログラムインストール先]\Wizard\madori\Program\madori2017.exeを選択します。
  4. [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++の場合

プロジェクトの設定
  1. [プロジェクト]メニュー/[クラスの追加]を実行してください。
    Visual Studio 2019以降では、[プロジェクト]メニュー/[新しい項目の追加]を実行してください。
  2. [TypeLib からの MFC クラス]を選択して、[追加]ボタンをクリックします。
  3. レジストリ/MyHomeDesignerMadori、または、ファイル/[プログラムインストール先]\Wizard\madori\Program\madori2017.exeを選択します。
  4. 使用するインターフェースを選択します。
  5. [完了]をクリックして、ダイアログを閉じます。
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のサポートはおこなっておりません。

※記載されている会社名、商品名は、各社の商標または登録商標です。