李子恒1205 2024-05-13 16:10 采纳率: 0%
浏览 117

C# CAD二次开发 动态块属性更新

img


CAD 二次开发,这个方法执行前后输出的块名称不一样,第二次输出直接变成匿名块了,为什么

  • 写回答

3条回答 默认 最新

  • 笑面虎 2024-05-13 16:10
    关注

    以下内容由CHATGPT及笑面虎共同生成、有用望采纳:


    【您想要解决的问题】: 您提问的目的是解决在CAD二次开发中,使用C#更新动态块属性时遇到的一个问题,即在执行更新方法后,块的名称从动态块变成了匿名块。

    【图片内容】: 您上传的图片包含了一段C#代码,这段代码的目的是更新AutoCAD中的动态块属性。代码首先获取当前激活文档和数据库对象,然后开始一个事务,并尝试获取一个块参照。如果块参照存在,代码将遍历其所有动态属性,并根据提供的键值对字典更新属性值。最后,代码提交事务或在遇到错误时回滚事务。

    【问题出现原因】: 问题出现的原因是在更新属性后,代码没有正确地处理块参照的状态,导致块的名称被更改。在代码中,blockRef.DowngradeOpen() 这一行可能是导致问题的原因,因为它将块参照的状态从可写改为了只读,但这不应该导致块名称的改变。可能是在更新属性的过程中,某个属性的值被错误地设置为了导致块名称变化的值。

    【问题解决方案】: 为了解决这个问题,您需要确保在更新属性后,块的名称保持不变。这可能需要您检查属性值的更新逻辑,确保没有属性值会影响到块的名称。同时,您可能需要检查是否有其他代码或逻辑在事务提交后修改了块的名称。

    【提供代码】: 由于您提供的代码片段中没有明显的错误,我将提供一个检查和更新属性值的示例代码,但请注意,您可能需要根据您的具体情况调整代码:

    public static void UpdateDynamicBlockAttributes(ObjectId blockRefId, Dictionary<string, string> attNameValues)
    {
        Document doc = Application.DocumentManager.MdiActiveDocument; // 获取当前激活的文档
        Database db = doc.Database; // 获取当前文档的数据库对象
        Editor ed = doc.Editor; // 获取编辑器对象
    
        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
            try
            {
                BlockReference blockRef = trans.GetObject(blockRefId, OpenMode.ForWrite) as BlockReference; // 获取块参照
                ed.WriteMessage($"\n正在更新动态块属性...");
    
                if (blockRef != null)
                {
                    DynamicBlockReferencePropertyCollection props = blockRef.DynamicBlockReferencePropertyCollection; // 获取动态块的所有动态属性
                    ed.WriteMessage($"\n修改前动态块名称'{blockRef.Name}'有{props.Count}个动态属性。");
    
                    foreach (DynamicBlockReferenceProperty prop in props)
                    {
                        if (attNameValues.ContainsKey(prop.PropertyName)) // 如果属性名在输入的字典中
                        {
                            prop.Value = attNameValues[prop.PropertyName]; // 更新属性值
                            ed.WriteMessage($"\n已更新属性'{prop.PropertyName}'为'{prop.Value}'。");
                        }
                    }
    
                    // 这里不要DowngradeOpen,如果需要保持块为可写状态
                    // blockRef.DowngradeOpen(); // 为了安全,将块参照的状态改为读
    
                    ed.WriteMessage($"\n修改后动态块名称'{blockRef.Name}'有{props.Count}个动态属性。");
                    trans.Commit(); // 提交事务
                }
                else
                {
                    ed.WriteMessage($"\n未找到块引用。");
                }
            }
            catch (Gssoft.Gscad.Runtime.Exception ex)
            {
                ed.WriteMessage($"\n更新动态块属性时发生错误:({ex.Message})");
                trans.Abort(); // 回滚事务
            }
        }
    }
    

    【代码运行方式】: 要运行这段代码,您需要有一个支持AutoCAD .NET API的开发环境,如Visual Studio。您需要将代码集成到一个AutoCAD .NET应用程序中,并确保您有适当的AutoCAD版本和.NET框架版本。

    【代码预期运行结果】: 如果代码正确执行,您应该看到编辑器中的消息,指示属性正在被更新。更新完成后,块的名称应该保持不变,编辑器会显示更新后的属性数量。

    【推荐相关链接】:

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月13日