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提供了將數據緩存開或關的方法,使用計數參數來避免拷貝數據,以及當整個數據不能裝入內存時將數據流分塊的方法(建議參考第四章可視化工具箱內容得到更多的信息)。

相關文章
相關標籤/搜索