乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 56|回复: 3

[原创]如何取到当前屏幕的两个角点的坐标?

[复制链接]

23

主题

76

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
168
发表于 2005-7-1 10:22:00 | 显示全部楼层 |阅读模式
有的时候我们需要得到当前屏幕的两个角点坐标。而中并没有直接给出相应的系统变量或者有关属性、方法,仅有存取图形界限的两个角点坐标的系统变量等等。在我的实际工作中,发现有以下两种方法可以得到当前屏幕的两个焦点坐标:
方法1: 利用ActiveViewport
ActiveViewport里面记录了中心点坐标,以及屏幕的高、宽。那么可以通过这三个数据计算出两角点坐标
Public Function Zoomac(p1() As Double, p2() As Double)                                 '得到当前的显示范围坐标 p1,右上,p2,左下
                         Dim ccc As AcadViewport
                         Dim cpp As Variant
                         Dim c, d As Double
         
                         ThisDrawing.ActiveSpace = acPaperSpace
                         ThisDrawing.ActiveSpace = acModelSpace
                 
                         Set ccc = ThisDrawing.ActiveViewport
                         cpp = ccc.Center
                         c = ccc.width
                         d = ccc.Height
                         p1(0) = cpp(0) + c / 2
                         p1(1) = cpp(1) + d / 2
                         p2(0) = cpp(0) - c / 2
                         p2(1) = cpp(1) - d / 2
End Function
                         说明:大家一定注意到程序中有                         
                                                                         ThisDrawing.ActiveSpace = acPaperSpace
                                                                         ThisDrawing.ActiveSpace = acModelSpace
                         这样一段。这是因为我在多次调试中发现的一个奇怪现象:在Autocad2004下,有的时候ActiveViewport并没有及时随着你的缩放而同步刷新。当你将屏幕缩放为另一个大小时,ActiveViewport里面仍然记录的是上一次的中心点和长宽等数据。这个现象我也是百思不得其解。这两句程序就是利用切换活动空间的办法,强制让ActiveViewport刷新一次。
                         不知道这个算不算一个Bug?还请各位多多分析、指导。当然,如果去掉这两句,程序在大多数情况下,或者在大多数人的电脑上肯定还是正确的。
方法2:利用系统变量
                         鉴于方法1中为了保险,额外增添的那两句有点鸡肋,况且在处理比较大的图纸时严重影响了运行速度。因此上网查了一些资料,在借鉴了晓东空间的版主efan2000的一篇文章后,找到了以下的方法。
                                                 在此对efan2000致以诚挚的谢意!原文题目为“实现CAD的翻页(屏)功能 ”,链接为
                                                 
                                                 方法主要是利用VIEWCTR,VIEWSIZE,SCREENSIZE三个系统变量。在efan2000的文章中有详细介绍。此处不再详述。VIEWCTR给出了当前屏幕中心点坐标,VIEWSIZE给出了屏幕的高度,屏幕的宽度则可以通过SCREENSIZE得到宽高比,再通过VIEWSIZE换算得到。
                                                 有了中心点坐标和屏幕宽、高,计算方法就如同“方法1”一样了。
Sub Test()
                         Dim iPt As Variant
                         Dim h As Double
                         Dim wh As Variant
                         Dim w As Double
                         Dim minPt(0 To 2) As Double
                         Dim maxPt(0 To 2) As Double
                         
                         On Error GoTo ErrTrap
                         iPt = ThisDrawing.GetVariable("VIEWCTR")
                         h = ThisDrawing.GetVariable("VIEWSIZE")
                         wh = ThisDrawing.GetVariable("SCREENSIZE")
                         w = wh(0) / wh(1) * h
                         minPt(0) = iPt(0) - w / 2: minPt(1) = iPt(1) - h / 2: minPt(2) = 0
                         maxPt(0) = iPt(0) + w / 2: maxPt(1) = iPt(1) + h / 2: maxPt(2) = 0
                         Exit Sub
                         
ErrTrap:
                         On Error GoTo 0
End Sub菜鸟初发文,还望各位多多指正!

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

hhc

5

主题

118

帖子

9

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
138
发表于 2005-7-14 14:16:00 | 显示全部楼层
楼上的,你说的那个所谓“bug”不是问题,我在《AutoCAD LISP/vLISP函数库查询辞典》里(587页)看到这样的说明:“对目前作用中视口进行的改变,要在视口重设为当前视口后才能看到。要重设作用中的视口,只要调用这个属性同时使用更新的视口对象即可。”
回复

使用道具 举报

23

主题

76

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
168
发表于 2005-10-30 10:01:00 | 显示全部楼层
多谢啦!
看来以后不用切换图纸空间了!

回复

使用道具 举报

20

主题

115

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
195
发表于 2005-10-30 14:58:00 | 显示全部楼层
谢谢楼主,这两天正想找这程序呢
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-5 17:27 , Processed in 0.873656 second(s), 61 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表