QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
7天前
查看: 5041|回复: 2
收起左侧

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

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

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

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

x
如题,在cad中画一个 ∠ ,旁边有文字显示角度值,如果选中角的顶点并移动鼠标,如何让文字实时的显示角度呢?
发表于 2010-1-23 12:34:45 | 显示全部楼层 来自: 中国浙江宁波
本帖最后由 sealive_leafage 于 2010-1-23 12:37 编辑
; b+ ~" O" O* j3 L( r1 t- o3 F
0 ~! G3 N9 ?& R1 I8 @8 @  e1 ~问题的难点在于在CAD中如何动态实时获得鼠标点的坐标,网上收集了些资料楼主可以体会一下;获得坐标值后则可以实现楼主要求的效果;详细参考:http://tiancao.net/blogview.asp?logID=214
, N! a6 c/ I4 a4 l& ICAD VBA实现橡皮筋直线、圆
/ ?& Z0 P" a. t1 |6 ~8 ~
) d/ W5 r3 _4 l7 [2 ^首先是计时控件,然后是实时捕捉鼠标的屏幕位置,然后是转换获得CAD当前试图鼠标所在的位置坐标,然后才是实时绘制直线或圆。  P& [, V. I$ i; A) d; {5 X4 h
VBA中不可直接使用vb的timer控件,我们可以调用独立的xTimer控件。
4 d$ W8 C, ~5 l6 u% y0 R2 `控件下载: ; Z# D! u/ S; E/ R2 t& F, \
http://www.tiancao.net/flashget.asp?dizhi=http://www.tiancao.net/attachments/month_0707/qnft_XTimers.rar
7 E, C" d: X" l& g( K' j# a+ V9 k# E! ~$ ~/ F0 A
然后是使用API函数GetCursorPos获得当前鼠标的屏幕坐标。& ]( `4 f6 }/ R+ G+ |+ \* q; }1 t; G
然后通过读取CAD系统变量viewSize荷Screensize分别得到当前试图的CAD高度和当前视口的屏幕尺寸(屏幕分辨率的像素).然后得到CAD实际尺寸和屏幕像素的比值。
7 W! i- u3 q3 M' S% \7 o- f  D4 \5 ?精确度于鼠标的频率快慢有关系/ e0 Z9 n$ G9 }$ |
8 ~  j& [$ R% N: Q' c: b
'获取CAD坐标系统和屏幕像素的比值) J3 m5 t8 p6 V( X8 G. p. N
Function ViewScreen() As Double$ Y; P3 t3 t+ R  T
    Dim ScreenSize As Variant
3 r1 k/ [8 b1 \) h# f    ScreenSize = ThisDrawing.GetVariable("screensize") '当前视口的屏幕宽度和高度
4 t% @* O4 i. {2 s' L- S    Dim H As Variant
/ \8 k0 T+ R  ?. X    H = ThisDrawing.GetVariable("viewsize") '当前视图图形的实际高度
1 C, i2 j2 d; y( L" M, R    ViewScreen = Abs(H / ScreenSize(1))
6 R/ x# L' Q3 q& T) T9 z, qEnd Function% \) ^4 F/ z6 l! n+ a. s
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long3 V1 d& O1 D% x: S0 s, z8 T

/ S+ Q5 T/ H3 t! e, H实时获得鼠标的屏幕坐标,然后通过屏幕尺寸和cad实际尺寸的比值,计算出鼠标当前的cad坐标。( f+ p4 @3 \! z8 V4 d
然后在基点和鼠标坐标之间绘制直线或圆。
% `" g! S; Z. o值得注意的是,屏幕坐标的是以屏幕的左上角为原点的。而cad的世界坐标是以右下角为原点的。
4 D! F+ |* m' v; e" {# X( i8 O0 {: ?0 D7 [3 ~
'得到鼠标屏幕坐标
% [6 |& j" m; d6 [
3 h) l% _( M; S; [9 |# }, nPrivate Type POINTAPI' e* l) r% e" ?  w
    x As Long
/ z- a" r! `( O) a2 a! I    Y As Long. y$ w3 }% I1 }  G# `
End Type6 M' G9 n' |% d2 e
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
) P9 o' h; h0 h  Y6 H5 f2 b0 l0 gDim CAD_Point1 As Variant& _" |9 Y$ ^/ U( o
Dim CAD_Point2 As Variant
- _$ \# z$ P) N& R1 YDim ScreenPoint1 As POINTAPI
( Y' J3 X( P+ Y2 ]) k5 S' u8 a6 iDim ScreenPoint2(1) As Long
  \6 ?: s5 F4 KDim BiLi As Double) f; ?! N: z1 Q; x1 E
'获取CAD坐标系统和屏幕像素的比值0 G6 b$ x- A2 _, y' r; G3 j0 X/ o
Function ViewScreen() As Double
$ w# x5 {1 G0 G) }% T    Dim ScreenSize As Variant; Q; H; K/ K/ a
    ScreenSize = ThisDrawing.GetVariable("screensize") '当前视口的屏幕宽度和高度' i+ H% l' ~5 C% ?9 `8 J9 v
    Dim H As Variant8 J2 {9 Q& Z4 u. j
    H = ThisDrawing.GetVariable("viewsize") '当前视图图形的实际高度' b% \% W/ k5 T- V* Q" `. ?
    ViewScreen = Abs(H / ScreenSize(1))( ]# |  u  `  A
End Function* ?# P0 h- o. Z5 j' D4 z
'通过CAD坐标计算屏幕坐标- x' o  a! r% s( Y9 R$ n
Sub GetScreenPoint()
5 ?# S5 o) E# E$ h* ?- D    BiLi = ViewScreen
9 g" l& h' C8 ~' x  R    CAD_Point1 = ThisDrawing.Utility.GetPoint(, "先指定一个点:") '获得鼠标所在位置的CAD坐标
1 z2 U) O& B" |) Y9 A3 A    ThisDrawing.ModelSpace.AddPoint CAD_Point1
0 ?& B: n% V5 w    GetCursorPos ScreenPoint1   '通过api直接获得鼠标所在位置的屏幕坐标6 w1 p2 M9 g8 V& O: ?
    MsgBox "屏幕坐标:" & ScreenPoint1.x & " / " & ScreenPoint1.Y4 A' s$ Q2 R4 j; j$ D* k: C
    MsgBox "对应的CAD坐标:" & CAD_Point1(0) & " / " & CAD_Point1(1)6 L& Y6 w! y2 a" R3 r# c! T* Y  {
    '以上获得了CAD坐标和屏幕坐标的对应关系,下面就可以计算了
; Z" r8 i# K! J( M" P' F   
. U0 Q; C5 `; @* F1 v    CAD_Point2 = ThisDrawing.Utility.GetPoint(CAD_Point1, "指定下一点,这个点将通过计算得到屏幕坐标:")
5 g* x' |9 y8 x: |% f    6 [" {9 D' e& D& y) K
    ScreenPoint2(0) = Int(ScreenPoint1.x + (CAD_Point2(0) - CAD_Point1(0)) / BiLi)
  A8 _) u( b; K! l3 I' N    ScreenPoint2(1) = Int(ScreenPoint1.Y - (CAD_Point2(1) - CAD_Point1(1)) / BiLi)
% j5 X2 {1 I& c3 a  e4 M# Q( J: |    MsgBox "屏幕坐标:" & ScreenPoint2(0) & " / " & ScreenPoint2(1). z, U' T4 m* t* b2 C
    '为了验证计算坐标,将CAD窗口在屏幕上移动到该点,看看效果吧。: e& n1 i# e; J4 i# s
    ThisDrawing.Application.WindowState = acNorm
$ B+ u, e  F! E" D    ThisDrawing.Application.WindowLeft = ScreenPoint2(0)
4 d; G* h9 E6 ]/ D# a: I    ThisDrawing.Application.WindowTop = ScreenPoint2(1)! J5 ^. C: \* z3 m1 ^
   
! ?4 h, m  ~, a! z9 o    " H7 U! J2 x" {, n7 Q$ F
End Sub$ c& v) C. c! f  k' |5 Y4 \
'   通过屏幕坐标计算CAD坐标
$ v1 J7 |  N. o$ W6 y# wSub GetCAD_Point()
; J# Y2 \1 f2 ?* e3 I    BiLi = ViewScreen
  [" h7 y4 k9 x; g    CAD_Point1 = ThisDrawing.Utility.GetPoint(, "先指定一个点:") '获得鼠标所在位置的CAD坐标
% o# s  R" ^* \    ThisDrawing.ModelSpace.AddPoint CAD_Point1
1 D  ~# A9 J$ A8 h3 l3 J; b1 e    GetCursorPos ScreenPoint1   '通过api直接获得鼠标所在位置的屏幕坐标
) t5 D4 q* s* X! A2 D$ v/ ~    MsgBox "屏幕坐标:" & ScreenPoint1.x & " / " & ScreenPoint1.Y
" _$ M5 h' h/ }; V9 t, d) R    MsgBox "对应的CAD坐标:" & CAD_Point1(0) & " / " & CAD_Point1(1)/ t" R1 S; G3 m, b  i( Z
    '以上获得了CAD坐标和屏幕坐标的对应关系,下面就可以计算了1 k; S2 {; A6 S5 O  b
   
% ^1 H( F, v1 V. h    Dim ScreenPoint3 As POINTAPI
# c- [! p+ Q" b1 k# e( Z( A    GetCursorPos ScreenPoint3" q  |) U% j6 E) J3 k# v9 f
   
) S& e9 Z: @: L& V* U7 ]3 g! O    Dim CAD_Point3(2) As Double
  Z2 n/ V$ K: I  y* w    '计算cad坐标
" M* A8 y; w/ ^8 {    CAD_Point3(0) = CAD_Point1(0) + BiLi * (ScreenPoint3.x - ScreenPoint1.x)* P4 R/ {* `4 o& \# z! R
    CAD_Point3(1) = CAD_Point1(1) - BiLi * (ScreenPoint3.Y - ScreenPoint1.Y)
% ?! s  ^$ s3 {) Q! x    CAD_Point3(2) = 0
2 G8 A  m5 J5 ~    MsgBox "屏幕坐标:" & CAD_Point3(0) & " / " & CAD_Point3(1)5 j$ a& N  x7 Q" V$ s  B
    '为了验证计算坐标,将画一条直线,看看效果吧。2 p3 Z( \7 V" {% `# D7 z8 F$ m
    ThisDrawing.ModelSpace.AddLine CAD_Point1, CAD_Point3
4 M' _! }! t+ ^+ l4 wEnd 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 )

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