乐筑天下

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

[编程交流] 如何在中运行vba lisp例程

[复制链接]

1

主题

4

帖子

3

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 12:10:02 | 显示全部楼层 |阅读模式
大家好,
我想知道是否有人能帮我解决这个问题。
我有一个vba lisp例程,我真的不知道它的任何东西,只是想在我的auto cad中运行这段代码,如果有人能给我一步一步的指示如何在我的autocad中运行这段代码,我不知道任何关于lisp的事,所以请给我完整的指示,直到我得到它在我的autocad中运行和使用,谢谢
代码如下:
 
  1. Option Explicit
  2. Function GetActiveSpace() As AcadBlock
  3.    With ThisDrawing
  4.        If .ActiveSpace = acModelSpace Then
  5.            Set GetActiveSpace = .ModelSpace
  6.        Else
  7.            Set GetActiveSpace = .PaperSpace
  8.        End If
  9.        End With
  10.    End Function
  11. Function StoreLayerStatus() As Variant
  12.    Dim oLayer As AcadLayer
  13.    Dim oLayers As AcadLayers
  14.    Dim i As Integer
  15.    With ThisDrawing
  16.        Set oLayers = .Layers
  17.    End With
  18.    ReDim layerArr(0 To oLayers.Count - 1, 0 To 2) As Variant
  19.    For Each oLayer In oLayers
  20.        layerArr(i, 0) = oLayer.Name
  21.        layerArr(i, 1) = oLayer.Lock
  22.        layerArr(i, 2) = oLayer.Freeze
  23.        On Error Resume Next
  24.        oLayer.Freeze = False
  25.        If Err Then Err.Clear
  26.        i = i + 1
  27.    Next oLayer
  28.    On Error GoTo 0
  29.    StoreLayerStatus = layerArr
  30. End Function
  31. Private Sub RestoreLayerStatus(ByVal ar As Variant)
  32.    Dim oLayer As AcadLayer
  33.    Dim oLayers As AcadLayers
  34.    Dim i As Integer
  35.        With ThisDrawing
  36.        Set oLayers = .Layers
  37.    End With
  38.    For i = LBound(ar, 1) To UBound(ar, 1)
  39.    Set oLayer = oLayers(ar(i, 0))
  40.    On Error Resume Next '<-- to bypass active layer
  41.    With oLayer
  42.    .Lock = ar(i, 1)
  43.    .Freeze = ar(i, 2)
  44.    End With
  45.    If Err Then Err.Clear
  46.    Next i
  47.    On Error GoTo 0
  48.    
  49. End Sub
  50. Sub BlockReplace()
  51. Dim lsArr As Variant
  52. lsArr = StoreLayerStatus
  53. Dim oSpace As AcadBlock
  54. Dim varPt As Variant
  55. Dim oEnt As AcadEntity
  56. Dim oldBlkRef As AcadBlockReference
  57. Dim newBlkRef As AcadBlockReference
  58. Dim oldblkName As String
  59. Dim newblkName As String
  60. Dim layName As String
  61. Dim xscl As Double
  62. Dim yscl As Double
  63. Dim zscl As Double
  64. Dim rot As Double
  65. Dim insPt(2) As Double
  66. Dim ftype(0) As Integer
  67. Dim fdata(0) As Variant
  68. Dim dxfCode, dxfValue
  69. Dim oSset As AcadSelectionSet
  70. ThisDrawing.Utility.GetEntity oEnt, varPt, vbCrLf & "Select new block instance to replace with:"
  71. If Not TypeOf oEnt Is AcadBlockReference Then
  72. MsgBox "Selected object isn't a block reference"
  73. Exit Sub
  74. End If
  75. Set newBlkRef = oEnt
  76. If newBlkRef.IsDynamicBlock Then
  77. newblkName = newBlkRef.EffectiveName
  78. Else
  79. newblkName = newBlkRef.Name
  80. End If
  81.          With ThisDrawing.SelectionSets
  82.               While .Count > 0
  83.                    .Item(0).Delete
  84.               Wend
  85.          Set oSset = .Add("$ReplaceBlocks$")
  86.          End With
  87.          
  88. ftype(0) = 0
  89. fdata(0) = "INSERT"
  90. dxfCode = ftype: dxfValue = fdata
  91. oSset.SelectOnScreen dxfCode, dxfValue
  92. Set oSpace = GetActiveSpace
  93. For Each oEnt In oSset
  94. Set oldBlkRef = oEnt
  95. With oldBlkRef
  96. layName = .Layer
  97. xscl = .XScaleFactor
  98. yscl = .YScaleFactor
  99. zscl = .ZScaleFactor
  100. rot = .Rotation
  101. varPt = .InsertionPoint
  102. insPt(0) = varPt(0): insPt(1) = varPt(1): insPt(2) = varPt(2)
  103. .Delete
  104. End With
  105. Set newBlkRef = oSpace.InsertBlock(insPt, newblkName, xscl, yscl, zscl, rot)
  106. newBlkRef.Layer = layName
  107. Next oEnt
  108. RestoreLayerStatus (lsArr)
  109. ThisDrawing.Regen acActiveViewport
  110. End Sub
回复

使用道具 举报

1

主题

4

帖子

3

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 12:18:41 | 显示全部楼层
抱歉,大家忘了告诉你,这段代码是用来用另一个块替换一个块的特定实例的。
回复

使用道具 举报

14

主题

719

帖子

706

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 12:34:11 | 显示全部楼层
试试这个解释
 
回复

使用道具 举报

24

主题

1265

帖子

1028

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
362
发表于 2022-7-6 12:37:36 | 显示全部楼层
 
VBA和Lisp是两个不同的东西。
您的代码是VBA,而不是lisp。
 
看起来Tiger给了你运行这段代码的步骤。。。
回复

使用道具 举报

1

主题

4

帖子

3

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 12:49:51 | 显示全部楼层
谢谢你,老虎,
你能解释一下激活lisp例程的单词是什么吗。
回复

使用道具 举报

1

主题

4

帖子

3

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 12:53:07 | 显示全部楼层
是的,我的代码是vba,有人能用我给的代码举例吗??我很欣赏tiger的回答,但运行我的代码仍然让我感到困惑,因为它与tiger在其示例中使用的代码不同,谢谢
回复

使用道具 举报

14

主题

719

帖子

706

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 13:07:30 | 显示全部楼层
 
因为我对VBA例程几乎一无所知,所以我不能帮你。我会把这个帖子转移到定制论坛,你可能会在那里得到更快的答案。
回复

使用道具 举报

24

主题

1265

帖子

1028

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
362
发表于 2022-7-6 13:16:29 | 显示全部楼层
 
实际代码并不重要。Tiger为您概述的过程是相同的,只需使用您的代码。我可能提到的唯一区别是,您可以运行VBARUN命令并从对话框中选择宏,而不是在命令行中使用“vbastmt”命令。
 
注意:如果您运行的是AutoCAD 2010,则不包括VBA。不过,您可以从Autodesk下载它。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-6-8 05:25 , Processed in 0.569884 second(s), 68 queries .

© 2020-2025 乐筑天下

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