IVtkTools_ShapeDataSource更新Shape

本文详细描述了如何通过VTK库中的组件(如TopoDS_Shape,Handle,IVtkTools_ShapeDataSource等)实现图形对象的渲染和实时更新,以及如何在点击事件中移动形状并在VTK窗口中进行重渲染的过程。
摘要由CSDN通过智能技术生成

通过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);
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值