关于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是窗口外扩比例

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

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

实例代码:acedSSGet做选择的时候使用关键字(:K)

实例代码:acedSSGet做选择的时候使用关键字(:K) 发表于 2014 年 11 月 13 日 由 boitboy //---------------------------------...
  • zzia72
  • zzia72
  • 2015年08月04日 10:43
  • 658

acedSSGet深度解析

int acedSSGet( const ACHAR * str, const void * pt1, const void * pt2, const struc...
  • panzhijiepanzhiyang
  • panzhijiepanzhiyang
  • 2014年11月05日 15:23
  • 1188

[转]acedSSGet()函数用法详解

原文在此:http://www.cnblogs.com/wf225/archive/2010/01/12/1644724.html 大多数ObjectARX函数在处理选择集和实体时,都用名字来识别...
  • u011511587
  • u011511587
  • 2013年12月06日 12:48
  • 1484

acedssget返回错误码-5001原因

原因可能是没有指定过滤机对象 也可能是对象dwgin out函数有问题!
  • CPUGeometry
  • CPUGeometry
  • 2016年03月29日 15:19
  • 316

Lua中的模式

在Lua中有很多字符分类: . 所有字符 %a 字母 %c 控制字符 %d 数字 %l 小写字母 %p 标点符号 ...
  • u013517637
  • u013517637
  • 2016年12月30日 18:21
  • 435

arx选择集实例

大多数ObjectARX函数在处理选择集和实体时,都用名字来识别选择集或实体,该名字用一个长整型对来表示的,并对AutoCAD来维护。在ObjectARX中,该名字的类型为ads_name。 在对选...
  • TXH0001
  • TXH0001
  • 2012年01月15日 14:37
  • 6262

acedSSGet用法

大多数ObjectARX函数在处理选择集和实体时,都用名字来识别选择集或实体,该名字用一个长整型对来表示的,并对AutoCAD来维护。在ObjectARX中,该名字的类型为ads_name。 在对选...
  • for_onxx
  • for_onxx
  • 2013年02月18日 16:03
  • 2541

Exercise 16: 读写文件

原文链接:http://learnpythonthehardway.org/book/ex16.html        如果你做了上次练习中的研究训练的话你应该了解了各种文件相关的操作命令(方法 / ...
  • LuoYe_123456
  • LuoYe_123456
  • 2014年03月13日 13:32
  • 1209

过程模式简介(Scott W. Ambler 著)

过程模式简介  一.什么是过程模式?要定义过程模式,首先要探究一下“过程”和“模式”这两个词。“过程”就是一系列的行为,在这些行为中,一个或多个输入会生成一个或多个的输出。而要定义一个“模式”则会麻烦...
  • hmjwdmh
  • hmjwdmh
  • 2005年06月12日 23:10
  • 936

对模式的十大误解

葛子昂译 这些日子,模式引起了大家强烈的兴趣,同时还伴随着一些迷惑、诧异和误解。这在一定程度上体现了主流软件开发人员认为这个领域有多么新,虽然从严格意义上说,它并不是一个新领域。这个领域的快速发展,也...
  • LoveLion
  • LoveLion
  • 2013年12月29日 22:06
  • 10684
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于acedSSGet的W模式
举报原因:
原因补充:

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