C#+VTK三维开发:实现事件响应回调函数切实可行的方法!千万不要使用vtkCommand或者它的子类!!

本人从2023年开始使用vtk+C#的模式开发桌面端三维应用,也就是利用vtk的.net版本ActiViz。

可以说这是一个非常不错的类库!!

以下是最近我用了一周时间开发的一个类似谷歌地球的桌面端程序,挺好玩的!(下面有视频演示!)

后面的博客里,我会上传源代码,请持续关注本人的博客!!

(以下是演示视频)

X3D虚拟地球演示

在开发过程中,踩坑不断,而网上的解决方案基本上都是抄来抄去,大部分不管用,读起来令人恼火!!我会在今后的文章中不断分享经实践成功的方法。

今天介绍事件响应机制回调函数的写法,网上(包括各种大模型)给出的方法基本都是照着C++的方法拔下来的,要么是使用vtkCallBackCommand或者是继承vtkCommand类,然后重载Execute方法,都不管用,结果就是报错!!!

正确的方法应该是针对控件里这个vtkRenderWindowInteractor对象添加事件处理函数!

下面给出具体代码:

      this.Interactor = this.renderWindowControl1.RenderWindow.GetInteractor();
      this.InteractorHandler = new Kitware.VTK.vtkObject.vtkObjectEventHandler(Interactor_AnyEventHandler);
      this.Interactor.AnyEvt += this.InteractorHandler;

上面实际上是把在这个Interactor上的任何事件(AnyEvt )都转给InteractorHandler去处理,而InteractorHandler是通过Interactor_AnyEventHandler来完成处理过程的。

Interactor_AnyEventHandler的函数实现方法如下:

        private void Interactor_AnyEventHandler(vtkObject sender, vtkObjectEventArgs e)
        {
            uint id = e.EventId;        //获得事件ID
            string eventName = vtkCommand.GetStringFromEventId(e.EventId); //获得事件名称
            if (e.EventId==vtkCommand.EventIds.MouseMoveEvent)
            {
                int[] pos = this.Interactor.GetEventPosition();  //获得鼠标当前位置
                //....
            }
        }

大家可以看到了,在这里面我们处理了鼠标移动事件,而其它事件也是类似的,vtkCommand的EventIds有很多事件ID,都可以照此模式处理!

附件:事件ID

            AbortCheckEvent = 10,

            ActiveCameraEvent = 29,

            AnimationCueTickEvent = 59,

            AnnotationChangedEvent = 78,

            AnyEvent = 1,

            Button3DEvent = 122,

            CharEvent = 22,

            Clip3DEvent = 132,

            ComputeVisiblePropBoundsEvent = 84,

            ConfigureEvent = 24,

            ConnectionClosedEvent = 71,

            ConnectionCreatedEvent = 70,

            CreateCameraEvent = 30,

            CreateTimerEvent = 48,

            CurrentChangedEvent = 83,

            CursorChangedEvent = 53,

            DeleteEvent = 2,

     &

【资源介绍】 基于Qt和VTK实现CT三维重建项目c++源码+项目说明.zip 该项目是个人毕设项目,答辩评审分达到95分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 项目进度记录 1、解决了内存问题 2、从切片上拾取点并计算在三维空间中的坐标 3、三维点标记 4、三维空间点的增删,设计测量模式的UI 5、添加了表格的数据增删 6、调试二次加载的BUG(添加重置功能) 7、裁剪功能的图像导入与滑条索引 8、优化:测量数据不可编辑 9、路径编码问题 10、实现裁剪功能(需要OpenCV) 11、增加导出裁剪图像时显示进度条的功能,由于VTK图像读取在内部完成,实现进度条功能相对复杂,暂未实现。 12、裸数据(二进制)裁剪 13、三维切面默认不显示 14、背景默认为黑色 15、bin文件读取增加自动读取config文件,确定宽高参数 16、裁剪后可直接读入到三维体绘制中,仍保留裁剪后保存的功能 17、三维体绘制的切面改为半透明 18、经测试,裁剪后读入(内存读入)出现了内存泄漏的问题,获取每一层的指针,解决了这个问题 19、解决进度条出现了假死的情况 20、解决选择文件夹为空的崩溃问题 21、实现对话框裁剪序列图像 22、在MainWindow中声明CropSequenceDialog为友元类,CropSequenceDialog则可以直接访问MainWindow的成员(包括私有)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值