Запись SourceFile для блока у Tool из Tool Palletes

Автор Тема: Запись SourceFile для блока у Tool из Tool Palletes  (Прочитано 3006 раз)

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

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

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

  • ADN OPEN
  • ****
  • Сообщений: 382
  • Карма: 21
А как сохранить изменения в Tool если я там поменяю путь в Source File? Я пробовал метод Save у ToolPaletteManager и у Tool, но так и не понял как правильно сохранять изменения.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А как сохранить изменения в Tool если я там поменяю путь в Source File? Я пробовал метод Save у ToolPaletteManager и у Tool, но так и не понял как правильно сохранять изменения.
А кто сказал, что такая возможность есть в AutoCAD .NET API? Ты можешь поменять только основные свойства CatalogItem и потом сохранять их методом Save. То что можно прочитать методом GetXml нельзя записать при помощи AutoCAD .NET API (т.е. метода типа SaveXml нет).
Поэтому если в планах есть изменение чего-то в atc-файлах, то используй возможности System.Xml (класс XmlDocument и т.д.) для чтения и изменения.
Ну а потом можешь загрузить исправленные при помощи метода ToolPaletteManager.LoadCatalogs
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 382
  • Карма: 21
А кто сказал, что такая возможность есть в AutoCAD .NET API?
Надежда умирает последней :)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А кто сказал, что такая возможность есть в AutoCAD .NET API?
Надежда умирает последней :)
В публичном API этого точно нет. Есть какие-то internal-методы, но я бы не рекомендовал туда лезть. Работа с atc-файлом как с xml-документом (при необходимости его модифицировать) мне кажется намного правильнее.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 382
  • Карма: 21
А кто сказал, что такая возможность есть в AutoCAD .NET API?
Надежда умирает последней :)
В публичном API этого точно нет. Есть какие-то internal-методы, но я бы не рекомендовал туда лезть. Работа с atc-файлом как с xml-документом (при необходимости его модифицировать) мне кажется намного правильнее.
Да я лучше поизучаю методы работы с System.Xml. Я примерно уже понимаю как действовать.

Отмечено как Решение Александр Ривилис 17-01-2020, 10:07:20

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Вроде бы работает. Новое значение SourceFile придумаешь сам:

Код - C# [Выбрать]
  1. [CommandMethod("TPCHANGE")]
  2. public void TPCHANGE()
  3. {
  4.   Document doc = Application.DocumentManager.MdiActiveDocument;
  5.   if (doc == null) return;
  6.   Editor ed = doc.Editor;
  7.   ToolPaletteManager tpm = ToolPaletteManager.Manager;
  8.   CatalogItemCollection cats = tpm.Catalogs;
  9.   bool wasChanged = false;
  10.   foreach (CatalogItem cat in cats)
  11.   {
  12.     for (int i = 0; i < cat.ChildCount; i++)
  13.     {
  14.       CatalogItem subcat = cat.GetChild(i);
  15.       // Работаем только с конкретным каталогом
  16.       if (subcat.Name.Equals("MyBlockTools", StringComparison.OrdinalIgnoreCase))
  17.       {
  18.         ed.WriteMessage($"\nTools Name={subcat.Name} LocalFile={subcat.LocalFile}");
  19.         XmlDocument xmlDoc = new XmlDocument();
  20.         xmlDoc.Load(subcat.LocalFile);
  21.         XmlNodeList sf = xmlDoc.GetElementsByTagName("SourceFile");
  22.         if (sf != null && sf.Count > 0)
  23.         {
  24.           foreach (XmlNode xn in sf)
  25.           {
  26.             ed.WriteMessage($"\n\tSourceFile Old={xn.InnerText}");
  27.             xn.InnerText = "C:\\MyNewFile.dwg"; // Новое значение SourceFile
  28.             ed.WriteMessage($"\n\tSourceFile New={xn.InnerText}");
  29.           }
  30.           xmlDoc.Save(subcat.LocalFile);
  31.           wasChanged = true;
  32.         }
  33.       }
  34.     }
  35.   }
  36.   if (wasChanged)
  37.     tpm.LoadCatalogs(); // Загружаем все каталоги
  38. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 382
  • Карма: 21
Спасибо, жаль нельзя нажать 2 раза кнопку "Решение"  :)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Спасибо, жаль нельзя нажать 2 раза кнопку "Решение"  :)
Я разделил тему. Так что теперь можно отметить Решние в этой теме.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 382
  • Карма: 21
Спасибо, жаль нельзя нажать 2 раза кнопку "Решение"  :)
Я разделил тему. Так что теперь можно отметить Решние в этой теме.
Это хорошо, так как в инете я не нашёл решений по данным вопросам.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Это хорошо, так как в инете я не нашёл решений по данным вопросам.
Подозреваю, что недостаточно хорошо искал. Я же нашел... ;)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение