2

BlockTableRecord更新したいが 3 つあります。各ブロック定義のエンティティを含む外部 .dxf ファイルをロードしています。古いエンティティを削除して新しいエンティティをロードすると、完全に正常に動作しますが、2 番目 (3 番目など) のエンティティの更新を開始するとすぐに、最初のエンティティがBlockTableRecord再び使用されます。図面全体を保存して再ロードした後でも発生します。

GetPositionBlock()BlockTableRecordXData に基づいて更新する を取得します。更新する正しいブロックを取得するため、このメソッドにはエラーはありません。

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(...)。最初の使用時に一部の値が上書きまたは設定され、その後は何もリセットされないようです。この問題を引き起こす可能性のあるアイデアはありますか? ヒントやヘルプをいただければ幸いです。

4

1 に答える 1

1

あなたの問題はここにあると思います:

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

_Database オブジェクトは、GetExternalBlock メソッドを使用しているデータベースではありません。個人的には、WblockCloneObjects メソッドを使用して外部図面からブロックを取得します。私のコード:

 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;
    }
于 2015-06-10T06:07:46.383 に答える