找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 414|回复: 0

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

[复制链接]
发表于 2005-7-1 10:12:38 | 显示全部楼层 |阅读模式

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

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

×
有的时候我们需要得到当前屏幕的两个角点坐标。而autocad中并没有直接给出相应的系统变量或者有关属性、方法,仅有存取图形界限的两个角点坐标的系统变量等等。在我的实际工作中,发现有以下两种方法可以得到当前屏幕的两个焦点坐标:


方法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的翻页(屏)功能 ”,链接为
       http://www.xdcad.net/forum/showt ... d=835741#post835741

       方法主要是利用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



菜鸟初发文,还望各位多多指正!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-9-29 01:25 , Processed in 0.354531 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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