QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
10天前
查看: 5011|回复: 2
收起左侧

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

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

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

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

x
如题,在cad中画一个 ∠ ,旁边有文字显示角度值,如果选中角的顶点并移动鼠标,如何让文字实时的显示角度呢?
发表于 2010-1-23 12:34:45 | 显示全部楼层 来自: 中国浙江宁波
本帖最后由 sealive_leafage 于 2010-1-23 12:37 编辑
2 T1 d& c% C2 f; q# s7 d5 N) L( W. C( ]( q
问题的难点在于在CAD中如何动态实时获得鼠标点的坐标,网上收集了些资料楼主可以体会一下;获得坐标值后则可以实现楼主要求的效果;详细参考:http://tiancao.net/blogview.asp?logID=214. b3 ]/ [. l! B3 S& O& r
CAD VBA实现橡皮筋直线、圆/ T- n. L& c* v! P% N9 w

" m  q; R) L# |: U3 k' V1 X) G+ u首先是计时控件,然后是实时捕捉鼠标的屏幕位置,然后是转换获得CAD当前试图鼠标所在的位置坐标,然后才是实时绘制直线或圆。
( Y1 L- W& n5 x; n& SVBA中不可直接使用vb的timer控件,我们可以调用独立的xTimer控件。
/ x* p1 L4 V9 X# r& \' O6 K. V" z控件下载:
2 `8 L, y, d) q* whttp://www.tiancao.net/flashget.asp?dizhi=http://www.tiancao.net/attachments/month_0707/qnft_XTimers.rar
& i) |% C. u; D# E+ f. L  L8 M6 o/ X0 b  K7 ~' R
然后是使用API函数GetCursorPos获得当前鼠标的屏幕坐标。
0 j4 |7 P! |! {& _( @# \0 f6 W: ]然后通过读取CAD系统变量viewSize荷Screensize分别得到当前试图的CAD高度和当前视口的屏幕尺寸(屏幕分辨率的像素).然后得到CAD实际尺寸和屏幕像素的比值。
, L! M$ x+ _) M5 ~精确度于鼠标的频率快慢有关系
$ G6 P! u2 d$ S& L# A, ^$ _% \/ e1 l7 G5 H) D
'获取CAD坐标系统和屏幕像素的比值
9 X- k9 u( ]' N5 W) l& |8 {Function ViewScreen() As Double" I1 r1 z7 B( B% d
    Dim ScreenSize As Variant
8 I- I) R- N' j  y4 ~/ `0 k( t    ScreenSize = ThisDrawing.GetVariable("screensize") '当前视口的屏幕宽度和高度
/ ~8 f& B4 o) D  m) k    Dim H As Variant) B& a0 a" Q4 I" B  o
    H = ThisDrawing.GetVariable("viewsize") '当前视图图形的实际高度7 ?: n9 g8 @2 s8 `- x0 b$ {
    ViewScreen = Abs(H / ScreenSize(1))
$ k0 `. c& K6 `End Function6 D& J: P$ }& k5 q9 C! H4 \8 P5 x
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
0 Z# q7 x; G; x- x! ?# S3 \5 Z- j; u+ O
实时获得鼠标的屏幕坐标,然后通过屏幕尺寸和cad实际尺寸的比值,计算出鼠标当前的cad坐标。) X& J" j  y+ v4 I+ C9 O' o
然后在基点和鼠标坐标之间绘制直线或圆。
) A2 W2 |- h" D5 L' R, ?; l2 _8 z值得注意的是,屏幕坐标的是以屏幕的左上角为原点的。而cad的世界坐标是以右下角为原点的。
+ [1 @& s- c0 S
' f' T, p$ W3 e'得到鼠标屏幕坐标' O; Z& s2 R$ O- p: R# q
) F6 R( o4 O# B
Private Type POINTAPI
, x. L2 M9 z# x8 f; A) z+ d7 W  T  k    x As Long& G$ S, M6 z: L, E; @/ S6 f
    Y As Long( w! A8 m& @2 Q  ?: V
End Type( a6 d6 X, X5 @* \' ~, R1 [
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
9 |, l$ {8 Q) |/ `Dim CAD_Point1 As Variant
7 O4 v9 V) d1 \: J; l! MDim CAD_Point2 As Variant
, y; A3 a0 J+ v4 r4 T. LDim ScreenPoint1 As POINTAPI
" q! I1 y( _( z# n6 xDim ScreenPoint2(1) As Long9 X* J0 T; o4 J
Dim BiLi As Double  y% V2 K6 b% E7 K$ i' V2 a
'获取CAD坐标系统和屏幕像素的比值
4 i+ {3 t+ s" T, U9 W) c8 hFunction ViewScreen() As Double8 V) Y* Q, @4 Q
    Dim ScreenSize As Variant: k2 o5 Y( }# Q- m& y8 K7 @0 Q! i
    ScreenSize = ThisDrawing.GetVariable("screensize") '当前视口的屏幕宽度和高度8 y0 p) `: `5 Q. b0 y& O6 F
    Dim H As Variant
/ I' [6 m) A1 I2 l# n0 H    H = ThisDrawing.GetVariable("viewsize") '当前视图图形的实际高度6 @0 u0 c. `& g' N& ~7 M0 \
    ViewScreen = Abs(H / ScreenSize(1))
: o% Q4 a  B3 m: _End Function
) I, h. r- c, o'通过CAD坐标计算屏幕坐标' {: L2 i9 U7 A5 W& I' ]
Sub GetScreenPoint()
# O/ j4 F! \$ a( @+ J/ l. L) o$ J5 ^    BiLi = ViewScreen- }6 y; g# Y1 W9 e$ R( s
    CAD_Point1 = ThisDrawing.Utility.GetPoint(, "先指定一个点:") '获得鼠标所在位置的CAD坐标: h0 ]- B0 v: p5 o+ P/ f
    ThisDrawing.ModelSpace.AddPoint CAD_Point1" J" I: O4 }8 ?
    GetCursorPos ScreenPoint1   '通过api直接获得鼠标所在位置的屏幕坐标
  L) F+ D( @+ Y1 i4 b8 F    MsgBox "屏幕坐标:" & ScreenPoint1.x & " / " & ScreenPoint1.Y5 P3 _. V0 D# n+ @
    MsgBox "对应的CAD坐标:" & CAD_Point1(0) & " / " & CAD_Point1(1)) |1 A% M* ]7 h7 L$ T$ D" ~
    '以上获得了CAD坐标和屏幕坐标的对应关系,下面就可以计算了
1 |1 i0 i6 ^" X2 R   
/ F! a2 I) p+ ~4 w    CAD_Point2 = ThisDrawing.Utility.GetPoint(CAD_Point1, "指定下一点,这个点将通过计算得到屏幕坐标:")
9 o" p$ K: l5 F- }7 J- `' p    4 f; x, B: U) w
    ScreenPoint2(0) = Int(ScreenPoint1.x + (CAD_Point2(0) - CAD_Point1(0)) / BiLi)/ e& J# E! V0 D  \, U, d
    ScreenPoint2(1) = Int(ScreenPoint1.Y - (CAD_Point2(1) - CAD_Point1(1)) / BiLi)2 X' N. J3 e3 t
    MsgBox "屏幕坐标:" & ScreenPoint2(0) & " / " & ScreenPoint2(1)/ [( Y+ f( f( I% {& X+ P
    '为了验证计算坐标,将CAD窗口在屏幕上移动到该点,看看效果吧。
& p% Z0 k% m" u# t' h    ThisDrawing.Application.WindowState = acNorm% b% C9 Z* ]  {  s8 o' ~) Y6 f
    ThisDrawing.Application.WindowLeft = ScreenPoint2(0)9 X# n+ P- e, v9 ?
    ThisDrawing.Application.WindowTop = ScreenPoint2(1)
7 U  a0 o& E# w: m' k# \7 u/ R7 `1 E   
3 u1 Q( C9 C$ d3 ]    5 [7 {* d* s8 O  g
End Sub
. B7 B' h! Z+ n+ H5 f'   通过屏幕坐标计算CAD坐标
. \/ [4 Q6 a8 n0 B* I0 z1 @Sub GetCAD_Point()
4 S6 i( w! o. f1 ]! z    BiLi = ViewScreen
$ z9 ?& N4 ~  s  j8 a) H( k    CAD_Point1 = ThisDrawing.Utility.GetPoint(, "先指定一个点:") '获得鼠标所在位置的CAD坐标; O) w& o$ ]1 M) c+ V
    ThisDrawing.ModelSpace.AddPoint CAD_Point12 h5 Y3 O( M* I5 Z# b
    GetCursorPos ScreenPoint1   '通过api直接获得鼠标所在位置的屏幕坐标  n* k1 I7 p6 {
    MsgBox "屏幕坐标:" & ScreenPoint1.x & " / " & ScreenPoint1.Y9 L* k& a2 Q) t( U1 V9 w
    MsgBox "对应的CAD坐标:" & CAD_Point1(0) & " / " & CAD_Point1(1)0 a  Z. q, r1 H9 `- f% T  ~% x
    '以上获得了CAD坐标和屏幕坐标的对应关系,下面就可以计算了. N% L* y: @1 R' F/ r9 y- p
   
) C1 F6 s: R1 E2 g$ S! `    Dim ScreenPoint3 As POINTAPI1 p! G- Z1 w' v8 J8 V7 g
    GetCursorPos ScreenPoint32 e. _' X" g( m
    : q# _1 I9 ~& Q0 T: ~- d
    Dim CAD_Point3(2) As Double' U) f) Q' y/ T, |
    '计算cad坐标
' `3 ^3 L, q" Z* o/ Y- o& c    CAD_Point3(0) = CAD_Point1(0) + BiLi * (ScreenPoint3.x - ScreenPoint1.x)
5 L8 s  f, o, T/ r% @# M    CAD_Point3(1) = CAD_Point1(1) - BiLi * (ScreenPoint3.Y - ScreenPoint1.Y)6 T! o/ J; [/ i1 f: @" f' M8 K
    CAD_Point3(2) = 0$ g. Y* E+ b2 I' K+ v/ ]1 p
    MsgBox "屏幕坐标:" & CAD_Point3(0) & " / " & CAD_Point3(1)6 P5 R# n4 w% g1 Y
    '为了验证计算坐标,将画一条直线,看看效果吧。9 r8 S5 N2 P$ T: n
    ThisDrawing.ModelSpace.AddLine CAD_Point1, CAD_Point3
7 Y" I% R9 y! iEnd 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 )

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