找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1879|回复: 7

[求助] [已解决]获取当前视口地理范围

[复制链接]

已领礼包: 12个

财富等级: 恭喜发财

发表于 2018-11-13 11:16:51 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 松s_king 于 2018-11-27 09:57 编辑

想要实现像构建栅格金字塔那样的根据比例 切割当前画布
不用鼠标操作就能将当前画布根据实体的边界 将图切割成小块然后输出

目前构想是将画布缩放到所有实体边界(四角)的范围打印输出
然后将输出的图像切割(避免去切割实体)

现在想请教一下有什么好的办法去获取实体范围(左上右下角坐标)
*****************************************************************
*****************************************************************
后续发现 只知道实体的范围是不够的
由于要将视口内实体范围部分给扣出来 那么势必要知道实体窗口在视口中的位置现在已有的信息有 图形范围 extmax extmin
//这里我理解为database内所有实体的地理边界构成实体的范围  但LoveArx 指出此处两个常量实际为图形范围  
后来想了下的确实体范围应该是指特定实体的地理范围 用来描述全部实体的地理范围 的确不太妥当.... 不知道理解是否有误

视口的大小 resbuf.resval.rpoint[0]/[1] (width height)

只需要知道图形在视口中的像素坐标(在视口中的实体坐标范围与width height同参考下的坐标)
就可以根据图形的像素坐标与图形的范围(地理坐标)来构建一个仿射的关系 从而推出 地理坐标与视口位置的关系

或者知道视口当前缩放条件下的范围(角点坐标) 同样的可以构建出来仿射关系 然后推出地理坐标与视口位置关系
然后通过图形范围得到图形在视口中的位置

进而可以愉快的吧图形从视口里面扣出来。。。

意思是这么个意思.. 可能表达上有些问题   任何问题欢迎指教




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

已领礼包: 12个

财富等级: 恭喜发财

 楼主| 发表于 2018-11-27 10:02:04 | 显示全部楼层
问题解决了..灰常感谢@edata 提供的解决方法!
代码如下
  1. CRect rc;
  2.                 CView* pCurView = acedGetAcadDwgView();
  3.                 pCurView->GetClientRect(&rc);
  4.                 CPoint ptTopLeft = rc.TopLeft();
  5.                 CPoint ptBottomRight = rc.BottomRight();
  6.                 acedDwgPoint pt1, pt2;
  7.                 acedCoordFromPixelToWorld(ptTopLeft, pt1);
  8.                 acedCoordFromPixelToWorld(ptBottomRight, pt2);

先获取角点的pixel坐标 然后转换成wcs坐标   
对应的有acedCoordFromWorldToPixel的方法可以吧wcs坐标转换成pixel坐标 上述问题就迎刃而解了
objcetarx提供的方法还是挺多的... 坑很深还需要慢慢摸索...
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-11-13 11:20:46 | 显示全部楼层
实体范围,现成的
AcDbEntity::getGeomExtents()
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 12个

财富等级: 恭喜发财

 楼主| 发表于 2018-11-26 16:13:55 | 显示全部楼层
newer 发表于 2018-11-13 11:20
实体范围,现成的
AcDbEntity::getGeomExtents()

这个是单个实体范围有一个AcDbDatabase->extmax();
AcDbDatabase->extmin();
是获取数据集里的实体范围

想请教一下 有没有什么方法获取当前视口的地理范围呢
就是根据视口的缩放平移 可能视口的范围会发生变化

点评

AcDbDatabase->extmax() 这个不是对象的范围,是数据库当前图形的范围, 系统变量 extmax,extmin 你说的名词不准确,不知道确定的表达的意思 视口角点坐标不会随着你屏幕的缩放变化的  详情 回复 发表于 2018-11-26 16:24
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2018-11-26 16:24:02 | 显示全部楼层
松s_king 发表于 2018-11-26 16:13
这个是单个实体范围有一个AcDbDatabase->extmax();
AcDbDatabase->extmin();
是获取数据集里的实体范 ...

AcDbDatabase->extmax() 这个不是对象的范围,是数据库当前图形的范围,
系统变量 extmax,extmin

你说的名词不准确,不知道确定的表达的意思
视口角点坐标不会随着你屏幕的缩放变化的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 12个

财富等级: 恭喜发财

 楼主| 发表于 2018-11-26 16:54:06 | 显示全部楼层
LoveArx 发表于 2018-11-26 16:24
AcDbDatabase->extmax() 这个不是对象的范围,是数据库当前图形的范围,
系统变量 extmax,extmin

database->extmax()图形范围 不就是实体范围的合集吗...例如说我只用鼠标中间缩放 那么是鼠标指的那个点坐标不会变 其他点坐标都变化了  角点坐标显然也变化了啊
难道是我对视口的理解有误?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 12个

财富等级: 恭喜发财

 楼主| 发表于 2018-11-26 17:01:15 | 显示全部楼层
就不说缩放吧就说简单的平移  实体的坐标是绝对的 把实体上不同的点依次平移到某一个角点上
那么每一次平移 角点上的坐标都是实体上的不同坐标 是否能说明角点的坐标发生了变化呢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2020-2-25 00:48:11 | 显示全部楼层
在adndevblog网站上,有xiaodong liang的一篇文章,里面讲了如何zoom pan窗口。所使用的方法,可以实现你的目的。
部分代码如下:
  1. AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();  
  2.     acedVports2VportTableRecords();

  3.     //get the active viewport object
  4.     AcDbViewportTable *pVpT = NULL;
  5.     AcDbViewportTableRecord *pActVp = NULL;

  6.     //get the *Active view port
  7.     pDb->getViewportTable(pVpT,AcDb::kForRead);
  8.     pVpT->getAt(_T("*Active"),pActVp,AcDb::kForWrite);


上述代码中,获取到pActVPN后,所有事情都好办了。因为这个对象有height、width以及centerpoint可以使用。
本来想把网址粘上,不明白晓东家园为什么还设置权限,不允许我使用链接。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-4 16:48 , Processed in 0.403977 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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