通过TopoDS_Shape->Handle->IVtkTools_ShapeDataSource->vtkPolyDataMapper->vtkActor的管线渲染到Vtk窗口。
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
vtkNew<IVtkTools_ShapeDataSource> occSource;
IVtkOCC_Shape::Handle shapeImpl = new IVtkOCC_Shape(shape);
shapeImpl->SetId(id);
occSource->SetShape(shapeImpl);
actor->SetMapper(mapper);
mapper->SetInputConnection(occSource->GetOutputPort());
//__setActorDisplayStyle(actor, t);
IVtkTools_ShapeObject::SetShapeSource(occSource, actor);
TopoDS_Shape发生变化时,需要替换occSource内的Handle,通过SetShape方法,可以更新数据。
使用VtkCommand检测事件发生之后,立即更新并修改TopoDS_Shape并更新,此处获得的shape为const &TopoDS_Shape,不能修改,Moved方法返回的是一基于当前模型的修改后的模型。
void ClickCallbackFunction(vtkObject* caller,
long unsigned int eventId,
void* clientData,
void* vtkNotUsed(callData))
{
std::cout << "Click callback" << std::endl;
std::cout << "Event: " << vtkCommand::GetStringFromEventId(eventId)
<< std::endl;
auto& shapeHandle = occSource->GetShape();
auto& shape = shapeHandle->GetShape();
auto id = shapeHandle->GetId();
gp_Trsf trans;
trans.SetTranslation(gp_Vec(0, 0, 0.1));
IVtkOCC_Shape::Handle shapeImpl = new IVtkOCC_Shape(shape.Moved(trans));
occSource->SetShape(shapeImpl);
auto* iren = static_cast<vtkRenderWindowInteractor*>(caller);
//重新渲染
iren->Render();
// Get the interactor like this:
// auto* iren = static_cast<vtkRenderWindowInteractor*>(caller);
}