2008-09-15
(一)、前言
之前学校的时候采用
VS2005
、
C++
方式开发
VTK
程序,此前在博客上写过一篇
VTK
开发指南一文;之后现在工作后越发发现原来如果抛弃底层的数据计算,使用
C#
语言开发
VTK
程序将是极其简单的一件事。可以说就基于
VTK
的程序开发效率而言,
C#
的开发效率较
C++
高好几倍。主要表现为:
(1)
更方便的搭建应用程序框架(
Form
编程代替了
MFC
的界面编程);
(2)
更方便的进行对象生成、销毁管理(
C#
的垃圾回收机制);
(3)
VTK
的
Dot Net Wrapper
封装使得
VTK
编程更为便捷,只需简单使用
“using vtk;”
,完成了
C++
的所有哦的
including
头文件操作;
(4)
更加方便的窗口消息截取,得益于
C# Form
;
下面将介绍如何在
.Net C#
环境下进行
VTK
应用程序开发:
(二)、准备工作:
1
.
下载
.NET Wrappers for VTK 5
| ||||
|
6664545
|
i386
| ||
|
18104898
|
i386
| ||
|
10781075
|
i386
| ||
|
10942984
|
Platform-Independent
|
其中,
VTK-5.0.1-control-1.1.zip , VTK-5.0.1-wrap-1.1-bin.zip
这两个文件是必须的,前者包含了
vtkFormsWindow.dll
,
在
.Net
下的
Form
编程使用;后者则包含了
VTK
的
.Net
下的包装的
Dll
库文件。
bin
目录下包含了已经编译好的
.Net
下的
Dll
文件,以及非托管的
Dll
链接库文件;
include
目录下包含了
C++
环境下
VTK
开发所需的头文件;
lib
目录下包含了
C++
环境下开发所有的
Lib
库文件。
本文主要讨论的是
.Net
下的
VTK
开发,因此只需把
bin
目录下
类似于
*DotNet.dll
文件拷贝到
C:/Windows
目录或者你的工程的运行目录下即可。
3. VS2005
的设置
新建
C# From Application
程序,在工程的
References
上点击右键选择
Add Reference..
,如下图所示:
选择
Browse
,在
File Name
中输入输入
Filter Name, *DotNet.dll
只显示
VTK
的
.Net Wrapper
文件,为了方便可将所有的
*DotNet.dll
文件选择并添加到
References
中
在
Toolbox
中点击右键,选择
Choose Items…
选择
Browse
,
选择
vtkFormsWindow.dll
文件,
至此,在
Toolbox
中已经完成添加了
vtkFormsWindowControl
控件了。
(三)、例子
从
Toolbox
中把
vtkFormsWindowControl
拖到
Form
中,如下图所示:
至此,
VS
会自动在
Form Code
中添加
private
vtk.vtkFormsWindowControl vtkFormsWindowControl1;
总的而言,
VTK
在
.Net
下的开发与
C++
极为相似,都是通过
VTK Rendering Pipeline
实现的,所不同的是在
C++
中你需要关心何时销毁生成的对象,而在
C#
中这一步由
C#
的垃圾回收机制帮你完成了。
例子代码如下:
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Text;
using
System.Windows.Forms;
using
vtk;
namespace
vtkTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
vtkEarthSource source = new vtkEarthSource();
vtkPolyDataMapper map = new vtkPolyDataMapper();
vtkActor actor = new vtkActor();
vtkRenderer ren = new vtkRenderer();
vtkRenderWindow win = this.vtkFormsWindowControl1.GetRenderWindow();
map.SetInput(source.GetOutput());
actor.SetMapper(map);
ren.AddActor(actor);
ren.SetBackground(.5, .5, 1);
win.AddRenderer(ren);
}
}
}
效果如下:
另外的一个例子: