Как реализовать приложение VTK с помощью CLR, встроенной в WPF

Я хочу создать проект VTK, который должен использовать WPF для создания графического интерфейса. Я нашел следующий пост, который также пытается объяснить эту проблему (рендеринг VTK без ActiViz) .

Я создал библиотеку классов CLR, которая реализует конвейер VTK из примера VTK:

#pragma once

#include <Windows.h>

using namespace System;

#include <vtkAlgorithmOutput.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkProperty.h>
#include <vtkNamedColors.h>
#include <vtkCylinderSource.h>

#include <array>

// https://stackoverflow.com/questions/30301087/vtk-render-into-c-sharp

namespace CVTK {
    class MyRender
    {
    public:
        MyRender(HWND parent)
        {
            vtkNew<vtkNamedColors> colors;

            std::array<unsigned char, 4> bkg{{26, 51, 102, 255}};
            colors->SetColor("BkgColor", bkg.data());

            vtkNew<vtkCylinderSource> cylinder;
            cylinder->SetResolution(8);

            vtkNew<vtkPolyDataMapper> cylinderMapper;
            cylinderMapper->SetInputConnection(cylinder->GetOutputPort());

            vtkNew<vtkActor> cylinderActor;
            cylinderActor->SetMapper(cylinderMapper);
            cylinderActor->GetProperty()->SetColor(colors->GetColor4d("Tomato").GetData());
            cylinderActor->RotateX(30.0);
            cylinderActor->RotateY(-45.0);

            renderer = vtkSmartPointer<vtkRenderer>::New();
            renderer->AddActor(cylinderActor);
            renderer->SetBackground(1, 0, 1);
            renderer->ResetCamera();

            renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
            //renderWindow->SetSize(300, 300);
            renderWindow->AddRenderer(renderer);

            interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
            interactor->SetRenderWindow(renderWindow);

            //setting background
            renderWindow->SetParentId(parent);
        }

        void Render()
        {
            //interactor->Initialize();
            renderWindow->Render();
            interactor->Start();
        }

    private:
        vtkSmartPointer<vtkRenderer> renderer;
        vtkSmartPointer<vtkRenderWindow> renderWindow;
        vtkSmartPointer<vtkRenderWindowInteractor> interactor;
    };


    public ref class cMyRender
    {
    public:
        cMyRender(IntPtr parent)
        {
            render = new MyRender((HWND)parent.ToPointer());
        }

        void Render()
        {
            render->Render();
        }


    private:
        MyRender* render;
    };
}

Затем я включил dll в проект WPF и попытался отобразить его, используя упомянутый выше пост:

<Window x:Class="CVTKRendering.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    
    xmlns:local="clr-namespace:CVTKRendering"
    mc:Ignorable="d"
    Title="MainWindow" 
    Height="450" 
    Width="800"
    Loaded="Window_Loaded">
</Window>

namespace CVTKRendering
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        public MainWindow()
        {
            InitializeComponent();   
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            HwndSource source = (HwndSource)HwndSource.FromVisual(this);
            IntPtr hWnd = source.Handle;
            cMyRender render = new cMyRender(hWnd);
            render.Render();
        }
    }
}

Проблема в том, что в окне ничего не отображается. Он полностью пуст. Любая помощь приветствуется.


person DummeFragen    schedule 05.05.2021    source источник
comment
Связанный ответ делает HwndSource source = (HwndSource)HwndSource.FromVisual(this) для окна WPF. Тогда зачем вам этот WindowsFormsHost?   -  person Clemens    schedule 05.05.2021
comment
@Clemens Я немного переработал код и использовал это. К сожалению, это все еще не работает. Я внес изменения прямо над   -  person DummeFragen    schedule 05.05.2021
comment
У меня нет доступной платформы Windows, но я успешно использовал VTK в QML. Я считаю, что вам понадобится vtkGenericOpenGLRenderWindow вместо этого.   -  person Jens Munk    schedule 07.05.2021