乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 67|回复: 4

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

[复制链接]

3

主题

6

帖子

1

银币

初来乍到

Rank: 1

铜币
18
发表于 2003-12-26 13:58:00 | 显示全部楼层 |阅读模式
我想为这些实体都附上扩展数据,所以要这样做。谢谢!
回复

使用道具 举报

2

主题

35

帖子

4

银币

初来乍到

Rank: 1

铜币
43
发表于 2003-12-26 15:49:00 | 显示全部楼层
long ssname[2];//选择集
acedSSGet("A",NULL,NULL,NULL,ssname);
long n=0;//在每次使用acedSSLength()之前,必须要赋零;
acedSSLength(ssname,&n);
long entname[2];
while(n>0)
{
   n--;
   acedSSName(ssname,n,entname);
   //entname为选择集里的实体。
}
acedSSFree(ssname);//别忘了释放选择集。
回复

使用道具 举报

4

主题

72

帖子

2

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
88
发表于 2003-12-26 19:38:00 | 显示全部楼层

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

使用道具 举报

14

主题

230

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
286
发表于 2003-12-26 21:26:00 | 显示全部楼层
二楼的代码中使用的while循环不是好的编程习惯。事实上,也没有必要让n递减。
可以这样构造循环:
for(long i=0;i=0; n--)
但这个循环可能会工作得不是很好。
首先,acedSSName()函数的第二个参数是从0开始的(二楼的代码忽视了这个问题,从而少浏览了一个对象),由于变量n是long类型,当循环执行到n == 0后再执行n--时,n可能会个很大的数(当n是unsigned类型时,这成了必然,但如何保证用户不会将它声明为unsigned long呢?),从而不能正确退出循环。要避免这个可能存在的程序隐患,我个人以为,四楼的for循环构造方式也许是较为简便的。
说明一下,以上说法未经实际编程验证,正确与否,victory朋友还可以继续讨论。
我在四楼很多问题没说清楚,最后向victory朋友致歉。
回复

使用道具 举报

2

主题

35

帖子

4

银币

初来乍到

Rank: 1

铜币
43
发表于 2003-12-27 13:14:00 | 显示全部楼层
再向victory朋友致歉,二楼的代码是正确的,且利用while循环巧妙地解决了0-1>0的错误。
少用一个long变量,在程序效率与可读性之间如何取舍,我也不清楚了,也许编程时我也会用while循环,因为它的灵活性决定:可以在循环内部根据需要决定修改循环条件的时机。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-4 14:51 , Processed in 0.202696 second(s), 62 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表