Изменить стиль интерактора во время выполнения - PullRequest
0 голосов
/ 28 октября 2019

Можно ли изменить стиль интерактора vtkRenderWindowInteractor во время выполнения? Я попытался изменить его с стиля 2D-интерактора на стиль 3D-интерактора, и он не работает ... и мне интересно, возможно ли это ...

У меня в начале программы на InitialUpdate :

m_pInteractor->SetInteractorStyle(vtkInteractorStyleImage::New());

, где m_pInteractor имеет тип vtkRenderWindowInteractor .

и где-то, при некотором событии кнопки:

m_pInteractor->SetInteractorStyle(vtkInteractorStyleTrackballCamera::New());

но кажется, что m_pInteractor имеет тот же тип vtkInteractorStyleImage , а не vtkInteractorStyleTrackballCamera тип.

Мне действительно нужен этот переключатель… этовозможно ? И если это так, как я могу сделать это переключение?

Позже отредактируйте:

Я попытался извлечь класс из vtkInteractorStyleSwitch и там переключиться между vtkInteractorStyleImage и vtkInteractorStyleVolume (получено из vtkInteractorStyleTrackballCamera ):

Вот код (заголовок):

#define VTKIS_JOYSTICKIMAGE                     0
#define VTKIS_JOYSTICKVOLUME                    1

class vtkInteractorStyleSwitchEx : public vtkInteractorStyleSwitch
{
public:
    static vtkInteractorStyleSwitchEx* New() { return new vtkInteractorStyleSwitchEx; }
    vtkTypeMacro(vtkInteractorStyleSwitchEx, vtkInteractorStyleSwitch);

public:
    void SetCurrentStyleToJoystickImage();
    void SetCurrentStyleToJoystickVolume();

protected:
    vtkInteractorStyleImage* m_pJoystickImage;
    vtkInteractorStyleVolume* m_pJoystickVolume;

protected:
    virtual ~vtkInteractorStyleSwitchEx();
    void SetCurrentStyle();

private:
    int m_nJoystickType;

private:
    vtkInteractorStyleSwitchEx();
    vtkInteractorStyleSwitchEx(const vtkInteractorStyleSwitchEx& rhs) = delete;
    void operator=(const vtkInteractorStyleSwitchEx& rhs) = delete;
};

иреализация:

#include "StdAfx.h"

#include "vtkInteractorStyleSwitchEx.h"

vtkInteractorStyleSwitchEx::vtkInteractorStyleSwitchEx()
    :m_nJoystickType(VTKIS_JOYSTICKIMAGE)
{
    m_pJoystickImage = vtkInteractorStyleImage::New();
    m_pJoystickVolume = vtkInteractorStyleVolume::New();
}

vtkInteractorStyleSwitchEx::~vtkInteractorStyleSwitchEx()
{
    m_pJoystickImage->Delete();
    m_pJoystickImage = nullptr;
    m_pJoystickVolume->Delete();
    m_pJoystickVolume = nullptr;
}

void vtkInteractorStyleSwitchEx::SetCurrentStyleToJoystickImage()
{
    if (VTKIS_JOYSTICKIMAGE != m_nJoystickType)
        m_nJoystickType = VTKIS_JOYSTICKIMAGE;
    SetCurrentStyle();
}

void vtkInteractorStyleSwitchEx::SetCurrentStyleToJoystickVolume()
{
    if (VTKIS_JOYSTICKVOLUME != m_nJoystickType)
        m_nJoystickType = VTKIS_JOYSTICKVOLUME;
    SetCurrentStyle();
}

void vtkInteractorStyleSwitchEx::SetCurrentStyle()
{
    switch (m_nJoystickType)
    {
    case VTKIS_JOYSTICKIMAGE:
        if (this->CurrentStyle != this->m_pJoystickImage)
        {
            if (this->CurrentStyle)
                this->CurrentStyle = nullptr;
            this->CurrentStyle = m_pJoystickImage;
        }
        break;
    case VTKIS_JOYSTICKVOLUME:
        if (this->CurrentStyle != this->m_pJoystickVolume)
        {
            if (this->CurrentStyle)
                this->CurrentStyle = nullptr;
            this->CurrentStyle = m_pJoystickVolume;
        }
        break;
    default:
        break;
    }

    if (this->CurrentStyle)
    {
        this->CurrentStyle->SetInteractor(this->Interactor);
        this->CurrentStyle->SetTDxStyle(this->TDxStyle);
    }
}

Но, даже если я позвоню:

m_pInteractor->SetInteractorStyle(m_pInteractorStyleSwitch);
m_pInteractorStyleSwitch->SetCurrentStyleToJoystickImage();

, где m_pInteractor равно

vtkRenderWindowInteractor * m_pInteractor;

и m_pInteractorStyleSwitch is

vtkInteractorStyleSwitchEx * m_pInteractorStyleSwitch;

У меня все еще нет функциональности переключателя (стиль переключателя)

Есть ли шанспереключить стиль интерактора во время выполнения? Вы встречали это задание раньше?

...