|
发表于 2010-1-23 12:34:45
|
显示全部楼层
来自: 中国浙江宁波
本帖最后由 sealive_leafage 于 2010-1-23 12:37 编辑 % }" e, T) \$ ?& K9 A; i
2 u1 C* w3 j3 J! Y1 Q
问题的难点在于在CAD中如何动态实时获得鼠标点的坐标,网上收集了些资料楼主可以体会一下;获得坐标值后则可以实现楼主要求的效果;详细参考:http://tiancao.net/blogview.asp?logID=2147 |. L5 j8 t1 L5 k
CAD VBA实现橡皮筋直线、圆1 [- l# \. [# P1 A
3 M5 I6 E; S! P4 z& ?+ P# P7 Z1 A首先是计时控件,然后是实时捕捉鼠标的屏幕位置,然后是转换获得CAD当前试图鼠标所在的位置坐标,然后才是实时绘制直线或圆。
/ Y; V& i. w6 ?3 p% ZVBA中不可直接使用vb的timer控件,我们可以调用独立的xTimer控件。
0 R' n3 l7 g! R4 U控件下载: + v- \, D7 i. m! A& R. h- u
http://www.tiancao.net/flashget.asp?dizhi=http://www.tiancao.net/attachments/month_0707/qnft_XTimers.rar
2 _7 x1 [6 \# J1 B- l9 [8 `1 F; J& m @) y; Q5 y4 V) x- Q# j* F
然后是使用API函数GetCursorPos获得当前鼠标的屏幕坐标。$ f. w* \( t: b# q
然后通过读取CAD系统变量viewSize荷Screensize分别得到当前试图的CAD高度和当前视口的屏幕尺寸(屏幕分辨率的像素).然后得到CAD实际尺寸和屏幕像素的比值。
& g) ^1 Y6 J/ ?4 s5 P精确度于鼠标的频率快慢有关系6 \+ Z9 b& E( ?/ E+ t; N
% L7 ^# l- x0 x) ] Q
'获取CAD坐标系统和屏幕像素的比值+ O3 k) t9 j! \# g' |0 Z
Function ViewScreen() As Double; ^/ [8 J- _2 x3 E. g6 |
Dim ScreenSize As Variant/ Y6 N1 A6 i& U' M$ b# X
ScreenSize = ThisDrawing.GetVariable("screensize") '当前视口的屏幕宽度和高度
7 N& N- t# v, z& [ M; I Dim H As Variant; N- d$ ]7 x0 T
H = ThisDrawing.GetVariable("viewsize") '当前视图图形的实际高度8 H6 b3 N1 }, n# i4 i+ W) e
ViewScreen = Abs(H / ScreenSize(1))
9 q, W6 C0 z3 f! q- H/ S7 `; `, JEnd Function/ U+ R1 `, T# \2 J( F# U: F
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long% `. }8 c& d& G. I
& f- r6 ~* x- }, r' z; b( Z
实时获得鼠标的屏幕坐标,然后通过屏幕尺寸和cad实际尺寸的比值,计算出鼠标当前的cad坐标。1 ^' ~ ?7 d3 p, s( W P1 `1 O+ _
然后在基点和鼠标坐标之间绘制直线或圆。4 m9 J1 ?; Q, ^+ e# X* ?
值得注意的是,屏幕坐标的是以屏幕的左上角为原点的。而cad的世界坐标是以右下角为原点的。! I3 a4 F! x0 _5 X9 b" @
. V/ B+ d1 N C/ O5 D( b
'得到鼠标屏幕坐标
& M* r; s. h9 P1 `" J0 T' {* H% m3 ~/ ~$ j
Private Type POINTAPI. a% h& i( }4 {8 S) L
x As Long2 U2 U2 U) w7 h( p/ G, G% E* P
Y As Long, Z0 _# D; W- t' ]
End Type
6 O/ {. d; m- Z4 e) kPrivate Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
, T, r+ n+ b/ u( _Dim CAD_Point1 As Variant
& J/ J6 d6 u: Q) J1 J: h% uDim CAD_Point2 As Variant
$ C2 v$ D) f' Q, m+ q. k/ ^Dim ScreenPoint1 As POINTAPI# Y# a5 {$ x$ c U$ F
Dim ScreenPoint2(1) As Long
0 L* ?+ m% b" d2 }Dim BiLi As Double$ I f' a% n& ?( A4 |
'获取CAD坐标系统和屏幕像素的比值
P9 c- y% h7 a" e- \7 |, q0 hFunction ViewScreen() As Double
0 t, L$ R; C( h+ M* p5 I' n7 k* g s Dim ScreenSize As Variant+ U1 C* F4 r9 ]( B; V0 o
ScreenSize = ThisDrawing.GetVariable("screensize") '当前视口的屏幕宽度和高度, f' a" j- U6 |) `1 }( g* r
Dim H As Variant
& v) v( I6 ~0 v/ m b0 l+ M H = ThisDrawing.GetVariable("viewsize") '当前视图图形的实际高度& k& V: T% t. r$ U8 u* J- D" Z+ n7 |% J
ViewScreen = Abs(H / ScreenSize(1))* ]! S) q( j/ O6 S
End Function& U# T1 v2 o. p
'通过CAD坐标计算屏幕坐标
* ^( t6 h2 ^) A3 A$ mSub GetScreenPoint()
: V' b0 D8 s( Q+ D BiLi = ViewScreen( s/ t A+ H* w/ Q+ J0 v
CAD_Point1 = ThisDrawing.Utility.GetPoint(, "先指定一个点:") '获得鼠标所在位置的CAD坐标- v0 j* s( Y2 C& ?5 }
ThisDrawing.ModelSpace.AddPoint CAD_Point1
: A) B6 B4 I4 P GetCursorPos ScreenPoint1 '通过api直接获得鼠标所在位置的屏幕坐标
; u6 L+ P: w7 l/ O; ? MsgBox "屏幕坐标:" & ScreenPoint1.x & " / " & ScreenPoint1.Y
! _2 E# h; S! L/ @2 m MsgBox "对应的CAD坐标:" & CAD_Point1(0) & " / " & CAD_Point1(1)2 v2 G* \: @/ N6 _5 {- F
'以上获得了CAD坐标和屏幕坐标的对应关系,下面就可以计算了3 r, u% p- D8 e# l
) V4 ?4 {8 Q8 k: t
CAD_Point2 = ThisDrawing.Utility.GetPoint(CAD_Point1, "指定下一点,这个点将通过计算得到屏幕坐标:")
E6 E4 }" n1 G) A! Z8 n
1 N- K6 |$ g8 E4 Q7 y* J; t- F3 R ScreenPoint2(0) = Int(ScreenPoint1.x + (CAD_Point2(0) - CAD_Point1(0)) / BiLi), _6 {7 [; z2 J5 ]' @% j v
ScreenPoint2(1) = Int(ScreenPoint1.Y - (CAD_Point2(1) - CAD_Point1(1)) / BiLi)/ `8 Z. P% m+ u$ W( S
MsgBox "屏幕坐标:" & ScreenPoint2(0) & " / " & ScreenPoint2(1) W4 f/ o; _2 F' j
'为了验证计算坐标,将CAD窗口在屏幕上移动到该点,看看效果吧。0 e1 S! g. f2 u- A0 \1 a# k
ThisDrawing.Application.WindowState = acNorm
. Y8 a( A& x7 A0 K) U! F. E ThisDrawing.Application.WindowLeft = ScreenPoint2(0)9 E! h% ]" T/ L K- K* e
ThisDrawing.Application.WindowTop = ScreenPoint2(1)2 ]: o9 K! D6 ~- M
9 t* Z. `+ s! x% N& n& ~/ O
1 e \' u. }! K3 ]3 U" a4 [& EEnd Sub4 c9 f- f+ ~/ [* V+ K% n) B
' 通过屏幕坐标计算CAD坐标3 G4 X: N6 Y. }$ }: ^/ h) O& K
Sub GetCAD_Point()! {) W/ U$ a" ]' ?2 F- p$ c
BiLi = ViewScreen
: X" B9 p( O0 }/ P) T$ l; ] CAD_Point1 = ThisDrawing.Utility.GetPoint(, "先指定一个点:") '获得鼠标所在位置的CAD坐标2 l$ e+ g8 y, U. m! }% N% O3 m
ThisDrawing.ModelSpace.AddPoint CAD_Point1
6 i. f% i: y. [6 g1 j3 O GetCursorPos ScreenPoint1 '通过api直接获得鼠标所在位置的屏幕坐标& u; ^ z s, F+ d) v) ?9 E
MsgBox "屏幕坐标:" & ScreenPoint1.x & " / " & ScreenPoint1.Y
0 H" |$ N8 d4 N5 H; r, w8 e MsgBox "对应的CAD坐标:" & CAD_Point1(0) & " / " & CAD_Point1(1)
* q9 ^( U* ~! K$ m# R '以上获得了CAD坐标和屏幕坐标的对应关系,下面就可以计算了
' a+ K* ]8 T4 \/ K8 G) S' y
6 J5 S6 w+ e, b& L8 R Dim ScreenPoint3 As POINTAPI4 W& D! q" e7 G9 \
GetCursorPos ScreenPoint3
8 }) M/ v3 q, R+ W
4 g4 |3 ^& H! G Dim CAD_Point3(2) As Double3 L, H: V5 j3 S
'计算cad坐标' H/ \* @2 \' ?4 L& {: r. r8 b* P
CAD_Point3(0) = CAD_Point1(0) + BiLi * (ScreenPoint3.x - ScreenPoint1.x)" h+ n* _" s( L( b9 j2 v; F6 N% s
CAD_Point3(1) = CAD_Point1(1) - BiLi * (ScreenPoint3.Y - ScreenPoint1.Y)
3 \9 A' D$ m. r2 c CAD_Point3(2) = 0
; ?3 P6 Y/ C3 J B: g/ w MsgBox "屏幕坐标:" & CAD_Point3(0) & " / " & CAD_Point3(1)
( q; A, _. X0 p5 q5 y. T8 | '为了验证计算坐标,将画一条直线,看看效果吧。
, m3 \" Z" f2 A' j6 c' s3 d5 i ThisDrawing.ModelSpace.AddLine CAD_Point1, CAD_Point3
' |9 E) f; y! x& hEnd Sub |
-
评分
-
查看全部评分
|