乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 148|回复: 3

交互式插入VBA

[复制链接]

6

主题

17

帖子

8

银币

初来乍到

Rank: 1

铜币
34
发表于 2022-7-6 22:41:31 | 显示全部楼层 |阅读模式
我正在尝试建立一个“更智能”的插入例程来放置家具块。我所说的“更智能”是指,我希望用户能够控制,最好是通过击键,无论是镜像块还是在每次按下我决定的键时以固定角度旋转它。我遇到的问题是,我甚至不知道如何正确地“搜索”帮助,而不找到大量不相关的信息。
 
我找不到解决方案的最大问题是,能够始终在我的鼠标上保留重影块,并使用用户输入更新重影块,直到最终放置为止。实际上,旋转可能会在最后进行,我只希望能够有一个带有镜像选项的可见插入例程。
 
令人沮丧的是,我知道这是可以做到的——我见过它使用家具供应商专有的ACAD小程序。我已经能够把小程序拆开——有点——但我相信我在这个小程序中寻找的是LISP。我不太懂LISP,我真的希望能够使用VBA。我已经能够将LISP的小而易于理解的片段与VBA结合使用,但仅此而已。
 
到目前为止,我得到的最接近的方法是使用几个小的子例程,例如:
  1. Sub BasicInsert()
  2. ThisDrawing.ModelSpace.InsertBlock InsPnt(), "TypicalD1", 1, 1, 1, Rot()
  3. End Sub
  4. Function InsPnt() As Variant
  5. Dim Pnt1 As Variant
  6. Pnt1 = ThisDrawing.Utility.GetPoint(, "Choose insertion point")
  7. InsPnt = Pnt1
  8. End Function
  9. Function Rot()
  10. Dim rotAng As Double
  11. Dim InsPnt As Variant
  12. rotAng = ThisDrawing.Utility.GetAngle(, vbCr & "Select Angle:")
  13. End Function

 
我的意思是,我已经发现我可以在InsertBlock例程中运行子例程。真的,我甚至不知道我是否走对了这条路。
 
我正在考虑但甚至不知道如何调用的另一种方法是让VBA复制实景效果,相当于通过插入点抓取一个块。你知道,当你在ACAD中高亮显示一个块,然后单击它的插入点夹点时,你现在已经控制了该块,直到你在图形中的其他地方单击以放置它。我想,如果我能在VBA或LISP中解决这个问题,我就可以把其余的东西排成一行。
 
任何帮助都将不胜感激。
 
谢谢
回复

使用道具 举报

6

主题

17

帖子

8

银币

初来乍到

Rank: 1

铜币
34
发表于 2022-7-6 23:21:08 | 显示全部楼层
更新:
 
我提到的另一条路线--“我正在考虑但甚至不知道如何调用的另一种方法是让VBA复制实景效果,相当于通过插入点夹点抓取一个块。你知道,当你在ACAD中高亮显示一个块,然后单击它的插入点夹点时,你现在已经控制了该块,直到你在图形中的其他地方单击以放置它。我想我是否可以在VBA或LIS中解决这个问题P、 我可以把剩下的东西排成一行。"
 
这只是调用STRETCH命令的另一种方式,因此我怀疑它是否有用。
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 23:40:34 | 显示全部楼层
关于视觉反馈,VBA是一个糟糕的编程界面。仅使用VBA无法实现该过程,但已提出了几种解决方法。这里是讨论主题的前一条线索:
 
 
 
http://www.cadtutor.net/forum/showthread.php?23468
 
 
 
 
 
在Lisp或VB中,需要视觉反馈的操作更为可行。净额。
回复

使用道具 举报

6

主题

17

帖子

8

银币

初来乍到

Rank: 1

铜币
34
发表于 2022-7-6 23:49:34 | 显示全部楼层
肖恩,
 
谢谢你的回复!不幸的是,在引用的帖子中,frostrap从未发布他最终使用的LISP。
 
在等待回复的同时,我走上了另一条路,决定通过lisp调用“-insert”,然后通过acSelectionSetLast选择该块,试图使用键盘输入来更改该块。然而,我并没有使用该实用程序进行输入,而是尝试运行几个API函数来查找按下的键。我从中得到了一些非常疯狂的东西——比如,一旦我按下左箭头键或右箭头键,木块就会像螺旋桨一样旋转,虽然非常有趣,但最终会导致崩溃。
 
我会把代码贴出来,如果你想把它拆开,请把它拆开。如果没有,没关系,我只会继续努力,直到有事情发生。
 
  1. Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
  2. Private Declare Function GetKeyboardState Lib "user32" (kbArray As KeyboardBytes) As Long
  3. Private Declare Function SetKeyboardState Lib "user32" (kbArray As KeyboardBytes) As Long
  4. Private Type KeyboardBytes
  5.    kbByte(0 To 255) As Byte
  6. End Type
  7. Global Cnt As Long
  8. Sub RunRoutine()
  9. Dim objBlock As AcadBlock, objRef As AcadBlockReference, objMir As AcadBlockReference
  10. Dim objEnt As AcadEntity, entArray(0) As AcadEntity
  11. Dim FurnPath As String, blkName As String
  12. Dim SS1 As AcadSelectionSet
  13. Dim insPnt1 As Variant, BXmin As Variant, BXmax As Variant
  14. Dim insPntX(0 To 2) As Double
  15. Dim insPntY(0 To 2) As Double
  16. Dim BXul(0 To 2) As Double
  17. Dim rotAng As Double
  18. Dim retKey As Boolean
  19. Dim prsKey
  20. Dim kbArray As KeyboardBytes
  21. On Error Resume Next
  22. ThisDrawing.SelectionSets.Item("insBlock").Delete
  23. On Error GoTo 0
  24. blkName = GetLispSym("B")
  25. FurnPath = "C:\Program Files\Autodesk\AutoCAD 2011\Support\COE_RST-FurnApps\COE_RST-FurnBlocks.dwg"
  26. If TestBlock(blkName) = True Then
  27.    ThisDrawing.SendCommand blkName & vbCr
  28. ElseIf Dir(FurnPath) = "" Then
  29.    Do Until Dir(FurnPath) <> "" And Right(FurnPath, 4) = ".dwg"
  30.    On vbCancel GoTo 1
  31.        FurnPath = InputBox("Enter Block file path, i.e. C:\My Documents\ACAD Blocks\BlockFile.dwg", "Block File Path?")
  32.            If Dir(FurnPath) = "" Then
  33.            MsgBox "File Doesn't Exist, Try Again."
  34.            Else
  35.            End If
  36.    Loop
  37.    GetFurnBlock blkName, FurnPath
  38.    ThisDrawing.SendCommand blkName & vbCr
  39. Else
  40. GetFurnBlock blkName, FurnPath
  41. ThisDrawing.SendCommand blkName & vbCr
  42. End If
  43. Set SS1 = ThisDrawing.SelectionSets.Add("insBlock")
  44. SS1.Select acSelectionSetLast
  45. SS1.Highlight True
  46.    For Each objEnt In SS1
  47.    If TypeOf objEnt Is AcadBlockReference Then
  48.    Set objRef = objEnt
  49.    Set objEnt = Nothing
  50.    insPnt1 = objRef.InsertionPoint
  51.    insPntX(0) = insPnt1(0) + 1#: insPntX(1) = insPnt1(1): insPntX(2) = 0
  52.    insPntY(0) = insPnt1(0): insPntY(1) = insPnt1(1) + 1#: insPntY(2) = 0
  53.        Do Until retKey = True
  54.        ThisDrawing.Utility.Prompt "UP=FlipUp/DOWN=FlipDown/RIGHT=+90/LEFT=-90" & vbCr
  55.            For Cnt = 13 And 32 To 128
  56.                If GetAsyncKeyState(Cnt) <> 0 Then
  57.                prsKey = Cnt
  58.                Exit For
  59.                Else
  60.                End If
  61.            Next Cnt
  62.        Select Case prsKey
  63.        Case 38
  64.            objRef.GetBoundingBox BXmin, BXmax
  65.            BXul(0) = BXmin(0): BXul(1) = BXmax(1): BXul(2) = 0
  66.            Set objMir = objRef.Mirror(BXul, BXmax)
  67.            objRef.Delete
  68.            Set objRef = Nothing
  69.            SS1.Clear
  70.            Set objRef = objMir
  71.            Set objMir = Nothing
  72.            Set entArray(0) = objRef
  73.            SS1.AddItems entArray
  74.            SS1.Update
  75.            Set entArray = Nothing
  76.        Case 40
  77.            Set objMir = objRef.Mirror(insPnt1, insPntX)
  78.            objRef.Delete
  79.            Set objRef = Nothing
  80.            SS1.Clear
  81.            Set objRef = objMir
  82.            Set objMir = Nothing
  83.            Set entArray(0) = objRef
  84.            SS1.AddItems entArray
  85.            SS1.Update
  86.            Set entArray = Nothing
  87.        Case 39
  88.            rotAng = objRef.Rotation
  89.            objRef.Rotate insPnt1, (rotAng + 90)
  90.        Case 37
  91.            rotAng = objRef.Rotation
  92.            objRef.Rotate insPnt1, (rotAng - 90)
  93.        Case 13
  94.        retKey = True
  95.        End Select
  96.        GetKeyboardState kbArray
  97.            For Cnt = 32 To 128
  98.            kbArray.kbByte(Cnt) = 0
  99.            Next Cnt
  100.        SetKeyboardState kbArray
  101.        Loop
  102.    Set objRef = Nothing
  103.    Else
  104.    End If
  105.    Next
  106. SS1.Clear
  107. SS1.Delete
  108. Set SS1 = Nothing
  109. 1
  110. End Sub

 
我知道这非常粗糙,但我正在学习束。
 
我想,在不久的将来,我将开始沿着这个方向前进。网络之路——这是一切基本上都在前进的地方。
 
再次感谢!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-12 23:02 , Processed in 0.672843 second(s), 60 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表