Activiz 使用笔记-3 数据源(1)

activiz自己自带的user guide 比较简单,因此我按着vtk的user guide来慢慢学。从简单例子入手去学习VTK。固然我以前已经看过不少VTK相关的东西了,可是没有本身去写去总结,致使我一段时间不用就忘记了。因此此次写博客就从简单的开始,一步一步写下来。记录本身的学习过程。web

不过,(⊙﹏⊙)b 我英文不太好,因此是看中文版的来学习的。参考的是这一本:算法

http://wenku.baidu.com/link?url=O2vrMU-8PIQM4aHYqLVM6ABSNucK_GLBrU3vWAa0gy1qvWYk71zEjroGgarFF3yY5n3g3CkeswB42IUnts1lqcWa6w8iFFclHomv312FHA_
c#

有须要的小伙伴们能够本身下载。缓存

《VTK用户手册》 P20app

VTK 创建应用程序的基本过程以下:ide

1) 读取/生成数据工具

2)过滤数据学习

3) 绘制图形网站

4) 交互操做ui


VTK 提供了两种获取数据的方法,一种是读取已经存在的数据文件,另外一种是经过算法或数学表达式生成数据。

在可视化流水线中起始节点对象被称为源对象,源对象又被分为程序源对象、读源对象,经过数学方法生成数据的对象称为程序源对象,从数据文件中读取数据的对象被称为读源对象。

首先,作一个程序源对象的读取:

(额,在写代码以前的如何添加引用和添加renderwindowcontrol到工具栏就再也不重复了,直接进入代码阶段)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Kitware.VTK;

namespace test1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void renderWindowControl1_Load(object sender, EventArgs e)
        {
            //vtkCylinderSource cylinder = new vtkCylinderSource();
            vtkCylinderSource cylinder = vtkCylinderSource.New();//建立圆柱体

            cylinder.SetResolution(8);//生成圆柱体多边形的数目

            vtkPolyDataMapper mymapper = vtkPolyDataMapper.New();//建立映射器对象

            mymapper.SetInput(cylinder.GetOutput());//圆柱体的输出做为映射器的输入

            vtkLODActor myactor = vtkLODActor.New();//建立演员对象

            myactor.SetMapper(mymapper);//为演员对象设置映射器

            myactor.GetProperty().SetDiffuseColor(1.0,1.0,1.0);//设定颜色

            vtkRenderer ren1 = renderWindowControl1.RenderWindow.GetRenderers().GetFirstRenderer();//获取renderwindowcontrol的绘制者

            vtkRenderWindow renwin = renderWindowControl1.RenderWindow;//获取renderwindowcontrol的绘制窗口


            ren1.AddActor(myactor);//为绘制者(我感受能够翻译为渲染器)添加演员

            renwin.SetSize(520,520);//设定窗口的大小


            vtkRenderWindowInteractor iren = renderWindowControl1.RenderWindow.GetInteractor();//获取交互器
            iren.Start();//开始交互

            vtkCamera camera = ren1.GetActiveCamera();//获取活动的相机

            ren1.ResetCamera();


        }

        
    }
}

运行效果:

 ̄へ ̄,上面的代码有点小问题,就是程序一运行的时候,柱体有点大,估计是个人相机没有设置好。

后面等看到了相机再说吧,也但愿能有高手指点一下,我相机的一些操做还不是特别熟。


好了下面作一个 读源对象的例子:

这个书上给的例子好简单,我本身在vtk的例子网站上找了一个,读取dicom序列文件的。下面用activiz实现一下。

例子的网址:

http://www.vtk.org/Wiki/VTK/Examples/Cxx/IO/ReadDICOM

下面是本身的实现:

(一样前面的添加引用和添加renderwinowcontrol就不讲了,能够按照第一篇笔记添加上。)

using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Kitware.VTK;

namespace test2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btn_openfile_Click(object sender, EventArgs e)
        {

            OpenFileDialog openDicomImage = new OpenFileDialog();
            openDicomImage.Filter = "DICOM文件|*.dcm";
            if(openDicomImage.ShowDialog()==DialogResult.OK)
            {
                vtkDICOMImageReader reader = vtkDICOMImageReader.New();
                reader.SetFileName(openDicomImage.FileName);

                reader.Update();

                vtkImageViewer2 view = vtkImageViewer2.New();
                

                view.SetInputConnection(reader.GetOutputPort());
                view.SetRenderWindow(renderWindowControl1.RenderWindow);
                view.SetRenderer(renderWindowControl1.RenderWindow.GetRenderers().GetFirstRenderer());
               

                view.Render();
                view.GetRenderer().ResetCamera();
                view.Render();

                view.SetupInteractor(renderWindowControl1.RenderWindow.GetInteractor());
                renderWindowControl1.RenderWindow.GetInteractor().Start();

            }

        }
    }
}

实现效果:

(能够实现交互调节窗宽窗位)


上面两个数据源的读取例子写完了,得加上点理论知识才显得高大上啊!下面是我以前学VTK的时候作的笔记,贴在下面,尽可能记得来源的就加上来源,不记得的若是有侵权,请告诉我一声我删掉。

VTK 流水线机制:

来源:http://wenku.baidu.com/link?url=Uu2YEG2QWZRveogQVbe0wS3ZHWvycVVxgBJcqcYJsQ62Xbab39pvn_l51JEC2OoGKRG3QrWOSr-nnwaYDGbGxWXHgKjWNypALWGaoYYxMRG#


以上基本对应以前讲的VTK 创建应用程序的基本过程,也和咱们以前作的两个小例子相对应,固然前面的两个小例子比较简单,没有涉及到filter。

可视化模型图形流水线的角色是将图形数据变换成图片,可视化流水线是将信息变换成图形数据。换句话说,可视化流水线负责几何表达,而后由图形流水线来绘制。VTK使用数据流方法将信息变换成图形数据,在这个方法中涉及两个基本对象类型。vtkDataObject 数据对象vtkProcessObject处理对象(过程对象?)数据对象表示各类类型的数据,

vtkDataObject能够当作是通用的“blob”数据(blob数据类型的列能够存储大型二进制对象,如图形、视频和声音等。具备正式结构的数据称为数据集(DataSet类)。

处理对象也常指滤波器,做用于数据对象,产生新的数据对象(注意这里与Mapper的不一样,滤波器读取的是数据对象,产生的是新的数据对象。而mapper读取的是数据对象,产生的是图形对象(图形对象是什么呢?看下面总结的九种图形对象

http://blog.csdn.net/williamyk/article/details/6014276

vtkMapper指定了渲染数据和图形库中基本图元之间的联系)。处理对象表示系统的算法。处理对象和数据对象经过可视化流水线相连(数据流网)

关于构建可视化流水线有一些重要的问题,简要在这里介绍一下。首先,流水线拓扑结构由方法变化而构成

A Filter->SetInput (anotherFilter->GetOutput());

这些方法将一个过滤器的输出做为另外一个过滤器的输入(具备多输入和输出的过滤器相似)。其次,必须创建一个机制来控制流水线的执行,仅执行那些流水线的必要部分,产生输出的更新。可视化工具箱使用一个懒评估(惰性赋值这个翻译更贴切一些)方案(当数据被请求时才执行),依据每一个对象内部修改时间。第三,流水线组装仅须要那些兼容的对象,使用SetInput() GetOutput()方法能与其它对象很好地结合在一块儿。在VTK中,C++编译时类型检查强迫作到这一点。最后,咱们必须决定一旦流水线执行,数据对象是否须要缓存或保留。因为可视化数据集至关大,如何成功应用VTK工具至关重要。VTK提供了将数据缓存开或关的方法,使用计数参数来避免拷贝数据,以及当整个数据不能装入内存时将数据流分块的方法(建议参考第四章可视化工具箱内容得到更多的信息)。

相关文章
相关标签/搜索