找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 9967|回复: 17

[求助] 布局空间有一个视口,迭代器遍历布局空间实体时却发现有两个AcDbviewport

[复制链接]
发表于 2014-9-4 18:20:10 | 显示全部楼层 |阅读模式

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

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

×
布局空间有一个视口,迭代器遍历布局空间实体时却发现有两个AcDbviewport,使用ArxDBG查看后paper中有两个AcDbViewPort,现需要取视口的范围,求问这两个视口的含义,哪个才是真正显示的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-9-5 11:06:23 | 显示全部楼层
dongjx 发表于 2014-9-5 10:08
你好:
           你的*paper可见视口只有一个吗,大概看了一下,这个两个视口实体名不同,其中坐标, ...

确实是2个,但只有一个是激活的,你可以获得当前激活的VIEWPORT,遍你的程序就是了。

点评

谢谢,虽然不知道为啥,问题终于解决了  详情 回复 发表于 2014-9-5 11:40
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-9-4 23:12:32 | 显示全部楼层
acdbGetCurVportId Global Function AcDbObjectId

acdbGetCurVportId(

AcDbDatabase* pDb);

pDb Input pointer to database  

This function returns the object ID of the AcDbViewport that was current when the drawing was last saved.

Returns AcDbObjectId::kNull if pDb is NULL, or if the space that was current when the drawing was last saved contains no AcDbViewports, or if tilemode was set to 1 when the drawing was last saved.

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-9-4 22:50:34 | 显示全部楼层
在CAD窗口中切换到 布局 查看最直观了

点评

可能我没表达清楚,在布局1中只新建一个视口,但是arx二次开发时遍历布局一中的实体,其中有两个视口实体,新建两个的话会有三个视口实体,我想知道其中多出来的视口实体是什么谢谢  详情 回复 发表于 2014-9-5 08:41
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-9-4 23:09:34 | 显示全部楼层
你说的是不是布局一,布局二啊?

点评

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

使用道具 举报

 楼主| 发表于 2014-9-5 08:41:23 | 显示全部楼层
st788796 发表于 2014-9-4 22:50
在CAD窗口中切换到 布局 查看最直观了

可能我没表达清楚,在布局1中只新建一个视口,但是arx二次开发时遍历布局一中的实体,其中有两个视口实体,新建两个的话会有三个视口实体,我想知道其中多出来的视口实体是什么{:soso_e129:}谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-5 08:43:25 | 显示全部楼层
newer 发表于 2014-9-4 23:09
你说的是不是布局一,布局二啊?

不是得,只是其中一个布局

点评

你遍历的是哪? 块表? 这里面你得不到当前激活的视口。 每个视口都有NAME,你打印出来看就知道是啥了。  详情 回复 发表于 2014-9-5 08:48
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-9-5 08:48:19 | 显示全部楼层
dongjx 发表于 2014-9-5 08:43
不是得,只是其中一个布局

你遍历的是哪? 块表? 这里面你得不到当前激活的视口。

每个视口都有NAME,你打印出来看就知道是啥了。

点评

给你看图片,我把布局1中的视口删除,但是用arxDbg还是可以看到其中存在一个视口,这个视口我在布局一中无法找到,打印中也找不到,好像完全不存在  详情 回复 发表于 2014-9-5 09:04
我遍历的是AcDbBlockTable中*paper块表记录中的实体,其中不管你是否新建视口,默认好像始终存在一个视口,我按照你之前的方法,过滤当前激活视口可以把这个视口过滤掉。为什么CAD始终储存这个视口了,这是缓存视口  详情 回复 发表于 2014-9-5 08:58
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-5 08:58:30 | 显示全部楼层
XDSoft 发表于 2014-9-5 08:48
你遍历的是哪? 块表? 这里面你得不到当前激活的视口。

每个视口都有NAME,你打印出来看就知道是啥了 ...

我遍历的是AcDbBlockTable中*paper块表记录中的实体,其中不管你是否新建视口,默认好像始终存在一个视口,我按照你之前的方法,过滤当前激活视口可以把这个视口过滤掉。为什么CAD始终储存这个视口了,这是缓存视口吗,当你在模型空间建立实体时,再转到图纸空间(布局),就会生成这个缓存视口,作用是当你新建视口时把缓存视口的东西映射到自己新建视口?不知道我的理解对不对??
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-5 09:04:33 | 显示全部楼层
XDSoft 发表于 2014-9-5 08:48
你遍历的是哪? 块表? 这里面你得不到当前激活的视口。

每个视口都有NAME,你打印出来看就知道是啥了 ...

给你看图片,我把布局1中的视口删除,但是用arxDbg还是可以看到其中存在一个视口,这个视口我在布局一中无法找到,打印中也找不到,好像完全不存在
QQ截图20140905090142.png
QQ截图20140905090218.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-9-5 09:32:12 | 显示全部楼层
下面是用XDRX_API的 XDRX_OBJECT_GET,XDRX_OBJECT_NEXT 遍历*Paper_Space的信息,你比较下两个视口的信息内容。

命令: (setq a (xdrx_object_get "block" "*Paper_Space"))
<图元名: 7ee68ed0>

命令: (while (setq b (xdrx_object_next))(setq d (cons b d)))
(("AcDbViewport" <图元名: 7ee88098>) ("AcDbViewport" <图元名: 7ee88088>))

命令: (setq v1 (cadar d))
<图元名: 7ee88098>

命令: (setq v2 (cadadr d))
<图元名: 7ee88088>

命令: (entget v2)
((-1 . <图元名: 7ee88088>) (0 . "VIEWPORT") (330 . <图元名: 7ee68ed0>) (5 .
"109") (100 . "AcDbEntity") (67 . 1) (410 . "布局1") (8 . "0") (100 .
"AcDbViewport") (10 128.5 97.5 0.0) (40 . 646.292) (41 . 222.18) (68 . 1) (69 .
1) (12 128.5 97.5 0.0) (13 0.0 0.0 0.0) (14 10.0 10.0 0.0) (15 10.0 10.0 0.0)
(16 0.0 0.0 1.0) (17 0.0 0.0 0.0) (42 . 50.0) (43 . 0.0) (44 . 0.0) (45 .
222.18) (50 . 0.0) (51 . 0.0) (72 . 1000) (90 . 32800) (281 . 0) (71 . 1) (74 .
0) (110 0.0 0.0 0.0) (111 1.0 0.0 0.0) (112 0.0 1.0 0.0) (79 . 0) (146 . 0.0)
(170 . 0))

命令: (entget v1)
((-1 . <图元名: 7ee88098>) (0 . "VIEWPORT") (330 . <图元名: 7ee68ed0>) (5 .
"10B") (100 . "AcDbEntity") (67 . 1) (410 . "布局1") (8 . "0") (100 .
"AcDbViewport") (10 128.5 97.5 0.0) (40 . 205.6) (41 . 156.0) (68 . 2) (69 . 2)
(12 1399.36 435.046 0.0) (13 0.0 0.0 0.0) (14 10.0 10.0 0.0) (15 10.0 10.0 0.0)
(16 0.0 0.0 1.0) (17 0.0 0.0 0.0) (42 . 50.0) (43 . 0.0) (44 . 0.0) (45 .
756.805) (50 . 0.0) (51 . 0.0) (72 . 1000) (90 . 32864) (281 . 0) (71 . 1) (74
. 0) (110 0.0 0.0 0.0) (111 1.0 0.0 0.0) (112 0.0 1.0 0.0) (79 . 0) (146 . 0.0)
(170 . 0))

点评

你好: 你的*paper可见视口只有一个吗,大概看了一下,这个两个视口实体名不同,其中坐标,还有范围也不同。我是个菜鸟,刚学autocad二次开,我现在要编写一个程序,是取得图纸空间的实体范围,从而确定  详情 回复 发表于 2014-9-5 10:08
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-5 10:08:05 | 显示全部楼层
XDSoft 发表于 2014-9-5 09:32
下面是用XDRX_API的 XDRX_OBJECT_GET,XDRX_OBJECT_NEXT 遍历*Paper_Space的信息,你比较下两个视口的信息内 ...

你好:
           你的*paper可见视口只有一个吗,大概看了一下,这个两个视口实体名不同,其中坐标,还有范围也不同。我是个菜鸟,刚学autocad二次开,我现在要编写一个程序,是取得图纸空间的实体范围,从而确定其图幅。但是每次取得范围都不是准确的,查询原因,是其中一个视口搞得怪。使用下面代码
if(spVwp=AcDbViewport::cast(spEnt))
   {
    AcDbObjectId mCurViewportId = acedGetCurViewportObjectId();
    if(spVwp->objectId()==mCurViewportId)
    {
     /*spVwp->bounds(ext);
     extAll.addExt(ext);*/
     bIsSkip=true;
    }
   }
把这个视口过滤掉不处理就对了,但是我始终搞不明白那个视口的作用。{:soso_e136:}

点评

确实是2个,但只有一个是激活的,你可以获得当前激活的VIEWPORT,遍你的程序就是了。  详情 回复 发表于 2014-9-5 11:06
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-5 11:40:26 | 显示全部楼层
XDSoft 发表于 2014-9-5 11:06
确实是2个,但只有一个是激活的,你可以获得当前激活的VIEWPORT,遍你的程序就是了。

{:soso_e113:}{:soso_e113:}谢谢,虽然不知道为啥,问题终于解决了

点评

对布局操作,你不用去遍历*Paper_Space, 直接用AcDbObjectId mCurViewportId = acedGetCurViewportObjectId();获得当前ID,然后写其他的就可以了。  详情 回复 发表于 2014-9-5 11:58
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-9-5 11:58:35 | 显示全部楼层
dongjx 发表于 2014-9-5 11:40
谢谢,虽然不知道为啥,问题终于解决了

对布局操作,你不用去遍历*Paper_Space, 直接用AcDbObjectId mCurViewportId = acedGetCurViewportObjectId();获得当前ID,然后写其他的就可以了。

点评

AcDbExtents GetBlockTableRecExts(AcDbBlockTableRecord *pBtr) { using namespace std; AcDbExtents extAll, ext; AcDbBlockTableRecordIterator *btrIter = NULL; pBtr->newIterator(btrIter);  详情 回复 发表于 2014-9-5 12:33
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-5 12:33:25 | 显示全部楼层
XDSoft 发表于 2014-9-5 11:58
对布局操作,你不用去遍历*Paper_Space, 直接用AcDbObjectId mCurViewportId = acedGetCurViewportObject ...

AcDbExtents GetBlockTableRecExts(AcDbBlockTableRecord *pBtr)
{
  using namespace std;
  AcDbExtents extAll, ext;
  AcDbBlockTableRecordIterator *btrIter = NULL;
  pBtr->newIterator(btrIter);
  auto_ptr<AcDbBlockTableRecordIterator> apBtrIter(btrIter);
  AcDbEntity *pEnt = NULL;
  AcDbText *pTxt = NULL;
  AcDbMText *pMtxt = NULL;
  CString  strContxt = _T("");
  int n=0;
  for (apBtrIter->start(); !apBtrIter->done(); apBtrIter->step())
  {
   bool bIsSkip = false;
   if (apBtrIter->getEntity(pEnt, AcDb::kForRead) != Acad::eOk)
    continue;
   AcDbEntityPointer spEnt;
   spEnt.acquire(pEnt);
            AcDbViewport *spVwp=NULL;
   if(spVwp=AcDbViewport::cast(spEnt))
   {
    AcDbObjectId mCurViewportId = acedGetCurViewportObjectId();
    if(spVwp->objectId()==mCurViewportId)
    {
     /*spVwp->bounds(ext);
     extAll.addExt(ext);*/
     bIsSkip=true;
    }
   }
     // 除去空字符
   if (pTxt = AcDbText::cast(spEnt))
   {
    strContxt = pTxt->textString();
    strContxt.Remove(_T(' '));
    strContxt.Remove(_T('\n'));
    strContxt.Remove(_T('\t'));
    if (strContxt.GetLength()==0)
    {
     bIsSkip = true;
    }
   }
   else if (pMtxt = AcDbMText::cast(spEnt))
   {
    strContxt = pMtxt->contents();
    strContxt.Remove(_T(' '));
    strContxt.Remove(_T('\n'));
    strContxt.Remove(_T('\t'));
    if (strContxt.GetLength()==0)
    {
     bIsSkip = true;
    }
   }
   AcDbObjectId layerid=spEnt->layerId();
   AcDbLayerTableRecordPointer spLayer(layerid, AcDb::kForRead);
   if(spLayer.openStatus() == Acad::eOk)
   {
    if (spLayer->isFrozen()||spLayer->isHidden())
    {
     bIsSkip=true;
    }
   }
   if (!bIsSkip)
   {
    spEnt->getGeomExtents(ext);
    extAll.addExt(ext);
   }
   pEnt->close();
  }
  return extAll;
}
这是我的获取图纸空间实体范围的方法函数,其中有多视口的情况时,也许需要对所有视口实体获取取得其范围,然后取交集的。所以只获取当前视口的是不够的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-7 07:18 , Processed in 0.613890 second(s), 76 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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