1.vtk filter 的编写要遵循以下几个原则:
从不修改输入数据:数据是静态的,修改了输入,其它滤波器也用这个输入数据,则会出问题。(因为数据会很大,应该用的都是同一份数据)
相关计算数据:不要复制,内存消耗会很大。
使用调试宏:当设置了对象的调试标记时,滤波器应该提供调试信息。使用在VTK/Commom/vtkSetGet.h中定义的VTK 的调试宏很方便。
取消/删除已分配的内存:滤波器写入器的一个共同的不足是引入了内存泄漏或者使用了额外的内存。通过对所有的VTK 对象成对地使用New()和Delete()方法来避免内存泄漏,而且new 和delete 方法适用于所有的固有的或者non-VTK 对象。其它降低内存使用的方法是使用所有数据对象都支持的Squeeze()方法。这个方法收回了一个对象可能在使用的额外内存。当只能估计数据对象的规模时使用Squeeze()方法。
写一个滤波器的诀窍是保证它被修改过的时间被适当地管理。你可能会记起, 被修改过的时间是每个对象包括的,与它内部状态有关的一个内部时间标签。Set
通常,一个滤波器被修改过的时间不需要干涉就可以维持。例如,如果你使用VTK/Commom/vtkSetGet.h 中定义的vtkSet/Get 宏来得到和设置实例变量值,被修改过的时间被适当地管理,而且继承方法vtkObject::GetMTime()返回正确的值。可是,如果你定义你自己的Set__()方法,或者包括了修改了对象内部状态的方法,你必须要在滤波器上调用Modified()(i.e,改变内部的修改时间)。而且,如果你的对象定义包括其它对象的相关,滤波器正确的修改过的时间包括滤波器和它依靠的对象。这需要重载GetMTime()方法。
一个对象的修改时间是其依赖的所有的对象的修改时间的最大值。
ProgressEvent 和AbortExecute:
ProgressEvent :反映filter执行的进度的类(例如进度条)。但是有些filter很难得到具体进度,这时通常会选择更新算法上关键点的滤波器
AbortExecute: 用于停止滤波器执行的一个标记当设置时,某些滤波器会中止它们的执行,向它们的输出发送它们执行结果(可能什么也没有)的某些部分
一个重要的指导原则:作为一个滤波器的实施者你不想过多地调用进程方法因为他们能够影响全部的执行。
2.如何写一个图象滤波器:
首先要考虑这个filter:
1. 源自哪个父类
2. 如何适当地安排被修改的时间,包括重载 GetMTime()方法和调用Modified();
3. 如何重载由流水线执行过程定义的方法
4. Execute()方法的创建//执行方法就是主方法?
5. 是否支持 Progress()和Abort()方法。
6. 滤波器实施所需要的实例变量,结构,或者方法。
简单filter:
简单滤波器是显示了典型行为的滤波器。这意味着它们有一个输入和/或输出,支持输入和输出数据类型的常用的结合,而且不需要重载GetMTime()方法。其关键点就是找到合适的抽象父类。
如果这个filter的作用是源,