Всех приветствую.
Есть вот такая тема
https://adndevblog.typepad.com/autocad/2014/06/copy-extension-dictionary.html как я понимаю автор просто клонирует объекты в базе данных и ассоциирует с новым объектом.
Если я правильно понимаю, то словарь это просто объект в базе данных, который "присоединён" к какому-то объекту. А есть ли возможность отцепить существующий словарь и прицепить к другому объекту без всяких танцев с бубнами, с созданием новых словарей для объекта-цели, клонирования новых словарей/записей и последующим удалением старого объекта, словарей/записей, если мне ух надо удалить?
И ещё вопрос. В чём отличие моего кода от кода по ссылке? А то может я опять что-то неправильно делаю?
namespace Test
{
public class Commands
{
[CommandMethod("TESTCOPYDICTIONARY")]
public static void CopyDictionary()
{
Database db = Application.DocumentManager.MdiActiveDocument.Database;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
PromptEntityResult prEntResSrc = ed.GetEntity("\nВыберете источник");
PromptEntityResult prEntResTrg = ed.GetEntity("\nВыберете приёмник");
if (prEntResSrc.Status != PromptStatus.OK && prEntResTrg.Status != PromptStatus.OK) return;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockReference source = tr.GetObject(prEntResSrc.ObjectId, OpenMode.ForRead) as BlockReference;
ObjectId srcDictId = source.ExtensionDictionary;
DBDictionary srcDict = tr.GetObject(srcDictId, OpenMode.ForRead) as DBDictionary;
BlockReference target = tr.GetObject(prEntResTrg.ObjectId, OpenMode.ForWrite) as BlockReference;
ObjectId trgDictId = target.ExtensionDictionary;
if (trgDictId == ObjectId.Null) target.CreateExtensionDictionary();
else return;
trgDictId = target.ExtensionDictionary;
DBDictionary trgDict = tr.GetObject(trgDictId, OpenMode.ForWrite) as DBDictionary;
foreach(DBDictionaryEntry entry in srcDict)
{
ObjectId xRecId = entry.Value;
Xrecord xRec = tr.GetObject(xRecId, OpenMode.ForWrite) as Xrecord;
trgDict.SetAt(entry.Key, xRec);
}
tr.Commit();
}
}
}
}