明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1915|回复: 9

在VBA中怎样获取当前图形的左下角和右上角坐标,如图所示

[复制链接]
发表于 2019-7-4 06:35 | 显示全部楼层 |阅读模式
本帖最后由 风言无际 于 2019-7-4 06:39 编辑


如图所示,两个红圈圈内坐标是这张图的左上角和右下角坐标,VBA中有什么函数能直接获取到吗?总不至于一个个对象的遍历,然后比较坐标吧,如果图内对象很多的话,将会很费时间。
VBA用zoomextents方法可以直接按范围显示,所以应该有办法获取到范围的左下角和右上角坐标的啊,请大家帮帮忙,谢谢了。

本帖子中包含更多资源

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

x
发表于 2019-7-4 09:27 | 显示全部楼层
就是遍历。不要想当然认为ACAD能做的事VBA就都支持。
另外从你例图上来看,并不是整张图的边界点,只是其中部分图元的边界点。就算有你期待的功能,你也用不上。
 楼主| 发表于 2019-7-4 18:50 | 显示全部楼层
mikewolf2k 发表于 2019-7-4 09:27
就是遍历。不要想当然认为ACAD能做的事VBA就都支持。
另外从你例图上来看,并不是整张图的边界点,只是其 ...

是有点想当然了,哎。图内容很多的话,遍历就有点蛋疼了
发表于 2019-7-5 09:57 | 显示全部楼层
风言无际 发表于 2019-7-4 18:50
是有点想当然了,哎。图内容很多的话,遍历就有点蛋疼了

有啥蛋疼的,又不要你一个个去数,一个遍历就得了。
发表于 2019-7-5 10:25 | 显示全部楼层
"当前图形的左下角和右上角坐标"有何特征,如有,或许可以缩小搜索范围
 楼主| 发表于 2019-7-6 08:31 | 显示全部楼层
mikewolf2k 发表于 2019-7-5 09:57
有啥蛋疼的,又不要你一个个去数,一个遍历就得了。

如果图纸内容很多的话,一个个遍历会很费时间,有可能导致软件卡死几秒种
 楼主| 发表于 2019-7-6 08:32 | 显示全部楼层
mikewolf2k 发表于 2019-7-4 09:27
就是遍历。不要想当然认为ACAD能做的事VBA就都支持。
另外从你例图上来看,并不是整张图的边界点,只是其 ...

我刚刚找了一篇别人的原代码,算是找到了,
ThisDrawing.GetVariable("EXTMAX")
ThisDrawing.GetVariable("EXTMIN")
 楼主| 发表于 2019-7-6 08:34 | 显示全部楼层
mikewolf2k 发表于 2019-7-4 09:27
就是遍历。不要想当然认为ACAD能做的事VBA就都支持。
另外从你例图上来看,并不是整张图的边界点,只是其 ...

ThisDrawing.GetVariable("EXTMAX")
ThisDrawing.GetVariable("EXTMIN")
刚刚阅读了别人的一段原代码找到了。
发表于 2019-7-6 13:25 | 显示全部楼层
风言无际 发表于 2019-7-6 08:34
ThisDrawing.GetVariable("EXTMAX")
ThisDrawing.GetVariable("EXTMIN")
刚刚阅读了别人的一段原代码找 ...

以前不知道这两个变量,学习了。谢谢。
经过测试,发现有些问题。比如先画一个100X200的框,取值是100,200(可能有小数点后数值),没问题。再在100,200处画一个半径20的圆,取值是120,220,没问题。删除圆,应该回到100,200,但是并没有,依旧是120,220。最后再手工执行下zoom E,取值才回到100,200。感觉是ACAD只在范围扩大或者Zoom E重置时候才更新此变量,变小或者删除时候不更新。换句话说,此数值可能偏大。
再回到楼主原始问题,只是部分图元的范围,还是得遍历判断满足自己需要的图元才能获得准确的数值,这两个变量还是没用。
 楼主| 发表于 2019-7-9 05:03 | 显示全部楼层
本帖最后由 风言无际 于 2019-7-9 05:21 编辑
mikewolf2k 发表于 2019-7-6 13:25
以前不知道这两个变量,学习了。谢谢。
经过测试,发现有些问题。比如先画一个100X200的框,取值是100, ...

CAD帮助文档中对于EXTMAX的定义:
类型:三维点
保存位置:图形
存储图形范围右上角点的值。如果有新的对象绘制到界限之外,则仅当使用 ZOOM 命令的“全部”或“范围”选项时,对象才会收缩至新范围内。本系统变量的值表示为当前空间中的世界坐标值。

所以获取这两个变量之前,应该是先ZOOMEXTENTS或ZOOMALL一下,才能获取更新后的数值。就像获取打印机信息之前需要用object.RefreshPlotDeviceInfo更新打印机、规范介质和打印样式表信息一样。是要跟其他命令配合使用的。

Dim eMax As Variant
Dim eMin As Variant
ThisDrawing.Application.ZoomAll
eMax = ThisDrawing.GetVariable("EXTMAX")
eMin = ThisDrawing.GetVariable("EXTMIN")
MsgBox Format(eMin(0), "0.00") & "," & Format(eMin(1), "0.00")
MsgBox Format(eMax(0), "0.00") & "," & Format(eMax(1), "0.00")

这样可以正确获取到我想要的坐标了。


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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-26 15:09 , Processed in 0.384731 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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