Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用VTK制作自定义事件?_C++_Vtk - Fatal编程技术网

C++ 如何使用VTK制作自定义事件?

C++ 如何使用VTK制作自定义事件?,c++,vtk,C++,Vtk,我正在用VTK制作一个线程软件,我需要实时更改模型本身,同时我需要更改他的渲染方法。一切正常,但问题从interactior->start()开始,模型数据得到了很好的更新,但它只在我移动相机时显示在屏幕上。此外,我还选择了一些从imagedata文件生成3D数据的方法,为此,我需要关闭vtk窗口(interactor窗口),然后代码将重新打开它并将生成的新数据发送给它 我需要这样的东西: int force close_window = false; int refresh_interacto

我正在用VTK制作一个线程软件,我需要实时更改模型本身,同时我需要更改他的渲染方法。一切正常,但问题从
interactior->start()开始,模型数据得到了很好的更新,但它只在我移动相机时显示在屏幕上。此外,我还选择了一些从imagedata文件生成3D数据的方法,为此,我需要关闭vtk窗口(interactor窗口),然后代码将重新打开它并将生成的新数据发送给它

我需要这样的东西:

int force close_window = false; int refresh_interactor = false;
我设法关闭了窗口,但只使用了
vtkcommand::keyppressed
命令,但是idk如何使用新命令:S,我尝试了
vtkcommand::UserEvent
,但没有找到关于如何处理该数据的好信息(比如调用它的方法)

我处理VTK的方式是使用两个线程,第一个线程是关于VTK iren循环的,第二个线程将管理模型并检查iren是否需要更新

在我的梦想代码中,应该是这样的:

=======================================================================================

bool VTKWindow()
{ 
    ... 
    vtkSmartPointer ator = vtkSmartPointer::New(); 
    iren = vtkSmartPointer::New(); 
    RenWindow = vtkSmartPointer::New(); 
    render->SetBackground(.1, .2, .3); 
    RenWindow->AddRenderer(renderer); 
    iren->SetRenderWindow(RenWindow);

    if(data_type == voxel_type)
    { 
        Render->AddViewProp(VoxelData); 
    }
    else
    { 
        actor->SetMapper(PolyData);
        Render->AddActor(Actor); 
    }

    RenWindow->Render(); 
    iren->Start();
}

void ManageVTK()
{ 
    while true loop... 
            if(force close_window == true)
                do some command to exit the iren loop 
            if(refresh_interactor == true)
                do some command to refresh iren 
}

对不起,英语不是我的母语,也对不起问题的格式,这是我第一次使用stackoverflow,听起来可能很愚蠢,但是,我找到了解决问题的方法。 我在相关链接上看到了这个家伙,这几乎是同一个问题

class VTKNewEvent : public vtkCommand{
    public:
        vtkTypeMacro(VTKNewEvent , vtkCommand);

        static VTKNewEvent * New(){
            return new VTKNewEvent ;
        }
        void Execute(vtkObject * caller, unsigned long vtkNotUsed(eventId), void * vtkNotUsed(callData)){
            vtkRenderWindowInteractor *iren = static_cast<vtkRenderWindowInteractor*>(caller);
            if (iren_close == true){
                iren->GetRenderWindow()->Finalize                   // Stop the interactor
                iren->TerminateApp();
                iren_close = false;
            }
            if (iren_update== true){
                renderJanela->Render();
                iren_update= false;
            }           
        }
};


bool VTKWindow(){
    vtkSmartPointer<VTKNewEvent > IrenRefresh= vtkSmartPointer<VTKNewEvent>::New();
...
    iren->CreateRepeatingTimer(1);//this makes that IrenRefresh will be called at every 1ms
    iren->AddObserver(vtkCommand::TimerEvent, IrenRefresh);
    iren->Start();
...
}
class VTKNewEvent:public vtkCommand{
公众:
vtkTypeMacro(VTKNewEvent、vtkCommand);
静态VTKNewEvent*新(){
返回新的VTKNewEvent;
}
void Execute(vtkObject*caller、未签名的长vtnotused(eventId)、void*vtnotused(callData)){
vtkRenderWindowInteractor*iren=静态_转换(调用者);
如果(iren_close==真){
iren->GetRenderWindow()->Finalize//停止交互程序
iren->TerminateApp();
iren_close=false;
}
如果(iren_update==true){
renderJanela->Render();
iren_update=false;
}           
}
};
bool VTKWindow(){
vtkSmartPointer IrenRefresh=vtkSmartPointer::New();
...
iren->CreateRepeatingTimer(1);//这使得每1ms调用一次IrenRefresh
iren->AddObserver(vtkCommand::TimerEvent,IrenRefresh);
iren->Start();
...
}

这很简单,但可能不是最好的,但它确实起到了作用,我希望这个链接将帮助那些开始进入VTK世界的人,因为线程+渲染循环并不是一个简单的工作来理解正在发生的事情

我不确定你是否真的在这段代码中创建了一个新事件。因为您正在使用
vtkCommand::TimerEvent
作为触发观察者的事件。创建新事件的正确方法是使用
vtkCommand::UserEvent+intShift
,其中intShift是允许创建更多新事件的整数。可以通过更新vtkAllEventsMacro来注册这些新事件。在本文中,文件vtkTestFilter.h显示了如何在不注册的情况下创建新事件。