关于acedSSGet的W模式

原创 2006年05月29日 14:14:00

    日前,电子报批系统用户反应计算速度慢,因此对系统进行了调整,在计算对象面积的时候,考虑到原来用acedSSGet("X",NULL,NULL,rb,sset)把可能相关的对象都找出来然后再去checkRelation,在图形较大的时候,可能做了很多无用的比较,因此修改为如下的形式:

  AcDbEntity *pEnt;
  AcDbExtents extents;
  if(acdbOpenObject(pEnt,m_eId,AcDb::kForRead)!=Acad::eOk) {
   return false;
  }
  pEnt->getGeomExtents(extents);
  pEnt->close();
  ads_point pt1, pt2;
  pt1[X] = extents.minPoint().x;
  pt1[Y] = extents.minPoint().y;
  pt2[X] = extents.maxPoint().x;
  pt2[Y] = extents.maxPoint().y;
  rc = acedSSGet("W", pt1, pt2, rb, sset);

    修改后,速度明显提高,在处理大文件的时候,可以得到4~5的加速度,计算时间大大缩短,就很高兴的编译发布测试了。

    谁知在试用时,用户发现经常出现计算不正确的情况,从计算结果判断,很多时候没能把图形内部对象找出来,测试时候发现,在zoom all以后,执行的结果是正确的。仔细观察了执行情况,发现问题出在acedSSGet这个函数中。

    采用"W"模式调用acedSSGet,原来是要求图层必须处于显示状态,而且查找的范围除了pt1/pt2确定的矩形外,同时还仅仅在当前窗口显示范围内进行筛选。因此,在zoom all的时候计算结果正确,但在更多的时候,函数返回的集合是不正确的。

    开始是考虑操作前先执行一次zoom all的操作,但由于命令调用先后次序关系,acDocManager->sendStringToExecute(curDoc(), "Zoom/nA/n", true, false)会在计算完成后才执行,而且考虑到zoom all以后对于大文件而言,regen的耗时也较大,就采用了另外一个方法,就是每次把当前窗口缩放到当前计算对象的范围内。增加了如下代码:

  AcGePoint2d pt2d1, pt2d2;
  pt2d1.x = extents.minPoint().x;
  pt2d1.y = extents.minPoint().y;
  pt2d2.x = extents.maxPoint().x;
  pt2d2.y = extents.maxPoint().y;
  CAcadCtrl::setView(pt2d1, pt2d2, 1.2);    //这个是自己写的函数,1.2是窗口外扩比例

    加入这段代码后,计算结果执行正确,有点小问题就是当前窗口显示范围变化了,不过对此用户暂时没有什么意见。

    执行时,随着进度条的变化,当前窗口也不断闪烁,嗯,看起来还是挺像那么回事的。

相关文章推荐

2014——迈出从5K到1W+的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问:         为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝;而自己加班加点搞到天亮还做不完。         为什么用户提出需求变更后,大...
  • singit
  • singit
  • 2016年01月25日 00:00
  • 332

迈出从3K到1W的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问:         为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝;而自己加班加点搞到天亮还做不完。         为什么用户提出需求变更后,大...

从3K升到1W的重要技能——掌握设计模式

为什么同样是程序员,大牛工资1W,而自己只能拿区区的3K?大牛显然知道一些小菜所不知道的秘密,这秘密又是什么呢? 这个秘密就是设计模式。而这23种设计模式分别是: 1.单例模式 2.工厂方法模式...

10W级数据更新操作__生产消费者模式

背景需求 最近有这么一个需求:由于本地系统信息与另一个系统数据可能不一致,两个系统有各自的独立数据库和业务,在通信过程中网络等原因,导致两者之间的关键信息有差异,因此本地数据库中可能有10W条记录...
  • ljyhust
  • ljyhust
  • 2017年07月07日 10:30
  • 190

迈出从3K到1W的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问:         为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝;而自己加班加点搞到天亮还做不完。         为什么用户提出需求变...

在FLX6410上调试88W8787的AP模式

2012-11-16 01:49 180人阅读 评论(0) 收藏 举报     88W8787是Marvell的新一代SDIO WIFI 蓝牙和FM三合一的芯片,不仅性能出众,功耗控制也做相当不...

迈出从3K到1W的重要一步——掌握设计模式

转载地址:http://blog.csdn.net/zhengzhb/article/details/7247188 IT职场的小菜经常有这样的疑问:         为什么一个相似的功能,大...

W5500EVB TCP Client模式设置说明

W5500EVB是WIZnet为了方便用户更好了解、使用W5500这款网络芯片所开发的评估板,该板采用了 STM32F103RCT6+W5500 的设计,基于 ARM 的 Cortex-M3 平台。那...

迈出从3K到1W的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问:         为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝;而自己加班加点搞到天亮还做不完。         为什么用户提出需求变...
  • yunhaiC
  • yunhaiC
  • 2012年03月13日 18:10
  • 817

TCP/IP芯片W5200掉电模式应用笔记

W5200 Power Down Mode Application Note   W5200 和W7200 都有提供两种很吸引性的功能, 就好像有掉电模式和LAN叫醒功能. 但是这两种功能不可...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于acedSSGet的W模式
举报原因:
原因补充:

(最多只允许输入30个字)