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

13/05/2014

Внутри палитр инструментов AutoCAD часть 1 - Подключение дополнительного каталога

Что происходит, когда пользователь (ну или программист - неважно) подключает дополнительный каталог палитр? Где и как это фиксируется? А если в файлы палитр вносить изменения, чего будет? Вот со всем этим богатством и попробую разобраться. По крайней мере попытаюсь "охватить" все ;)

В вертикальных решениях (типа AutoCAD Architecture / AutoCAD MEP etc) есть прекрасный механизм синхронизации серверных и локальных палитр инструментов (ToolPalettes). В "чистом" AutoCAD такой возможности нет.

В вертикалках такое решение называется ContentBrowser и позволяет синхронизировать серверные палитры и их содержимое на компьютере пользователя. Синхронизация выполняется либо автоматически при старте вертикалки, либо принудительно. При этом имеющийся механизм (расскажу для тех, кто с ним не сталкивался) обладает несколькими очень интересными особенностями:
  • Можно "поставить" на сихнронизацию определенную группу палитр. При этом в дальнейшем будут синхронизироваться только те палитры, которые были в группе на момент первого запуска: добавление новой палитры в группу не добавит ее к интерфейсу пользователя.
  • При соответствующих настройках изменения, которые внес CAD-менеджер в серверные палитры, моментально отображаются у пользователей.
  • Синхронизация не "рушит" пользовательские группировки палитр
В обычном AutoCAD существует немного способов синхронизации палитр:
  • CAD-менеджер настраивает палитру и выполняет ее экспорт. Потом сообщает пользователям об изменении палитр, а сами пользователи уже
    1. удаляют старую палитру у себя на компьютере
    2. выполняют импорт палитры
    Понятно, что такой подход далек от совершенства: пользователь может что-нибудь забыть сделать, и в результате ничего хорошего не будет. А если у пользователя еще и несколько профилей AutoCAD, то все становится совсем уныло.
  • Пользователям устанавливается путь к ToolPalettes, располагающихся на сервере. Пишется небольшая программка, которая по некоторым условиям (например, изменились файлы серверных палитр) выполняет замену пути к ToolPalettes сначала на какой-то "левый" каталог, а потом возвращает его к серверному.

    Тоже вариант, но:
    1. остается открытым вопрос - как поступать, если пользователь установил несколько каталогов к палитрам
    2. Практически гарантированно "слетят" группировки
Предлагаю немного разобраться с ситуацией добавления палитр в профиль AutoCAD'a, что, где и когда происходит, и как с этим жить.

Эксперименты будем проводить над AutoCAD 2009, 2010, 2013, 2015; все AutoCAD'ы - 64-разрядные. На компьютере понадобится любая система контроля версий (я буду использовать SourceTree), какой-нибудь редактор xml-файлов (я взял бесплатный Notepad++ и его дополнение XML Tools). Для чистоты экспериментов использоваться будет виртуальный компьютер. На компьютер сначала устанавливается система, потом все необходимые версии AutoCAD и обновления для них, следом - SourceTree и xml-редактор, и только потом - все возможные дополнения для ОС. Долго, конечно, но зато выясним в результате все что надо :)

Вспомним, что сама по себе палитра - это xml-подобный файл *.atc, написанный "почти правильно" (там нет стартовой строки, определяющей кодировку xml и версию). Файл пишется в кодировке UTF-8 и фактически просто перечисляет доступные инструменты и их настройки.

Подключенные и используемые палитры перечислены в файле AcTpCatalog.atc. Перечисляются только палитры, без их состава (ну и еще дополнительно опции отображения палитр, но это уже на данный момент несущественно)

Вообще говоря, с этим файлом не все так просто. По идее AutoCAD при старте опрашивает все доступные каталоги ToolPalettes, находит первый такой файл и считает его единственным. И все изменения пытается записывать именно в него. Но как только такой файл становится в режим ReadOnly, все изменения вроде бы записываются, но "не подхватываются" (по крайней мере я именно так понимаю эту ситуацию). Именно поэтому я в "боевых" условиях добавляю дополнительные каталоги после стандартных - вариантов получить проблемы на ровном месте на порядок меньше.

Общая технология работы с серверными палитрами и их синхронизацией может быть реализована, как мне думается, в двух вариантах:
  • Есть серверный каталог, куда имеет право записи только CAD-менеждер (ну или тот, кто настраивает сами палитры). Именно этот каталог подключается как второй / дополнительный. И в этом каталоге хранятся только палитры и их файлы, ничего больше.
  • На локальном компьютере создается отдельный каталог, в который при необходимости копируются новые версии *.atc-файлов. Этот локальный каталог подключается как второй / дополнительный путь.
На самом деле принципиальной разницы между этими двумя вариантами нет, но я предпочитаю использовать именно второй: мне не очень нравится идея прямого доступа со стороны пользователя на какие-либо служебные каталоги и файлы.

Для экспериментов я взял пару готовых палитр и закинул их в каталог вида c:\toolapettes."ВерсияAutoCAD" (т.е. в 2009 будем добавлять каталог c:\toolpalettes.2009; в AutoCAD 2013 - c:\toolpalettes.2013 и т.п.). Структура каталога похожа на такую:
 

Единственные изменения, которые вносятся в реестр - это добавление путей к ToolPalettes. Ничего другого там не фиксируется, поэтому и отслеживать изменения в реестре никакого смысла нет.

Прежде чем начинать работать с палитрами, создадим несколько git-репозиториев (можете поверить - изменения касаются только каталога в %AppDat%; %LocalAppData% отслеживать не надо). Для экономии времени про игнорирование файлов забудем ;). Но фактически отслеживать будем файлы *.atc и *.aws. Сначала запуск AutoCAD'a, потом коммит, потом показываем ToolPalettes и коммитим изменения. Самое тяжелое здесь - это ждать, пока каждый из AutoCAD'ов корректно запустится и закроется.

В результате получаем картину наподобие:
004SourceTree


Теперь начнем (естественно, последовательно по каждой версии AutoCAD) выполнять такие действия:
  • Показать ToolPalettes. Изменения в файлах
  • Контроль изменений в файлах при все еще открытом AutoCAD
  • Закрываем AutoCAD. Контроль изменений в файлах
Пока вносить изменения в пути ToolPalettes не будем. Дело в том, что все перечисленные "как бы xml" файлы (имею в виду, естественно, aws и atc) могут запросто потерять "структурированность", которую мы и будем восстанавливать через Notepad++ и XML tools.

Забегая вперед, скажу, что из общего ряда выбивается только AutoCAD 2009. Но убедился в этом я только после проведения всех экспериментов.

Показ ToolPalettes
  Открытый AutoCAD После закрытия AutoCAD
AutoCAD 2009 Нет Изменений очень много, но все они находятся в %appdata%:
  1. \Support\Profiles\FixedProfile.aws
  2. \Suppotrt\Profiles\Unnamed Profile\FixedProfile.aws
  3. \Support\RegisteredTools\AcTpTools.atc
  4. \Support\ToolPalette\AcTpCatalog.atc
  5. \Support\ToolPalette\AcTpMaterials.atc
  6. Добавлены автоматически созданные *.atc-файлы палитр
Каждый из файлов является "почти-xml", поэтому каждый из них был открыт в Notepad++ и отформатирован.
AutoCAD 2010 Нет Фактически изменения такие же., за исключением файла FixedProfile.aws: SourceTree не показал, что в него были внесены изменения.
AutoCAD 2013 Нет Все то же самое
AutoCAD 2015 Нет Все то же самое
Что именно меняется в файлах aws, на данный момент не сильно интересно. Интересно другое - что и где будет меняться, когда мы добавим еще один каталог в качестве путей ToolPalettes.

Открываем AutoCAD нужной версии, подключаем новый каталог в качестве дополнительного пути к палитрам, экспортируем реестр и смотрим на изменения файлов. Все, как раньше:
  • Добавить каталог ToolPalettes
  • Контроль изменений в файлах при все еще открытом AutoCAD
  • Закрываем AutoCAD. Контроль изменений в файлах
Добавление каталога к новым ToolPalettes (без активации новой палитры)
  Открытый AutoCAD После закрытия AutoCAD
AutoCAD 2009 Изменен Profile.aws. В узел Profile - StorageRoot - ToolPaletteScheme - ToolPaletteSets - ToolPaletteSet - AcTcUiToolPaletteSet - ToolPalettes добавляются узлы, описывающие дополнительные палитры:
Код - XML: [Выделить]
  1. <ToolPalette> <CAdUiPalette PaletteStyle="0"/> <CAcTcUiToolPalette> <CatalogView ID="{...}"> <ToolSource> <Palette ID="{...}">kpblc_testaddon01</Palette> </ToolSource> <Image SizeCX="32" SizeCY="32"/> <Style>0</Style> <ToolOrder/> </CatalogView> </CAcTcUiToolPalette> </ToolPalette>

Значение ID у CatalogView и у Palette одинаково. Пока не знаю, важно это или нет, но отметим.
Меняется файл FixedProfile.aws по аналогии с изменениями в Profile.aws. Сам файл Profile.aws в части, касающейся именно ToolPalettes, не меняется
AutoCAD 2010 То же самое Меняется файл Profile.aws, добавляется информация о дополнительных палитрах в узел Profile - StorageRoot - AcApData - AdUiTools - ToolsInfo - Tool - CAcTcUiToolPaletteSet - ToolPalettes. Проблема в том, что подузлов Tool внутри ToolsInfo может быть несколько, и контролировать / проверять при необходимости придется все.
AutoCAD 2013, 2014 То же самое То же самое
Все изменения фиксировались для варианта "добавили каталог и на этом успокоились". А если попробовать менять активную палитру? Попереключаться между ними?

Как выяснилось, во всех версиях AutoCAD изменения в файлы aws / atc не вносятся, пока AutoCAD работает. А вот после закрытия приложения в файл Profile.aws вносятся следующие изменения:
  1. Узел Profile - StorageRoot - TooLPaletteScheme - ToolPaleetSets - ToolPaletteSet - CAdUiPaletteSet, атрибут ActivePaletteIndex принимает номер активной палитры (нумерация начинается с 0, порядок определяется последовательностью описания элементов ToolPalette в узле Profile - StorageRoot - TooLPaletteScheme - ToolPaleetSets - ToolPaletteSet - CAcTcUiToolPaletteSet.
  2. Для каждой палитры (узел Profile - StorageRoot - TooLPaletteScheme - ToolPaleetSets - ToolPaletteSet - CAcTcUiToolPaletteSet - ToolPalettes, подузлы ToolPalette) создается подузел ToolOrder, описывающий последовательность отображения инструментов в палитру
  3. В узел Profile - StorageRoot - AcApData - AdUiTools - ToolsInfo - Tool - CAdUiPaletteSet (в моих условиях изменения вносились в последний элемент дерева) дублируется информация об активной палитре.
  4. Для каждой палитры (узел Profile - StorageRoot - AcApData - AdUiTools - ToolsInfo - Tool - CAcTcUiToolPaletteSet - ToolPalettes, подузлы ToolPalette) создается подузел ToolOrder, описывающий последовательность отображения инструментов в палитру


Единственное отличие версии 2009 - почему-то изменения фиксируются не только в Profile.aws, но и в FixedProfile.aws.

В итоге:
  • Добавление нового каталога палитр сразу вносит изменения в Profile.aws. В AutoCAD 2009 дополнительно меняется файл FixedProfile.aws
  • После закрытия AutoCAD дополнительно вносятся изменения в Profile.aws, указывая на активную палитру и (для активированных ранее палитр) переписывается порядок следования инструментов


Автор: Алексей Кулик

Обсуждение: http://adn-cis.org/forum/index.php?topic=729

Опубликовано 13.05.2014
Отредактировано 13.05.2014 в 10:52:10