c# - 导入多个 DXF 文件时实体错误

标签 c# .net autocad autocad-plugin

我有 3 个不同的 BlockTableRecord 要更新。 我正在加载包含每个 block 定义的实体的外部 .dxf 文件。现在,当我删除旧实体并加载新实体时,它工作得很好,但一旦我开始更新第二个(第三个等)实体,它就会再次使用第一个 BlockTableRecord 的实体。它甚至会在保存并重新加载整个绘图后发生。

GetPositionBlock() 获取我要根据其 XData 更新的 BlockTableRecord。错误不在这个方法中,因为它获得了正确的 block 来更新。

public void Update(string fileName)
{
    using (_doc.LockDocument())
    {
        using Transaction transaction = _dataBase.TransactionManager.StartTransaction())
        {
            BlockTableRecord blockTableRecord = GetPositionBlock();
            // ...delete old entities
            BlockTableRecord externalblock =  GetExternalBlock(fileName);
            ObjectIdCollection objs = new ObjectIdCollection();
            foreach (ObjectId objId in externalBlock)
            {
                objs.Add(objId);
            }
            blockTableRecord.AssumeOwnershipPf(objs);
            transaction.Commit();
        }
    }
}

private BlockTableRecord GetExternalBlock(string fileName)
{
    DBObjectCollection dbObjColleciton = new DBObjectCollection();
    using (Transaction transaction = _doc.TransactionManager.StartTransaction())
    {
        using (Database sourceDb = new Database(false, true))
        {
            sourceDb.DxfIn(fileName, null);
            ObjectId blockId = _dataBase.Insert(Guid.NewGuid().ToString(), sourceDb, false)
            BlockTableRecord blockTableRecord = (BlockTableRecord)transaction.GetObject(blockId, OpenMode.ForRead);
            transaction.Commit();
            return blockTableRecord;
        }
    }
}

我仔细检查了每个值。它从不使用相同的 guid、名称或类似的东西。问题似乎出在 blockId_dataBase.Insert(...) 中。似乎某些值在第一次使用时被覆盖或设置,之后没有任何重置。 有什么想法会导致这个问题吗?非常感谢任何提示或帮助。

最佳答案

我认为你的问题在这里:

ObjectId blockId = _dataBase.Insert(Guid.NewGuid().ToString(), sourceDb, false)

_Database 对象不是您在使用方法 GetExternalBlock 时所在的数据库。我个人会使用 WblockCloneObjects 方法从外部绘图中获取 block 。 我的代码:

 public bool GetExternBlok(string filePath, string blockName)
    {
        bool functionReturnValue = true;
        Document doc = Application.DocumentManager.MdiActiveDocument;

        using (DocumentLock  myLock = doc.LockDocument())
        {
            using (Database OpenDb = new Database(false, false))
            {
                OpenDb.ReadDwgFile(filePath, System.IO.FileShare.Read, true, "");
                //readwrite
                ObjectIdCollection sourceidsCollection = new ObjectIdCollection();
                ObjectId sourceBlockId = ObjectId.Null;

                using (Transaction tr = OpenDb.TransactionManager.StartTransaction())
                {

                    BlockTable bt = (BlockTable)tr.GetObject(OpenDb.BlockTableId, OpenMode.ForRead);

                    if (bt.Has(blockName))
                    {
                        sourceidsCollection.Add(bt[blockName]);
                        sourceBlockId = bt[blockName];
                    }

                    if (sourceidsCollection.Count != 0)
                    {
                        Database destdb = doc.Database;
                        IdMapping iMap = new IdMapping();
                        OpenDb.WblockCloneObjects(sourceidsCollection, destdb.BlockTableId, iMap, DuplicateRecordCloning.Replace, false);

                        using (Transaction t = destdb.TransactionManager.StartTransaction())
                        {
                            ObjectId targetBlockId = ObjectId.Null;
                            BlockTable b = (BlockTable)t.GetObject(destdb.BlockTableId, OpenMode.ForRead);

                            if (b.Has(blockName))
                            {
                                targetBlockId = b[blockName];
                            }

                            t.Commit();

                        }
                    }
                    else
                    {
                        functionReturnValue = false;
                    }

                    tr.Commit();

                }
            }
        }
        return functionReturnValue;
    }

关于c# - 导入多个 DXF 文件时实体错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30732160/

相关文章:

c# - 当 DLL 位于不同目录时如何添加项目引用

c# - AesManaged.KeySize 属性的默认值是多少?

c# - 从 C#.net 中的缩短 url 获取完整 url

c# - NHibernate 3.2 通过版本属性的代码类映射

c# - .NET - 类似于 Rails 的数据库部署

lisp - 设置和重置系统变量 - AutoCAD LISP

C# Selenium,如何检查页面 <div> 上是否存在文本

c# - 如何使用设置变量为 NLog 配置 Azure 表连接字符串?

c++ - 远程调试C++代码

C#.NET Autocad 2021 API : Accessing specific BlockTableRecords within a given BlockTable?