|
发表于 2010-1-23 12:34:45
|
显示全部楼层
来自: 中国浙江宁波
本帖最后由 sealive_leafage 于 2010-1-23 12:37 编辑
& a1 Q1 ~1 A- Q; m
& @6 o$ X. T; r问题的难点在于在CAD中如何动态实时获得鼠标点的坐标,网上收集了些资料楼主可以体会一下;获得坐标值后则可以实现楼主要求的效果;详细参考:http://tiancao.net/blogview.asp?logID=214
2 A) r: H5 K1 w5 g8 |4 V- o8 vCAD VBA实现橡皮筋直线、圆# c, k9 F# n% N% X* v
# X; ?& f" q8 S7 G1 f首先是计时控件,然后是实时捕捉鼠标的屏幕位置,然后是转换获得CAD当前试图鼠标所在的位置坐标,然后才是实时绘制直线或圆。
: X+ x, L9 q# y, v/ zVBA中不可直接使用vb的timer控件,我们可以调用独立的xTimer控件。
V# ]1 u8 h+ j. _控件下载: 0 [# M: }1 q, G. ?3 n, ~8 p
http://www.tiancao.net/flashget.asp?dizhi=http://www.tiancao.net/attachments/month_0707/qnft_XTimers.rar
% M4 m7 x. Y+ D) y) ~' M
! A$ X2 Z$ m7 l7 d2 K1 S8 ]* B: T然后是使用API函数GetCursorPos获得当前鼠标的屏幕坐标。
( w$ @6 x4 B- A" Y) T" r( p然后通过读取CAD系统变量viewSize荷Screensize分别得到当前试图的CAD高度和当前视口的屏幕尺寸(屏幕分辨率的像素).然后得到CAD实际尺寸和屏幕像素的比值。
( N U8 E; w, v; H# r$ p精确度于鼠标的频率快慢有关系. f# i6 z1 G" \1 L6 H* b* f
0 ~5 b. F5 C0 t d- r% Q5 _$ c: O
'获取CAD坐标系统和屏幕像素的比值3 l% P0 s; X) f# I- T1 {. |
Function ViewScreen() As Double
" X5 D9 r3 F+ _2 R$ d8 ]6 D) H Dim ScreenSize As Variant
9 B3 g( [1 q; n( [2 N g* ` ScreenSize = ThisDrawing.GetVariable("screensize") '当前视口的屏幕宽度和高度
! I4 H8 A$ [. o6 ~- L& Y9 T Dim H As Variant
/ ?* {+ e- ~" J( u7 G H = ThisDrawing.GetVariable("viewsize") '当前视图图形的实际高度$ U' f6 b3 [9 |' Y7 w/ w
ViewScreen = Abs(H / ScreenSize(1))6 `6 a5 A# c: P: C& a7 T
End Function
* j* L0 n& t, ^ L1 y6 T) j" I; gPublic Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long+ O9 ^' F0 M6 k% h- x
. _+ }4 B' R. p( \% E
实时获得鼠标的屏幕坐标,然后通过屏幕尺寸和cad实际尺寸的比值,计算出鼠标当前的cad坐标。" R3 f8 O* j# p; y' A
然后在基点和鼠标坐标之间绘制直线或圆。
* v7 X8 h1 M$ \0 B5 \+ ^值得注意的是,屏幕坐标的是以屏幕的左上角为原点的。而cad的世界坐标是以右下角为原点的。
+ ^$ k& S- N; u1 A* V$ s& r q* `: q3 n* k& G( b w- F
'得到鼠标屏幕坐标3 @+ Y0 k* t8 b5 h
- Q' t9 X5 f Y6 \
Private Type POINTAPI
$ p- z r8 _ A6 s. C$ r x As Long F/ z' ~; {# H$ O
Y As Long
V( ~) }- Q: O5 O4 m4 N; t) hEnd Type1 g0 h0 B1 f" G p2 j
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long; d$ g3 T( J1 f e9 |% S
Dim CAD_Point1 As Variant( g0 U. e4 R* F( Z4 f4 m/ a6 ?
Dim CAD_Point2 As Variant3 a$ U- ~" r; x4 _
Dim ScreenPoint1 As POINTAPI0 l" y) G9 v8 \
Dim ScreenPoint2(1) As Long
, J G! {* A& u$ h2 DDim BiLi As Double" ?# { H% }! P
'获取CAD坐标系统和屏幕像素的比值
4 \! r7 [, ?' L; qFunction ViewScreen() As Double
: \/ X9 E( F* C( d: t2 L Dim ScreenSize As Variant% P; L; r* ^# W* b' @7 Z8 Y
ScreenSize = ThisDrawing.GetVariable("screensize") '当前视口的屏幕宽度和高度
' _: l3 [5 @. u5 [) [ Dim H As Variant0 I) u# R' Y1 y* n6 y' m4 H
H = ThisDrawing.GetVariable("viewsize") '当前视图图形的实际高度7 U% Q" x" a! c6 z, r9 a
ViewScreen = Abs(H / ScreenSize(1))
) ~, W( E! ~; C( A3 w+ a9 DEnd Function
5 o8 \' l* O& O/ b0 ~$ g' Z; {% y'通过CAD坐标计算屏幕坐标
7 q8 F t8 m5 o+ sSub GetScreenPoint()
( |9 U e% u7 t; ?3 @$ S BiLi = ViewScreen& o* D; y: ~# i2 H: U
CAD_Point1 = ThisDrawing.Utility.GetPoint(, "先指定一个点:") '获得鼠标所在位置的CAD坐标: F, E: t. }2 ~. X9 T7 w
ThisDrawing.ModelSpace.AddPoint CAD_Point1
6 Z+ e7 A8 r0 n% Q: C W GetCursorPos ScreenPoint1 '通过api直接获得鼠标所在位置的屏幕坐标
( I; u7 G; b5 N7 v MsgBox "屏幕坐标:" & ScreenPoint1.x & " / " & ScreenPoint1.Y
2 O( `! M$ e7 H' d MsgBox "对应的CAD坐标:" & CAD_Point1(0) & " / " & CAD_Point1(1)
7 S" {& U- P& p, b$ o '以上获得了CAD坐标和屏幕坐标的对应关系,下面就可以计算了! r$ Q" `; P' U( r8 a/ S" C4 g
+ P' M6 ^$ M) o6 l% _ Z9 L
CAD_Point2 = ThisDrawing.Utility.GetPoint(CAD_Point1, "指定下一点,这个点将通过计算得到屏幕坐标:")& b* D' j l( F; b* ^- N
: v5 n( _9 p3 d# \ ScreenPoint2(0) = Int(ScreenPoint1.x + (CAD_Point2(0) - CAD_Point1(0)) / BiLi)- \6 e, b1 G) R- S5 ^9 U
ScreenPoint2(1) = Int(ScreenPoint1.Y - (CAD_Point2(1) - CAD_Point1(1)) / BiLi)
8 p# Q' C c! e# J8 `$ t" r MsgBox "屏幕坐标:" & ScreenPoint2(0) & " / " & ScreenPoint2(1)
7 I% H% A- N0 f k$ S '为了验证计算坐标,将CAD窗口在屏幕上移动到该点,看看效果吧。
! l! ?9 C* o2 l! t3 J* W+ L ThisDrawing.Application.WindowState = acNorm1 z$ q" o" ?+ B- v
ThisDrawing.Application.WindowLeft = ScreenPoint2(0)3 M/ z H+ B/ {- C$ {
ThisDrawing.Application.WindowTop = ScreenPoint2(1)
6 m2 R& z+ K4 s! Y2 H + x1 ~. i& D9 z4 o
) [8 M& R$ a i/ Y# [0 eEnd Sub1 S3 M% y4 ^/ {" `5 l$ y) r
' 通过屏幕坐标计算CAD坐标5 ]1 X; @* n3 R- [ [8 I- p5 `
Sub GetCAD_Point()/ s8 a) R5 E: i2 q
BiLi = ViewScreen6 w J! l- ~( M/ r3 U
CAD_Point1 = ThisDrawing.Utility.GetPoint(, "先指定一个点:") '获得鼠标所在位置的CAD坐标
; K) Z) L# U; }* A% U ThisDrawing.ModelSpace.AddPoint CAD_Point1. ^1 Y& z, F) a5 o0 O! \
GetCursorPos ScreenPoint1 '通过api直接获得鼠标所在位置的屏幕坐标, ~& T1 G4 ^: B9 A
MsgBox "屏幕坐标:" & ScreenPoint1.x & " / " & ScreenPoint1.Y3 r' I0 E% f7 [6 @( G
MsgBox "对应的CAD坐标:" & CAD_Point1(0) & " / " & CAD_Point1(1)
0 V, m2 c1 @- n7 E6 n, Y: C '以上获得了CAD坐标和屏幕坐标的对应关系,下面就可以计算了
, n5 h" M; J& C- i/ P9 P- k 1 z* K7 y9 f+ ]/ }
Dim ScreenPoint3 As POINTAPI8 K# j' p5 i' k( f) L q' ^
GetCursorPos ScreenPoint3
# R! @$ [" d' r% [1 E+ o# K$ h ; ?! X7 F% g0 S! E$ C+ U
Dim CAD_Point3(2) As Double4 m. V) } _. J2 k: A- D6 B
'计算cad坐标
& G1 m* G5 G+ B/ [% T CAD_Point3(0) = CAD_Point1(0) + BiLi * (ScreenPoint3.x - ScreenPoint1.x)
) a* U+ Q3 j+ B" N( i3 p5 N0 x7 p CAD_Point3(1) = CAD_Point1(1) - BiLi * (ScreenPoint3.Y - ScreenPoint1.Y)
8 c4 N/ h- j: K' {: }' X' g- { CAD_Point3(2) = 0
' L' a2 e2 T, ^ MsgBox "屏幕坐标:" & CAD_Point3(0) & " / " & CAD_Point3(1)
9 z. [. {$ J2 b" v '为了验证计算坐标,将画一条直线,看看效果吧。
. H) Y) |- ^! f- h6 O ThisDrawing.ModelSpace.AddLine CAD_Point1, CAD_Point3
6 U% F. E$ m KEnd Sub |
-
评分
-
查看全部评分
|