|
|
发表于 2010-1-23 12:34:45
|
显示全部楼层
来自: 中国浙江宁波
本帖最后由 sealive_leafage 于 2010-1-23 12:37 编辑 % f* L. l2 G( B7 X6 C t' Y; w0 H
/ {$ @7 _# e9 Q0 {6 J! m( k5 s+ m
问题的难点在于在CAD中如何动态实时获得鼠标点的坐标,网上收集了些资料楼主可以体会一下;获得坐标值后则可以实现楼主要求的效果;详细参考:http://tiancao.net/blogview.asp?logID=214
" T, e" f1 T: R- ACAD VBA实现橡皮筋直线、圆5 s8 x4 Q L9 J" a: x0 `
' L5 G y; c0 u, L) P6 q
首先是计时控件,然后是实时捕捉鼠标的屏幕位置,然后是转换获得CAD当前试图鼠标所在的位置坐标,然后才是实时绘制直线或圆。/ E( b2 x4 \" N" G7 u3 t# q
VBA中不可直接使用vb的timer控件,我们可以调用独立的xTimer控件。
; Y" h! k! z7 \( I5 @. q控件下载:
* @0 {, e6 H* O6 J+ l0 \! _7 ~1 Thttp://www.tiancao.net/flashget.asp?dizhi=http://www.tiancao.net/attachments/month_0707/qnft_XTimers.rar
! V6 z) k2 y$ d* a2 C& R* g' I1 Y1 H4 d2 O2 g/ X
然后是使用API函数GetCursorPos获得当前鼠标的屏幕坐标。
; g2 p( k/ a- J9 l- }% i然后通过读取CAD系统变量viewSize荷Screensize分别得到当前试图的CAD高度和当前视口的屏幕尺寸(屏幕分辨率的像素).然后得到CAD实际尺寸和屏幕像素的比值。
% ?6 o3 z3 |: Z% C% P+ d. E) i精确度于鼠标的频率快慢有关系
/ ^! W7 L, M3 d. A6 T% T e+ z; N! _0 J' Y; J! @& x, l
'获取CAD坐标系统和屏幕像素的比值2 b2 O/ ^2 u2 S' f6 d5 t0 D
Function ViewScreen() As Double. l; L0 l, l7 V7 y: n; h. Q( I0 z5 w
Dim ScreenSize As Variant
2 K+ F; p$ Y" d6 p1 L& U ScreenSize = ThisDrawing.GetVariable("screensize") '当前视口的屏幕宽度和高度
: O/ N% u. c4 O. p Dim H As Variant8 g2 e* i1 Z5 e9 }# _1 C
H = ThisDrawing.GetVariable("viewsize") '当前视图图形的实际高度; f$ S! K/ M( ~+ L7 t- X/ ?
ViewScreen = Abs(H / ScreenSize(1))
! a" E1 S2 g$ x- M" \' Y; V8 T2 kEnd Function8 s* `+ u% n/ {" O" [$ D4 Z
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long% ~9 a/ }- a& S8 y7 i. p$ C
) ^8 _0 i! k( a' ?# U实时获得鼠标的屏幕坐标,然后通过屏幕尺寸和cad实际尺寸的比值,计算出鼠标当前的cad坐标。
, ^: E# F8 D) N- X) k+ j: P6 a5 k" v( L然后在基点和鼠标坐标之间绘制直线或圆。. N; m* z6 j/ e5 _& u
值得注意的是,屏幕坐标的是以屏幕的左上角为原点的。而cad的世界坐标是以右下角为原点的。1 [8 j4 V' a: j! H o
+ _) i0 D6 y, w( N! m, ?# Q6 d'得到鼠标屏幕坐标
' N" J" J& |7 M$ Q# y. R: {6 G3 w6 d$ L; w5 K! ~
Private Type POINTAPI
* s9 s: T, l( a1 d x As Long
: x1 f; E0 G1 T2 |% s! J Y As Long
+ M5 r o% ? L5 |End Type
, F) @1 K6 q% a: ?! `& XPrivate Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long. y3 ~% r/ `& o& z8 z* |' D
Dim CAD_Point1 As Variant$ L' A9 e: K5 r
Dim CAD_Point2 As Variant* G' x8 e/ o3 C# V5 A% T6 i# [
Dim ScreenPoint1 As POINTAPI
8 E2 b8 c$ w6 Z" a- a5 PDim ScreenPoint2(1) As Long
$ e% {6 g4 L# E! M, TDim BiLi As Double7 g2 i$ j4 P. V4 |
'获取CAD坐标系统和屏幕像素的比值
X7 _* [$ V% S* f5 y3 ?Function ViewScreen() As Double7 E( ]' B8 t( G: s3 a% f, g2 F/ u
Dim ScreenSize As Variant6 G$ c- J' G% ]2 E& n
ScreenSize = ThisDrawing.GetVariable("screensize") '当前视口的屏幕宽度和高度5 x) P1 \1 r6 h8 H- v. D8 e. W$ p
Dim H As Variant0 u0 ^5 |6 L1 v: p3 |9 _7 C
H = ThisDrawing.GetVariable("viewsize") '当前视图图形的实际高度
( ?: f7 i3 T9 c$ x3 ] ViewScreen = Abs(H / ScreenSize(1))
s/ m' C" P: w) dEnd Function4 I2 i: B- U% }
'通过CAD坐标计算屏幕坐标
) a o" J) x WSub GetScreenPoint()
3 e3 Z3 h& t# M q. m BiLi = ViewScreen
0 a g" z$ z! g2 I) t a! d: g CAD_Point1 = ThisDrawing.Utility.GetPoint(, "先指定一个点:") '获得鼠标所在位置的CAD坐标/ i+ i! ?" q, m; z2 ^- C# K
ThisDrawing.ModelSpace.AddPoint CAD_Point1+ T$ T0 O+ r: E
GetCursorPos ScreenPoint1 '通过api直接获得鼠标所在位置的屏幕坐标
: ^& ^! a G! C7 E# q0 s MsgBox "屏幕坐标:" & ScreenPoint1.x & " / " & ScreenPoint1.Y
9 l% {1 \: C/ X6 k! P/ } MsgBox "对应的CAD坐标:" & CAD_Point1(0) & " / " & CAD_Point1(1)
4 k4 u( a6 z8 k8 c$ P9 J; a) N8 N4 ^ '以上获得了CAD坐标和屏幕坐标的对应关系,下面就可以计算了
; P: n- A, T. @! O* X7 ^
# f& x$ ]2 h. E9 k* e/ q$ z0 g9 `% L CAD_Point2 = ThisDrawing.Utility.GetPoint(CAD_Point1, "指定下一点,这个点将通过计算得到屏幕坐标:")
* ^0 z4 |: U9 ~ W& h
1 ~3 t6 Z: Q9 S4 Z! F1 Y6 E5 [9 k ScreenPoint2(0) = Int(ScreenPoint1.x + (CAD_Point2(0) - CAD_Point1(0)) / BiLi). o) Y8 T: \: y5 K: I3 M
ScreenPoint2(1) = Int(ScreenPoint1.Y - (CAD_Point2(1) - CAD_Point1(1)) / BiLi)
+ k8 ~8 S8 r% J: W MsgBox "屏幕坐标:" & ScreenPoint2(0) & " / " & ScreenPoint2(1)
- ]0 G6 I8 h3 Y '为了验证计算坐标,将CAD窗口在屏幕上移动到该点,看看效果吧。 ?- n' T- K& Y7 b; c# _" r. H- {" @
ThisDrawing.Application.WindowState = acNorm& w: d2 }( y, X( m9 q4 |
ThisDrawing.Application.WindowLeft = ScreenPoint2(0)8 q [) U& O3 a2 K' x0 f
ThisDrawing.Application.WindowTop = ScreenPoint2(1)
7 r% w0 b8 [. i0 a0 H# f ( k1 \0 V; Z3 @1 d$ C V& p$ n
+ C9 q( P) S3 fEnd Sub
; W' _+ T" d' {& I. }# ]. O* G' 通过屏幕坐标计算CAD坐标4 N) `+ k5 {2 }0 d
Sub GetCAD_Point()
: o9 o$ L3 m. R8 | BiLi = ViewScreen
8 [0 U7 r6 B: n CAD_Point1 = ThisDrawing.Utility.GetPoint(, "先指定一个点:") '获得鼠标所在位置的CAD坐标& c' _- x5 o/ d" M2 C+ b& T( f
ThisDrawing.ModelSpace.AddPoint CAD_Point1
4 q# H2 [4 `& m, b% ^ GetCursorPos ScreenPoint1 '通过api直接获得鼠标所在位置的屏幕坐标
1 E1 `& P9 G7 G/ P n: n( x8 \' f MsgBox "屏幕坐标:" & ScreenPoint1.x & " / " & ScreenPoint1.Y
}8 D" O: o Q) a4 B( j$ u MsgBox "对应的CAD坐标:" & CAD_Point1(0) & " / " & CAD_Point1(1)
" r1 w, G" [) x; [ '以上获得了CAD坐标和屏幕坐标的对应关系,下面就可以计算了
! q- l( y) F R, E) p
6 l; B' \" n/ T% I Dim ScreenPoint3 As POINTAPI9 `4 Z: ]( _2 m1 O3 M, S1 ^
GetCursorPos ScreenPoint3, |& B* }: H3 _: t
, B9 O7 Z3 C2 i* ?
Dim CAD_Point3(2) As Double1 u. S- x2 F) R
'计算cad坐标
. s8 e7 b+ i- r& \ CAD_Point3(0) = CAD_Point1(0) + BiLi * (ScreenPoint3.x - ScreenPoint1.x)
8 |, V" G% j3 M CAD_Point3(1) = CAD_Point1(1) - BiLi * (ScreenPoint3.Y - ScreenPoint1.Y)
4 c9 G4 [5 K1 o CAD_Point3(2) = 0
, x9 j7 W3 q+ x+ U, ? MsgBox "屏幕坐标:" & CAD_Point3(0) & " / " & CAD_Point3(1)
% L/ V. W& p; I! t& @ '为了验证计算坐标,将画一条直线,看看效果吧。
[+ o" }- j8 A: r ThisDrawing.ModelSpace.AddLine CAD_Point1, CAD_Point3/ E+ f3 @3 d- `8 g) H5 T5 R/ w
End Sub |
-
评分
-
查看全部评分
|