Удаление ссылок на связанные файлы в dwg

Автор Тема: Удаление ссылок на связанные файлы в dwg  (Прочитано 11101 раз)

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

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

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

  • ADN
  • *
  • Сообщений: 11
  • Карма: 0
Добрый день.
Необходимо удалить ссылки на связанные файлы в dwg файле. Воспользовались вариантом предложенным :
http://adn-cis.org/forum/index.php?topic=948.0
Код - C# [Выбрать]
  1.         [CommandMethod("AcadMyPluginDwgLoad")]
  2.         public static void AcadMyPluginDwgLoad()
  3.         {
  4.             AcAp.Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
  5.            
  6.             Database db = new Database(false, true);
  7.             db.ReadDwgFile(@"c:\img\02.dwg", FileOpenMode.OpenForReadAndAllShare, false, null);
  8.            
  9.             AcEd.Editor ed = doc.Editor;
  10.             AcDb.ObjectIdCollection ids = new AcDb.ObjectIdCollection();
  11.             // Имена DataLink
  12.             ed.WriteMessage("\nНеиспользуемые/ненайденные связи с данными (DataLink): ");
  13.  
  14.             ed.WriteMessage(db.DataLinkManager.DataLinkCount.ToString());
  15.             ed.WriteMessage(db.FileDependencyManager.CountEntries.ToString());
  16.            
  17.             AcDb.ObjectId idLinkDict = db.DataLinkDictionaryId;
  18.             if (!idLinkDict.IsNull)
  19.             {
  20.                 using (AcDb.DBDictionary dLinkDict = db.DataLinkDictionaryId.Open(OpenMode.ForRead) as AcDb.DBDictionary)
  21.                 {
  22.                     foreach (AcDb.DBDictionaryEntry ent in dLinkDict) ids.Add(ent.Value);
  23.                 }
  24.                 foreach (AcDb.ObjectId id in ids)
  25.                 {
  26.                     using (AcDb.DataLink dLink = id.Open(OpenMode.ForRead) as AcDb.DataLink)
  27.                     {
  28.                         if (!dLink.IsValid)
  29.                         {
  30.                             ed.WriteMessage("\n\tНенайденая связь: Имя={0} Связь={1}", dLink.Name, dLink.ConnectionString);
  31.                             dLink.UpgradeOpen();
  32.                             dLink.Erase(); // Удаляем её
  33.                         }
  34.                         else
  35.                         {
  36.                             bool bIsFound = false;
  37.                             foreach (AcDb.ObjectId id_target in dLink.GetTargets())
  38.                             {
  39.                                 if (id_target.ObjectClass.IsDerivedFrom(RXClass.GetClass(typeof(AcDb.Entity))))
  40.                                 {
  41.                                     bIsFound = true;
  42.                                     break;
  43.                                 }
  44.                                 if (!bIsFound)
  45.                                 {
  46.                                     ed.WriteMessage("\n\tНеиспользуемая связь: Имя={0} Связь={1}", dLink.Name, dLink.ConnectionString);
  47.                                     dLink.UpgradeOpen();
  48.                                     dLink.Erase(); // Удаляем её
  49.                                 }
  50.                             }
  51.                         }
  52.                     }
  53.                 }
  54.             }
  55.  
  56.             db.SaveAs(@"c:\img\003.dwg", DwgVersion.Current);
  57.  
  58.             ed.WriteMessage("cmpled");
  59.            
  60. }
  61.  
После открытия вновь созданного файла получаем сообщение что ссылки так и не удалились.
« Последнее редактирование: 22-10-2014, 11:52:03 от dds »

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
А ручками эти ссылки удаляются?

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

  • ADN
  • *
  • Сообщений: 11
  • Карма: 0
Да. Нам необходимо полностью автоматизировать.

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

  • ADN
  • *
  • Сообщений: 11
  • Карма: 0
Точнее говоря необходимо избавиться от возникновения следующего окна при получении файла пользователем(во вложении).

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Необходимо удалить ссылки на связанные файлы в dwg файле
О каких связанных файлах идёт речь? Желательно получить пример такого файла.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 11
  • Карма: 0
Файлы достаются из Vault. Пример файла в приложении.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Вообще-то это файл внешней ссылки (XREF) и приведенный тобой код с ними не работает:

Думаешь стоит удалять эту внешнюю ссылку? Или тебе нужно просто убрать само окно?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 11
  • Карма: 0
Мне их надо именно удалить.

Отмечено как Решение dds 22-10-2014, 15:58:04

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Тогда пока на словах опишу алгоритм:
1) Открываешь таблицу блоков
2) Проходишься по ней, находя только те блоки, у которых XrefStatus == FileNotFound или XrefStatus == Unresolved и собираешь ObjectId этих блоков.
3) Открываешь каждый из отобранных блоков по их ObjectId, вызываешь их метод Erase и закрываешь их
4) Сохраняешь чертеж.
Если не получится у тебя его реализовать - обращайся.

P.S.: И приветствую на форуме!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 11
  • Карма: 0
Большое спасибо!

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Вопрос о передаче пути к файлу в команду отделил в отдельную тему: http://adn-cis.org/forum/index.php?topic=1036.0
P.S.: В дальнейшем придерживаемся принципа: "Один вопрос - одна тема". Исключение только если это развитие темы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение