将RenderWindowControl添加到工具箱

时间:2015-09-17 11:28:23

标签: vtk

我正在尝试使用Kitware ActiViz.NET。我用nuget安装了它。 但我似乎无法在工具箱上找到RenderWindowControl。我一直试图以这种方式手动添加它:

  • 调用"选择项目......"

  • 并在随后的对话框中点击按钮"浏览...",

  • 导航到您的ActiViz.NET安装文件夹,浏览到/ bin 文件夹,选择" Kitware.VTK.dll"。

  • 单击“确定”。

现在,您应该在ToolBox中看到一个名为RenderWindowControl的新控件。 但我得到"文件" C:\ programfiles \ activiz.net 5.8.0 Opensource Eddition \ bin \ kitware.vtk.DLL"无效"。

我试图在代码中添加控件而不是设计器,并且得到了以下异常: 无法加载文件或程序集' Kitware.VTK,Version = 5.8.0.607,Culture = neutral,PublicKeyToken = 995c7fb9db2c1b44'或其中一个依赖项。试图加载格式不正确的程序。

以前有人有这个问题吗? 有什么想法吗?

2 个答案:

答案 0 :(得分:2)

对于设计模式,您需要使用32位版本,因为VS在32Bit上运行,并且只能加载32位控件。 因此,您可以将设计时间用于32位版本,并将构建/释放切换为64位版本。

但您也可以手动添加RenderWindowControl。 当然设计师将无法展示这一点,所以它会是 在切换到设计师之前需要对其进行评论

打开您的设计师档案,例如Form1.Designer.cs并添加控件,如

private RenderWindowControl myRenderWindowControl;

private void InitalizeComponent()
{
    //all other controls added by the designer

    myRenderWindowControl = new RenderWindowControl();
    myRenderWindowControl.SetBounds(0,0,640,480);
    this.Controls.Add(this.myRenderWindowControl);
}

答案 1 :(得分:0)

将VTK的RenderWindowControl添加到WPF有点复杂。 假设您安装了64位VTK软件包,以下步骤对我有用。

https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/walkthrough-hosting-a-windows-forms-control-in-wpf

  • 将项目引用添加到WindowsFormsIntegration和System.Windows.Forms
  • 在设计器窗体上绘制一个网格。
  • 在“属性”对话框中,给它命名,然后
  • 双击Loaded事件。
  • 在已加载的事件处理程序中添加代码。
#include "stdafx.h"
#include <iostream>
#include <atlbase.h>
#include <atlcom.h>



using namespace std;
using namespace TCatSysManagerLib;
using namespace EnvDTE;


int _tmain(int argc, _TCHAR* argv[])
{
    CoInitialize(NULL); // COM initialisieren
    cout << "Creating VisualSTudio.DTE.10.0 ...";
    // creating a new instance of Visual Studio
    CComPtr<_DTE> m_pDTE;
    HRESULT hr = m_pDTE.CoCreateInstance(L"VisualStudio.DTE.10.0", 0, CLSCTX_ALL);
    if (FAILED(hr)) { cout << " FAILED"; return 1; }
    cout << " created." << endl;
    // retrieves the EnvDTE.Solution-Objekt
    CComPtr<_Solution> pSolution;
    m_pDTE->get_Solution(&pSolution);
    CComBSTR strSolutionFolder(_T("C:\\Users\\X240\\3D Objects\\Implementation\\Test")); // Solution-main directory (has to exist)
    CComBSTR strSolutionName(_T("MySolution1"));
    CComBSTR strTemplatePath(_T("C:\\TwinCAT\\3.1\\Components\\Base\\PrjTemplate\\TwinCATProject.tsproj"));
    CComBSTR strSolutionPath; // Solution-Pfad (doesn’t exist!)
    strSolutionPath = strSolutionFolder;
    strSolutionPath.Append(_T("\\"));
    strSolutionPath.Append(strSolutionName);
    strSolutionPath.Append(_T(".sln"));
    // create the solution
    hr = pSolution->Create(strSolutionFolder, strSolutionName);
    CComBSTR strProjectPath(strSolutionFolder); // project path
    strProjectPath.Append(_T("\\"));
    strProjectPath.Append(strSolutionName);
    CComBSTR strProjectName = "MyProject"; // project name // create projekt from a template
    CComPtr pProject;
    hr = pSolution -> AddFromTemplate(strTemplatePath, strProjectPath, strProjectName, VARIANT_FALSE, &pProject);
    // Wenn z.B. Projekt bereits besteht >> error
    if (FAILED(hr)) { cout << " Project creation FAILED"; return 1; }
    cout << "Project created" << endl;
    // define project automation class (here the Coclass TcSysManager)
    CComPtr pDispatch;
    hr = pProject->get_Object(&pDispatch);
    // retrieve ITcSysManager interface
    CComPtr pSystemManager;
    hr = pDispatch.QueryInterface(&pSystemManager);
    // operate with SystemManager interface
    CComBSTR netId;
    netId = (pSystemManager->GetTargetNetId()).GetBSTR();
    cout << "TargetNetId: " << netId << endl;
    hr = pSystemManager->ActivateConfiguration();
    hr = pSystemManager->StartRestartTwinCAT();
    // save project and solution
    hr = pProject->Save(CComBSTR());
    hr = pSolution->SaveAs(strSolutionPath);
    cout << "Succeeded";
    return 0;
}