gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:00:40 30 4
gpt4 key购买 nike

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

我需要这样的东西:

int force close_window = false; int refresh_interactor = false;

我设法关闭了窗口,但只能使用 vtkcommand::Keypressed 命令,但我不知道如何使用新命令: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

最佳答案

这听起来可能很愚蠢,但是,我找到了一种解决问题的方法。 我在相关链接上看到这个人vtkRenderWindowInteractor event loop and threading而且,这几乎是同样的问题......

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();
...
}

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

关于c++ - 如何使用 VTK 制作自定义事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33179646/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com