乐筑天下

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

[编程交流] 将块插入块表

[复制链接]

48

主题

1073

帖子

1043

银币

后起之秀

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

铜币
238
发表于 2022-7-6 22:05:39 | 显示全部楼层 |阅读模式
我有一个VBA例程,最后在图形上放置一个块,只要该块已经存在于图形中,该例程基本上工作正常。如果块尚未定义,则会出现错误。如何确保块已在图形中?
 
  1.      Set BlockRefObj = ThisDrawing.ModelSpace.InsertBlock(TriPos, "Tri", CScale, CScale, CScale, 0)

 
块名为“Tri”,位于路径文件夹中。我显然错过了一些东西,但我不确定是什么。
回复

使用道具 举报

12

主题

175

帖子

77

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
149
发表于 2022-7-6 22:17:11 | 显示全部楼层
 
在添加任何引用之前,可以检查块是否存在
 
例如
  1. Dim BlockToCheck As AcadBlock
  2. Dim BlockRefObj As AcadBlockReference
  3. On Error Resume Next
  4. Set BlockToCheck = ThisDrawing.Blocks.Item("name")
  5. On Error Resume Next
  6. If Not BlockToCheck Is Nothing Then
  7.    Set BlockRefObj = ThisDrawing.ModelSpace.InsertBlock(TriPos, "Tri", CScale, CScale, CScale, 0)
  8. End If
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 22:30:44 | 显示全部楼层
 
我怀疑Dave想先检查BlockTableRecord是否存在,如果不存在,则从文件中插入它(正如在SFSP中发现的那样)。。。我的VBA几乎不存在(我只在LISP/.NET中编写代码),因此可以从中学习:
 
  1. Dim dwg As String
  2. dwg = "Tri"
  3. Dim BlockToCheck As AcadBlock
  4. Dim BlockRefObj As AcadBlockReference
  5. On Error Resume Next
  6. Set BlockToCheck = ThisDrawing.Blocks.Item(dwg)
  7. On Error Resume Next
  8. If BlockToCheck Is Nothing Then
  9.    dwg$ = [color="red"]AcadFindFile[/color](dwg)
  10. End If
  11. Set BlockRefObj = ThisDrawing.ModelSpace.InsertBlock(TriPos, dwg, CScale, CScale, CScale, 0)

 
 
... 以及依赖的AcadFindFile()伪函数:
 
  1. Function AcadFindFile(fname As String) As String
  2. Dim envpath As Variant, i As Integer, FSO As FileSystemObject, srchfname As String
  3. envpath = Split(Application.ActiveDocument.GetVariable("Acadprefix"), ";")
  4. Set FSO = New FileSystemObject
  5. For i = LBound(envpath) To UBound(envpath)
  6.         srchfname = FSO.BuildPath(envpath(i), fname)
  7.         If FSO.FileExists(srchfname) Then
  8.                 AcadFindFile = srchfname
  9.                 Exit For
  10.         End If
  11. Next
  12. End Function
回复

使用道具 举报

48

主题

1073

帖子

1043

银币

后起之秀

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

铜币
238
发表于 2022-7-6 22:37:40 | 显示全部楼层
是的,正如BB所说。我想检查它是否存在,如果它已经在绘图中,我会插入该文件,但如果它不在绘图中,则从文件中插入。
 
由于我无法理解AcadFindFile位(我无法让FileSystemObject工作),我现在采用了大锤式方法,使用RICVBA的搜索和从文件中插入,然后立即删除它(!)如果找不到块。文件路径目前是硬编码的,但只有在网络驱动器的名称下一次(再次)更改时,才会在一个位置更改。
 
谢谢你们俩。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 22:46:34 | 显示全部楼层
 
对不起,戴夫。
 
它*应该*复制中的FindFile()方法。NET/LISP,它接受字符串参数,并自动返回第一个找到的文件路径,同时在SFSP中搜索所述字符串。
 
 
 
无论如何,我很高兴你把它整理好了。
 
干杯
回复

使用道具 举报

12

主题

175

帖子

77

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
149
发表于 2022-7-6 22:58:06 | 显示全部楼层
 
很高兴能对“发光生物”有所帮助!
至于AcadFindFile函数,您只需通过VBE中的工具->引用设置对Windows脚本主机对象模型的引用
但你也必须替换
  1. AcadFindFile = srchfname
  1. AcadFindFile = FSO.GetAbsolutePathName(srchfname)

否则,如果在最后一个“envpath”中找到文件,即“”(即搜索整个磁盘),它将只返回文件名(即“Tri.dwg”),而不返回其实际路径名。
 
或者,您可以避免设置该引用并使用后期绑定。在这种情况下,您必须替换
  1. ..., FSO As FileSystemObject,...
  1. ...FSO As Object,...

 
最后,无论使用哪种绑定,都必须在main sub中设置
  1. dwg = "Tri.dwg"

 
希望这会有所帮助
 
再见
回复

使用道具 举报

48

主题

1073

帖子

1043

银币

后起之秀

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

铜币
238
发表于 2022-7-6 23:11:11 | 显示全部楼层
RICVBA,谢谢你。下周我会再读一遍,看看能学到什么。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-4 11:15 , Processed in 0.833063 second(s), 77 queries .

© 2020-2025 乐筑天下

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