需求:读取模型文件后,需要对模型重新读取并更换,由于vtk内存的管理问题,直接操作vtkRenderer 或者vtkAssembly 时,旧的模型存在需要释放的问题。
方法1:
//将读取的模型指针放到全局,
vtkSmartPointer<vtkSTLReader> modreader =NULL;
//通过指针重新去读取文件并更新显示
mod = "Resources/mod.stl"; //模型路径
modreader->SetFileName(mod .c_str()); //读取模型
modreader->Update(); //
WindowRender->Render();
方法2:
//在读取模型时,记录这个模型的一些参数,然后通过遍历reader 去找到这个模型后修改
vtkActorCollection* actorCollection = renderer->GetActors();
int num = actorCollection->GetNumberOfItems();
std::cout << "GetActors Size=" << num << std::endl; //
//这个函数比较重要,否则getNextActor将没法得到正确的actor
actorCollection->InitTraversal();
for (int i = 0; i < num; ++i)
{
vtkActor* actor = actorCollection->GetNextActor();
std::cout << "GetLength=" << actor->GetLength() << std::endl; //
if(actor->GetLength() > 200) //找到自己想要的模型了
{
//取模型 根据点云生成的几何图元
auto buttcoilMapper = actor->GetMapper();
//重新去读取模型文件
mod = "Resources/mod.stl";
vtkSmartPointer<vtkSTLReader> modreader= vtkSmartPointer<vtkSTLReader>::New();
modreader->SetFileName(mod .c_str());
modreader->Update(); //
//更新模型的几何图元
buttcoilMapper->SetInputConnection(buttcoilreader->GetOutputPort());
WindowRender->Render();
}
}
以上两种方法,都能保证旧的模型资源及时得到释放