找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1144|回复: 3

[已解决] .net二次开发中,写好的程序无法引用动态块的属性,该如何解决了?已上传项目文件

[复制链接]
发表于 2019-9-2 13:50:37 | 显示全部楼层 |阅读模式
悬赏100D豆未解决
本帖最后由 史巴燕 于 2020-2-24 23:42 编辑

附件说明:
1、项目源文件在附件1中,引用的AutoCAD是2014版的(2014版的相关dll文件在“\Question\Question\bin\Debug”路径中),编程语言是vb.net,源文件专门针对这个问题精简了代码,很小的小程序。2、包含动态块的dwg文件在附件2中。


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


代码如下(也可以下载附件中的源文件和dwg文件调试):


  1. Imports Autodesk.AutoCAD.ApplicationServices
  2. Imports Autodesk.AutoCAD.DatabaseServices
  3. Imports Autodesk.AutoCAD.EditorInput
  4. Imports Autodesk.AutoCAD.Runtime

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

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

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





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

  43. #Region "其他"
  44.     Public Class Initialize
  45.         Public Sub New()

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



动态块的专有属性截图:

动态块属性.png

Question.rar

1.57 MB, 下载次数: 6, 下载积分: D豆 -1 , 活跃度 1

包含一个动态块.rar

28.6 KB, 下载次数: 3, 下载积分: D豆 -1 , 活跃度 1

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2019-9-2 23:08:30 | 显示全部楼层
真的没有人知道吗?我问了很多论坛和QQ群了,都没人回复我,大家遇到这些疑难杂症连网上大神都解决不了的问题最后又都是怎么解决的了?

我做业余CAD二次开发有好多年了,但是有些疑难杂症至今都无法解决,网上也没人愿意回答,晓东工具箱这里是悬赏提问,也没人回复,难道真的要给钱吗?付费回答也不知道给多少合适,而且也没有地方付费问答,什么知乎、百度知道上面更不可能有人回答这种专业问题了,二次开发感觉真的玩不下去了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2019-9-3 07:18:35 来自手机 | 显示全部楼层
我自己找到解决方法了,国外的一个网友也提过这个问题,答案就是不能把引用动态块专有属性的相关代码放在transaction代码段的外面,而我的代码中单独定义了一个getEntityByObjectID函数,在该函数返回entity对象后就关闭了transaction,所以再检测返回的entity对象是否为动态块时系统就会认为它不是动态块了。
来自: 微社区
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 3256个

财富等级: 富可敌国

发表于 2019-9-3 09:37:50 | 显示全部楼层
楼主辛苦了,想要成为高手就要 自己多多摸索 哈哈
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-4 16:52 , Processed in 0.435027 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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