QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
8天前
查看: 5044|回复: 2
收起左侧

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

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

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

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

x
如题,在cad中画一个 ∠ ,旁边有文字显示角度值,如果选中角的顶点并移动鼠标,如何让文字实时的显示角度呢?
发表于 2010-1-23 12:34:45 | 显示全部楼层 来自: 中国浙江宁波
本帖最后由 sealive_leafage 于 2010-1-23 12:37 编辑
. g2 Q& e9 g3 r4 K# ^4 G0 m- [8 L( F9 `; x  d3 B0 [6 @' a: l% V$ {
问题的难点在于在CAD中如何动态实时获得鼠标点的坐标,网上收集了些资料楼主可以体会一下;获得坐标值后则可以实现楼主要求的效果;详细参考:http://tiancao.net/blogview.asp?logID=214! u* N# f4 f: i+ f3 k% s
CAD VBA实现橡皮筋直线、圆4 A& z& ~0 q5 I* c# Z/ t) W

( Q; c  F7 _# I6 X- F9 e首先是计时控件,然后是实时捕捉鼠标的屏幕位置,然后是转换获得CAD当前试图鼠标所在的位置坐标,然后才是实时绘制直线或圆。8 f, T5 l4 ~$ u5 o
VBA中不可直接使用vb的timer控件,我们可以调用独立的xTimer控件。
. |1 B  V7 p5 I控件下载:   E* I4 ?1 j$ I' g  O
http://www.tiancao.net/flashget.asp?dizhi=http://www.tiancao.net/attachments/month_0707/qnft_XTimers.rar4 ]2 }2 x6 \/ ^# V0 a6 f; r: I$ j1 H

* h1 @8 s& a7 y- \% a然后是使用API函数GetCursorPos获得当前鼠标的屏幕坐标。# W# f# S, W. _6 ]& l, C9 X8 [/ d) m
然后通过读取CAD系统变量viewSize荷Screensize分别得到当前试图的CAD高度和当前视口的屏幕尺寸(屏幕分辨率的像素).然后得到CAD实际尺寸和屏幕像素的比值。
% z. [4 N: R7 Q/ s0 K8 K精确度于鼠标的频率快慢有关系3 g3 @3 ^/ j8 o" I5 t+ z& I

, }# Z, C' E5 y1 A4 Y1 T'获取CAD坐标系统和屏幕像素的比值; T+ v4 j: U8 R; q+ f2 b
Function ViewScreen() As Double! ]8 B- |& y4 O
    Dim ScreenSize As Variant$ U8 B; K" h4 r- M5 L: o
    ScreenSize = ThisDrawing.GetVariable("screensize") '当前视口的屏幕宽度和高度* `% j7 F. f% n
    Dim H As Variant& _) s; p6 Y4 q) T5 P
    H = ThisDrawing.GetVariable("viewsize") '当前视图图形的实际高度/ @! B3 r2 i7 _4 k5 h; C/ X
    ViewScreen = Abs(H / ScreenSize(1))7 @& F' \$ a; t% P& m$ A
End Function
" c( q) f5 Z* MPublic Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
) I  O% j8 ]* o# H+ P6 A' C. E% n
; ], x0 t5 l& ]2 U  K实时获得鼠标的屏幕坐标,然后通过屏幕尺寸和cad实际尺寸的比值,计算出鼠标当前的cad坐标。
" W# t7 K; b9 f% U) l然后在基点和鼠标坐标之间绘制直线或圆。3 O( u0 l2 a9 X0 D7 W0 n" }/ w; Z
值得注意的是,屏幕坐标的是以屏幕的左上角为原点的。而cad的世界坐标是以右下角为原点的。
4 M9 g$ f6 h8 V" M& V( C* K7 s5 j
'得到鼠标屏幕坐标
! {% P0 C# I: X2 ]
8 ]0 N7 s+ c( D% f1 w/ i. m4 S4 XPrivate Type POINTAPI" ^" R, m8 ^8 M8 ?
    x As Long
; m6 F2 q3 j6 [- Z" D5 O4 I8 a    Y As Long
4 a4 o% t1 Q, j" PEnd Type
9 y8 f8 V3 E( U  F! O. WPrivate Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
; T  n% G8 t8 F* a5 MDim CAD_Point1 As Variant
; U4 D  {- ?9 v) b+ l# v# I5 BDim CAD_Point2 As Variant" d9 S& K* j" @# }
Dim ScreenPoint1 As POINTAPI& d, R; M* O1 Y6 d$ s8 K6 k
Dim ScreenPoint2(1) As Long
1 b7 d; W5 f  h  ~/ z4 bDim BiLi As Double
% U0 S8 d) Y4 {. j3 q( p, T3 r'获取CAD坐标系统和屏幕像素的比值
# [9 ]5 l' l! L( F- qFunction ViewScreen() As Double: Y4 g* b% u0 x. R$ q7 y
    Dim ScreenSize As Variant; g$ `  |1 _0 E) s/ ^
    ScreenSize = ThisDrawing.GetVariable("screensize") '当前视口的屏幕宽度和高度" ^0 @9 y& h6 d$ b
    Dim H As Variant( g0 X; Z1 a# F  R7 w$ W& ~% v3 I7 N
    H = ThisDrawing.GetVariable("viewsize") '当前视图图形的实际高度
& r% I& C& d0 S% _$ }    ViewScreen = Abs(H / ScreenSize(1))
* P7 |. Q' ^. ]1 D; a/ J  pEnd Function5 K4 g) z3 e7 n" t6 F/ q3 `! A5 i
'通过CAD坐标计算屏幕坐标0 o/ ]& f5 d8 G9 n5 d% y) ?
Sub GetScreenPoint()
8 @9 j5 v8 f$ g4 g2 F: W    BiLi = ViewScreen
" h2 S9 Q" a) p3 l" ^7 E    CAD_Point1 = ThisDrawing.Utility.GetPoint(, "先指定一个点:") '获得鼠标所在位置的CAD坐标
7 i% {  V$ Q; J8 L2 o7 ^) `) E    ThisDrawing.ModelSpace.AddPoint CAD_Point1
% e" a1 U4 e+ ~: V1 W' w    GetCursorPos ScreenPoint1   '通过api直接获得鼠标所在位置的屏幕坐标
6 m% E! R/ o; x& X( q: o    MsgBox "屏幕坐标:" & ScreenPoint1.x & " / " & ScreenPoint1.Y
8 U  Y4 X6 r$ S5 ~3 G& X    MsgBox "对应的CAD坐标:" & CAD_Point1(0) & " / " & CAD_Point1(1)/ o- S$ H/ q* z0 v" ?0 m
    '以上获得了CAD坐标和屏幕坐标的对应关系,下面就可以计算了
& x) F0 f% m( Q" K1 W   
6 e2 B9 Z  x, q" i5 r& V  ^    CAD_Point2 = ThisDrawing.Utility.GetPoint(CAD_Point1, "指定下一点,这个点将通过计算得到屏幕坐标:"), o, m3 ^7 H+ Z" H2 ]4 ~
    3 P) J- P# a  y
    ScreenPoint2(0) = Int(ScreenPoint1.x + (CAD_Point2(0) - CAD_Point1(0)) / BiLi)
0 F1 G( r9 U. f    ScreenPoint2(1) = Int(ScreenPoint1.Y - (CAD_Point2(1) - CAD_Point1(1)) / BiLi)
+ f# h/ b: F9 ~$ A0 p$ F    MsgBox "屏幕坐标:" & ScreenPoint2(0) & " / " & ScreenPoint2(1)
6 S" q, i$ c. G: r) L7 u+ ^    '为了验证计算坐标,将CAD窗口在屏幕上移动到该点,看看效果吧。
+ J4 Y7 L" h9 h9 R( o' Z    ThisDrawing.Application.WindowState = acNorm: }) _4 m# a6 i$ t2 l! C
    ThisDrawing.Application.WindowLeft = ScreenPoint2(0)6 k2 X" W  p& n6 o& @8 X
    ThisDrawing.Application.WindowTop = ScreenPoint2(1)* ]6 o+ x  o9 w; i
   
3 |- `7 x. a9 U$ p% O% l   
0 e$ S4 ]! [" x. ?. O7 k' w- p* LEnd Sub" S5 Z. R" G5 z  Q7 m; a- k
'   通过屏幕坐标计算CAD坐标
5 u  o+ T/ H9 |0 D- b0 \: X* vSub GetCAD_Point()
5 V2 w- R; L. x) F6 z    BiLi = ViewScreen  Q( B# C# J3 i; Q- Y
    CAD_Point1 = ThisDrawing.Utility.GetPoint(, "先指定一个点:") '获得鼠标所在位置的CAD坐标% J) @* l: E! h
    ThisDrawing.ModelSpace.AddPoint CAD_Point19 w0 |8 [4 _" {  [
    GetCursorPos ScreenPoint1   '通过api直接获得鼠标所在位置的屏幕坐标
0 m9 E6 Y( \8 s( D$ a- M    MsgBox "屏幕坐标:" & ScreenPoint1.x & " / " & ScreenPoint1.Y
, S% {) c5 @7 K$ z3 |$ C    MsgBox "对应的CAD坐标:" & CAD_Point1(0) & " / " & CAD_Point1(1); z# W( ~& ~- c* z+ G5 g# Z- j
    '以上获得了CAD坐标和屏幕坐标的对应关系,下面就可以计算了
& D9 J" ^& }: e' |   
- }( Y3 y0 F6 Z" r5 }    Dim ScreenPoint3 As POINTAPI! ], H' q  x/ ^( j6 `
    GetCursorPos ScreenPoint37 k, E* J6 E- v0 C/ ]
    , t5 J0 U" c6 k. K' A* H& }
    Dim CAD_Point3(2) As Double
. x0 N. z5 Q6 Q: Q7 {    '计算cad坐标
- D6 E2 E; W6 X- a% V/ p5 ?; E    CAD_Point3(0) = CAD_Point1(0) + BiLi * (ScreenPoint3.x - ScreenPoint1.x)& T6 l3 X) M+ P: {' K! }2 P1 i! z( X
    CAD_Point3(1) = CAD_Point1(1) - BiLi * (ScreenPoint3.Y - ScreenPoint1.Y)
" l) Q/ _& R4 r: O0 d3 f# Q    CAD_Point3(2) = 01 x6 N( A% s! m# h% u8 }: g5 o
    MsgBox "屏幕坐标:" & CAD_Point3(0) & " / " & CAD_Point3(1); |8 M0 z4 b+ Y$ \, H: V- p8 u  Z: a
    '为了验证计算坐标,将画一条直线,看看效果吧。
# v9 ^; i. W" S    ThisDrawing.ModelSpace.AddLine CAD_Point1, CAD_Point3$ B+ Z7 y1 [9 s0 o
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 )

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