QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
9天前
查看: 5010|回复: 2
收起左侧

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

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

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

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

x
如题,在cad中画一个 ∠ ,旁边有文字显示角度值,如果选中角的顶点并移动鼠标,如何让文字实时的显示角度呢?
发表于 2010-1-23 12:34:45 | 显示全部楼层 来自: 中国浙江宁波
本帖最后由 sealive_leafage 于 2010-1-23 12:37 编辑 0 h; [/ {4 P4 ^9 G' Y; a7 X
1 Z$ P/ W) |# c* t; y% i
问题的难点在于在CAD中如何动态实时获得鼠标点的坐标,网上收集了些资料楼主可以体会一下;获得坐标值后则可以实现楼主要求的效果;详细参考:http://tiancao.net/blogview.asp?logID=214
3 A- D( S% x7 {3 m5 R. ^CAD VBA实现橡皮筋直线、圆
7 Y. W: n/ \/ E0 [
# W2 y2 n: F$ s% X8 k首先是计时控件,然后是实时捕捉鼠标的屏幕位置,然后是转换获得CAD当前试图鼠标所在的位置坐标,然后才是实时绘制直线或圆。* l6 h* Z* v$ l' G% k6 B3 S
VBA中不可直接使用vb的timer控件,我们可以调用独立的xTimer控件。
3 l, k7 P5 t3 {0 ^( j3 F% A控件下载: ! l# j1 k1 C' i' s' G2 V
http://www.tiancao.net/flashget.asp?dizhi=http://www.tiancao.net/attachments/month_0707/qnft_XTimers.rar: n% ?; E) G  U8 l& Z4 i% o* e$ l
- t, E! N5 u1 m; C6 b
然后是使用API函数GetCursorPos获得当前鼠标的屏幕坐标。) V4 A3 i1 ?$ J7 S! B
然后通过读取CAD系统变量viewSize荷Screensize分别得到当前试图的CAD高度和当前视口的屏幕尺寸(屏幕分辨率的像素).然后得到CAD实际尺寸和屏幕像素的比值。& v  t- o! j/ q* r/ @7 q
精确度于鼠标的频率快慢有关系/ d, z( c! o& z; t- m' e6 ~
  N' @+ \. V' I$ k1 t
'获取CAD坐标系统和屏幕像素的比值
: n% E# u( b/ U" zFunction ViewScreen() As Double3 Q9 j8 e  C, ~3 I! |) M
    Dim ScreenSize As Variant- r4 A* U; |! Z
    ScreenSize = ThisDrawing.GetVariable("screensize") '当前视口的屏幕宽度和高度0 Q( W# B; t4 M; o$ u% ?
    Dim H As Variant  S* d1 I( N+ x
    H = ThisDrawing.GetVariable("viewsize") '当前视图图形的实际高度6 b/ G  U( E  L$ b' O
    ViewScreen = Abs(H / ScreenSize(1))
+ z! c: D9 I) n' w5 }2 @  lEnd Function
. r1 N' y3 [% t( T- DPublic Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long& _& M4 p0 v" {: Q

, [1 y8 j; J5 a; h3 v$ T5 D! a1 a实时获得鼠标的屏幕坐标,然后通过屏幕尺寸和cad实际尺寸的比值,计算出鼠标当前的cad坐标。5 J3 t5 D& i0 D0 N6 g& L
然后在基点和鼠标坐标之间绘制直线或圆。' J2 N1 }: s" ?; N# i9 P
值得注意的是,屏幕坐标的是以屏幕的左上角为原点的。而cad的世界坐标是以右下角为原点的。
* S7 C* p5 ^# k2 N, i1 f
( Q5 R$ j! I5 A* s. N'得到鼠标屏幕坐标
9 K4 H$ F, a7 m) ^
- E' v: g( m/ R6 i( ^! o1 hPrivate Type POINTAPI
) v. o, C- \7 ^5 Z0 p+ e8 Q    x As Long2 u0 U& i7 G! P. Y3 D" w% g
    Y As Long; W9 S: A5 s6 t- k4 {# o4 C4 t
End Type3 Y7 _1 G2 K+ @2 o
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long' ?# A0 T1 @' e6 L/ B2 d# x( e  q
Dim CAD_Point1 As Variant
7 R4 p8 P* {, {" Q2 v2 I, K7 N( lDim CAD_Point2 As Variant  s( [, ^" O$ k) ?/ {# ?5 h
Dim ScreenPoint1 As POINTAPI: O# m5 B0 A  ~# v. q; q$ u
Dim ScreenPoint2(1) As Long
5 |& N+ P# g/ n7 E) X( tDim BiLi As Double$ W2 ]5 Y4 d& c! Y% ~1 E
'获取CAD坐标系统和屏幕像素的比值
$ n# |  t+ N% O. F& Q# X: b* Y& i4 ]$ |; FFunction ViewScreen() As Double
  U% }; L- j* l/ {. s& {: e    Dim ScreenSize As Variant
. }& k4 Q$ Y! y8 f; x5 I0 Z    ScreenSize = ThisDrawing.GetVariable("screensize") '当前视口的屏幕宽度和高度  ^& j& Q3 x+ a1 u( _6 t; e- m
    Dim H As Variant, Y% x% [9 s  K0 i2 x
    H = ThisDrawing.GetVariable("viewsize") '当前视图图形的实际高度! i$ H6 Z+ C3 t/ P6 t0 I- ?. V+ W
    ViewScreen = Abs(H / ScreenSize(1)). F% A! o( m5 f$ J: X! e  C8 V& H
End Function( b% H5 o9 C& ^% i9 ]. x
'通过CAD坐标计算屏幕坐标4 \, ~' z( T: ^0 B# Q
Sub GetScreenPoint()
0 o8 H' ~/ Z: c    BiLi = ViewScreen: {7 o2 k* q1 w. o, `3 Y8 _( u
    CAD_Point1 = ThisDrawing.Utility.GetPoint(, "先指定一个点:") '获得鼠标所在位置的CAD坐标; O- ]6 X. Y$ h# H. j% n3 w
    ThisDrawing.ModelSpace.AddPoint CAD_Point1
4 W8 d8 e+ {2 c/ Q2 ^! @6 F0 u+ D2 R    GetCursorPos ScreenPoint1   '通过api直接获得鼠标所在位置的屏幕坐标
+ v9 @* E% I  f) C1 k    MsgBox "屏幕坐标:" & ScreenPoint1.x & " / " & ScreenPoint1.Y
7 B$ D/ G1 p0 D! J/ g    MsgBox "对应的CAD坐标:" & CAD_Point1(0) & " / " & CAD_Point1(1)
, m5 J$ F1 q) l. o; b9 J    '以上获得了CAD坐标和屏幕坐标的对应关系,下面就可以计算了& {% o, C! L. Z8 z* B9 b  T. M
   
/ a7 c* y% F5 N( H; z; c    CAD_Point2 = ThisDrawing.Utility.GetPoint(CAD_Point1, "指定下一点,这个点将通过计算得到屏幕坐标:")+ h1 i1 D% y2 Q" x; _# x5 ~
   
- s, ~7 J- a6 F2 F/ v8 R    ScreenPoint2(0) = Int(ScreenPoint1.x + (CAD_Point2(0) - CAD_Point1(0)) / BiLi)
2 Q9 ?; h& B' Q% U, K    ScreenPoint2(1) = Int(ScreenPoint1.Y - (CAD_Point2(1) - CAD_Point1(1)) / BiLi)
) R+ [% R; ~; F9 u$ ?2 F8 a7 T) w    MsgBox "屏幕坐标:" & ScreenPoint2(0) & " / " & ScreenPoint2(1)0 d, U% S  k: M% o) P
    '为了验证计算坐标,将CAD窗口在屏幕上移动到该点,看看效果吧。0 ~, O! [1 ^0 S
    ThisDrawing.Application.WindowState = acNorm
- k+ Y& H1 D: Y" w7 ]5 F, {! m! f    ThisDrawing.Application.WindowLeft = ScreenPoint2(0)
8 d  ~% K. t! E% \% r: d& E    ThisDrawing.Application.WindowTop = ScreenPoint2(1): I1 }) X$ \$ M3 x% _0 L' J
    ' v6 q2 D+ N8 w4 x
    ) x& P: p; Z3 h+ V# g" Y
End Sub
# S3 w1 ]8 B3 L, h$ c'   通过屏幕坐标计算CAD坐标, U! k$ w' z- K: @
Sub GetCAD_Point()
  W8 V8 g9 F( d/ i; D% b; |    BiLi = ViewScreen% v: _5 U5 Z0 H$ [) H8 W* c
    CAD_Point1 = ThisDrawing.Utility.GetPoint(, "先指定一个点:") '获得鼠标所在位置的CAD坐标
& H4 H) V6 F! _* }5 W4 e9 H  d    ThisDrawing.ModelSpace.AddPoint CAD_Point1/ Q$ H6 o9 B/ L6 y
    GetCursorPos ScreenPoint1   '通过api直接获得鼠标所在位置的屏幕坐标
' p% ~1 t: Z3 Y1 ^: K% b0 i" H    MsgBox "屏幕坐标:" & ScreenPoint1.x & " / " & ScreenPoint1.Y- L5 ^! D; C( x' H: A
    MsgBox "对应的CAD坐标:" & CAD_Point1(0) & " / " & CAD_Point1(1)4 o$ I* F7 @4 B
    '以上获得了CAD坐标和屏幕坐标的对应关系,下面就可以计算了7 p/ p* x' d) n2 S7 o, l4 D  r
   
  ~* M0 Z8 S. F! e1 E$ q    Dim ScreenPoint3 As POINTAPI5 I7 U' X. \# u2 [
    GetCursorPos ScreenPoint31 k  x( P8 @1 }" j
   
) U0 i. h! \4 O5 r9 m  q0 k    Dim CAD_Point3(2) As Double/ i6 X6 w0 _% I. I9 W
    '计算cad坐标* g+ L  y% k1 V' p
    CAD_Point3(0) = CAD_Point1(0) + BiLi * (ScreenPoint3.x - ScreenPoint1.x)
) ], ~7 g# I, k( G2 p    CAD_Point3(1) = CAD_Point1(1) - BiLi * (ScreenPoint3.Y - ScreenPoint1.Y)
8 n  S% ?9 A5 _8 _    CAD_Point3(2) = 0
2 `" q! W, N2 x! `; I    MsgBox "屏幕坐标:" & CAD_Point3(0) & " / " & CAD_Point3(1), m. A# R; x& a0 r7 Q( J
    '为了验证计算坐标,将画一条直线,看看效果吧。( B  q6 s, g' A
    ThisDrawing.ModelSpace.AddLine CAD_Point1, CAD_Point35 h* S4 c+ a3 s5 o- ]# Z( b2 }
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 )

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