MItSelectionList::setFilter()和MItSelectionList::reset()

来源:互联网 发布:windows进程内存监控 编辑:程序博客网 时间:2024/06/16 23:02

今晚写代码中出现了一个问题,记录下来。

 

首先是所参照的没问题的代码:

 

 

当选择uv后if之间的代码块没问题的执行,

 

而几乎照搬的代码:

却根本不能迭代,调试过程发现,只有选择mesh才能迭代,但是当然的过不了if…… 我就郁闷啊。几乎一模一样的代码了,可电脑就是和我做对呢。

 

后来突然想难道是iter.reset()的问题?查了一下doc:


MStatus MItSelectionList::setFilter  ( MFn::Type  filter   )   

 

Apply a filter to the iteration. Selection items not matching the filter type will be excluded from the iteration.

 

 

 

MStatus MItSelectionList::reset  (   )   

 

Reset the iterator. If a filter has been specified then the current item will be the first selected item that matches the filter.

 

 

以前的理解一直是setFilter之后iter要迭代的序列会自动过滤掉非法的元素了,原来不是这样的,setFilter只是严格对比元素的apiType和指定的类型,不匹配的就标记为invalid,但是元素还是会迭代的,除非经过reset。

reset所做的不仅是将指针归位,还有就是去掉invalid的元素。

 

这样看来devkit里的代码其实是有问题的,虽然结果正确。setFilter之后不得不手动的验证排除,事实上只要setFilter正确然后reset,api会自动排除。

 

这个问题可能太弱智吧,本人菜鸟一只,如有错误欢迎指正。

 

还有就是mesh节点只能存储顶点的tweak,不能存uv的修改信息,如果一个mesh节点有历史,对uv的直接操作只能保存到节点中,如果直接对节点操作,一旦重新evaluate之后就浮云了。