按名称获取表
我试图在我的绘图中获得所有的自定义表,我可以用编辑器来完成,但我不想使用编辑器,我更喜欢使用数据库,以下是我所拥有的,指导将是巨大的。Dim filter for()As typed value = { New typed value(0,“ACAD _表”),New TypedValue(1000,“表名”)}
Dim SF As selection filter = New selection filter(filter for)
Dim PSR As PromptSelectionResult = ed。选择全部(sf)
**** Hidden Message ***** 嗨,
我不知道你想做什么
您将如何选择所有表并使用数据库
嗯,我有很多图纸需要从中读取表格,所以我想使用
ReadDwgFile,但当时我无法使用编辑器。获取所有块BlockReference的示例如下:
将MyBTR设置为BlockTableRecord=DirectCast(SpaceId.GetObject(OpenMode.ForRead),BlockTableRecord)
,除了我想要表 我发现了..
私有共享函数GetTables(_Database As Database,Table style name As String)As List(Of Table)
Dim return value As New List(Of Table)
使用tran As Transaction = _Database。transaction manager . start transaction()
Dim layout dict As db dictionary = direct cast(tran。GetObject(_Database。LayoutDictionaryId,OpenMode。ForRead)、DBDictionary)
对于layoutDict中的每个条目作为DictionaryEntry。GetObject(DirectCast(entry。Value,ObjectId),OpenMode。ForRead)、Layout)
Dim oBlockTableRecord As block table record = DirectCast(tran。GetObject(oLayout。BlockTableRecordId,OpenMode。ForRead)、BlockTableRecord)
对于oBlockTableRecord中作为ObjectId的每个oo ObjectId
Dim odb object As DBObject = direct cast(tran。GetObject(oo objectid,OpenMode。ForRead),DBObject)
如果oDBObject的类型是Table,则
Dim oTable As Table = try cast(odb object,Table)
如果oTable不是Nothing,则
如果oTable。table style name . ToUpper = table style name。ToUpper Then
返回值。add(oTable)
End If
End If
End If
Next
Next
End Using
Return Return value
End函数 (1)Transaction.GetObject() 返回一个 DbObject,因此您不必强制转换返回类型。
(2)那么看起来你正在测试oDBObject是否属于Type Table。 然后,您正在使用TryCast()的下一行将始终返回一个非空对象,因为它必须通过您的第一个测试。 我想试试这样的
,每个objectId作为ObjectTableRecord中的objectId。
如果是objectId.ObjectClass。DxfName=“表DXF名称”然后
Dim table=DirectCast(trans.GetObject(objectId,OpenMode.ForRead),table)
如果是table.TableStyleName。ToUpper()=表样式名。ToUpper()然后
返回值。添加(表)
如果
如果
下一个
在打开对象之前检查DXF名称比打开对象然后检查更快。首先,您没有不必要地打开对象。其次,您知道它是一个表,因此您可以将其作为一个表打开,而无需任何trycast。希望这能有所帮助。 下面是使用命名对象字典的另一种方法。由于调用此方法时很可能会有一个活动事务,因此我使用了顶部事务,而不是创建一个新事务
公共共享函数GetTablesByNameFromLayouts(数据库为数据库,表名为字符串)为列表(表)
Dim tables=新列表(表格)
Dim transaction=database.TransactionManager.TopTransaction()
如果事务=无,则
抛出新的Autodesk.AutoCad.Runtime.Exception(ErrorStatus.NoActiveTransactions,“此方法要求激活事务”)
如果
Dim nod=DirectCast(transaction.GetObject(database.NamedObjectsDictionaryId,OpenMode.ForRead),DBDictionary)
Dim layouts=DirectCast(transaction.GetObject(nod.GetAt(“ACAD_LAYOUT”),OpenMode。ForRead),DBDictionary)
<div>对于布局中作为DBDictionaryEntry的每个条目</div>
Dim layout=DirectCast(transaction.GetObject(entry.Value,OpenMode.ForRead),布局)
Dim blockTableRecord=DirectCast(transaction.GetObject(layout.blocktablerrecordid,OpenMode.ForRead),blocktable记录)
对于blockTableRecord中作为objectId的每个objectId
如果是objectId.ObjectClass。DxfName=“表DXF名称”然后
Dim table=DirectCast(transaction.GetObject(objectId,OpenMode.ForRead),table)
如果是table.TableStyleName。ToUpper()=表名。ToUpper()然后
表格。添加(表格)
如果
如果
下一个
下一个
返回表
结束函数
我一开始就这么做了,没有运行或调试代码,所以我交叉手指,它是正确的。 我认为你也可以从表格样式字典中获取TableStyle,并使用GetPersistentReactorIds()获取表格。 Wowens,
您可以在Autocad扩展库中找到许多有用的方法和扩展 感谢大家的帮助和指导
页:
[1]