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

ADN Club => AutoCAD .NET API => Тема начата: Lemieux от 16-01-2020, 19:40:06

Название: Запись SourceFile для блока у Tool из Tool Palletes
Отправлено: Lemieux от 16-01-2020, 19:40:06
А как сохранить изменения в Tool если я там поменяю путь в Source File? Я пробовал метод Save у ToolPaletteManager и у Tool, но так и не понял как правильно сохранять изменения.
Название: Re: Запись SourceFile для блока у Tool из Tool Palletes
Отправлено: Александр Ривилис от 16-01-2020, 22:09:56
А как сохранить изменения в Tool если я там поменяю путь в Source File? Я пробовал метод Save у ToolPaletteManager и у Tool, но так и не понял как правильно сохранять изменения.
А кто сказал, что такая возможность есть в AutoCAD .NET API? Ты можешь поменять только основные свойства CatalogItem и потом сохранять их методом Save. То что можно прочитать методом GetXml нельзя записать при помощи AutoCAD .NET API (т.е. метода типа SaveXml нет).
Поэтому если в планах есть изменение чего-то в atc-файлах, то используй возможности System.Xml (класс XmlDocument и т.д.) для чтения и изменения.
Ну а потом можешь загрузить исправленные при помощи метода ToolPaletteManager.LoadCatalogs
Название: Re: Запись SourceFile для блока у Tool из Tool Palletes
Отправлено: Lemieux от 16-01-2020, 22:36:53
А кто сказал, что такая возможность есть в AutoCAD .NET API?
Надежда умирает последней :)
Название: Re: Запись SourceFile для блока у Tool из Tool Palletes
Отправлено: Александр Ривилис от 16-01-2020, 22:39:30
А кто сказал, что такая возможность есть в AutoCAD .NET API?
Надежда умирает последней :)
В публичном API этого точно нет. Есть какие-то internal-методы, но я бы не рекомендовал туда лезть. Работа с atc-файлом как с xml-документом (при необходимости его модифицировать) мне кажется намного правильнее.
Название: Re: Запись SourceFile для блока у Tool из Tool Palletes
Отправлено: Lemieux от 16-01-2020, 22:49:51
А кто сказал, что такая возможность есть в AutoCAD .NET API?
Надежда умирает последней :)
В публичном API этого точно нет. Есть какие-то internal-методы, но я бы не рекомендовал туда лезть. Работа с atc-файлом как с xml-документом (при необходимости его модифицировать) мне кажется намного правильнее.
Да я лучше поизучаю методы работы с System.Xml. Я примерно уже понимаю как действовать.
Название: Re: Запись SourceFile для блока у Tool из Tool Palletes
Отправлено: Александр Ривилис от 17-01-2020, 00:37:44
Вроде бы работает. Новое значение 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. }
Название: Re: Запись SourceFile для блока у Tool из Tool Palletes
Отправлено: Lemieux от 17-01-2020, 02:04:37
Спасибо, жаль нельзя нажать 2 раза кнопку "Решение"  :)
Название: Re: Запись SourceFile для блока у Tool из Tool Palletes
Отправлено: Александр Ривилис от 17-01-2020, 03:24:44
Спасибо, жаль нельзя нажать 2 раза кнопку "Решение"  :)
Я разделил тему. Так что теперь можно отметить Решние в этой теме.
Название: Re: Запись SourceFile для блока у Tool из Tool Palletes
Отправлено: Lemieux от 17-01-2020, 14:46:07
Спасибо, жаль нельзя нажать 2 раза кнопку "Решение"  :)
Я разделил тему. Так что теперь можно отметить Решние в этой теме.
Это хорошо, так как в инете я не нашёл решений по данным вопросам.
Название: Re: Запись SourceFile для блока у Tool из Tool Palletes
Отправлено: Александр Ривилис от 17-01-2020, 14:47:52
Это хорошо, так как в инете я не нашёл решений по данным вопросам.
Подозреваю, что недостаточно хорошо искал. Я же нашел... ;)