Чтение адреса у Tool из Tool Palletes

Автор Тема: Чтение адреса у Tool из Tool Palletes  (Прочитано 851 раз)

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 160
  • Карма: 1
Всех приветствую.
Имеется палитра с инструментами, которые созданы с помощью блоков. В свойствах инструментов есть поле "Source", где указана ссылка на блок. Вот мне нужно средствами .NET узнать эту ссылку. Я добираюсь до Tool вот так
Код - C# [Выбрать]
  1.         [CommandMethod("lmxToolPalette")]
  2.         public void lmxToolPalette()
  3.         {
  4.             Editor lxEditor = Application.DocumentManager.MdiActiveDocument.Editor;
  5.             ToolPaletteManager tpm = ToolPaletteManager.Manager;
  6.             CatalogItemCollection cic = tpm.Catalogs;
  7.             CatalogItem ci = cic[0];
  8.             lxEditor.WriteMessage(ci.Name + "\n");
  9.             CatalogItem subCi = ci.GetChild(0);
  10.             lxEditor.WriteMessage(subCi.ChildCount.ToString() + "\n");
  11.             Tool paletteItem = subCi.GetChild(0) as Tool;
  12.         }
Вообще я хочу написать модуль пакетной замены адресов, если сменился адрес у всех инструментов, например когда экспортируешь/импортируешь палитры.

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

  • Administrator
  • *****
  • Сообщений: 11422
  • Карма: 1477
  • Рыцарь ObjectARX
  • Skype: rivilis
Lemieux,
На нашем форуме действует правило: "Один вопрос - одна тема"
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 160
  • Карма: 1
Lemieux,
На нашем форуме действует правило: "Один вопрос - одна тема"
Всё понял  :)

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

  • Administrator
  • *****
  • Сообщений: 11422
  • Карма: 1477
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Чтение адреса у Tool из Tool Palletes
« Ответ #3 : 08-01-2020, 01:44:14 »
Lemieux,
Нужно парсить соответствующий xml (atc) файл. Пример файла:
Код - XML [Выбрать]
  1. <?xml version="1.0"?>
  2.  
  3. <Palette option="0" Revision="23.1.1" FileRevision="23.1.0">
  4.  
  5.   <ItemID idValue="{829D4E31-874E-447C-9500-0DAE98447AC0}"/>
  6.  
  7.   <Properties>
  8.     <ItemName>RivilisPal</ItemName>
  9.     <Images option="0"/>
  10.     <Time modifiedUniversalDateTime="2020-01-07T22:01:23" createdUniversalDateTime="2020-01-07T22:01:23"/>
  11.   </Properties>
  12.   <Tools>
  13.     <Tool option="31" Revision="23.1.1">
  14.       <ItemID idValue="{21120424-2B30-459F-B3C8-0D67C5697CA6}"/>
  15.       <Properties>
  16.         <ItemName>aaa</ItemName>
  17.         <Images option="0">
  18.           <Image src="Images\aaa32.PNG" IsDark="false" cy="32" cx="32"/>
  19.           <Image src="Images\aaa32_dark.PNG" IsDark="true" cy="32" cx="32"/>
  20.           <Image src="Images\aaa64.PNG" IsDark="false" cy="64" cx="64"/>
  21.           <Image src="Images\aaa64_dark.PNG" IsDark="true" cy="64" cx="64"/>
  22.         </Images>
  23.         <Time modifiedUniversalDateTime="2019-05-05T19:34:12" createdUniversalDateTime="2019-05-05T19:34:12"/>
  24.       </Properties>
  25.       <ToolType>1</ToolType>
  26.       <StockToolRef idValue="{C9AB9290-FC5A-458B-AEB4-BDF9BE6A5E55}"/>
  27.       <Data>
  28.         <GeneralProperties>
  29.           <Color>
  30.             <BasicPropInfo>
  31.               <PropValue unspecified="FALSE"/>
  32.             </BasicPropInfo>
  33.             <CreateInfo>
  34.               <AcCmColor mRGB="3221225472"/>
  35.             </CreateInfo>
  36.           </Color>
  37.           <Layer>
  38.             <BasicPropInfo>
  39.               <PropValue unspecified="FALSE" value="0" valueType="1"/>
  40.             </BasicPropInfo>
  41.           </Layer>
  42.           <Linetype>
  43.             <BasicPropInfo>
  44.               <PropValue unspecified="FALSE" value="ByLayer" valueType="1"/>
  45.             </BasicPropInfo>
  46.           </Linetype>
  47.           <LinetypeScale>
  48.             <BasicPropInfo>
  49.               <PropValue unspecified="FALSE" value="1" valueType="3"/>
  50.             </BasicPropInfo>
  51.           </LinetypeScale>
  52.           <PlotStyle>
  53.             <BasicPropInfo>
  54.               <PropValue unspecified="FALSE" value="ByLayer" valueType="1"/>
  55.             </BasicPropInfo>
  56.           </PlotStyle>
  57.           <LineWeight>
  58.             <BasicPropInfo>
  59.               <PropValue unspecified="FALSE" value="-1" valueType="2"/>
  60.             </BasicPropInfo>
  61.           </LineWeight>
  62.           <Transparency>
  63.             <BasicPropInfo>
  64.               <PropValue unspecified="FALSE" value="ByLayer" valueType="1"/>
  65.             </BasicPropInfo>
  66.           </Transparency>
  67.           <Textstyle>
  68.             <BasicPropInfo>
  69.               <PropValue unspecified="TRUE" valueType="1"/>
  70.             </BasicPropInfo>
  71.           </Textstyle>
  72.           <Dimstyle>
  73.             <BasicPropInfo>
  74.               <PropValue unspecified="TRUE" valueType="1"/>
  75.             </BasicPropInfo>
  76.           </Dimstyle>
  77.           <Tablestyle>
  78.             <BasicPropInfo>
  79.               <PropValue unspecified="TRUE" valueType="1"/>
  80.             </BasicPropInfo>
  81.           </Tablestyle>
  82.         </GeneralProperties>
  83.         <Block>
  84.           <BlockType>1</BlockType>
  85.           <BlockTypeEx>0</BlockTypeEx>
  86.           <BlockName>aaa</BlockName>
  87.           <SourceFile>%UserProfileFolder%\Documents\Drawing1.dwg</SourceFile>
  88.           <InsertAs>1</InsertAs>
  89.           <XrefType>0</XrefType>
  90.           <Scale>1</Scale>
  91.           <AuxiliaryScale>NONE</AuxiliaryScale>
  92.           <Rotation>0</Rotation>
  93.           <PromptRotation>0</PromptRotation>
  94.           <Explode>0</Explode>
  95.         </Block>
  96.       </Data>
  97.     </Tool>
  98.   </Tools>
  99. </Palette>
Тебя должен интересовать раздел <Block>. Там <SourceFile> хранит путь к dwg-файлу.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 160
  • Карма: 1
Re: Чтение адреса у Tool из Tool Palletes
« Ответ #4 : 08-01-2020, 01:47:50 »
Спасибо. Я догадывался об этом, но надеялся, что есть инструмент в AutoCAD.

Отмечено как Решение Александр Ривилис 08-01-2020, 11:58:33

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

  • Administrator
  • *****
  • Сообщений: 11422
  • Карма: 1477
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Чтение адреса у Tool из Tool Palletes
« Ответ #5 : 08-01-2020, 02:46:48 »
Спасибо. Я догадывался об этом, но надеялся, что есть инструмент в AutoCAD.
Ну вот такой инструмент:
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using Autodesk.AutoCAD.Windows;
  8. using Autodesk.AutoCAD.Windows.ToolPalette;
  9. using System.Xml;
  10.  
  11. // This line is not mandatory, but improves loading performances
  12. [assembly: CommandClass(typeof(Rivilis.ToolsInfo))]
  13.  
  14. namespace Rivilis
  15. {
  16.   public class ToolsInfo
  17.   {
  18.     [CommandMethod("TPINFO")]
  19.     public void MyCommand()
  20.     {
  21.       Document doc = Application.DocumentManager.MdiActiveDocument;
  22.       if (doc == null) return;
  23.       Editor ed = doc.Editor;
  24.       ToolPaletteManager tpm = ToolPaletteManager.Manager;
  25.       CatalogItemCollection cats = tpm.Catalogs;
  26.       foreach (CatalogItem cat in cats)
  27.       {
  28.         for (int i = 0; i < cat.ChildCount; i++)
  29.         {
  30.           CatalogItem subcat = cat.GetChild(i);
  31.           ed.WriteMessage($"\nName={subcat.Name}");
  32.           // Работаем только с конкретным каталогом
  33.           if (subcat.Name.Equals("MyBlockTools",StringComparison.OrdinalIgnoreCase))
  34.           {
  35.             for (int j = 0; j < subcat.ChildCount; j++)
  36.             {
  37.               CatalogItem subsubcat = subcat.GetChild(j);
  38.               Tool tool = subsubcat as Tool;
  39.               ed.WriteMessage($"\n\nTool Name={tool.Name}");
  40.               string str = tool.GetXml(SaveFlags.SaveLinksAsLinks);
  41.               XmlDocument xmlDoc = new XmlDocument();
  42.               xmlDoc.LoadXml(str);
  43.               XmlNodeList sf = xmlDoc.GetElementsByTagName("SourceFile");
  44.               if (sf.Count > 0) {
  45.                 ed.WriteMessage($"\n\tSourceFile={sf[0].InnerText}");
  46.               }
  47.               XmlNodeList bn = xmlDoc.GetElementsByTagName("BlockName");
  48.               if (bn.Count > 0) {
  49.                 ed.WriteMessage($"\n\tBlockName={bn[0].InnerText}");
  50.               }
  51.             }
  52.           }
  53.         }
  54.       }
  55.     }
  56.   }
  57. }



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

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

  • ADN OPEN
  • ***
  • Сообщений: 160
  • Карма: 1
Re: Чтение адреса у Tool из Tool Palletes
« Ответ #6 : 08-01-2020, 02:48:28 »
Класс! Спасибо большое!

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

  • ADN OPEN
  • ***
  • Сообщений: 160
  • Карма: 1
Re: Чтение адреса у Tool из Tool Palletes
« Ответ #7 : 16-01-2020, 13:54:08 »
Александр, а Вы не знаете почему код работает только с активной палитрой? И не знаете почему в хелпе написано, что пространство имён "Autodesk.AutoCAD.Windows.ToolPalette" находится в "Acmgd.dll", а по факту находится в "AcTcMgd.dll"?

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

  • Administrator
  • *****
  • Сообщений: 11422
  • Карма: 1477
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Чтение адреса у Tool из Tool Palletes
« Ответ #8 : 16-01-2020, 14:02:26 »
И не знаете почему в хелпе написано, что пространство имён "Autodesk.AutoCAD.Windows.ToolPalette" находится в "Acmgd.dll", а по факту находится в "AcTcMgd.dll"?
Пространство имён Autodesk.AutoCAD.Windows.ToolPalette есть и в "Acmgd.dll" и в "AcTcMgd.dll". Причем в последних версиях AutoCAD часть классов мигрировали из  "Acmgd.dll" в "AcTcMgd.dll"
Александр, а Вы не знаете почему код работает только с активной палитрой?
Нужно перепроверить. Скорее всего в неактивной палитре не подгружен её каталог из atc-файла и соответственно код не работает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 160
  • Карма: 1
Re: Чтение адреса у Tool из Tool Palletes
« Ответ #9 : 16-01-2020, 14:15:55 »
Причем в последних версиях AutoCAD часть классов мигрировали из  "Acmgd.dll" в "AcTcMgd.dll"
Вы правы, так будет точнее, я неправильно свой вопрос сформулировал. А Вы не знаете зачем они так сделали?

Нужно перепроверить. Скорее всего в неактивной палитре не подгружен её каталог из atc-файла и соответственно код не работает.
То есть мне надо вручную подгружать по полученному списку?

Оффлайн Привалов Дмитрий

  • ADN Club
  • ****
  • Сообщений: 396
  • Карма: 80
Re: Чтение адреса у Tool из Tool Palletes
« Ответ #10 : 16-01-2020, 14:20:58 »
То есть мне надо вручную подгружать по полученному списку?
CatalogItemCollection cic = tpm.Catalogs;
Скорее всего список выдает пустой, если палитра не активна.

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

  • ADN OPEN
  • ***
  • Сообщений: 160
  • Карма: 1
Re: Чтение адреса у Tool из Tool Palletes
« Ответ #11 : 16-01-2020, 14:27:05 »
Александр, спасибо за наводку, я добавил в условие, перед циклом, вот такую строчку, и всё заработало.
Код - C# [Выбрать]
  1. subcat.LoadLink();

CatalogItemCollection cic = tpm.Catalogs;
Скорее всего список выдает пустой, если палитра не активна.
Не, я сейчас на отладке проверил, не подгружает именно atc файл.

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

  • Administrator
  • *****
  • Сообщений: 11422
  • Карма: 1477
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Чтение адреса у Tool из Tool Palletes
« Ответ #12 : 16-01-2020, 14:35:29 »
А Вы не знаете зачем они так сделали?
Думаю, что это как-то связано с выделением ядра AutoCAD (в версии 2013), когда acmgd.dll разделили на acmgd.dll и accoremgd.dll. Ну и заодно решили что-то из acmgd.dll перенести в AcTcMgd.dll.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 11422
  • Карма: 1477
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Чтение адреса у Tool из Tool Palletes
« Ответ #13 : 16-01-2020, 14:37:10 »
Александр, спасибо за наводку, я добавил в условие, перед циклом, вот такую строчку, и всё заработало.
Код - C# [Выбрать]
  1. subcat.LoadLink();

CatalogItemCollection cic = tpm.Catalogs;
Скорее всего список выдает пустой, если палитра не активна.
Не, я сейчас на отладке проверил, не подгружает именно atc файл.

Можно так, а можно на всякий случай (перед главным циклом):
Код - C# [Выбрать]
  1. tpm.LoadCatalogs(); // Загружаем все каталоги
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение