明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2451|回复: 5

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

[复制链接]
发表于 2019-9-3 00:23:04 | 显示全部楼层 |阅读模式
本帖最后由 shibayan 于 2019-9-3 00:24 编辑

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

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

  • Imports Autodesk.AutoCAD.ApplicationServices
  • Imports Autodesk.AutoCAD.DatabaseServices
  • Imports Autodesk.AutoCAD.EditorInput
  • Imports Autodesk.AutoCAD.Runtime

  • Public NotInheritable Class MyAutoCADTools2014
  •     '该项目引用的是AutoCAD2014版的.net库

  •     ''' <summary>
  •     ''' 输出选择的块实体(包括动态块)的所有属性名称
  •     ''' </summary>
  •     <CommandMethod("SBBC")>
  •     Public Shared Sub SBBC() 'SetBlockByCoordinate

  •         '---------------这一段代码是输出常规的块参照的属性-------------------------
  •         Dim ed As Editor = Core.Application.DocumentManager.MdiActiveDocument.Editor
  •         Dim peo As PromptEntityResult = ed.GetEntity("请选择一个块实体")
  •         Dim objId As ObjectId = peo.ObjectId
  •         Dim ent As Entity = getEntityByObjectId(peo.ObjectId)
  •         Do Until ent.GetType.Name = "BlockReference" Or peo.Status = PromptStatus.Cancel Or peo.Status = PromptStatus.None
  •             ed.WriteMessage("选择的不是块实体")
  •             peo = ed.GetEntity("请选择一个块实体")
  •             ent = getEntityByObjectId(peo.ObjectId) 'getEntityByObjectId是我自定义的函数,代码见后面的“其他”
  •         Loop
  •         Dim br As BlockReference = CType(ent, BlockReference)
  •         Dim ar As AttributeReference
  •         Dim arNames As String = ""
  •         For i As Integer = 0 To br.AttributeCollection.Count - 1
  •             ar = CType(getEntityByObjectId(br.AttributeCollection.Item(i)), AttributeReference)
  •             If i = 0 Then arNames = ar.Tag Else arNames = arNames & vbCrLf & ar.Tag
  •         Next
  •         ed.WriteMessage(vbCrLf & vbCrLf & "------该块实体包含的属性------" & vbCrLf & arNames)
  •         '---------------这一段代码是输出常规的块参照的属性-------------------------





  •         '--------这一段代码用来调试检测动态块的相关属性,问题就在这里,跟动态块相关的代码都不起作用--------
  •         ed.WriteMessage(vbCrLf & "------检测该块是否是动态块------" & vbCrLf)
  •         ed.WriteMessage(br.IsDynamicBlock)
  •         ed.WriteMessage(vbCrLf & "------输出动态块的属性的个数------" & vbCrLf)
  •         ed.WriteMessage(br.DynamicBlockReferencePropertyCollection.Count)
  •         ed.WriteMessage(vbCrLf & "------输出动态块的所有属性的名称------")
  •         arNames = ""
  •         For Each dbrp As DynamicBlockReferenceProperty In br.DynamicBlockReferencePropertyCollection
  •             arNames = arNames & vbCrLf
  •         Next
  •         '--------这一段代码用来调试检测动态块的相关属性,问题就在这里,跟动态块相关的代码都不起作用--------
  •     End Sub

  • #Region "其他"
  •     Public Class Initialize
  •         Public Sub New()

  •         End Sub
  •     End Class
  •     ''' <summary>
  •     ''' 根据ObjectID返回实体,做这个函数是因为不知道为什么使用objectId.getObject()方法要出错
  •     ''' </summary>
  •     ''' <param name="objId">对象的ObjectId</param>
  •     ''' <returns></returns>
  •     Public Shared Function getEntityByObjectId(ByVal objId As ObjectId) As Entity
  •         Dim ent As Entity
  •         Using tr As Transaction = objId.Database.TransactionManager.StartTransaction
  •             ent = CType(tr.GetObject(objId, OpenMode.ForRead), Entity)
  •             tr.Commit()
  •         End Using
  •         Return ent
  •     End Function
  • #End Region
  • End Class


 楼主| 发表于 2019-9-3 07:29:08 来自手机 | 显示全部楼层
我自己找到解决方法了,国外的一个网友也提过这个问题,答案就是不能把引用动态块专有属性的相关代码放在transaction代码段的外面,而我的代码中单独定义了一个getEntityByObjectID函数,在该函数返回entity对象后就关闭了transaction,所以再检测返回的entity对象是否为动态块时系统就会认为它不是动态块了。
回复 支持 1 反对 1

使用道具 举报

发表于 2019-9-3 08:39:58 | 显示全部楼层
可以把transaction 作为getEntityByObjectId函数的一个参数
发表于 2022-12-6 20:44:19 | 显示全部楼层
感谢分享,我也遇到了同样的问题!
发表于 2022-12-7 11:55:47 | 显示全部楼层
shibayan 发表于 2019-9-3 07:29
我自己找到解决方法了,国外的一个网友也提过这个问题,答案就是不能把引用动态块专有属性的相关代码放在tr ...

不要在子函数中开启事务,非常错误的用法
发表于 2023-1-16 23:19:30 来自手机 | 显示全部楼层
以前看书,查资料,也在子函数里面弄了不少事务,自从用了ifox,就喜欢一个事务打天下了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 04:22 , Processed in 0.164753 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表