26/05/2015
Копирование словаря расширения (ExtDictionary)
Следующий код показывает как скопировать словарь расширения одного примитива в другой примитив. Специальная логика устанавливает в конце имена словаря как у исходного примитива, так как “DeepCloneObjects” копирует их с другими именами в целевой примитив.
Код - C#: [Выделить]
- [CommandMethod("copyExtDic")]
- public void copyExtDic()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- Editor ed = doc.Editor;
- PromptEntityResult surRes =
- ed.GetEntity("Выберите исходный примитив: ");
- if (surRes.Status != PromptStatus.OK)
- return;
- PromptEntityResult tarRes =
- ed.GetEntity("Выберите целевой примитив: ");
- if (tarRes.Status != PromptStatus.OK)
- return;
- ObjectIdCollection ids = new ObjectIdCollection();
- ObjectId tarId = ObjectId.Null;
- ObjectId surId = ObjectId.Null;
- using (Transaction tr =
- db.TransactionManager.StartTransaction())
- {
- DBObject dbObj = tr.GetObject(surRes.ObjectId,
- OpenMode.ForRead);
- surId = dbObj.ExtensionDictionary;
- if (surId != ObjectId.Null)
- {
- DBDictionary dbExt =
- (DBDictionary)tr.GetObject(surId,
- OpenMode.ForRead);
- foreach (DBDictionaryEntry entry in dbExt)
- {
- ids.Add(entry.Value);
- }
- }
- else
- {
- ed.WriteMessage("Нет словаря для копирования ");
- return;
- }
- // Есть ли у целевого примитива словарь?
- DBObject target = tr.GetObject(tarRes.ObjectId,
- OpenMode.ForRead);
- tarId = target.ExtensionDictionary;
- if (tarId == ObjectId.Null)
- {
- target.UpgradeOpen();
- target.CreateExtensionDictionary();
- tarId = target.ExtensionDictionary;
- }
- tr.Commit();
- }
- IdMapping mapping = new IdMapping();
- db.DeepCloneObjects(ids, tarId, mapping, false);
- //
- using (Transaction tr =
- db.TransactionManager.StartTransaction())
- {
- DBDictionary dbExt =
- (DBDictionary)tr.GetObject(surId, OpenMode.ForRead);
- DBDictionary dbTarg =
- (DBDictionary)tr.GetObject(tarId, OpenMode.ForWrite);
- foreach (IdPair pair in mapping)
- {
- DBObject target = tr.GetObject(pair.Value,
- OpenMode.ForRead);
- dbTarg.SetName(
- dbTarg.NameAt(pair.Value),
- dbExt.NameAt(pair.Key));
- }
- tr.Commit();
- }
- }
Источник: http://adndevblog.typepad.com/autocad/2014/06/copy-extension-dictionary.html
Автор перевода: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=2737
Опубликовано 26.05.2015