找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1084|回复: 11

[求助]:请各位高手看看这段程序

[复制链接]
发表于 2003-5-15 11:35:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
BeginEditorCommand();
  
  ads_name ssName;

  acedSSGet(NULL, NULL, NULL, NULL, ssName);

  long length;
  AcDbObjectId objId;
  AcDbObject* pObj;

  acedSSLength(ssName, &length);
  for (int i = 0; i < length; i++)
  {
    ads_name ent;
    acedSSName(ssName, i, ent);
    acdbGetObjectId(objId, ent);
   
    acdbOpenObject(pObj, objId, AcDb::kForWrite);

    ((AcDbLine*)pObj)->setColorIndex(1);

    pObj->close();
  }
  acedSSFree(ssName);

  CompleteEditorCommand();

本段代码主要是通过用鼠标选择一个范围内的实体,然后将被选中的所有实体变成红色。

基本功能已经实现了,一、不过在执行acedSSGet(NULL, NULL, NULL, NULL, ssName);时,用鼠标选定范围后还要点回车进行确认,又没有什么方法可以不用手工去确认,就是选择完范围就可以直接进行下面的操作,无需再点回车确认。二、setColorIndex(1);执行完后并没有马上变色,总是要等到再执行点别的什么操作的时候譬如再重新选择线的时候才变色,又没有什么方法能够立即变色呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-5-15 14:13:20 | 显示全部楼层
1、用acedSSGet(NULL, NULL, NULL, NULL, ssName);是提示你连续选择,得自己回车进行确认。按你的要求最好用acedSSGet("W", NULL, NULL, NULL, ssName);或acedSSGet("C", NULL, NULL, NULL, ssName);等,自己看一下acedSSGet的具体用法。
2、这是显示的问题,循环结束后用REGEN命令刷新一下即可。
3、提示:for (int i = 0; i < length; i++)一句中,变量i 应定义为long
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-15 22:56:03 | 显示全部楼层
千万不要用REGEN命令,否则,图形较大时,重画时间太长;
我的方法是:先定义任意点Point,然后PAN命令,从Point到Point,
Acad会很听话的重画,而且重画时间十分短。

此外,定义AcDbObject* pObj   ,是否应使用AcDbEntity;
而且不需要用(AcDBLine *) pObj->setColorIndex();
由于使用了AcDbEntity;直接pObj->setColorIndex();即可。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-5-15 23:03:39 | 显示全部楼层
最初由 xb4270293 发布
[B]千万不要用REGEN命令,否则,图形较大时,重画时间太长;
我的方法是:先定义任意点Point,然后PAN命令,从Point到Point,
Acad会很听话的重画,而且重画时间十分短。

此外,定义AcDbObject* pObj   ,是否应使... [/B]


可以用现成的:acedUpdateDispaly() 刷新屏幕的。

此外,如果要强制刷新(生成)一个指定的实体,可以用:
acdbOpenObject(pEnt,id,AcDb::kForWrite);
pEnt->recordGraphicsModified();
pEnt->close();
....

AcTransactionManager::flushGraphics();
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-15 23:07:53 | 显示全部楼层
不好意思,R14过来的人,没有试过acedUpdateDispaly() 刷新屏幕,我遇到过这样的问题,
由于程序中打开和关闭了图层,图形很大时,刷新屏幕的时间十分长,不知acedUpdateDispaly()
好不好用,速度如何。我想ACAD需要刷新显示列表,图形较大时,很可能会需要大量的数据库访问时间。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-5-15 23:09:02 | 显示全部楼层

Re: [求助]:请各位高手看看这段程序

最初由 saintlzh 发布
[B]BeginEditorCommand();
  
  ads_name ssName;

  acedSSGet(NULL, NULL, NULL, NULL, ssName);

  long length;
  AcDbObjectId objId;
  AcDbObject* pObj;

  acedSSLength(ssName, &length);
  fo... [/B]


不能马上变色,是由于ssget 除了X 外,操作是显示表结构,而你的实体并没有刷新到显示表里面,所以要先刷新下显示表,可以用我上面帖子的方法,在循环里面将每个实体recordGraphicsModified(); 这样记录后,程序结束的时候用AcTransactionManager::flushGraphics();强制实体生成。

或者直接使用acedUpdateDisplay()函数,刷新显示表。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-5-15 23:17:29 | 显示全部楼层
最初由 xb4270293 发布
[B]不好意思,R14过来的人,没有试过acedUpdateDispaly() 刷新屏幕,我遇到过这样的问题,
由于程序中打开和关闭了图层,图形很大时,刷新屏幕的时间十分长,不知acedUpdateDispaly()
好不好用,速度如何。我想ACAD?.. [/B]


放心使用,ACAD的REDRAW命令,底层就是调用的它。而且维护的是显示表,不是整个数据库实体。显示表 dispaly list 就是为了加快SSGET构建选择集和显示实体到屏幕而维护的一个高速的图形CACHE。

另外,已经测试过,遍历整个几十万实体数据库的时间,仅仅是0.01秒内。ARX遍历数据库的时间要比ssget x 方法要快一个数量级,这个论坛以前讨论过,给过测试结果的。所以要遍历整个数据库,用ssget 比 ARX要慢很多。

还有,就是给需要的对象做标记,ACAD看到标记后recordGraphicsModified(); ,即使实体没有被编辑,也会自动更新这些实体。通过这个,就可以刷新屏幕内的部分实体到显示表。

ARX是最底层的接口,所有的ACAD命令都是最终通过ARX来完成的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-15 23:24:27 | 显示全部楼层
而且维护的是显示表,不是整个数据库实体。
问题来了,如果图层原来是关闭的,程序将其打开,图层中的实体本不在显示表中,需要重刷新显示表,就必须acedUpdateDispaly() 刷新屏幕。
此外,我没有看明白,程序中必须为每个已修改的实体都设置标志之后,acedUpdateDispaly() 刷新屏幕才有效吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-5-15 23:39:26 | 显示全部楼层
最初由 xb4270293 发布
[B]而且维护的是显示表,不是整个数据库实体。
问题来了,如果图层原来是关闭的,程序将其打开,图层中的实体本不在显示表中,需要重刷新显示表,就必须acedUpdateDispaly() 刷新屏幕。
此外,我没有看明白,程序中必... [/B]


acedUpdateDispaly() 单独用,刷新的是整个屏幕,相当于ads_command(RTSTR,"redraw",0);
但是比命令快的多。

做标记的方法,以后需要的时候,用AcTransactionManager::flushGraphics () 刷新,这个方法只对实体做recordGraphicsModified()的作用。
如果要是在一些事务处理里面的实体(包括嵌套的事务),用这个方法前,先要调用:AcTransactionManager::queueForGraphicsFlush()

  1. <normalfont>
  2. AcTransactionManager::flushGraphics Function virtual void

  3. flushGraphics() = 0;

  4. Flushes the graphics queue to the display.

  5. Normally an entity's graphics are not updated until the entity's changes are committed.
  6. In the transaction environment this doesn't occur until the outermost transaction (or,
  7. if there are no nested transactions, then the single transaction itself) is ended,
  8. so the graphics for all entities in the transactions are not updated until the outermost transaction ends.
  9. If a graphics update is desired before the outermost transaction is ended, then the
  10. queueForGraphicsFlush() function should be called to queue up all changes made
  11. so far followed by a flushGraphics() call to flush all graphics currently queued up out to the display.

  12. </normalfont>
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-15 23:47:46 | 显示全部楼层
有没有直接操纵显示表的函数。可以更加深入地理解和使用。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-5-21 15:57:36 | 显示全部楼层
谢谢楼上的各位高手,不过2楼说acedSSGet("W", NULL, NULL, NULL, ssName);  可以达到我的要求,可是试了一下,提示(应用程序错误,ssget w/c 需要两个点),请指点。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-23 10:27:13 | 显示全部楼层
这样会好些:

acdbOpenObject(pObj, objId, AcDb::kForWrite);

((AcDbLine*)pObj)->setColorIndex(1);
((AcDbLine*)pObj)->draw();
pObj->close();
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-15 00:56 , Processed in 0.220106 second(s), 53 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表