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

ADN Club => AutoCAD .NET API => Тема начата: dds от 22-10-2014, 11:37:08

Название: Удаление ссылок на связанные файлы в dwg
Отправлено: dds от 22-10-2014, 11:37:08
Добрый день.
Необходимо удалить ссылки на связанные файлы в 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.  
После открытия вновь созданного файла получаем сообщение что ссылки так и не удалились.
Название: Re: Удаление ссылок на связанные файлы в dwg
Отправлено: trir от 22-10-2014, 11:39:49
А ручками эти ссылки удаляются?
Название: Re: Удаление ссылок на связанные файлы в dwg
Отправлено: dds от 22-10-2014, 11:43:30
Да. Нам необходимо полностью автоматизировать.
Название: Re: Удаление ссылок на связанные файлы в dwg
Отправлено: dds от 22-10-2014, 11:48:59
Точнее говоря необходимо избавиться от возникновения следующего окна при получении файла пользователем(во вложении).
Название: Re: Удаление ссылок на связанные файлы в dwg
Отправлено: Александр Ривилис от 22-10-2014, 14:38:02
Необходимо удалить ссылки на связанные файлы в dwg файле
О каких связанных файлах идёт речь? Желательно получить пример такого файла.
Название: Re: Удаление ссылок на связанные файлы в dwg
Отправлено: dds от 22-10-2014, 14:50:56
Файлы достаются из Vault. Пример файла в приложении.
Название: Re: Удаление ссылок на связанные файлы в dwg
Отправлено: Александр Ривилис от 22-10-2014, 15:07:57
Вообще-то это файл внешней ссылки (XREF) и приведенный тобой код с ними не работает:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F2712%2F7842324.2%2F0_eaac9_68474d54_orig.png&hash=b9f4333ab123c306686077994d972715)
Думаешь стоит удалять эту внешнюю ссылку? Или тебе нужно просто убрать само окно?
Название: Re: Удаление ссылок на связанные файлы в dwg
Отправлено: dds от 22-10-2014, 15:13:26
Мне их надо именно удалить.
Название: Re: Удаление ссылок на связанные файлы в dwg
Отправлено: Александр Ривилис от 22-10-2014, 15:47:17
Тогда пока на словах опишу алгоритм:
1) Открываешь таблицу блоков
2) Проходишься по ней, находя только те блоки, у которых XrefStatus == FileNotFound или XrefStatus == Unresolved и собираешь ObjectId этих блоков.
3) Открываешь каждый из отобранных блоков по их ObjectId, вызываешь их метод Erase и закрываешь их
4) Сохраняешь чертеж.
Если не получится у тебя его реализовать - обращайся.

P.S.: И приветствую на форуме!
Название: Re: Удаление ссылок на связанные файлы в dwg
Отправлено: dds от 22-10-2014, 15:48:52
Большое спасибо!
Название: Re: Удаление ссылок на связанные файлы в dwg
Отправлено: Александр Ривилис от 22-10-2014, 21:30:00
Вопрос о передаче пути к файлу в команду отделил в отдельную тему: http://adn-cis.org/forum/index.php?topic=1036.0
P.S.: В дальнейшем придерживаемся принципа: "Один вопрос - одна тема". Исключение только если это развитие темы.