乐筑天下

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

[编程交流] VBA AutoCAD命令行变量

[复制链接]

2

主题

19

帖子

17

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 21:41:42 | 显示全部楼层 |阅读模式
嗨,


我目前正在使用VBA编写一个小程序。我正在处理的程序部分是修改图形边框。我在网上找到了一个Lisp文件,它通过查找和替换变量发挥了神奇的作用,但我似乎无法使用Send命令
使其发挥作用

lisp要求键入要替换的内容,然后键入要替换的内容。


我似乎找不到将变量传递到命令行的方法,以便它将替换输入的内容

这是我的示例代码:

---------------------------------------------------

Sub RENAME_BORDER()


[左对齐][颜色=#666666][大小=14px]错误下一步继续
Dim acadCmd作为字符串
将客户端设置为字符串
将位置变暗为字符串


[左对齐][颜色=#666666][大小=14px]客户端=纸张(1)。范围(“N”和20)。价值
位置=板材(1)。范围(“N”和22)。值

[左对齐][颜色=#666666][大小=14px]设置ACAD=GetObject(,“AutoCAD.Application”)
ACAD。可见=真
[左对齐][颜色=#666666][大小=14px]
acadCmd=“coa&############和客户端”

[左对齐][颜色=#666666][大小=14px]ACAD。ActiveDocument。SendCommand acadCmd和vbCr
[左对齐][颜色=#666666][大小=14px]
结束子

--------------------------


当您尝试该代码时,它运行命令,告诉lisp程序搜索#########,但然后我需要使用一个变量,例如N20或N22中的单元格值来替换所有这些#。


有人有什么建议吗?
回复

使用道具 举报

18

主题

118

帖子

101

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
89
发表于 2022-7-6 21:46:57 | 显示全部楼层
您好
我不太明白你的意思,但如果你试图修改一种“公司模板”,你可以轻松地创建一个带有属性(客户、工作编号发布等)的块,并使用VBA进行修改。请参阅附加的Jpg图像
224144zy997eotyo770ie1.jpg
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 21:51:06 | 显示全部楼层
看起来您正在从excel运行此操作。所以读取单元格范围。我同意可以通过属性顺序或att标记名更容易地编辑块属性。还可以控制要更新的布局选项卡等。
回复

使用道具 举报

2

主题

19

帖子

17

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 21:51:34 | 显示全部楼层
很抱歉不清楚。


我附上了我们的边框和我正在使用的lisp程序的屏幕截图

在lisp程序中,我指定了要查看的块,即我们的边界。


所以要运行命令,您需要键入“coa”

然后它会请求您要替换的文本[color][align]
它会要求您输入所需的新文本。


这是我无法完成的最后一部分。VBA将发送命令#'s,但我无法将e单元格值放入命令行以更改#'s


我将替换的所有文本中都会有不同数量的#'s,并且它们在多达60个图形中是相同的。

224147ff2fvxn6dr26x6gd.png
回复

使用道具 举报

18

主题

118

帖子

101

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
89
发表于 2022-7-6 21:56:51 | 显示全部楼层
您好,谢谢您的解释,我想用一个包含所有信息的块作为属性,您可以很好地解决您的问题。
您可以创建VBA表单,其中需要更改文本,在此步骤后,程序将在图形内搜索图形信息标题栏,搜索要更改的属性(文本),然后解决您的问题。
块属性也可以通过直接双击图形内的块手动更改,您可以更改包含要更改的文本的属性。
给我寄一张空画,我会尽力更好地解释我的意思,而不是你能决定的。
 
当做
回复

使用道具 举报

2

主题

19

帖子

17

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 21:57:55 | 显示全部楼层
感谢您的回复
 
这只是我和另一个人正在开发的一个稍大的程序的一小部分。
 
很难尝试解释所有内容,但基本上工程师希望从列表中选择一些图纸,单击按钮,它会将文件复制到相关作业文件夹(已完成),整理图纸(已完成),并使用相关客户、位置、作业编号和日期更新所有边框(wip)
 
负责这个小项目的工程师坚持认为,尽管使用AutoCAD的内置查找和替换功能只需要一分钟,但他希望边界能够完成,。但是无法通过VBA使用该函数,这就是为什么我尝试使用lisp。 
 
如果你能想出另一种方法,那我洗耳恭听
 
我附上了带边框的文件
回复

使用道具 举报

18

主题

118

帖子

101

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
89
发表于 2022-7-6 22:02:06 | 显示全部楼层
您好,barakar42
看起来你们已经有了标题栏,所以一半的工作已经完成了。
还有几个问题:
1) “从列表中选择多个图形”列表可以是包含图形列表的文本文件吗?列表当前在excel文件中?我这样问是因为在程序内部,您可以显示一个“组合框”,其中包含要应用的文件列表图形,因此可以轻松管理源代码,此外,您可以避免将相同的“图形编号”双重分配给不同的图形。
 
2) 我在您的图形中看到几个“布局”或“图纸空间”,是否要为内部图形指定相同的布局名称?。
 
我将准备一个简单的VBA代码,向您展示如何快速解决问题。
 
再见
回复

使用道具 举报

2

主题

19

帖子

17

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 22:05:40 | 显示全部楼层
关于第1点。每个可能的图纸都有一个列表,每个图纸都有自己独特的图纸标题和编号,工程师只需在每个图纸编号旁边打勾即可选择。不可能复制图纸
 
2.我们只有一个dwg文件,其中有多个布局选项卡,所有内容都在模型空间中绘制。边框位于图纸空间上,带有显示正确图形的视口。
 
只有哈希标记需要替换为excel工作表上的某些值,它们在每个布局选项卡上都是相同的。
回复

使用道具 举报

18

主题

118

帖子

101

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
89
发表于 2022-7-6 22:07:52 | 显示全部楼层
您好,barakar42,
下面是一些解决问题的部分代码
下面的代码是在Excel开发区内编写的。
作为第二个问题,我看到您有一些重复的“标题栏”属性,如左上角内的图纸编号。这不是一个好主意,您可以将左上角的图形编号指示作为一个新属性轻松管理,即与放置在右下图形部分的图形编号相同。
问题属性相同
如何管理图形:
例如:
您有一个图纸列表,使用excel,您可以在布局之前设置您想在哪里应用有关客户的excel信息等等。
您可以在Excel命令栏中添加一个按钮,调用下面的宏,该宏将传输cad图形上的信息。
变量Attributelist它是一个包含所有属性标记、提示和实际值的数组。
每个标签都位于具有属性的阵列内,请参见下图:
224152fv2an8nn282nvqgg.png
属性数组0
224154r6vy2bdnazybbhpg.png
因此,您将有一个TAGSTRING,它是属性标记,TEXTSTRING是值。
通过这种方式,您可以使用AttributeList(0)修改值。TextString=“EXCEL行或单元格值”。其他属性(客户端或DWG编号)相同
上述句子可以添加到显示为“”的地方
嗨,希望这能给你更多帮助。
如果你需要更多的澄清,请告诉我
  1. Sub RENAME_BORDER()
  2. Dim client As String
  3. Dim location As String
  4. Dim acadApp As Object
  5. Dim acadDoc As Object
  6. Dim MyMag As Double
  7. client = Sheets(1).Range("N" & 20).Value
  8. location = Sheets(1).Range("N" & 22).Value
  9. Bname = "TITLE BLOCK"
  10.     On Error Resume Next
  11. 'Check if AutoCAD application is open. If is not opened create a new instance and make it visible.
  12.     Set acadApp = GetObject(, "AutoCAD.Application")
  13.     Set acadDoc = acadApp.ActiveDocument
  14.    If acadApp Is Nothing Then
  15.        Set acadApp = CreateObject("AutoCAD.Application")
  16.         acadApp.Visible = True
  17.    End If
  18.         acadApp.Visible = True
  19.         
  20.    
  21.     Set NewoBlock = acadDoc.ActiveLayout.Block
  22.         For iCount = 0 To NewoBlock.Count - 1
  23.             Set oEnt = NewoBlock.Item(iCount)
  24.                 If TypeOf oEnt Is AcadBlockReference Then
  25.                     Set NewoblkRef = oEnt
  26.                         If UCase(NewoblkRef.Name) = UCase(Bname) Then
  27.                            If NewoblkRef.HasAttributes = True Then
  28.                                 AttributeList = NewoblkRef.GetAttributes
  29.                 '  '' <do something with this block here >
  30.                                 
  31.                                 Exit For
  32.                            Else
  33.                                 bCount = bCount + 1
  34.                            End If
  35.                
  36.             End If
  37.         End If
  38.     Next iCount
  39. End Sub
回复

使用道具 举报

2

主题

19

帖子

17

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 22:12:34 | 显示全部楼层
嗨,彼得
 
谢谢你的代码。不过,我有几个问题需要解决
 
它是否需要首先为所有可能的块设置所有可能的属性,然后检查并更改值? 
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-4 16:22 , Processed in 0.422835 second(s), 74 queries .

© 2020-2025 乐筑天下

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