如何利用BricsCAD .NET API访问块参照Custom区域的Angle1字段?
访问BricsCAD BlockReference的自定义数据(非属性)
你遇到的这类不在AttributeCollection中的自定义数据,在BricsCAD里通常以XData(扩展数据)、**ExtensionDictionary(扩展字典)**或动态块参数的形式存储,下面分别给出对应访问方法:
1. 访问XData(扩展数据)
XData是绑定到对象的自定义数据块,需通过对应的应用程序名(AppName)访问。如果"Angle1"存储在此,可按以下代码实现:
ObjectId objId = selObj.ObjectId; using (Transaction trans = db.TransactionManager.StartTransaction()) { BlockReference blockRef = (BlockReference)trans.GetObject(objId, OpenMode.ForRead); // 替换为存储Angle1的实际应用程序名 string targetAppName = "YOUR_APP_NAME"; ResultBuffer xDataBuffer = blockRef.GetXDataForApplication(targetAppName); if (xDataBuffer != null) { foreach (TypedValue typedVal in xDataBuffer) { // 根据Angle1的数据类型匹配TypeCode,示例为实数类型(1040) if (typedVal.TypeCode == 1040 && typedVal.Value.ToString().Contains("Angle1")) { double angleValue = (double)typedVal.Value; // 此处添加你的数据处理逻辑 break; } } xDataBuffer.Dispose(); // 释放资源 } trans.Commit(); }
如果不知道目标AppName,可遍历所有关联的应用程序名排查:
string[] allAppNames = blockRef.GetXDataApplicationNames(); foreach (string appName in allAppNames) { ResultBuffer tempBuffer = blockRef.GetXDataForApplication(appName); // 遍历tempBuffer中的TypedValue查看数据内容 tempBuffer.Dispose(); }
常用XData类型码参考:
1000:字符串1040:实数(double)1070:整数(short)1005:ObjectId
2. 访问ExtensionDictionary(扩展字典)
若自定义数据存储在扩展字典中,通常以Xrecord或自定义对象形式存在,访问代码如下:
ObjectId objId = selObj.ObjectId; using (Transaction trans = db.TransactionManager.StartTransaction()) { BlockReference blockRef = (BlockReference)trans.GetObject(objId, OpenMode.ForRead); if (!blockRef.ExtensionDictionary.IsNull) { DBDictionary extDict = (DBDictionary)trans.GetObject(blockRef.ExtensionDictionary, OpenMode.ForRead); if (extDict.Contains("Angle1")) { ObjectId dataId = extDict.GetAt("Angle1"); Xrecord xRecord = (Xrecord)trans.GetObject(dataId, OpenMode.ForRead); foreach (TypedValue typedVal in xRecord.Data) { double angleValue = (double)typedVal.Value; // 数据处理逻辑 } } } trans.Commit(); }
3. 动态块参数场景
如果该BlockReference是动态块,"Angle1"可能是动态块的角度参数,可通过以下方式获取:
ObjectId objId = selObj.ObjectId; using (Transaction trans = db.TransactionManager.StartTransaction()) { BlockReference blockRef = (BlockReference)trans.GetObject(objId, OpenMode.ForRead); DynamicBlockReferencePropertyCollection dynProps = blockRef.DynamicBlockReferencePropertyCollection; foreach (DynamicBlockReferenceProperty prop in dynProps) { if (prop.PropertyName == "Angle1") { double angleValue = (double)prop.Value; // 数据处理逻辑 break; } } trans.Commit(); }
排查建议
如果以上方法都未找到数据,可在BricsCAD中执行LIST命令,查看该BlockReference的完整属性信息,其中会明确标注自定义数据的存储位置(XData、扩展字典或动态块参数)。
内容的提问来源于stack exchange,提问作者Diogo Barros
相关产品推荐
相关产品推荐

