sonny3g 发表于 2019-6-7 09:39:10

用C#读取块的属性

我需要能够选择单个块并读取其属性。我使用一个结构将这些属性值传递给其他函数。到目前为止,我还没有成功读取属性并返回字符串值。下面是我的代码。感谢您的帮助
使用(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。处置()
返回结构
}
**** Hidden Message *****

gile 发表于 2019-6-7 10:11:33

您正在收集某些块定义的属性定义的TextString值,而不是所选块引用的属性引用的TextString值。
第一个是默认值,第二个是在插入块引用时输入的值或稍后编辑的值。我猜你想得到第二个。
如果是这样,您必须遍历块引用的属性集合,其中包含您正在寻找的属性引用。

sonny3g 发表于 2019-6-7 10:30:43

感谢Giles的回应并指出了问题。 您的帮助总是值得赞赏的。
没错,我需要属性中的文本字符串值。 但我还需要知道属性标签名称,这样我才能确保获得其他每个函数的正确值。
我会用属性引用替换属性定义吗? 如果是这样,我是否仍能获得属性 Tag?
桑尼

Atook 发表于 2019-6-7 10:47:01

看起来您可以从AttributeReference中提取标记和TextString。

sonny3g 发表于 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();
返回结构;
}
}

Atook 发表于 2019-6-7 12:47:40

恭喜sonny3g,看起来不错。
我建议您在考虑此问题时将attdef变量重命名为attref;或者两年后,您会想知道如何从定义中提取值。

sonny3g 发表于 2019-6-11 11:50:48

你的右边,我错过了。谢谢你的接球。

pjm8765 发表于 2019-6-18 09:12:38

因此,每个块必须至少有一个块引用(并且每个属性定义都附加了相应的属性引用),是吗? 在我见过的各种示例和教程中都暗示了这一点,但到目前为止我还没有看到它公开陈述。

gile 发表于 2019-6-18 09:23:00


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

dgorsman 发表于 2019-6-19 15:24:10

如果除了定义之外还有其他指向块定义的硬指针,则不能清除块定义。
页: [1] 2
查看完整版本: 用C#读取块的属性