shibayan 发表于 2019-9-3 00:23:04

【求助】vb.net二次开发时,在CAD中选择了动态块,但其IsDynamicBlock属性却是false?

本帖最后由 shibayan 于 2019-9-3 00:24 编辑

我在CAD里面定义并插入了一个块参照(动态块),它除了包含两个常规的块属性外还有一个动态块的专有属性“可见性1”,但是运行后该动态块的DynamicBlockReferencePropertyCollection.Count的值输出为0(即动态块专有属性的个数为0),且它的isDynamicBlock属性是False(即程序认为该块参照不是动态块),想问下问题出在哪?

这里是代码,引用的AutoCAD是2014版的,编程语言是vb.net。


[*]Imports Autodesk.AutoCAD.ApplicationServices

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gifImports Autodesk.AutoCAD.DatabaseServices

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gifImports Autodesk.AutoCAD.EditorInput

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gifImports Autodesk.AutoCAD.Runtime

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gifPublic NotInheritable Class MyAutoCADTools2014

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif    '该项目引用的是AutoCAD2014版的.net库

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif    ''' <summary>

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif    ''' 输出选择的块实体(包括动态块)的所有属性名称

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif    ''' </summary>

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif    <CommandMethod("SBBC")>

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_shrink.gif    Public Shared Sub SBBC() 'SetBlockByCoordinate

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      '---------------这一段代码是输出常规的块参照的属性-------------------------

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      Dim ed As Editor = Core.Application.DocumentManager.MdiActiveDocument.Editor

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      Dim peo As PromptEntityResult = ed.GetEntity("请选择一个块实体")

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      Dim objId As ObjectId = peo.ObjectId

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      Dim ent As Entity = getEntityByObjectId(peo.ObjectId)

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      Do Until ent.GetType.Name = "BlockReference" Or peo.Status = PromptStatus.Cancel Or peo.Status = PromptStatus.None

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif            ed.WriteMessage("选择的不是块实体")

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif            peo = ed.GetEntity("请选择一个块实体")

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif            ent = getEntityByObjectId(peo.ObjectId) 'getEntityByObjectId是我自定义的函数,代码见后面的“其他”

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      Loop

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      Dim br As BlockReference = CType(ent, BlockReference)

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      Dim ar As AttributeReference

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      Dim arNames As String = ""

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      For i As Integer = 0 To br.AttributeCollection.Count - 1

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif            ar = CType(getEntityByObjectId(br.AttributeCollection.Item(i)), AttributeReference)

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_shrink.gif            If i = 0 Then arNames = ar.Tag Else arNames = arNames & vbCrLf & ar.Tag

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      Next

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      ed.WriteMessage(vbCrLf & vbCrLf & "------该块实体包含的属性------" & vbCrLf & arNames)

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      '---------------这一段代码是输出常规的块参照的属性-------------------------

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      '--------这一段代码用来调试检测动态块的相关属性,问题就在这里,跟动态块相关的代码都不起作用--------

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      ed.WriteMessage(vbCrLf & "------检测该块是否是动态块------" & vbCrLf)

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      ed.WriteMessage(br.IsDynamicBlock)

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      ed.WriteMessage(vbCrLf & "------输出动态块的属性的个数------" & vbCrLf)

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      ed.WriteMessage(br.DynamicBlockReferencePropertyCollection.Count)

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      ed.WriteMessage(vbCrLf & "------输出动态块的所有属性的名称------")

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      arNames = ""

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      For Each dbrp As DynamicBlockReferenceProperty In br.DynamicBlockReferencePropertyCollection

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif            arNames = arNames & vbCrLf

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      Next

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      '--------这一段代码用来调试检测动态块的相关属性,问题就在这里,跟动态块相关的代码都不起作用--------

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif    End Sub

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif#Region "其他"

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_shrink.gif    Public Class Initialize

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_shrink.gif      Public Sub New()

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      End Sub

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif    End Class

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif    ''' <summary>

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif    ''' 根据ObjectID返回实体,做这个函数是因为不知道为什么使用objectId.getObject()方法要出错

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif    ''' </summary>

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif    ''' <param name="objId">对象的ObjectId</param>

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif    ''' <returns></returns>

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_shrink.gif    Public Shared Function getEntityByObjectId(ByVal objId As ObjectId) As Entity

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      Dim ent As Entity

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_shrink.gif      Using tr As Transaction = objId.Database.TransactionManager.StartTransaction

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif            ent = CType(tr.GetObject(objId, OpenMode.ForRead), Entity)

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif            tr.Commit()

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      End Using

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif      Return ent

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif    End Function

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gif#End Region

[*]http://bbs.xdcad.net/source/plugin/imc_colorcode/images/jssc_none.gifEnd Class


shibayan 发表于 2019-9-3 07:29:08

我自己找到解决方法了,国外的一个网友也提过这个问题,答案就是不能把引用动态块专有属性的相关代码放在transaction代码段的外面,而我的代码中单独定义了一个getEntityByObjectID函数,在该函数返回entity对象后就关闭了transaction,所以再检测返回的entity对象是否为动态块时系统就会认为它不是动态块了。

sieben 发表于 2019-9-3 08:39:58

可以把transaction 作为getEntityByObjectId函数的一个参数

阿霸jun 发表于 2022-12-6 20:44:19

感谢分享,我也遇到了同样的问题!

d1742647821 发表于 2022-12-7 11:55:47

shibayan 发表于 2019-9-3 07:29
我自己找到解决方法了,国外的一个网友也提过这个问题,答案就是不能把引用动态块专有属性的相关代码放在tr ...

不要在子函数中开启事务,非常错误的用法

荣sir 发表于 2023-1-16 23:19:30

以前看书,查资料,也在子函数里面弄了不少事务,自从用了ifox,就喜欢一个事务打天下了
页: [1]
查看完整版本: 【求助】vb.net二次开发时,在CAD中选择了动态块,但其IsDynamicBlock属性却是false?