将块插入块表
我有一个VBA例程,最后在图形上放置一个块,只要该块已经存在于图形中,该例程基本上工作正常。如果块尚未定义,则会出现错误。如何确保块已在图形中?Set BlockRefObj = ThisDrawing.ModelSpace.InsertBlock(TriPos, "Tri", CScale, CScale, CScale, 0)
块名为“Tri”,位于路径文件夹中。我显然错过了一些东西,但我不确定是什么。
在添加任何引用之前,可以检查块是否存在
例如
Dim BlockToCheck As AcadBlock
Dim BlockRefObj As AcadBlockReference
On Error Resume Next
Set BlockToCheck = ThisDrawing.Blocks.Item("name")
On Error Resume Next
If Not BlockToCheck Is Nothing Then
Set BlockRefObj = ThisDrawing.ModelSpace.InsertBlock(TriPos, "Tri", CScale, CScale, CScale, 0)
End If
我怀疑Dave想先检查BlockTableRecord是否存在,如果不存在,则从文件中插入它(正如在SFSP中发现的那样)。。。我的VBA几乎不存在(我只在LISP/.NET中编写代码),因此可以从中学习:
Dim dwg As String
dwg = "Tri"
Dim BlockToCheck As AcadBlock
Dim BlockRefObj As AcadBlockReference
On Error Resume Next
Set BlockToCheck = ThisDrawing.Blocks.Item(dwg)
On Error Resume Next
If BlockToCheck Is Nothing Then
dwg$ = AcadFindFile(dwg)
End If
Set BlockRefObj = ThisDrawing.ModelSpace.InsertBlock(TriPos, dwg, CScale, CScale, CScale, 0)
... 以及依赖的AcadFindFile()伪函数:
Function AcadFindFile(fname As String) As String
Dim envpath As Variant, i As Integer, FSO As FileSystemObject, srchfname As String
envpath = Split(Application.ActiveDocument.GetVariable("Acadprefix"), ";")
Set FSO = New FileSystemObject
For i = LBound(envpath) To UBound(envpath)
srchfname = FSO.BuildPath(envpath(i), fname)
If FSO.FileExists(srchfname) Then
AcadFindFile = srchfname
Exit For
End If
Next
End Function
是的,正如BB所说。我想检查它是否存在,如果它已经在绘图中,我会插入该文件,但如果它不在绘图中,则从文件中插入。
由于我无法理解AcadFindFile位(我无法让FileSystemObject工作),我现在采用了大锤式方法,使用RICVBA的搜索和从文件中插入,然后立即删除它(!)如果找不到块。文件路径目前是硬编码的,但只有在网络驱动器的名称下一次(再次)更改时,才会在一个位置更改。
谢谢你们俩。
对不起,戴夫。
它*应该*复制中的FindFile()方法。NET/LISP,它接受字符串参数,并自动返回第一个找到的文件路径,同时在SFSP中搜索所述字符串。
无论如何,我很高兴你把它整理好了。
干杯
很高兴能对“发光生物”有所帮助!
至于AcadFindFile函数,您只需通过VBE中的工具->引用设置对Windows脚本主机对象模型的引用
但你也必须替换
AcadFindFile = srchfname
AcadFindFile = FSO.GetAbsolutePathName(srchfname)
否则,如果在最后一个“envpath”中找到文件,即“”(即搜索整个磁盘),它将只返回文件名(即“Tri.dwg”),而不返回其实际路径名。
或者,您可以避免设置该引用并使用后期绑定。在这种情况下,您必须替换
..., FSO As FileSystemObject,...
...FSO As Object,...
最后,无论使用哪种绑定,都必须在main sub中设置
dwg = "Tri.dwg"
希望这会有所帮助
再见 RICVBA,谢谢你。下周我会再读一遍,看看能学到什么。
页:
[1]