andycong 发表于 2003-12-26 13:58:00

[ARX]我建立了一个选择集,如何从选择集中遍历实体?

我想为这些实体都附上扩展数据,所以要这样做。谢谢!

victory 发表于 2003-12-26 15:49:00

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);//别忘了释放选择集。

中国虫 发表于 2003-12-26 19:38:00

victory发表于2003-12-26 15:49:00static/image/common/back.giflong ssname;//选择集
acedSSGet("A",NULL,NULL,NULL,ssname);

long n=0;//在每次使用acedSSLength()之前,必须要赋零;
acedSSLength(ssname,&n);

long entname;
whi


对楼上的代码稍作一点附加说明,最严谨的做法应判断acedSS系列函数的返回值,如果acedSSGet返回RTNORM,才能调用acedSSLength,而acedSSLength返回RTNORM才能使用取得的实体个数(也就是说是否先置为0并不重要)。
其实ARX很多函数都应该判断是否成功的,以前的ADS函数(现在以aced、acut、acdb等打头的函数)都是以返回RTNORM/RTNONE/RTERROR/...为判断依据,而ARX则是以返回值是否为Acad::eOk/...为判断依据。

leeyeafu 发表于 2003-12-26 21:26:00

再补充一点

二楼的代码中使用的while循环不是好的编程习惯。事实上,也没有必要让n递减。
可以这样构造循环:
for(long i=0;i<n;i++)
{
    if(acedSSName(ssname, i, entname) == RTNORM)
      
    //循环体内还有很多工作要做,例如用acdbOpenObject()打开选择集中的对象
    //然后才能附加扩展数据
}

victory 发表于 2003-12-27 13:14:00

很好!
第三楼的说的好!以前从SDK里的例子里看到对返回值都没有判断,只是通过长度来判断。如果不赋零,没有实体时会返回一个-0,即一个很大的数。
至于第四楼说的,本人的确不敢苟同!

中国虫 发表于 2003-12-27 21:10:00

说到这里就再对ADESK的SDK提供的例子多说两句:
不能照搬其中的例子,其中内存该释放没释放的有,帮助中明确说了该此做法的丫却彼做法的有,一句话能完成偏有用N句话完成的有等等。对最后这种情况可以举个例子,从R12开始ADESK提供的构造过滤resbuf办法就是resbuf rb1,rb2..rbn,然后用rbnext串起来,其实一个acutBuildList/ads_buildlist就搞掂的,现在不少朋友还在用sdk提供的方法在干。
另外SDK提供的例子,对象层次结构也差,ADESK的SDK示例肯定不是大拿在做,而是让一些N把刀对付的,这一点MS就做得很好,远比Borland、Sun等做得好。

victory 发表于 2003-12-28 00:55:00

SDK里的有些例子的确是有缺陷,但如果你连SDK里的东西都没看完,或是理解到,有怎么能知道好与坏!难道去买本书,书上写的都是SDK的翻译版。我买了一本书,前几章介绍了ADS,LISP,DCL,如何使用VC环境,接着介绍了ADSRX,数据访问,MFC的使用(给出的例子和SDK里的一样),最后用了三分之一的篇幅介绍了ADS和ARX的新旧函数对照,参数以及函数功能,还把CLASS给一一罗列出来!!!当我花了点时间看完SDK后才有点后悔,不过这也是我买的有关这方面的最后一本书!看书不是看死书,好与坏各人自有自己的见解,其中的取舍,各有各的不同!
至于编程习惯的问题,各有各的见解。比如大家都熟悉的匈牙利表示法,在MS的框架上MS的程序员说可能好用,但UNIX的程序员却说它是一塌糊涂!为什么?在“代码中使用的while循环不是好的编程习惯”,哪为什么又要提供while这个关键字,还有do...while...,goto这些?为什么非要用for而多定义一个变量?

中国虫 发表于 2003-12-28 08:53:00

完全你说的这些等我有空专门写些文字讨论吧

leeyeafu 发表于 2003-12-28 11:20:00

循环构造的编程风格

首先,所谓“编程风格”,愚以为是大多数编程者所认同的一种程序代码书写格式。程序不仅仅是写给计算机的,也是写给编程者本人的,更是写给更多的其他编程者看的。所以说,好的程序应该是编程者自己和其他编程者都能比较轻松读懂的。只有在这一点上获得共识,与victory朋友之间关于while循环和for循环的讨论才有意义。
匈牙利命名法与UNIX命名法都是大多数编程者所认同的,因此都是好的编程风格。不过在同一个程序中两种命名法混合使用就不应该是好的编程风格,至少我个人这么认为。
我个人认为,大多数编程者以为,while循环需要在循环内部修改循环条件,从而比for循环更为灵活,C++保留while关键字应该就是为了这个灵活性,若for循环不能或者不能用可读性好的方法构造时,使用while循环能改善程序的可读性甚至提高代码质量。所以,大多数编程者看到while循环,首先想到可能有较为复杂的循环条件,或者确实需要在循环内部修改循环条件。二楼的代码看上去很短,自然不会误解while循环的用途,但实际上完整代码,这个while循环并不会很短,阅读这段代码时我会时刻注意循环内部是否会修改循环条件,这对于代码阅读者来说是多余的负担。当然,for循环以在循环内部修改循环条件,但这不是好的编程风格,我想这个结论是大多数人能接受的。
至于多使用了一个变量i,我曾经想这样构造for循环:
for(; n>=0; n--)
但这个循环可能会工作得不是很好。
首先,acedSSName()函数的第二个参数是从0开始的(二楼的代码忽视了这个问题,从而少浏览了一个对象),由于变量n是long类型,当循环执行到n == 0后再执行n--时,n可能会个很大的数(当n是unsigned类型时,这成了必然,但如何保证用户不会将它声明为unsigned long呢?),从而不能正确退出循环。要避免这个可能存在的程序隐患,我个人以为,四楼的for循环构造方式也许是较为简便的。
说明一下,以上说法未经实际编程验证,正确与否,victory朋友还可以继续讨论。
我在四楼很多问题没说清楚,最后向victory朋友致歉。

leeyeafu 发表于 2003-12-28 15:27:00

再向victory朋友致歉,二楼的代码是正确的,且利用while循环巧妙地解决了0-1>0的错误。
少用一个long变量,在程序效率与可读性之间如何取舍,我也不清楚了,也许编程时我也会用while循环,因为它的灵活性决定:可以在循环内部根据需要决定修改循环条件的时机。
页: [1] 2
查看完整版本: [ARX]我建立了一个选择集,如何从选择集中遍历实体?