vtkdesigner是一款提供vtk的pipeline可视化编辑软件,有了它,就不需要自己再用程序去组合各种复杂的pipeline,而只需要拖动一下鼠标建立一个pipeline,并且设置一些参数,就可以立即观察到其效果了,vtkdesigner的下载页面是这里:http://vtkdesigner.sourceforge.net
从一开始接触到vtk开始,我就希望能够用vtkdesigner来帮助学习,但是它的使用却实在不怎么方便,官方网站上只有下载sourcecode,而没有预编译的版本,之前我在Redhat9和Redhat AS3上的编译全部以失败告终,具体编译时出现哪些错误信息现在已经记不得了。
后来尝试在Windows上编译,vtkdesigner虽然是使用vtk和qt进行开发的,但是官方网站上却没有说明其是否可以在Windows上进行编译,死马当活马医了。。。经过N番努力,编译初见成效,但是到最后关头,发现我使用的QT版本竟然不支持QGL(即QT对OpenGL的封装),所以还是以失败告终了,期间我也尝试过向Trolltech申请试用版的QT,可是他们竟然告诉我无法向我提供企业版,只能去下载不支持QGL的简化试用版,唉,可恨的Trolltech。
不管怎么样,还是把我在Windows下编译的过程记录一下吧:
1)准备QT,我使用的是QT企业版,版本为QT334,(可惜,其中没有QGL),将QT的bin目录加入系统Path,将QT的include,lib和bin路径分别加入VC的环境变量中。
2)安装CMake,从http://www.kitware.com有Windows下的安装版,下载后安装即可。
3)下载VTK,还是从http://www.kitware.com,我使用的是VTK4.2,用CMake生成VTK的VC工程dsw文件,使用的是ShareLibrary,Debug模式,进行编译,很顺利的编译完成了,将VTK/bin/debug目录加入系统的Path环境中。
4)下载vtkdesigner,我下载的版本是1.0.3,使用CMake生成其VC的工程文件,期间会提示QT_QT_LIBRARY变量没有定义,此时选则继续,然后选择“Show Advanced Values”,并将该变量设置为:"QT/lib/qt-mt334.lib"(即你使用的QT的lib文件)。
5)开始编译vtkdesigner,编译vtkCommon.dsp时出现link错误,此时打开Project Settings,在link library中加入“vtkRendering.lib vtkGraphics.lib vtkImaging.lib vtkIO.lib vtkFiltering.lib vtkCommon.lib vtkftg1.lib glu32.lib opengl32.lib vtkfreetype.lib vtkpng.lib vtktiff.lib vtkzlib.lib vtkjpeg.lib vtkexpat.lib”
6)继续编译,此时提示“C2733”错误,msdn上家是为“second C link of overloaded function 'function' not allowed”,疑为一个行数名称与Windows API行数同名了,修改CvtkExtraProperty.h,CvtkExtraProperty.cpp,CvtkObject.cpp,将其中的RegistClass()和UnregisterClass()名称改掉(如:后面加字符B)。
7)继续编译,vtkdCommon顺利编译通过,vtkdWrapper的Link时,提示无法找到vtkdCommon.lib文件安,回头查看vtkdCommon.dll,发现竟然没有export函数表,估计是export行数没有定义,导致编译器没有为其生成lib文件,修改vtkdCommon:
a)修改CCalculator.h:class __declspec(dllexport) CCalculator
b)修改CDlgPtr.h:class __declspec(dllexport) CDlgPtr : public QByteArray
c)修改CComplexProperty.h:
__declspec(dllexport) QString vtkLightCollectionToString(vtkLightCollection* col);
__declspec(dllexport) void stringToVtkLightCollection(vtkLightCollection* col, const QString &string);
__declspec(dllexport) QString vtkLightToString(vtkLight* light);
__declspec(dllexport) QString vtkPropertyToString(vtkProperty* prop);
__declspec(dllexport) vtkLight* stringToVtkLight(const QString &string);
__declspec(dllexport) vtkProperty* stringToVtkProperty(const QString &string);
__declspec(dllexport) void setField(QString &str, int field, const QString &data);
__declspec(dllexport) QString getField(const QString& str, int field);
__declspec(dllexport) QString pullChars(const QString &str, int length);
__declspec(dllexport) QByteArray byteArray(const QString str);
8)继续编译,vtkCommon.dll正确生成了,导出函数表这次也对了,编译到vtkdWrappers时,还是link错误:
???中...
?????? D:\vtkdesigner\build\bin\vtkd\Debug/vtkdWrappers.lib と???????? D:\vtkdesigner\build\bin\vtkd\Debug/vtkdWrappers.exp を作成中
CVtkRenderWindow.obj : error LNK2001: 外部????? ""public: void __thiscall CVtkQtRenderWindow::setFocusSignal(bool)" (?setFocusSignal@CVtkQtRenderWindow@@QAEX_N@Z)" は未解決です
CVtkRenderWindow.obj : error LNK2001: 外部????? ""public: static class CVtkQtRenderWindow * __cdecl CVtkQtRenderWindow::New(void)" (?New@CVtkQtRenderWindow@@SAPAV1@XZ)" は未解決です
CVtkRenderWindow.obj : error LNK2001: 外部????? ""public: void __thiscall CVtkQtRenderWindowInteractor::SetRenderWindow(class CVtkQtRenderWindow *)" (?SetRenderWindow@CVtkQtRenderWindowInteractor@@QAEXPAVCVtkQtRenderWindow@@@Z)" は未解決です
CVtkRenderWindow.obj : error LNK2001: 外部????? ""public: __thiscall CVtkQtRenderWindowInteractor::CVtkQtRenderWindowInteractor(void)" (??0CVtkQtRenderWindowInteractor@@QAE@XZ)" は未解決です
D:\vtkdesigner\build\bin\vtkd\Debug/vtkdWrappers.dll : fatal error LNK1120: 外部参照 4 が未解決です。
link.exe の実行???
发现是CVtkQtRenderWindow类没有实现导出,偷懒一点了,直接将CVtkQtRenderWindow.h,CVtkQtRenderWindow.cpp,CVtkQtRenderWindowInteractor.h,CVtkQtRenderWindowInteractor.cpp四个文件加入到vtkdWrapper的dsp中了,并且加上对moc的调用,让其生成moc_CVtkQtRenderWindow.h和moc_CVtkQtRenderWindowInteractor.h两个文件,并将这两个文件也加入工程,好了再编译,这次只出现了少量Link错误,是关于QGLWidget的,这是由于我使用的QT中没有QGL的部分,如果有QGL,相信这个步骤就可以顺利通过了。
呵呵,写了半天,将Windows平台上不成功的编译过程写出来了,实在是惭愧,昨天开始又尝试在Linux上编译vtkdesigner了,并且意外的总算成功了,当然过程中还是遇到了一点困难了,也把过程写出来:
1)我用的系统是Fedora Core 3,gcc版本是3.4.2(可能对于VTK4.2来说版本太高了,所以会有编译错误的)
2)先安装CMake,接着安装VTK,但是不幸,发生了编译错误,编译器指出VTK/IO/vtkBMPReader.cxx中有一个vtkBMPReaderUpdate2的模板函数,如下:
//----------------------------------------------------------------------------
// This function reads in one data of data.
// templated to handle different data types.
template <class OT>
void vtkBMPReaderUpdate2(vtkBMPReader *self, vtkImageData *data, OT *outPtr)
{
......
}
下面有几处调用的代码,如这样:
case VTK_DOUBLE:
vtkBMPReaderUpdate2(this, data, (double *)(outPtr));
break;
编译器提示了一堆奇怪的错误,我实在是没有看懂,总之是说函数的使用不正确,我没有能力修改这样的错误,所以只好把这几处调用的地方都屏蔽了。
相比之下,以前在Redhat9和Redhat AS3上编译VTK时都没有任何问题的,按理说gcc的重大改变是发生在4.0时的,那时候才出现了一些和旧代码的不兼容问题,而我用的还是旧的gcc啊,所以也实在搞不明白。
后来又发生了一个类似的编译错误,是在vtkImageReader.cxx中,也是这么一个模板函数:vtkTemplateMacro4(...),就索性又把它注释掉了。还好,后来就再也没有这样的错误了,怀疑这两处是同一个作者写的,风格竟然如此相似,还一起出错。。。郁闷
3)VTK顺利编译通过了,开始编译vtkdesigner了,我使用的是vtkdesigner1.0.3版,先将其解压缩在任意目录下,然后编辑该用户的.bashrc文件,加入以下内容:
export VTKD_HOME=/usr/local/lib/vtkd
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$VTKD_HOME:$VTKD_HOME/Plugins
export VTK_DIR=/usrt/share/VTK
4)使用cmake生成vtkdesigner的make文件,然后make,过程中发生了一个错误,发现问题是出在CPipelineElement.cpp中的这么一行:
QFont font(font());
没有看懂,就索性把它改了:
QFont font;
好编译通过了
5)make install
6)一切顺利,vtkdesigner竟然完全编译通过了,在命令行中打入vtkdesigner,期待已久的画面总算出现了,顺手按照manual画了个简单的流程图,呵呵,果然方便: