乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 129|回复: 7

BlockTableRec.GetBlockReferenceIds数组命令后返回“幽灵”

[复制链接]

1

主题

5

帖子

1

银币

初来乍到

Rank: 1

铜币
9
发表于 2018-1-9 19:39:06 | 显示全部楼层 |阅读模式
大家好,我正在开发(我愚蠢地认为是)一个简单的工具,它可以计算某一层上的块数。只是该层上任何块的实例数,如果只有单独的块实例放置并与所需层相关联,下面的工作就很好。但是,如果有人愚蠢地将这些块组成一个数组,现在有额外的“幽灵”块引用,即使我删除整个数组并且图中没有可见对象,仍然有1到3个幽灵对象由GetBlockReduce ceIds()表示。问题:我怎么知道这些幽灵不是要计数的块引用?很想了解如何以不同的方式或更有效地处理这个问题等,只是想要任何特定层上所有块实例的总可见实例。提前感谢!-KenBlockTable bt=db.BlockTableId.GetObject(OpenMode.ForRead)as BlockTable;。
foreach(bt中的ObjectId ObId)。
{。
BlockTableRecord btr=(BlockTableRecords)objId.GetObject(OpenMode.ForRead);。

if(btr.IsLayout){继续;}。

foreach(ObjectId id在btr.GetBlockReferenceIds(true, false))。
{。
实体acEntity=trx.GetObject(id,OpenMode.ForRead)作为实体;。

字符串layerName=acEntity.Layer;。
如果(WeWantThisLayer(layerName))。
CountIt++;。
}。
}。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2018-1-9 20:50:36 | 显示全部楼层
我不确定你说的幽灵是什么意思,但它可能是实现过滤器的一个好例子。我没有编译或测试过,但也许这将有所帮助:    public int NumberOfBlocksOnLayer(string layer name)。
{。
int result = 0;。

//为我们设置编辑器。
文档doc = Autodesk,AutoCAD . application services . application . document manager . mdiactivedocument;。
编辑器ed = doc,编辑;。

//为我们设置过滤器。
typed value[]filter array = new[]。
{。
新类型值((int) DxfCode),运算符,“。
新类型值((int) DxfCode),开始,“插入”),。
新类型值((int) DxfCode),层名,层名),。
新类型值((int) DxfCode),运算符," and > ",。
};。
selection filter filter = new selection filter(filter array);。

//选择图层上的块。
PromptSelectionResult PSR = 。
ed,SelectAll(过滤器);。
if (psr,Status == PromptStatus,好)。
{。
结果= psr,Value . GetObjectIds(),长度;。
}。

返回结果;。
}。

祝你好运。
回复

使用道具 举报

1

主题

5

帖子

1

银币

初来乍到

Rank: 1

铜币
9
发表于 2018-1-9 23:32:52 | 显示全部楼层
我冒昧地猜测一下,Array命令实际上是在幕后创建某种秘密(匿名?)块(动态或其他)。 在创建数组之前,我有一个块引用和一个“清除”中的块列在“无法清除的项目”下。 “我可以清除的项目”下没有列出的块。
创建数组后,我现在有块*U9,*U10,原始块列为“无法清除”。
如果我删除阵列:现在*U10被列为“可以”清除,而*U9和原始块仍然被列为无法清除。
关于如何判断我何时对*Ux块的引用的想法? IsAnonymous似乎不起作用,尽管明天将进一步调查。 作为最后的手段,我想我可以在BlockTableRecord Name属性中检查*xx。
回复

使用道具 举报

1

主题

5

帖子

1

银币

初来乍到

Rank: 1

铜币
9
发表于 2018-1-9 23:56:31 | 显示全部楼层
因此,选择代码运行了,但在计算实际实例方面没有做得更好。我有一个由12个块组成的数组,报告中选择了1项。(数组)
我相信这就是正在发生的事情(并且很乐意对此进行澄清):
当用户创建一个块数组时,首先发生的事情是AutoCAD创建一个匿名块,例如*U3,它引用原始块“myBlock”,使“myBlock”成为*U3的嵌套块。然后,它继续创建*U4,这就是我将称之为“AutoCAD的数组秘密动态块”,它引用*U3次数与*U3块的实例次数相同。所以*U4还有一个嵌套引用“myBlock”
因此,使用DirectOnly=True调用GetBlockReferenceId,我得到了“1”
使用DirectOnline=False调用(即,包括嵌套块)我得到“13”
:屏幕上有12项:这非常令人不安。
关于如何解决这个问题有什么建议吗?我似乎无法找到任何方法来确定该块是否在该块的“放置”实例中实际引用。这意味着,当我完全删除数组时,我仍然有对*U3返回的“myBlock”的引用,它似乎“在机翼上等待”,即使图形中没有实际放置的“myBlock”实例
我觉得“GetBlockReferenceId”可能不是解决这个问题的正确方法,有没有办法迭代实际放置的对象,看看它们是否是块
任何人如何在包含阵列项目的任何图形上进行自动提取<再次感谢您的建议、澄清或评论
回复

使用道具 举报

1

主题

5

帖子

1

银币

初来乍到

Rank: 1

铜币
9
发表于 2018-1-10 09:02:49 | 显示全部楼层
我很好奇这个数组是否是作为一个关联数组创建的,或者换句话说,这个数组有12个对象,但是它的创建方式是被看作一个1的组对象?
不知道这对您的程序是否有帮助,但可能有助于识别阵列块的问题。
回复

使用道具 举报

5

主题

29

帖子

1

银币

初来乍到

Rank: 1

铜币
49
发表于 2018-1-10 09:31:13 | 显示全部楼层
嗨,桑尼,
非常好的问题,我也在与一些“我对AutoCAD知之甚少”作斗争,因为我多年来一直是100%的Revit API。
以下是我在 AutoCAD 2017 中创建数组的方式:
1. 放置“myBlock”的一个实例
2. 键入 Array 命令
3. 选择放置的 “myBlock”
4.选择“矩形”
5。Enter(它似乎创建了一个默认的4x3数组,因此有12个对象)
这是一个“关联数组”吗?
回复

使用道具 举报

1

主题

5

帖子

1

银币

初来乍到

Rank: 1

铜币
9
发表于 2018-1-10 09:37:14 | 显示全部楼层
在创建时,有一个选择使其成为关联数组。要知道它是否是关联数组,最好的方法是拾取其中一个对象。如果它们都高亮显示,则创建为关联数组。
回复

使用道具 举报

5

主题

29

帖子

1

银币

初来乍到

Rank: 1

铜币
49
发表于 2018-7-30 15:41:52 | 显示全部楼层
AutoCAD中的“Array”命令从纯粹的一种在一个命令中绘制多个实体的方式演变而来(例如,在命令之后,无论实体有多少行/行,它们仍然是单独的,而不是“与其他实体关联”),到后来数组的结果是一个动态块,用户可以拖动动态块以增加/减少行/行(我不是从什么时候开始发生这种变化的,也许是引入动态块的Acad2005?)。
现在AutoCAD有命令Array(或ARRAYRECT/ARRAYPOLAR)和ARRAYCLASSIC。ARRAYCLASSIC是早期AutoCAD中的旧的原始ARRAY命令,它会产生单个实体。
由于ARRAING块创建了一个新的动态块,它将块引用实体添加到新的匿名块定义中,所以,是的,当您计算特定的块引用时,您必须决定是否要计算嵌套在其他块定义中的块引用(匿名块定义,在您的情况下)。
此外,还有另一种类型的块引用:MInsertBlock,它看起来像是对同一块定义的多个块引用,但它实际上是一个具有多个块定义的单个实体直观地显示出来。也就是说,它是对块定义的一个引用,但直观地显示了多次。它不同于块数组(动态块引用)。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-4 10:54 , Processed in 0.169574 second(s), 73 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表