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