找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1473|回复: 10

[讨论]:程序选择实体的ARX实现及其中的Bug!

[复制链接]
发表于 2004-5-30 17:46:27 | 显示全部楼层 |阅读模式

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

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

×

  1.   [FONT=courier new]
  2.         AcDbExtents extents;
  3.         ads_point pt1,pt2;
  4.         ads_name ssname;
  5.         pBlkRef->getGeomExtents(extents);
  6.         pt1[X]=extents.minPoint().x;
  7.         pt1[Y]=extents.minPoint().y;
  8.         pt2[X]=extents.maxPoint().x;
  9.         pt2[Y]=extents.maxPoint().y;
  10.         acutPrintf("pt1.x=%f,pt1.y=%f,pt2.x=%f,pt2.y=%f\n",pt1[X],pt1[Y],pt2[X],pt2[Y]);   //1
  11.         acedSSGet("W",pt1,pt2,NULL,ssname);

  12.         long length;
  13.         acedSSLength(ssname,&length);

  14.         acutPrintf("ssname length=%d\n",length);  //2
  15.   [/FONT]
复制代码


如上程序代码两次执行结果如下:
第一次:
pt1.x=1580.104385,pt1.y=-7468.729406,pt2.x=1780.104385,pt2.y=-7179.729406
ssname length=9
pt1.x=1840.104385,pt1.y=-7468.729406,pt2.x=1940.104385,pt2.y=-7324.229406
ssname length=6
第二次:
pt1.x=1580.104385,pt1.y=-7468.729406,pt2.x=1780.104385,pt2.y=-7179.729406
ssname length=-858993460
pt1.x=1840.104385,pt1.y=-7468.729406,pt2.x=1940.104385,pt2.y=-7324.229406
ssname length=-858993460
说明acedSSGet可能有问题
另外acedSSGet加"I"参数我亦没有成功过,
看文档说要使用标记ACRX_CMD_USERPICKSET和ACRX_CMD_REDRAW,
但不知道在何处使用,请指教。

如果上述真是acedSSGet的Bug
而我要实现上述功能,怎么办?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-5-30 22:07:41 | 显示全部楼层
如果ssname length=-858993460,那肯定acedSSLength(ssname,&length);失败,就是acedSSGet失败!!
你应该看看acedSSGet返回什么,还有ssname应该释放,如果想取得pBlkRef的范围,好像有比getGeomExtents更好的函数,你看看帮助吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2004-5-30 23:56:06 | 显示全部楼层

Re: [讨论]:程序选择实体的ARX实现及其中的Bug!

最初由 easypower 发布
[B][CODE]
  
        AcDbExtents extents;
        ads_point pt1,pt2;
        ads_name ssname;
        pBlkRef->getGeomExtents(extents);
        pt1[X]=extents.minPoint().x;
        pt1[Y]=extents.minPoint().y;
        pt2[X]=e... [/B]


ssname里面的length参数要求是长整数LONG类型,你声明和使用对了,但是你打印语句里面,怎么用的是 d% 啊? 应该是数据越界了。

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

使用道具 举报

 楼主| 发表于 2004-5-31 08:24:47 | 显示全部楼层
經過查找資料,發現acedSSGet只對當前視窗範圍內實體有效,有沒有甚麼函數對所有模式都有效果呢??不會要自己遍歷數據庫,一個一個實體判斷吧???



解决如下:
[PHP]
        AcDbExtents extents;
        ads_name ssname;
        pBlkRef->getGeomExtents(extents);
        makeViewport(extents.maxPoint(),extents.minPoint());
        acedSSGet("_B",asDblArray(extents.minPoint()), asDblArray(extents.maxPoint()),NULL,ssname);//只選擇視圖可見區域的實體,所以必需要所有實體在視圖可見區域
        long length;
        acedSSLength(ssname,&length);


void makeViewport(AcGePoint3d &maxpt,AcGePoint3d &minpt)
{
        AcDbViewTableRecord view;

        view.setHeight(fabs(maxpt.y-minpt.y));
        view.setWidth(fabs(maxpt.x-minpt.x));
        view.setCenterPoint(AcGePoint2d((maxpt.x+minpt.x)/2,(maxpt.y+minpt.y)/2));
        // set the view
        acedSetCurrentView (&view, NULL);
        // updates the extents
        acdbHostApplicationServices()->workingDatabase()->updateExt(TRUE);
        view.close();
}
[/PHP]

新问题出现,如何得到当前视图,以便在后面恢复??
acedSetCurrentView 是设置当前视图的函数
那得到的函数呢???
是否需要从系统变量中取得??
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-5 23:14:47 | 显示全部楼层
我是一个初学者,好长时间没编出个东西来,还望各位高人多指教
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2004-6-6 01:13:57 | 显示全部楼层
最初由 easypower 发布
[B]經過查找資料,發現acedSSGet只對當前視窗範圍內實體有效,有沒有甚麼函數對所有模式都有效果呢??不會要自己遍歷數據庫,一個一個實體判斷吧???
解决如下:

        AcDbExtents extents;
        ads_name ssname;
... [/B]


1、SSGET屏幕外的只有X参数可以选到(选择全部实体),其他都做不到,因为SSGET是基于显示表结构的,只能选择屏幕内的实体。如果你想选择屏幕外的,只能遍历数据库。

2、保存当前视图,你应该实例一个AcDbViewTableRecord 对象:

AcDbViewTableRecord *pvRec=new AcDbViewTableRecord;

然后利用其下面的编辑方法,把一些视口的信息写到这个对象里面,最后把AcDbViewTableRecord 对象添加到AcDbViewTable表里面就可以了,需要保存的,下面:
[php]

        ads_getvar("VIEWMODE", &var);
        pvRec->setPerspectiveEnabled(var.resval.rint & 1);
        pvRec->setFrontClipEnabled(var.resval.rint & 2);
        pvRec->setBackClipEnabled(var.resval.rint & 4);
        pvRec->setFrontClipAtEye(!(var.resval.rint & 16));
       
        ads_getvar("BACKZ", &var);
        pvRec->setBackClipDistance(var.resval.rreal);
       
        ads_getvar("VIEWCTR", &var);
        ads_trans(var.resval.rpoint, &UCS, &DCS, NULL, var.resval.rpoint);
        pvRec->setCenterPoint(AcGePoint2d(var.resval.rpoint[X],
                var.resval.rpoint[Y]));
       
        ads_getvar("FRONTZ", &var);
        pvRec->setFrontClipDistance(var.resval.rreal);
       
        ads_getvar("LENSLENGTH", &var);
        pvRec->setLensLength(var.resval.rreal);
       
        ads_getvar("TARGET", &var);
        ads_trans(var.resval.rpoint, &UCS, &WCS, NULL, var.resval.rpoint);
        pvRec->setTarget(AcGePoint3d(var.resval.rpoint[X],
                var.resval.rpoint[Y], var.resval.rpoint[Z]));
       
        ads_getvar("VIEWDIR", &var);
        ads_trans(var.resval.rpoint, &UCS, &WCS, TRUE, var.resval.rpoint);
        pvRec->setViewDirection(AcGeVector3d(var.resval.rpoint[X],
                var.resval.rpoint[Y], var.resval.rpoint[Z]));
       
        ads_getvar("VIEWSIZE", &var);         
        pvRec->setHeight(var.resval.rreal);
        double height=var.resval.rreal;
        ads_getvar("SCREENSIZE", &var);         
        pvRec->setWidth(var.resval.rpoint[X]/var.resval.rpoint[Y]*height);
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-6-7 12:33:36 | 显示全部楼层
Autodesk太過分了!,提供了acedSetCurrentView 设置当前视图的函数,為何不提供一個得到當前視圖的函數?還要這麼複雜取系統變量.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-7 21:22:28 | 显示全部楼层
Write it once, complicatedly[/COLOR].
Use   it many times, easily[/COLOR]!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-9-29 10:08:39 | 显示全部楼层
遇到这个问题的人不在少数,我就是acedSSGet的受害者,先前的高手已经研究了这个问题了,真是谢谢他们,我顶起来,让大家也看看!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-9-29 10:34:57 | 显示全部楼层
zoom p,返回上一个视图
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-10-15 15:00:15 | 显示全部楼层
acedSSGet是ADS的方法,除非要得到子实体标记,最好是绕过,其中有太多的东西不可控制,程序很难做的稳定,
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 05:05 , Processed in 0.286630 second(s), 52 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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