Статус внешней ссылки - Не используется

Автор Тема: Статус внешней ссылки - Не используется  (Прочитано 16996 раз)

0 Пользователей и 4 Гостей просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Подскажите пожалуйста
Как определить иммено этот статус внешней ссылки - "Не используется" ?

т.е. нужно определить есть ли в чертеже ссылки именно с этим статусом и никаким либо другим.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Это не сложно:
1) Проходишься по всем BlockTableRecord в чертеже
2) Находишь среди них только те, у которых свойство XrefStatus != XrefStatus.NotAnXref
3) Для них проверяешь значение свойства .GetBlockReferenceIds(false,true).Count == 0
Это и будут которые "Не используются" (Unreferenced)
« Последнее редактирование: 06-09-2014, 21:46:33 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Подскажите пожалуйста, как определить статус "Не используются" для растровых изображений?

Отмечено как Решение Александр Ривилис 06-10-2015, 08:51:54

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Я так понимаю, что растрами ты не ограничишься.  :) Поэтому сделал код сразу и для внешних ссылок, и для растров, и для 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. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Спасибо, что с меня причетается?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Достаточно спасибо.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн simson43

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
так и не сказал спасибо(

XrefStatus.Unreferenced не то же самое?

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Я так понимаю, что это означает, что ссылка выгружена.
А нет, есть Unloaded.

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Цитировать
1) Проходишься по всем BlockTableRecord в чертеже
а если сразу искать в графе внешних ссылок

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Цитировать
1) Проходишься по всем BlockTableRecord в чертеже
а если сразу искать в графе внешних ссылок
Ищи.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн simson43

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
А с моим то вопросом что?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
А с моим то вопросом что?
Я не увидел вопроса. Научись нормально формулировать вопросы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн simson43

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Это не сложно:
1) Проходишься по всем BlockTableRecord в чертеже
2) Находишь среди них только те, у которых свойство XrefStatus != XrefStatus.NotAnXref
3) Для них проверяешь значение свойства .GetBlockReferenceIds(false,true).Count == 0
Это и будут которые "Не используются" (Unreferenced)

Не проще ли сделать так XrefStatus.Unreferenced ?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Это не сложно:
1) Проходишься по всем BlockTableRecord в чертеже
2) Находишь среди них только те, у которых свойство XrefStatus != XrefStatus.NotAnXref
3) Для них проверяешь значение свойства .GetBlockReferenceIds(false,true).Count == 0
Это и будут которые "Не используются" (Unreferenced)

Не проще ли сделать так XrefStatus.Unreferenced ?
Нет. Потому что предложенный мной алгоритм с гарантией вычисляет использованы или не использованы внешние ссылки.
На всякий случай почитай: http://www.theswamp.org/index.php?topic=45115.0
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн simson43

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Т е статус в менеджере не соответствует статусу, который найден програмно?
В каком случае тогда мы увидим в коде статус «не используется»?
« Последнее редактирование: 25-12-2018, 09:22:33 от simson43 »