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

ADN Club => AutoCAD .NET API => Тема начата: Doublefish от 05-09-2014, 12:46:53

Название: Статус внешней ссылки - Не используется
Отправлено: Doublefish от 05-09-2014, 12:46:53
Подскажите пожалуйста
Как определить иммено этот статус внешней ссылки - "Не используется" ?

т.е. нужно определить есть ли в чертеже ссылки именно с этим статусом и никаким либо другим.
Название: Re: Статус внешней ссылки - Не используется
Отправлено: Александр Ривилис от 05-09-2014, 18:23:48
Это не сложно:
1) Проходишься по всем BlockTableRecord в чертеже
2) Находишь среди них только те, у которых свойство XrefStatus != XrefStatus.NotAnXref
3) Для них проверяешь значение свойства .GetBlockReferenceIds(false,true).Count == 0
Это и будут которые "Не используются" (Unreferenced)
Название: Re: Статус внешней ссылки - Не используется
Отправлено: Doublefish от 06-09-2014, 16:11:38
Подскажите пожалуйста, как определить статус "Не используются" для растровых изображений?
Название: Re: Статус внешней ссылки - Не используется
Отправлено: Александр Ривилис от 06-09-2014, 18:49:47
Я так понимаю, что растрами ты не ограничишься.  :) Поэтому сделал код сразу и для внешних ссылок, и для растров, и для PDF- и DWF-подложек:

Код - 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.     [CommandMethod("TestUnref")]
  21.     public void TestUnref()
  22.     {
  23.       AcAp.Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
  24.       AcDb.Database db = doc.Database;
  25.       AcEd.Editor ed = doc.Editor;
  26.       // Имена внешних ссылок
  27.       ed.WriteMessage("\nНе используемые внешние ссылки: ");
  28.       AcDb.ObjectId idBT = db.BlockTableId;
  29.       using (AcDb.BlockTable bt = idBT.Open(OpenMode.ForRead) as AcDb.BlockTable) {
  30.         foreach (AcDb.ObjectId idBTR in bt) {
  31.           using (AcDb.BlockTableRecord btr = idBTR.Open(OpenMode.ForRead) as AcDb.BlockTableRecord) {
  32.             if (btr.XrefStatus != AcDb.XrefStatus.NotAnXref && btr.GetBlockReferenceIds(false, true).Count == 0) {
  33.               ed.WriteMessage("\n\tИмя={0} Путь={1}", btr.Name, btr.PathName);
  34.             }
  35.           }
  36.         }
  37.       }
  38.       AcDb.ObjectIdCollection ids_unref = new AcDb.ObjectIdCollection();
  39.       // Имена растров
  40.       ed.WriteMessage("\nНе используемые растры: ");
  41.       AcDb.ObjectId idImgDict = AcDb.RasterImageDef.GetImageDictionary(db);
  42.       using (AcDb.DBDictionary imgDict = idImgDict.Open(OpenMode.ForRead) as AcDb.DBDictionary) {
  43.         foreach (AcDb.DBDictionaryEntry ent in imgDict) ids_unref.Add(ent.Value);
  44.         db.Purge(ids_unref); // Удаляем из набора те, которые используются
  45.         foreach (AcDb.ObjectId id in ids_unref) {
  46.           string name = imgDict.NameAt(id);
  47.           using (AcDb.RasterImageDef imgDef = id.Open(OpenMode.ForRead) as AcDb.RasterImageDef) {
  48.             ed.WriteMessage("\n\tИмя={0} Путь={1}", name, imgDef.SourceFileName);
  49.           }
  50.         }
  51.       }
  52.       ids_unref.Clear();
  53.       // Имена PDF-подложек
  54.       ed.WriteMessage("\nНе используемые PDF-подложки: ");
  55.       string pdfKeyName = AcDb.UnderlayDefinition.GetDictionaryKey(typeof(AcDb.PdfDefinition));
  56.       using (AcDb.DBDictionary nodeDict = db.NamedObjectsDictionaryId.Open(OpenMode.ForRead) as AcDb.DBDictionary) {
  57.         using (AcDb.DBDictionary pdfDict = nodeDict.GetAt(pdfKeyName).Open(OpenMode.ForRead) as AcDb.DBDictionary) {
  58.           foreach (AcDb.DBDictionaryEntry ent in pdfDict) ids_unref.Add(ent.Value);
  59.           db.Purge(ids_unref); // Удаляем из набора те, которые используются
  60.           foreach (AcDb.ObjectId id in ids_unref) {
  61.             string name = pdfDict.NameAt(id);
  62.             using (AcDb.PdfDefinition def = id.Open(OpenMode.ForRead) as AcDb.PdfDefinition) {
  63.               ed.WriteMessage("\n\tИмя={0} Путь={1}", name, def.SourceFileName);
  64.             }
  65.           }
  66.         }
  67.       }
  68.       ids_unref.Clear();
  69.       // Имена DWF-подложек
  70.       ed.WriteMessage("\nНе используемые DWF-подложки: ");
  71.       string dwfKeyName = AcDb.UnderlayDefinition.GetDictionaryKey(typeof(AcDb.DwfDefinition));
  72.       using (AcDb.DBDictionary nodeDict = db.NamedObjectsDictionaryId.Open(OpenMode.ForRead) as AcDb.DBDictionary) {
  73.         using (AcDb.DBDictionary dwfDict = nodeDict.GetAt(dwfKeyName).Open(OpenMode.ForRead) as AcDb.DBDictionary) {
  74.           foreach (AcDb.DBDictionaryEntry ent in dwfDict) ids_unref.Add(ent.Value);
  75.           db.Purge(ids_unref); // Удаляем из набора те, которые используются
  76.           foreach (AcDb.ObjectId id in ids_unref) {
  77.             string name = dwfDict.NameAt(id);
  78.             using (AcDb.DwfDefinition def = id.Open(OpenMode.ForRead) as AcDb.DwfDefinition) {
  79.               ed.WriteMessage("\n\tИмя={0} Путь={1}", name, def.SourceFileName);
  80.             }
  81.           }
  82.         }
  83.       }
  84.     }
  85.   }
  86. }
Название: Re: Статус внешней ссылки - Не используется
Отправлено: Doublefish от 08-09-2014, 07:58:07
Спасибо, что с меня причетается?
Название: Re: Статус внешней ссылки - Не используется
Отправлено: Александр Ривилис от 08-09-2014, 12:04:31
Достаточно спасибо.
Название: Re: Статус внешней ссылки - Не используется
Отправлено: simson43 от 24-12-2018, 17:07:54
так и не сказал спасибо(

XrefStatus.Unreferenced не то же самое?
Название: Re: Статус внешней ссылки - Не используется
Отправлено: Дмитрий Загорулькин от 24-12-2018, 17:12:31
Я так понимаю, что это означает, что ссылка выгружена.
А нет, есть Unloaded.
Название: Re: Статус внешней ссылки - Не используется
Отправлено: trir от 24-12-2018, 18:16:40
Цитировать
1) Проходишься по всем BlockTableRecord в чертеже
а если сразу искать в графе внешних ссылок
Название: Re: Статус внешней ссылки - Не используется
Отправлено: Александр Ривилис от 24-12-2018, 18:49:35
Цитировать
1) Проходишься по всем BlockTableRecord в чертеже
а если сразу искать в графе внешних ссылок
Ищи.
Название: Re: Статус внешней ссылки - Не используется
Отправлено: simson43 от 24-12-2018, 22:16:00
А с моим то вопросом что?
Название: Re: Статус внешней ссылки - Не используется
Отправлено: Александр Ривилис от 24-12-2018, 22:33:14
А с моим то вопросом что?
Я не увидел вопроса. Научись нормально формулировать вопросы.
Название: Re: Статус внешней ссылки - Не используется
Отправлено: simson43 от 24-12-2018, 22:39:28
Это не сложно:
1) Проходишься по всем BlockTableRecord в чертеже
2) Находишь среди них только те, у которых свойство XrefStatus != XrefStatus.NotAnXref
3) Для них проверяешь значение свойства .GetBlockReferenceIds(false,true).Count == 0
Это и будут которые "Не используются" (Unreferenced)

Не проще ли сделать так XrefStatus.Unreferenced ?
Название: Re: Статус внешней ссылки - Не используется
Отправлено: Александр Ривилис от 24-12-2018, 23:31:32
Это не сложно:
1) Проходишься по всем BlockTableRecord в чертеже
2) Находишь среди них только те, у которых свойство XrefStatus != XrefStatus.NotAnXref
3) Для них проверяешь значение свойства .GetBlockReferenceIds(false,true).Count == 0
Это и будут которые "Не используются" (Unreferenced)

Не проще ли сделать так XrefStatus.Unreferenced ?
Нет. Потому что предложенный мной алгоритм с гарантией вычисляет использованы или не использованы внешние ссылки.
На всякий случай почитай: http://www.theswamp.org/index.php?topic=45115.0
Название: Re: Статус внешней ссылки - Не используется
Отправлено: simson43 от 25-12-2018, 00:23:49
Т е статус в менеджере не соответствует статусу, который найден програмно?
В каком случае тогда мы увидим в коде статус «не используется»?
Название: Re: Статус внешней ссылки - Не используется
Отправлено: Александр Ривилис от 25-12-2018, 00:25:15
simson43,
Исправляй ошибки. Не буду разгадывать ребусы.
Название: Re: Статус внешней ссылки - Не используется
Отправлено: Александр Ривилис от 25-12-2018, 17:16:06
В каком случае тогда мы увидим в коде статус «не используется»?
Тогда когда не используется, т.е. нет ссылок на него. А это как раз соответствует GetBlockReferenceIds(false,true).Count == 0