|
|
发表于 2010-1-23 12:34:45
|
显示全部楼层
来自: 中国浙江宁波
本帖最后由 sealive_leafage 于 2010-1-23 12:37 编辑 & F! ~: X0 d% d3 w9 l
) X w) ~. \7 H& @问题的难点在于在CAD中如何动态实时获得鼠标点的坐标,网上收集了些资料楼主可以体会一下;获得坐标值后则可以实现楼主要求的效果;详细参考:http://tiancao.net/blogview.asp?logID=214
0 D7 V0 T# x ?# i+ K: _2 ^CAD VBA实现橡皮筋直线、圆
5 q0 F# M/ n1 o v8 I3 ^+ ?" b9 M0 n n( D+ J( A
首先是计时控件,然后是实时捕捉鼠标的屏幕位置,然后是转换获得CAD当前试图鼠标所在的位置坐标,然后才是实时绘制直线或圆。
) [- h v: }0 `8 gVBA中不可直接使用vb的timer控件,我们可以调用独立的xTimer控件。
% k) S1 t2 C- u! c控件下载:
3 O, a( N, C- e: `http://www.tiancao.net/flashget.asp?dizhi=http://www.tiancao.net/attachments/month_0707/qnft_XTimers.rar
% H; v6 _! L& A2 ^; i& V# C* P
8 O4 ~) L8 Z3 D, B6 p然后是使用API函数GetCursorPos获得当前鼠标的屏幕坐标。( v% j6 o; K& ]7 v
然后通过读取CAD系统变量viewSize荷Screensize分别得到当前试图的CAD高度和当前视口的屏幕尺寸(屏幕分辨率的像素).然后得到CAD实际尺寸和屏幕像素的比值。
) h! ^9 `* R( t% a$ \精确度于鼠标的频率快慢有关系
/ G. `8 F$ C0 [8 o
/ g% \2 J M. U'获取CAD坐标系统和屏幕像素的比值. G' r E6 d9 W) [7 b: }, E
Function ViewScreen() As Double6 m5 D# D2 t1 ?1 o
Dim ScreenSize As Variant
8 X3 U# n. V+ q ScreenSize = ThisDrawing.GetVariable("screensize") '当前视口的屏幕宽度和高度
, o5 @& f9 Z' e3 o Dim H As Variant
7 h3 J& b- T: H. } H = ThisDrawing.GetVariable("viewsize") '当前视图图形的实际高度
7 Z( Z% P( j8 j/ R7 h; c ViewScreen = Abs(H / ScreenSize(1))
( o3 q; b9 l# i9 O# _8 b% oEnd Function+ |. G" m2 I. c( i+ V; V! ~3 g
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
& ~- P7 S8 p. b1 r- |- \* [! H+ q( Z& u) u( @$ l
实时获得鼠标的屏幕坐标,然后通过屏幕尺寸和cad实际尺寸的比值,计算出鼠标当前的cad坐标。1 {* d n' x2 o% {: H! I1 a
然后在基点和鼠标坐标之间绘制直线或圆。0 e- i" l. H; D# K' b" m: r. |
值得注意的是,屏幕坐标的是以屏幕的左上角为原点的。而cad的世界坐标是以右下角为原点的。
) o; l4 @* z7 n1 p0 T& o0 [4 V/ m& G" f% A3 G+ L& i- {& |) h
'得到鼠标屏幕坐标
/ N* L8 X' g" g& C0 r5 V# H( q- Y2 Z4 L
Private Type POINTAPI# L5 [+ M. O1 W
x As Long
' f9 H% e/ D' D! U4 j/ r4 |8 J Y As Long
8 k! z& E! }. UEnd Type( e7 j7 q' H" i
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long3 A' F4 A* }6 _' K$ ]" ^7 ?# {
Dim CAD_Point1 As Variant- s7 C+ ?8 w1 s0 Z) w1 V
Dim CAD_Point2 As Variant
- `. V: @7 a" x# v" q% C9 Z1 k' WDim ScreenPoint1 As POINTAPI$ ^: P% e$ f. o& n. N5 c0 c
Dim ScreenPoint2(1) As Long) D6 N7 m9 G$ k# ~2 h
Dim BiLi As Double: T! N. r" T( c: Z
'获取CAD坐标系统和屏幕像素的比值" s# c* {- J3 @9 i, V3 M2 {% q
Function ViewScreen() As Double
4 I- [1 D, f% D+ w Dim ScreenSize As Variant6 L2 G! a5 k. Q; {+ T' E A
ScreenSize = ThisDrawing.GetVariable("screensize") '当前视口的屏幕宽度和高度
/ s9 l. y8 J- ` Dim H As Variant/ \% i: e- r$ g" C; i8 v
H = ThisDrawing.GetVariable("viewsize") '当前视图图形的实际高度
3 c9 L" A4 ]: m+ R& \* B1 x4 s ViewScreen = Abs(H / ScreenSize(1))
) }/ G: D+ \" i6 P7 J& k6 OEnd Function
3 \0 c% p) f% @9 ~) }% H& t) X5 J'通过CAD坐标计算屏幕坐标( F/ C7 s* @3 E2 q, c9 V
Sub GetScreenPoint(), v' ^7 p2 c" y) |' U. N( X1 p' R0 I
BiLi = ViewScreen/ c) t2 ~9 R( L) H) k
CAD_Point1 = ThisDrawing.Utility.GetPoint(, "先指定一个点:") '获得鼠标所在位置的CAD坐标8 j9 }# W, ], t- ^- X7 b0 u0 P
ThisDrawing.ModelSpace.AddPoint CAD_Point1. E- m8 ^. U' ~, v# C
GetCursorPos ScreenPoint1 '通过api直接获得鼠标所在位置的屏幕坐标# v& G# E$ o# X4 y. V+ }- s
MsgBox "屏幕坐标:" & ScreenPoint1.x & " / " & ScreenPoint1.Y( B8 I7 S4 ~5 j' m) a
MsgBox "对应的CAD坐标:" & CAD_Point1(0) & " / " & CAD_Point1(1)
. j( o7 t; w- R% e( Z '以上获得了CAD坐标和屏幕坐标的对应关系,下面就可以计算了
& {: c8 [0 ~3 K$ b' N# U
, d, Y1 d* t4 b, g4 I' l1 g CAD_Point2 = ThisDrawing.Utility.GetPoint(CAD_Point1, "指定下一点,这个点将通过计算得到屏幕坐标:")
( n/ v% g3 Y, m( ` n/ F9 F( L/ W* R6 {+ \
ScreenPoint2(0) = Int(ScreenPoint1.x + (CAD_Point2(0) - CAD_Point1(0)) / BiLi)/ i7 H( p( A* N2 |$ ^
ScreenPoint2(1) = Int(ScreenPoint1.Y - (CAD_Point2(1) - CAD_Point1(1)) / BiLi)7 Q) p8 r Y, g
MsgBox "屏幕坐标:" & ScreenPoint2(0) & " / " & ScreenPoint2(1)9 _. \; d& N q+ V, o! J
'为了验证计算坐标,将CAD窗口在屏幕上移动到该点,看看效果吧。
' N, L! x( P; Y0 ]! j7 `* X ThisDrawing.Application.WindowState = acNorm9 l4 x1 c% ~8 ~8 l) k
ThisDrawing.Application.WindowLeft = ScreenPoint2(0)
" t0 Q4 A& H4 r: v# ` ThisDrawing.Application.WindowTop = ScreenPoint2(1)
1 C' j" A% _5 m5 z
! l: H3 L. G& J/ ^5 T
8 c6 l1 r% _6 ^! r" x1 ~1 dEnd Sub5 H% c1 ~" M5 B7 \
' 通过屏幕坐标计算CAD坐标
; Z& n) E! ]& k3 n: LSub GetCAD_Point()
% l9 u7 w. x' \+ k BiLi = ViewScreen
: i" } I* w' ? M0 V/ p CAD_Point1 = ThisDrawing.Utility.GetPoint(, "先指定一个点:") '获得鼠标所在位置的CAD坐标0 K' ^$ x9 T1 t* R, C6 E0 t) Y
ThisDrawing.ModelSpace.AddPoint CAD_Point1
6 T- Y: ^( `7 G0 x) j7 } GetCursorPos ScreenPoint1 '通过api直接获得鼠标所在位置的屏幕坐标
' |5 p- i" U/ q3 H' l, @! K MsgBox "屏幕坐标:" & ScreenPoint1.x & " / " & ScreenPoint1.Y! w g1 S7 ^! X- N
MsgBox "对应的CAD坐标:" & CAD_Point1(0) & " / " & CAD_Point1(1)
- i) a+ F8 U) B8 S/ p/ k, H$ e8 _" q '以上获得了CAD坐标和屏幕坐标的对应关系,下面就可以计算了
- j+ H' L1 N% ~: Y & e& N" V; Z0 Q8 D2 N3 _
Dim ScreenPoint3 As POINTAPI
( b+ e% x! x9 N/ O9 } GetCursorPos ScreenPoint3
- v0 b& Z9 @' u 8 ]8 x. N6 y9 M+ k( p' N. C
Dim CAD_Point3(2) As Double2 t/ [# H0 N! }$ m# a% G
'计算cad坐标# u1 R& g, q& v' c F
CAD_Point3(0) = CAD_Point1(0) + BiLi * (ScreenPoint3.x - ScreenPoint1.x)* o1 y$ _- F2 x% ~
CAD_Point3(1) = CAD_Point1(1) - BiLi * (ScreenPoint3.Y - ScreenPoint1.Y)
% X$ Y) M4 [. B- Z5 T6 c9 q3 K+ `- ?7 A CAD_Point3(2) = 0! T1 n' I1 U, L0 F2 |; g
MsgBox "屏幕坐标:" & CAD_Point3(0) & " / " & CAD_Point3(1); ^4 f2 C# V# s0 D$ a6 N/ m+ L+ b. _
'为了验证计算坐标,将画一条直线,看看效果吧。/ p: o: N4 R" P8 D3 `
ThisDrawing.ModelSpace.AddLine CAD_Point1, CAD_Point3
3 P3 ^# d# K& j) D8 }2 a8 u5 r8 \End Sub |
-
评分
-
查看全部评分
|