乐筑天下

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

用C#读取块的属性

[复制链接]

5

主题

29

帖子

1

银币

初来乍到

Rank: 1

铜币
49
发表于 2019-6-7 09:39:10 | 显示全部楼层 |阅读模式
我需要能够选择单个块并读取其属性。我使用一个结构将这些属性值传递给其他函数。到目前为止,我还没有成功读取属性并返回字符串值。下面是我的代码。感谢您的帮助
使用(Transaction rbTrans=db.TransactionManager.StartTransaction())
{
块引用bref=(BlockReference)rbTrans.GetObject(bed,OpenMode.ForRead);
BlockTableRecord bdef=(BlockTableRecord)rbTrans.GetObjects(bref.BlockTableRecord,OpenMode.ForRead);
如果(bdef.HasAttributeDefinitions!=true)返回null
foreach(bdef中的ObjectId)

DBObject obj=(DBObject)rbTrans.GetObject(id,OpenMode.ForRead,true);
AttributeDefinition attdef=obj作为AttributeDefinition;
如果((attdef!=null)和(!attdef.Constant))
{
如果(attdef.Tag==“pos_Origin_Z”)
{
structure.insPtZ=attdef.TextString;
}
否则如果(attef.Tag=”pos_ Endpoint_{
structure.endPtZ=attdef.TextString;
}
否则((attdef.Tag==“prd_UL”)
{
structure.uLabel=attded.textsstring;
}
否则,如果((attdef.Tag==“prd_LP”)
{
结构。layPos=attdef.文本字符串;
}
>结构。insPt=bref。位置
结构。blkName=((BlockTableRecord)bref.DynamicBlockTableRecord.GetObject(OpenMode.ForRead))。姓名
结构。lyrName=bref。层
结构。旋转角度=bref。旋转
rbTrans。处置()
返回结构
}

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

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

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2019-6-7 10:11:33 | 显示全部楼层
您正在收集某些块定义的属性定义的TextString值,而不是所选块引用的属性引用的TextString值。
第一个是默认值,第二个是在插入块引用时输入的值或稍后编辑的值。我猜你想得到第二个。
如果是这样,您必须遍历块引用的属性集合,其中包含您正在寻找的属性引用。
回复

使用道具 举报

5

主题

29

帖子

1

银币

初来乍到

Rank: 1

铜币
49
发表于 2019-6-7 10:30:43 | 显示全部楼层
感谢Giles的回应并指出了问题。 您的帮助总是值得赞赏的。
没错,我需要属性中的文本字符串值。 但我还需要知道属性标签名称,这样我才能确保获得其他每个函数的正确值。
我会用属性引用替换属性定义吗? 如果是这样,我是否仍能获得属性 Tag?
桑尼
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2019-6-7 10:47:01 | 显示全部楼层
看起来您可以从AttributeReference中提取标记和TextString。
回复

使用道具 举报

5

主题

29

帖子

1

银币

初来乍到

Rank: 1

铜币
49
发表于 2019-6-7 11:53:24 | 显示全部楼层
谢谢阿图克和贾尔斯。像往常一样,你们俩都很乐于助人!在你们俩和诺曼·袁之间,我现在能够让这部分工作了。这就是我所拥有的,它比我的第一次尝试要简洁得多。结构是一个单独的函数,以后会被其他函数使用。public BlkStrct read block(ObjectId bed)
{
using(Transaction Rb trans = db。transaction manager . start transaction())
{
block reference bref =(block reference)Rb trans。GetObject(bed,OpenMode。for read);block table record bdef =(block table record)Rb trans。GetObject(bref。DynamicBlockTableRecord,OpenMode。for read);
if (bdef。HasAttributeDefinitions!= true)返回null
foreach(bref中的ObjectId id。attribute collection)
{
attribute reference attdef =(attribute reference)Rb trans。GetObject(id,OpenMode。for read);
开关(属性。tag)
{
case " pos _ Origin _ Z ":
structure . insptz = attdef。TextString
断开;
case " pos _ Endpoint _ Z ":
structure . end ptz = attdef。TextString
断开;
案例" prd _ UL ":
structure . ul Abel = attdef。TextString
断开;
case " prd _ LP ":
structure . lay pos = attdef。TextString
断开;structure.insPt = bref。位置;
structure . blk name =((block table record)bref。DynamicBlockTableRecord . GetObject(OpenMode。ForRead))。姓名;
structure.lyrName = bref。层;
structure.rotAngle = bref。旋转;rbTrans。dispose();
返回结构;
}
}
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2019-6-7 12:47:40 | 显示全部楼层
恭喜sonny3g,看起来不错。
我建议您在考虑此问题时将attdef变量重命名为attref;或者两年后,您会想知道如何从定义中提取值。
回复

使用道具 举报

5

主题

29

帖子

1

银币

初来乍到

Rank: 1

铜币
49
发表于 2019-6-11 11:50:48 | 显示全部楼层
你的右边,我错过了。谢谢你的接球。
回复

使用道具 举报

21

主题

58

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
142
发表于 2019-6-18 09:12:38 | 显示全部楼层
因此,每个块必须至少有一个块引用(并且每个属性定义都附加了相应的属性引用),是吗? 在我见过的各种示例和教程中都暗示了这一点,但到目前为止我还没有看到它公开陈述。
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2019-6-18 09:23:00 | 显示全部楼层

不,您可以有非引用的块定义(您可以清除的那些),并且块引用可能与块定义中的属性定义没有相同的属性引用(这由ATTSYNC命令更正)。
回复

使用道具 举报

16

主题

506

帖子

6

银币

中流砥柱

Rank: 25

铜币
570
发表于 2019-6-19 15:24:10 | 显示全部楼层
如果除了定义之外还有其他指向块定义的硬指针,则不能清除块定义。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2024-11-22 09:02 , Processed in 0.269077 second(s), 72 queries .

© 2020-2024 乐筑天下

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