QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 5091|回复: 2
收起左侧

[已答复] 如何用vba在cad中实时显示角度的变化?

[复制链接]
发表于 2010-1-23 00:10:01 | 显示全部楼层 |阅读模式 来自: 中国江苏徐州

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

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

x
如题,在cad中画一个 ∠ ,旁边有文字显示角度值,如果选中角的顶点并移动鼠标,如何让文字实时的显示角度呢?
发表于 2010-1-23 12:34:45 | 显示全部楼层 来自: 中国浙江宁波
本帖最后由 sealive_leafage 于 2010-1-23 12:37 编辑 ' g" q8 t8 T7 q# E* z7 P' H
3 D# T1 T3 z/ ^4 N# i: Y* r/ a
问题的难点在于在CAD中如何动态实时获得鼠标点的坐标,网上收集了些资料楼主可以体会一下;获得坐标值后则可以实现楼主要求的效果;详细参考:http://tiancao.net/blogview.asp?logID=2144 v/ S9 S5 \' f: `0 m
CAD VBA实现橡皮筋直线、圆; s, A# I% {- D% \7 a- M3 _
3 X2 Y/ j: Y7 W/ O. ^
首先是计时控件,然后是实时捕捉鼠标的屏幕位置,然后是转换获得CAD当前试图鼠标所在的位置坐标,然后才是实时绘制直线或圆。
) b' ?* F% ~" u( l! E# Z1 LVBA中不可直接使用vb的timer控件,我们可以调用独立的xTimer控件。
8 A- n+ b+ W* e7 l( |+ E5 |控件下载:
4 J" ^% b% ]# V1 @) z/ Z. ?http://www.tiancao.net/flashget.asp?dizhi=http://www.tiancao.net/attachments/month_0707/qnft_XTimers.rar
" V, ^0 g" T/ }" ]3 {: N. I8 J/ \+ u3 A
然后是使用API函数GetCursorPos获得当前鼠标的屏幕坐标。3 X' k) b% W" f- t8 ~
然后通过读取CAD系统变量viewSize荷Screensize分别得到当前试图的CAD高度和当前视口的屏幕尺寸(屏幕分辨率的像素).然后得到CAD实际尺寸和屏幕像素的比值。9 u" I8 G- y" `) h
精确度于鼠标的频率快慢有关系" J- j( `0 K; k3 W

" V- H6 f  o" [# o! t'获取CAD坐标系统和屏幕像素的比值' K2 k! t- `; U$ V2 l- Q
Function ViewScreen() As Double
6 X8 X; e6 |3 ^' I    Dim ScreenSize As Variant% D( Z1 a/ |; E
    ScreenSize = ThisDrawing.GetVariable("screensize") '当前视口的屏幕宽度和高度/ Z4 B$ C; `0 C! A6 S
    Dim H As Variant
) g+ B- U6 x. q& [' \! R1 x    H = ThisDrawing.GetVariable("viewsize") '当前视图图形的实际高度
! g4 U2 k4 h2 g( b: v; f, K1 O    ViewScreen = Abs(H / ScreenSize(1))7 u( u: X- h7 ^2 B
End Function
: x, P6 c, u9 n( [( t" dPublic Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
1 Q6 S/ l' _+ E: N: h
$ Q& |1 p% s- M- A" i实时获得鼠标的屏幕坐标,然后通过屏幕尺寸和cad实际尺寸的比值,计算出鼠标当前的cad坐标。
7 F% g9 U0 i2 G2 T4 w然后在基点和鼠标坐标之间绘制直线或圆。
  ^; B- B2 h% P5 T/ h9 B6 e值得注意的是,屏幕坐标的是以屏幕的左上角为原点的。而cad的世界坐标是以右下角为原点的。
6 ?& z+ y! m: e+ l& u; G- \8 V; G& k
'得到鼠标屏幕坐标
: A. V, ?5 J) q, W) ?
4 K4 a+ d# W0 I, X0 p/ D% PPrivate Type POINTAPI
2 j8 b3 c$ z6 H; |/ o% n* ?* p    x As Long$ [% K5 O; {0 J4 w' [) h9 l
    Y As Long! Q1 w( t- o. @% I2 ~
End Type
, ^! b8 m; l9 {Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long4 C, ^& ?1 z% ~4 j1 p1 q4 A
Dim CAD_Point1 As Variant) `4 D& F: w; B0 U% {
Dim CAD_Point2 As Variant
3 q. S; p, y& m- z2 `Dim ScreenPoint1 As POINTAPI$ t, U. {. [0 i2 i4 Q3 M
Dim ScreenPoint2(1) As Long
1 [: V& Y- M. X$ ^: }$ z, TDim BiLi As Double
) u: [, \% q3 S'获取CAD坐标系统和屏幕像素的比值
$ ]1 `8 H5 ~3 p0 e) t  aFunction ViewScreen() As Double
. g0 O: L1 S* t' m4 h    Dim ScreenSize As Variant
, f) N( W- t. O6 [0 ]. n) O$ C8 m    ScreenSize = ThisDrawing.GetVariable("screensize") '当前视口的屏幕宽度和高度
; H& W8 a' u* k" B    Dim H As Variant, G' g! Q4 `( s; q
    H = ThisDrawing.GetVariable("viewsize") '当前视图图形的实际高度
$ r" T" }7 h3 S    ViewScreen = Abs(H / ScreenSize(1))+ C8 d1 }& X; ?8 B5 O
End Function) p' @( A! l. J4 S
'通过CAD坐标计算屏幕坐标* P: t5 _' G4 A- ]. ?7 g' a
Sub GetScreenPoint()
" j; n! V, X, e( V: ^0 K# Z6 v    BiLi = ViewScreen
+ E5 w7 y  H: a5 h- [) \/ r    CAD_Point1 = ThisDrawing.Utility.GetPoint(, "先指定一个点:") '获得鼠标所在位置的CAD坐标
4 X3 ^0 F8 n, K! V7 i' O1 S" A5 i* H    ThisDrawing.ModelSpace.AddPoint CAD_Point1
' Z3 a' {- o6 f5 m1 u5 V0 I+ v    GetCursorPos ScreenPoint1   '通过api直接获得鼠标所在位置的屏幕坐标' `" ~6 i# R8 V
    MsgBox "屏幕坐标:" & ScreenPoint1.x & " / " & ScreenPoint1.Y( x) u" |9 z$ q
    MsgBox "对应的CAD坐标:" & CAD_Point1(0) & " / " & CAD_Point1(1)5 ], q" i+ G5 N% Q$ \7 k' y9 a
    '以上获得了CAD坐标和屏幕坐标的对应关系,下面就可以计算了) {' J; _+ R5 r
    1 X5 X" T) s7 n# E3 @
    CAD_Point2 = ThisDrawing.Utility.GetPoint(CAD_Point1, "指定下一点,这个点将通过计算得到屏幕坐标:")
+ W3 y" e6 ]( e3 V5 _9 f) ^   
% W0 n( v9 J/ V    ScreenPoint2(0) = Int(ScreenPoint1.x + (CAD_Point2(0) - CAD_Point1(0)) / BiLi)
  m! m9 f5 C. |    ScreenPoint2(1) = Int(ScreenPoint1.Y - (CAD_Point2(1) - CAD_Point1(1)) / BiLi)
$ ]4 t, z2 a% ^6 }) g    MsgBox "屏幕坐标:" & ScreenPoint2(0) & " / " & ScreenPoint2(1)8 }5 @3 {7 Y& K( h% Q& M1 P* }% ~
    '为了验证计算坐标,将CAD窗口在屏幕上移动到该点,看看效果吧。
+ i6 L  F9 [/ A; g# e1 k: v    ThisDrawing.Application.WindowState = acNorm
/ {2 l8 x- A: a/ d8 A# S4 k" n    ThisDrawing.Application.WindowLeft = ScreenPoint2(0)" u( R7 I5 X- |0 v; i
    ThisDrawing.Application.WindowTop = ScreenPoint2(1)! o& K/ ?4 d: Q- ]% p0 D7 D6 z
    " p* e" q# k# p# u6 v4 |
    ; y9 j. E" {8 ~* ?; ~
End Sub: G( p/ b& u# t; v9 N  Q" ~
'   通过屏幕坐标计算CAD坐标
& n% k+ j4 j: XSub GetCAD_Point()) a% ?( X" K  k: ?- U
    BiLi = ViewScreen  ?* O( X: ?* z* o# E
    CAD_Point1 = ThisDrawing.Utility.GetPoint(, "先指定一个点:") '获得鼠标所在位置的CAD坐标
9 f- A8 d; g, ~* O! p9 R+ N    ThisDrawing.ModelSpace.AddPoint CAD_Point1' b+ g+ D; O8 d$ C) f# S
    GetCursorPos ScreenPoint1   '通过api直接获得鼠标所在位置的屏幕坐标
$ X8 u, z1 g* ?. C; ]1 f7 L6 d    MsgBox "屏幕坐标:" & ScreenPoint1.x & " / " & ScreenPoint1.Y
/ l9 y# p: n% r# a7 p" q5 W8 K    MsgBox "对应的CAD坐标:" & CAD_Point1(0) & " / " & CAD_Point1(1). O0 G' m5 T/ G) g$ ^& `+ O
    '以上获得了CAD坐标和屏幕坐标的对应关系,下面就可以计算了4 k2 v1 ?& p( g( p+ f) V* b
   
( K# _( M9 x5 M) z    Dim ScreenPoint3 As POINTAPI& Y( P& [( |* R0 b
    GetCursorPos ScreenPoint3
( F2 J/ f3 {' v5 b1 _   
* E6 z# ]4 S7 s4 l; S+ k5 W    Dim CAD_Point3(2) As Double
3 Y* ]" r$ \  |1 k2 C    '计算cad坐标+ L' S6 p8 v. F' |+ u
    CAD_Point3(0) = CAD_Point1(0) + BiLi * (ScreenPoint3.x - ScreenPoint1.x)6 y" G) [3 j( ~0 V& M# v9 b
    CAD_Point3(1) = CAD_Point1(1) - BiLi * (ScreenPoint3.Y - ScreenPoint1.Y)4 s  [" D% G* _# d% U
    CAD_Point3(2) = 0$ w9 J1 A; Y/ Q9 C; c
    MsgBox "屏幕坐标:" & CAD_Point3(0) & " / " & CAD_Point3(1)
9 Q6 g: _6 ]8 @& D% N) h6 m. m7 j. l    '为了验证计算坐标,将画一条直线,看看效果吧。
2 Y, C& z, _0 ]4 c; Y4 Y    ThisDrawing.ModelSpace.AddLine CAD_Point1, CAD_Point3; d  Q" I3 {4 Z0 i
End Sub
zwo3_123213.gif

评分

参与人数 1三维币 +20 收起 理由
woaishuijia + 20 应助

查看全部评分

 楼主| 发表于 2010-1-23 21:22:40 | 显示全部楼层 来自: 中国江苏徐州
非常感谢你!我要把你讲的好好消化消化!!
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

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