关于acedSSGet的W模式

    日前,电子报批系统用户反应计算速度慢,因此对系统进行了调整,在计算对象面积的时候,考虑到原来用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是窗口外扩比例

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

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

你可能感兴趣的:(AutoCAD二次开发)