明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: mikewolf2k

vba能不能获得当前鼠标精确位置?新设想,高手请看看.

  [复制链接]
发表于 2004-4-1 09:19 | 显示全部楼层
发表于 2004-5-6 08:40 | 显示全部楼层
发表于 2004-5-6 08:41 | 显示全部楼层
发表于 2004-5-12 01:17 | 显示全部楼层
本帖最后由 作者 于 2004-5-12 15:39:02 编辑

将VLAX类的EvalLispExpression子程改动一下可以实现
  1. Public Function EvalLispExpression(lispStatement As String)
  2.        On Error GoTo ErrClear
  3.        Dim sym As Object, ret As Object, retVal
  4.        EvalLispExpression = ""
  5.        Set sym = VLF.Item("read").funcall(lispStatement)
  6.        retVal = VLF.Item("eval").funcall(sym)
  7.        EvalLispExpression = retVal
  8. ErrClear:
  9.        Err.Clear
  10. End Function
总觉得VLAX类不太健壮测试(插入一个块,拖动并旋转):先导入Lisp函数dd,再生成一个名为"123"的块
  1. Sub Test()
  2. On Error Resume Next
  3.        Dim obj As VLAX, retVal
  4.        Dim a As String, b
  5.        Dim c(2) As Double, d(2) As Double
  6.        Dim pObj As AcadBlockReference, pLine As AcadLine
  7.        Set obj = New VLAX
  8.        retVal = obj.EvalLispExpression("(dd)")
  9.        Set obj = Nothing
  10.        a = Split(retVal, ",")(0)
  11.        Err.Clear
  12.        Set pObj = ThisDrawing.ModelSpace.InsertBlock(c, "123", 1, 1, 1, 0)
  13.        ThisDrawing.Utility.Prompt vbCr & "请输入插入点:" & vbCr
  14.        Do While a <> "3"
  15.                Set obj = New VLAX
  16.                retVal = obj.EvalLispExpression("(dd)")
  17.                Set obj = Nothing
  18.                a = Split(retVal, ",")(0)
  19.                Err.Clear
  20.                If a = 5 Then
  21.                        b = Split(retVal, ",")
  22.                        Err.Clear
  23.                        c(0) = b(1)
  24.                        c(1) = b(2)
  25.                        pObj.InsertionPoint = c
  26.                        Err.Clear
  27.                End If
  28.        Loop
  29.        a = 5
  30.        ThisDrawing.Utility.Prompt vbCr & "请输入旋转角度:" & vbCr
  31.        Set pLine = ThisDrawing.ModelSpace.AddLine(c, d)
  32.        Do While a <> "3"
  33.                Set obj = New VLAX
  34.                retVal = obj.EvalLispExpression("(dd)")
  35.                Set obj = Nothing
  36.                a = Split(retVal, ",")(0)
  37.                Err.Clear
  38.                If a = 5 Then
  39.                        b = Split(retVal, ",")
  40.                        Err.Clear
  41.                        c(0) = b(1)
  42.                        c(1) = b(2)
  43.                        pLine.EndPoint = c
  44.                        pObj.Rotation = ThisDrawing.Utility.AngleFromXAxis(pObj.InsertionPoint, c)
  45.                        Err.Clear
  46.                End If
  47.        Loop
  48.        pLine.Delete
  49. End Sub
Lisp函数
  1. (defun dd()
  2.    (setq a (grread t))
  3.    (if (OR (= 3 (car a)) (= 5 (car a)))
  4.        (setq str (strcat (itoa (car a))
  5.                ","
  6.                (rtos (caadr a) 2 4)
  7.                ","
  8.                (rtos (cadadr a) 2 4)
  9.                ","
  10.                (rtos (cadr (cdadr a)) 2 4)
  11.              )
  12.        )
  13.    )
  14.    (IF (OR (= 2 (car a)) (= 11 (car a)))
  15.        (setq str (strcat (itoa (car a))
  16.                ","
  17.                (itoa (cadr a))
  18.              )
  19.        )
  20.    )
  21.        str
  22.   )

评分

参与人数 1威望 +1 金钱 +10 贡献 +5 激情 +5 收起 理由
mccad + 1 + 10 + 5 + 5 【精华】好程序

查看全部评分

发表于 2004-5-12 16:15 | 显示全部楼层
本帖最后由 作者 于 2004-5-12 16:35:20 编辑

还是VLAX类不够健壮的原因,上述测试有10%的几率会使AutoCad崩溃



可能需要在VBA与Lisp间传递数据,使VBA中的While语句等VLAX处理完Lisp语句后再运行下次循环


或者将程序分为两部分,橡皮筋处理用Lisp做,其余的用VBA做
发表于 2004-5-13 13:01 | 显示全部楼层
本帖最后由 作者 于 2004-5-13 18:06:03 编辑

  1. Function GetPoint()
  2. '功能:返回当前鼠标状态
  3. 'Vlax类请小心使用,该函数可能使AutoCad崩溃
  4. '返回值:一维数组
  5. '返回0,0,-1表示按下鼠标左键,返回0,0,1表示按下鼠标右键,返回a,b,0表示当前鼠标坐标
  6. On Error GoTo ErrClear
  7. Dim obj As VLAX
  8. Dim pRetVal(2) As Double, retVal
  9. Set obj = New VLAX
  10. obj.EvalLispExpression ("(setq a (grread t) b (car a) c (cadr a))")
  11. Select Case obj.GetLispSymbol("b")
  12. Case 3
  13. pRetVal(2) = -1
  14. Case 5
  15. retVal = obj.GetLispList("c")
  16. pRetVal(0) = retVal(0)
  17. pRetVal(1) = retVal(1)
  18. Case Else
  19. pRetVal(2) = 1
  20. End Select
  21. GetPoint = pRetVal
  22. ErrClear:
  23. Set obj = Nothing
  24. End Function
  1. Sub Test()
  2. On Error Resume Next
  3. Dim c(2) As Double
  4.        Do While 1
  5.        a = GetPoint
  6.        ThisDrawing.Utility.Prompt a(0) & "," & a(1) & "," & a(2) & vbCrLf
  7.        Select Case a(2)
  8.        Case -1
  9.        Exit Sub
  10.        Case 0
  11.        Case 1
  12.        End Select
  13.        Loop
  14. End Sub
发表于 2004-5-26 16:17 | 显示全部楼层
lzh741206发表于2004-5-13 13:01:00Function GetPoint()'功能:返回当前鼠标状态'Vlax类请小心使用,该函数可能使A...
求助VLAX的使用,上面这段程序怎么用不了,好象直接跳出去了,Private Sub Class_Initialize()       If Left(ThisDrawing.Application.Version, 2) = "15" Then
               Set VL = ThisDrawing.Application.GetInterfaceObject("VL.Application.1")
       ElseIf Left(ThisDrawing.Application.Version, 2) = "16" Then
               Set VL = ThisDrawing.Application.GetInterfaceObject("VL.Application.16")
       End If
       Set VLF = VL.ActiveDocument.FunctionsEnd Sub  到Set VL = ThisDrawing.Application.GetInterfaceObject("VL.Application.16")直接跳到ErrCleargetpoint函数)
Set obj = Nothing
复制代码
发表于 2004-5-27 07:30 | 显示全部楼层
有关VL类不能使用问题主要是该控件没有注册,必须先注册。
发表于 2004-5-27 09:29 | 显示全部楼层
如何注册?希望指点一下!
发表于 2004-5-27 15:43 | 显示全部楼层
好复杂啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-25 07:15 , Processed in 0.219118 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表