|
|
发表于 2010-1-23 12:34:45
|
显示全部楼层
来自: 中国浙江宁波
本帖最后由 sealive_leafage 于 2010-1-23 12:37 编辑
. g2 Q& e9 g3 r4 K# ^4 G0 m- [8 L( F9 `; x d3 B0 [6 @' a: l% V$ {
问题的难点在于在CAD中如何动态实时获得鼠标点的坐标,网上收集了些资料楼主可以体会一下;获得坐标值后则可以实现楼主要求的效果;详细参考:http://tiancao.net/blogview.asp?logID=214! u* N# f4 f: i+ f3 k% s
CAD VBA实现橡皮筋直线、圆4 A& z& ~0 q5 I* c# Z/ t) W
( Q; c F7 _# I6 X- F9 e首先是计时控件,然后是实时捕捉鼠标的屏幕位置,然后是转换获得CAD当前试图鼠标所在的位置坐标,然后才是实时绘制直线或圆。8 f, T5 l4 ~$ u5 o
VBA中不可直接使用vb的timer控件,我们可以调用独立的xTimer控件。
. |1 B V7 p5 I控件下载: E* I4 ?1 j$ I' g O
http://www.tiancao.net/flashget.asp?dizhi=http://www.tiancao.net/attachments/month_0707/qnft_XTimers.rar4 ]2 }2 x6 \/ ^# V0 a6 f; r: I$ j1 H
* h1 @8 s& a7 y- \% a然后是使用API函数GetCursorPos获得当前鼠标的屏幕坐标。# W# f# S, W. _6 ]& l, C9 X8 [/ d) m
然后通过读取CAD系统变量viewSize荷Screensize分别得到当前试图的CAD高度和当前视口的屏幕尺寸(屏幕分辨率的像素).然后得到CAD实际尺寸和屏幕像素的比值。
% z. [4 N: R7 Q/ s0 K8 K精确度于鼠标的频率快慢有关系3 g3 @3 ^/ j8 o" I5 t+ z& I
, }# Z, C' E5 y1 A4 Y1 T'获取CAD坐标系统和屏幕像素的比值; T+ v4 j: U8 R; q+ f2 b
Function ViewScreen() As Double! ]8 B- |& y4 O
Dim ScreenSize As Variant$ U8 B; K" h4 r- M5 L: o
ScreenSize = ThisDrawing.GetVariable("screensize") '当前视口的屏幕宽度和高度* `% j7 F. f% n
Dim H As Variant& _) s; p6 Y4 q) T5 P
H = ThisDrawing.GetVariable("viewsize") '当前视图图形的实际高度/ @! B3 r2 i7 _4 k5 h; C/ X
ViewScreen = Abs(H / ScreenSize(1))7 @& F' \$ a; t% P& m$ A
End Function
" c( q) f5 Z* MPublic Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
) I O% j8 ]* o# H+ P6 A' C. E% n
; ], x0 t5 l& ]2 U K实时获得鼠标的屏幕坐标,然后通过屏幕尺寸和cad实际尺寸的比值,计算出鼠标当前的cad坐标。
" W# t7 K; b9 f% U) l然后在基点和鼠标坐标之间绘制直线或圆。3 O( u0 l2 a9 X0 D7 W0 n" }/ w; Z
值得注意的是,屏幕坐标的是以屏幕的左上角为原点的。而cad的世界坐标是以右下角为原点的。
4 M9 g$ f6 h8 V" M& V( C* K7 s5 j
'得到鼠标屏幕坐标
! {% P0 C# I: X2 ]
8 ]0 N7 s+ c( D% f1 w/ i. m4 S4 XPrivate Type POINTAPI" ^" R, m8 ^8 M8 ?
x As Long
; m6 F2 q3 j6 [- Z" D5 O4 I8 a Y As Long
4 a4 o% t1 Q, j" PEnd Type
9 y8 f8 V3 E( U F! O. WPrivate Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
; T n% G8 t8 F* a5 MDim CAD_Point1 As Variant
; U4 D {- ?9 v) b+ l# v# I5 BDim CAD_Point2 As Variant" d9 S& K* j" @# }
Dim ScreenPoint1 As POINTAPI& d, R; M* O1 Y6 d$ s8 K6 k
Dim ScreenPoint2(1) As Long
1 b7 d; W5 f h ~/ z4 bDim BiLi As Double
% U0 S8 d) Y4 {. j3 q( p, T3 r'获取CAD坐标系统和屏幕像素的比值
# [9 ]5 l' l! L( F- qFunction ViewScreen() As Double: Y4 g* b% u0 x. R$ q7 y
Dim ScreenSize As Variant; g$ ` |1 _0 E) s/ ^
ScreenSize = ThisDrawing.GetVariable("screensize") '当前视口的屏幕宽度和高度" ^0 @9 y& h6 d$ b
Dim H As Variant( g0 X; Z1 a# F R7 w$ W& ~% v3 I7 N
H = ThisDrawing.GetVariable("viewsize") '当前视图图形的实际高度
& r% I& C& d0 S% _$ } ViewScreen = Abs(H / ScreenSize(1))
* P7 |. Q' ^. ]1 D; a/ J pEnd Function5 K4 g) z3 e7 n" t6 F/ q3 `! A5 i
'通过CAD坐标计算屏幕坐标0 o/ ]& f5 d8 G9 n5 d% y) ?
Sub GetScreenPoint()
8 @9 j5 v8 f$ g4 g2 F: W BiLi = ViewScreen
" h2 S9 Q" a) p3 l" ^7 E CAD_Point1 = ThisDrawing.Utility.GetPoint(, "先指定一个点:") '获得鼠标所在位置的CAD坐标
7 i% { V$ Q; J8 L2 o7 ^) `) E ThisDrawing.ModelSpace.AddPoint CAD_Point1
% e" a1 U4 e+ ~: V1 W' w GetCursorPos ScreenPoint1 '通过api直接获得鼠标所在位置的屏幕坐标
6 m% E! R/ o; x& X( q: o MsgBox "屏幕坐标:" & ScreenPoint1.x & " / " & ScreenPoint1.Y
8 U Y4 X6 r$ S5 ~3 G& X MsgBox "对应的CAD坐标:" & CAD_Point1(0) & " / " & CAD_Point1(1)/ o- S$ H/ q* z0 v" ?0 m
'以上获得了CAD坐标和屏幕坐标的对应关系,下面就可以计算了
& x) F0 f% m( Q" K1 W
6 e2 B9 Z x, q" i5 r& V ^ CAD_Point2 = ThisDrawing.Utility.GetPoint(CAD_Point1, "指定下一点,这个点将通过计算得到屏幕坐标:"), o, m3 ^7 H+ Z" H2 ]4 ~
3 P) J- P# a y
ScreenPoint2(0) = Int(ScreenPoint1.x + (CAD_Point2(0) - CAD_Point1(0)) / BiLi)
0 F1 G( r9 U. f ScreenPoint2(1) = Int(ScreenPoint1.Y - (CAD_Point2(1) - CAD_Point1(1)) / BiLi)
+ f# h/ b: F9 ~$ A0 p$ F MsgBox "屏幕坐标:" & ScreenPoint2(0) & " / " & ScreenPoint2(1)
6 S" q, i$ c. G: r) L7 u+ ^ '为了验证计算坐标,将CAD窗口在屏幕上移动到该点,看看效果吧。
+ J4 Y7 L" h9 h9 R( o' Z ThisDrawing.Application.WindowState = acNorm: }) _4 m# a6 i$ t2 l! C
ThisDrawing.Application.WindowLeft = ScreenPoint2(0)6 k2 X" W p& n6 o& @8 X
ThisDrawing.Application.WindowTop = ScreenPoint2(1)* ]6 o+ x o9 w; i
3 |- `7 x. a9 U$ p% O% l
0 e$ S4 ]! [" x. ?. O7 k' w- p* LEnd Sub" S5 Z. R" G5 z Q7 m; a- k
' 通过屏幕坐标计算CAD坐标
5 u o+ T/ H9 |0 D- b0 \: X* vSub GetCAD_Point()
5 V2 w- R; L. x) F6 z BiLi = ViewScreen Q( B# C# J3 i; Q- Y
CAD_Point1 = ThisDrawing.Utility.GetPoint(, "先指定一个点:") '获得鼠标所在位置的CAD坐标% J) @* l: E! h
ThisDrawing.ModelSpace.AddPoint CAD_Point19 w0 |8 [4 _" { [
GetCursorPos ScreenPoint1 '通过api直接获得鼠标所在位置的屏幕坐标
0 m9 E6 Y( \8 s( D$ a- M MsgBox "屏幕坐标:" & ScreenPoint1.x & " / " & ScreenPoint1.Y
, S% {) c5 @7 K$ z3 |$ C MsgBox "对应的CAD坐标:" & CAD_Point1(0) & " / " & CAD_Point1(1); z# W( ~& ~- c* z+ G5 g# Z- j
'以上获得了CAD坐标和屏幕坐标的对应关系,下面就可以计算了
& D9 J" ^& }: e' |
- }( Y3 y0 F6 Z" r5 } Dim ScreenPoint3 As POINTAPI! ], H' q x/ ^( j6 `
GetCursorPos ScreenPoint37 k, E* J6 E- v0 C/ ]
, t5 J0 U" c6 k. K' A* H& }
Dim CAD_Point3(2) As Double
. x0 N. z5 Q6 Q: Q7 { '计算cad坐标
- D6 E2 E; W6 X- a% V/ p5 ?; E CAD_Point3(0) = CAD_Point1(0) + BiLi * (ScreenPoint3.x - ScreenPoint1.x)& T6 l3 X) M+ P: {' K! }2 P1 i! z( X
CAD_Point3(1) = CAD_Point1(1) - BiLi * (ScreenPoint3.Y - ScreenPoint1.Y)
" l) Q/ _& R4 r: O0 d3 f# Q CAD_Point3(2) = 01 x6 N( A% s! m# h% u8 }: g5 o
MsgBox "屏幕坐标:" & CAD_Point3(0) & " / " & CAD_Point3(1); |8 M0 z4 b+ Y$ \, H: V- p8 u Z: a
'为了验证计算坐标,将画一条直线,看看效果吧。
# v9 ^; i. W" S ThisDrawing.ModelSpace.AddLine CAD_Point1, CAD_Point3$ B+ Z7 y1 [9 s0 o
End Sub |
-
评分
-
查看全部评分
|