|
发表于 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 |
-
评分
-
查看全部评分
|