You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:22:46