Переименование внешней ссылки

Автор Тема: Переименование внешней ссылки  (Прочитано 6942 раз)

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

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

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Возникла необходимость при вставке вн. ссылки в чертеж AutoCAD осуществлять её автоматическое переименование. Путь должен остаться таким, какой был, а вот имя измениться. В идеале должно происходить единомоментно во время вставки вн. ссылки. Но изучив доступные события, ничего подходящего для этого не нашлось. Только XrefBeginAttached сообщает, что вн. ссылка с таким то именем файла начала вставляться в чертеж.
Отследить окончание вставки удалось событием CommandEnded. Тоже вроде норм. Неожиданная загвоздка оказалась в самом переименовании. Имя новое присваивается, но в менеджере внешних ссылок оно не меняется. Что за чудеса?!

Вот мой код:

Код - C# [Выбрать]
  1.         public static string AttachedXrefFilename { get; set; }
  2.  
  3.         ...
  4.  
  5.         public void AddDocEvents(Document doc)
  6.         {
  7.             doc.CommandEnded += doc_CommandEnded;
  8.             doc.Database.XrefBeginAttached += Database_XrefBeginAttached;
  9.             doc.Database.SaveComplete += Database_SaveComplete;
  10.             doc.BeginDocumentClose += Document_BeginDocumentClose;
  11.         }
  12.  
  13.         void doc_CommandEnded(object sender, CommandEventArgs e)
  14.         {
  15.             if (e.GlobalCommandName == "XATTACH" && !string.IsNullOrEmpty(AttachedXrefFilename))
  16.             {
  17.                 Document doc = sender as Document;
  18.                 Database db = doc.Database;
  19.  
  20.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  21.                 {
  22.                     XrefGraph xrgraph = db.GetHostDwgXrefGraph(false);
  23.                    
  24.                     for (int i = 1; i < (xrgraph.NumNodes); i++)
  25.                     {
  26.                         XrefGraphNode xrNode = xrgraph.GetXrefNode(i);
  27.                         if (!xrNode.IsNested)
  28.                         {
  29.                             BlockTableRecord btr = (BlockTableRecord)tr.GetObject(xrNode.BlockTableRecordId, OpenMode.ForRead);
  30.  
  31.                             string pathName = btr.PathName;
  32.                             if (pathName.StartsWith("."))
  33.                                 pathName = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(db.Filename), pathName));
  34.  
  35.                             if (pathName == AttachedXrefFilename)
  36.                             {
  37.                                 btr.UpgradeOpen();
  38.                                 btr.Name = "test";
  39.                                 break;
  40.                             }
  41.                         }
  42.                     }
  43.                     tr.Commit();
  44.                 }
  45.                 AttachedXrefFilename = null;
  46.             }
  47.         }
  48.  
  49.         void Database_XrefBeginAttached(object sender, XrefBeginOperationEventArgs e)
  50.         {
  51.             AttachedXrefFilename = e.From.Filename;
  52.         }
  53.  

Есть мысли, что не так?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Переименование внешней ссылки
« Ответ #1 : 28-01-2021, 21:49:01 »
Ну во-первых, при переименовании внешней ссылки потребуется переименовать и все зависимые (блоки, слои, и т.д).
Это хорошо видно если запустить команду _-RENAME
И это тоже не меняет имя в панели XREF. Чтобы изменилось имя требуется выполнить Xref Reload. Возможно будет достаточно Database.ReloadXrefs - не пробовал. Проверь.
 
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Переименование внешней ссылки
« Ответ #2 : 28-01-2021, 21:55:12 »
Может я и не прав, но похоже самый простой способ - это повторный Attach, но с правильным именем.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Переименование внешней ссылки
« Ответ #3 : 28-01-2021, 22:50:54 »
Alxd,
Сохрани чертеж и повторно его открой. Какое имя будет в Диспетчере внешних ссылок? :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Re: Переименование внешней ссылки
« Ответ #4 : 29-01-2021, 07:54:17 »
Сохранил и открыл. Имя внешней ссылке стало таким, каким должно быть. Но, блин, это не вариант.  >:(

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

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Re: Переименование внешней ссылки
« Ответ #5 : 29-01-2021, 08:00:41 »
Цитировать
Возможно будет достаточно Database.ReloadXrefs - не пробовал.

Попробовал. Сработало. Попробую придерживаться этого решения. Спасибо!

Вот результат:
Код - C# [Выбрать]
  1.         void doc_CommandEnded(object sender, CommandEventArgs e)
  2.         {
  3.             if (e.GlobalCommandName == "XATTACH" && !string.IsNullOrEmpty(AttachedXrefFilename))
  4.             {
  5.                 Document doc = sender as Document;
  6.                 Database db = doc.Database;
  7.  
  8.                 ObjectId btrObjectId = ObjectId.Null;
  9.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  10.                 {
  11.                     XrefGraph xrgraph = db.GetHostDwgXrefGraph(false);
  12.                    
  13.                     for (int i = 1; i < (xrgraph.NumNodes); i++)
  14.                     {
  15.                         XrefGraphNode xrNode = xrgraph.GetXrefNode(i);
  16.                         if (!xrNode.IsNested)
  17.                         {
  18.                             BlockTableRecord btr = (BlockTableRecord)tr.GetObject(xrNode.BlockTableRecordId, OpenMode.ForRead);
  19.  
  20.                             string pathName = btr.PathName;
  21.                             if (pathName.StartsWith("."))
  22.                                 pathName = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(db.Filename), pathName));
  23.  
  24.                             if (pathName == AttachedXrefFilename)
  25.                             {
  26.                                 btr.UpgradeOpen();
  27.                                 btr.Name = "test";
  28.                                 btrObjectId = xrNode.BlockTableRecordId;
  29.                                 break;
  30.                             }
  31.                         }
  32.                     }
  33.                     tr.Commit();
  34.                 }
  35.                 AttachedXrefFilename = null;
  36.  
  37.                 if (btrObjectId != ObjectId.Null)
  38.                     db.ReloadXrefs(new ObjectIdCollection(new ObjectId[]{ btrObjectId }));
  39.             }
  40.         }
  41.