[ARX]我建立了一个选择集,如何从选择集中遍历实体?
我想为这些实体都附上扩展数据,所以要这样做。谢谢! long ssname;//选择集acedSSGet("A",NULL,NULL,NULL,ssname);
long n=0;//在每次使用acedSSLength()之前,必须要赋零;
acedSSLength(ssname,&n);
long entname;
while(n>0)
{
n--;
acedSSName(ssname,n,entname);
//entname为选择集里的实体。
}
acedSSFree(ssname);//别忘了释放选择集。
对楼上的代码稍作一点附加说明,最严谨的做法应判断acedSS系列函数的返回值,如果acedSSGet返回RTNORM,才能调用acedSSLength,而acedSSLength返回RTNORM才能使用取得的实体个数(也就是说是否先置为0并不重要)。
其实ARX很多函数都应该判断是否成功的,以前的ADS函数(现在以aced、acut、acdb等打头的函数)都是以返回RTNORM/RTNONE/RTERROR/...为判断依据,而ARX则是以返回值是否为Acad::eOk/...为判断依据。 二楼的代码中使用的while循环不是好的编程习惯。事实上,也没有必要让n递减。
可以这样构造循环:
for(long i=0;i=0; n--)
但这个循环可能会工作得不是很好。
首先,acedSSName()函数的第二个参数是从0开始的(二楼的代码忽视了这个问题,从而少浏览了一个对象),由于变量n是long类型,当循环执行到n == 0后再执行n--时,n可能会个很大的数(当n是unsigned类型时,这成了必然,但如何保证用户不会将它声明为unsigned long呢?),从而不能正确退出循环。要避免这个可能存在的程序隐患,我个人以为,四楼的for循环构造方式也许是较为简便的。
说明一下,以上说法未经实际编程验证,正确与否,victory朋友还可以继续讨论。
我在四楼很多问题没说清楚,最后向victory朋友致歉。 再向victory朋友致歉,二楼的代码是正确的,且利用while循环巧妙地解决了0-1>0的错误。
少用一个long变量,在程序效率与可读性之间如何取舍,我也不清楚了,也许编程时我也会用while循环,因为它的灵活性决定:可以在循环内部根据需要决定修改循环条件的时机。
页:
[1]