ADN Open CIS
Сообщество программистов Autodesk в СНГ

10/09/2014

Как удалить неиспользуемые и необработанные ссылки на данные (DataLink)?

Для необработанных ссылок на данные свойство IsValid всегда равно false. А вот с неиспользуемыми ссылками на данные несколько сложнее. Метод DataLink.GetTargets() возвращает коллекцию ObjectId объектов/примитивов, которые используют эту связь. Если таблица (Table) использовала связь, то её ObjectId содержится в коллекции DataLink.GetTargets(). Если эту таблицу стереть, то DataLink.GetTargets() не будет содержать ObjectId таблицы, а будет содержать ObjectId для объекта TableContent (это не примитив, т.е. не является наследником Entity). Таким образом, если DataLink.GetTargets() не содержит ObjectId ни одного примитива, то соответственно он не используется и его можно удалить. Следующий код это и показывает:

Код - C#: [Выделить]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using AcRx = Autodesk.AutoCAD.Runtime;
  8. using AcAp = Autodesk.AutoCAD.ApplicationServices;
  9. using AcDb = Autodesk.AutoCAD.DatabaseServices;
  10. using AcGe = Autodesk.AutoCAD.Geometry;
  11. using AcEd = Autodesk.AutoCAD.EditorInput;
  12.  
  13. [assembly: CommandClass(typeof(TestUnref.MyCommands))]
  14.  
  15. namespace TestUnref
  16. {
  17.   public class MyCommands
  18.   {
  19.     // Печать и удаление неиспользуемых/ненайденных
  20.     // свзяей с данными (DataLink)
  21.     [CommandMethod("RemoveUnusedDlink")]
  22.     public void RemoveUnusedDlink()
  23.     {
  24.       AcAp.Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
  25.       AcDb.Database db = doc.Database;
  26.       AcEd.Editor ed = doc.Editor;
  27.       AcDb.ObjectIdCollection ids = new AcDb.ObjectIdCollection();
  28.       // Имена DataLink
  29.       ed.WriteMessage("\nНеиспользуемые/ненайденные связи с данными (DataLink): ");
  30.       AcDb.ObjectId idLinkDict = db.DataLinkDictionaryId;
  31.       if (!idLinkDict.IsNull) {
  32.         using (AcDb.DBDictionary dLinkDict = db.DataLinkDictionaryId.Open(OpenMode.ForRead) as AcDb.DBDictionary) {
  33.           foreach (AcDb.DBDictionaryEntry ent in dLinkDict) ids.Add(ent.Value);
  34.         }
  35.         foreach (AcDb.ObjectId id in ids) {
  36.           using (AcDb.DataLink dLink = id.Open(OpenMode.ForRead) as AcDb.DataLink) {
  37.             if (!dLink.IsValid) {
  38.               ed.WriteMessage("\n\tНенайденая связь: Имя={0} Связь={1}", dLink.Name, dLink.ConnectionString);
  39.               dLink.UpgradeOpen();
  40.               dLink.Erase(); // Удаляем её
  41.             } else {
  42.               bool bIsFound = false;
  43.               foreach (AcDb.ObjectId id_target in dLink.GetTargets()) {
  44.                 if (id_target.ObjectClass.IsDerivedFrom(RXClass.GetClass(typeof(AcDb.Entity)))) {
  45.                   bIsFound = true;
  46.                   break;
  47.                 }
  48.                 if (!bIsFound) {
  49.                   ed.WriteMessage("\n\tНеиспользуемая связь: Имя={0} Связь={1}", dLink.Name, dLink.ConnectionString);
  50.                   dLink.UpgradeOpen();
  51.                   dLink.Erase(); // Удаляем её
  52.                 }
  53.               }
  54.             }
  55.           }
  56.         }
  57.       }
  58.     }
  59.   }
  60. }

Автор: Александр Ривилис
Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=953

Опубликовано 10.09.2014
Отредактировано 11.09.2014 в 00:31:23