Внутри палитр инструментов в AutoCAD, часть 1. Подключение дополнительного каталога ToolPalettes
Что происходит, когда пользователь (ну или программист - неважно) подключает дополнительный каталог палитр? Где и как это фиксируется? А если в файлы палитр вносить изменения, чего будет? Вот со всем этим богатством и попробую разобраться. По крайней мере попытаюсь "охватить" все
В вертикальных решениях (типа AutoCAD Architecture / AutoCAD MEP etc) есть прекрасный механизм синхронизации серверных и локальных палитр инструментов (ToolPalettes). В "чистом" AutoCAD такой возможности нет.
В вертикалках такое решение называется ContentBrowser и позволяет синхронизировать серверные палитры и их содержимое на компьютере пользователя. Синхронизация выполняется либо автоматически при старте вертикалки, либо принудительно. При этом имеющийся механизм (расскажу для тех, кто с ним не сталкивался) обладает несколькими очень интересными особенностями:
- Можно "поставить" на сихнронизацию определенную группу палитр. При этом в дальнейшем будут синхронизироваться только те палитры, которые были в группе на момент первого запуска: добавление новой палитры в группу не добавит ее к интерфейсу пользователя.
- При соответствующих настройках изменения, которые внес CAD-менеджер в серверные палитры, моментально отображаются у пользователей.
- Синхронизация не "рушит" пользовательские группировки палитр
В обычном AutoCAD существует немного способов синхронизации палитр:
- CAD-менеджер настраивает палитру и выполняет ее экспорт. Потом сообщает пользователям об изменении палитр, а сами пользователи уже
- удаляют старую палитру у себя на компьютере
- выполняют импорт палитры
Понятно, что такой подход далек от совершенства: пользователь может что-нибудь забыть сделать, и в результате ничего хорошего не будет. А если у пользователя еще и несколько профилей AutoCAD, то все становится совсем уныло.
- Пользователям устанавливается путь к ToolPalettes, располагающихся на сервере. Пишется небольшая программка, которая по некоторым условиям (например, изменились файлы серверных палитр) выполняет замену пути к ToolPalettes сначала на какой-то "левый" каталог, а потом возвращает его к серверному.
Тоже вариант, но:- остается открытым вопрос - как поступать, если пользователь установил несколько каталогов к палитрам
- Практически гарантированно "слетят" группировки
Предлагаю немного разобраться с ситуацией добавления палитр в профиль 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, все изменения вроде бы записываются, но "не подхватываются" (по крайней мере я именно так понимаю эту ситуацию). Именно поэтому я в "боевых" условиях добавляю дополнительные каталоги после стандартных - вариантов получить проблемы на ровном месте на порядок меньше.
Для экспериментов я взял пару готовых палитр и закинул их в каталог вида c:\toolapettes."ВерсияAutoCAD" (т.е. в 2009 будем добавлять каталог c:\toolpalettes.2009; в AutoCAD 2013 - c:\toolpalettes.2013 и т.п.). Структура каталога похожа на такую:
Единственные изменения, которые вносятся в реестр - это добавление путей к ToolPalettes. Ничего другого там не фиксируется, поэтому и отслеживать изменения в реестре никакого смысла нет.
Прежде чем начинать работать с палитрами, создадим несколько git-репозиториев (можете поверить - изменения касаются только каталога в %AppDat%; %LocalAppData% отслеживать не надо). Для экономии времени про игнорирование файлов забудем ;). Но фактически отслеживать будем файлы *.atc и *.aws. Сначала запуск AutoCAD'a, потом коммит, потом показываем ToolPalettes и коммитим изменения. Самое тяжелое здесь - это ждать, пока каждый из AutoCAD'ов корректно запустится и закроется.
В результате получаем картину наподобие:
Теперь начнем (естественно, последовательно по каждой версии AutoCAD) выполнять такие действия:
- Показать ToolPalettes. Изменения в файлах
- Контроль изменений в файлах при все еще открытом AutoCAD
- Закрываем AutoCAD. Контроль изменений в файлах
Пока вносить изменения в пути ToolPalettes не будем. Дело в том, что все перечисленные "как бы xml" файлы (имею в виду, естественно, aws и atc) могут запросто потерять "структурированность", которую мы и будем восстанавливать через Notepad++ и XML tools.
Забегая вперед, скажу, что из общего ряда выбивается только AutoCAD 2009. Но убедился в этом я только после проведения всех экспериментов.
Показ ToolPalettes | ||
Открытый AutoCAD | После закрытия AutoCAD | |
AutoCAD 2009 | Нет | Изменений очень много, но все они находятся в %appdata%:
Каждый из файлов является "почти-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 добавляются узлы, описывающие дополнительные палитры:
Значение 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 вносятся следующие изменения:
- Узел Profile - StorageRoot - TooLPaletteScheme - ToolPaleetSets - ToolPaletteSet - CAdUiPaletteSet, атрибут ActivePaletteIndex принимает номер активной палитры (нумерация начинается с 0, порядок определяется последовательностью описания элементов ToolPalette в узле Profile - StorageRoot - TooLPaletteScheme - ToolPaleetSets - ToolPaletteSet - CAcTcUiToolPaletteSet.
- Для каждой палитры (узел Profile - StorageRoot - TooLPaletteScheme - ToolPaleetSets - ToolPaletteSet - CAcTcUiToolPaletteSet - ToolPalettes, подузлы ToolPalette) создается подузел ToolOrder, описывающий последовательность отображения инструментов в палитру
- В узел Profile - StorageRoot - AcApData - AdUiTools - ToolsInfo - Tool - CAdUiPaletteSet (в моих условиях изменения вносились в последний элемент дерева) дублируется информация об активной палитре.
- Для каждой палитры (узел Profile - StorageRoot - AcApData - AdUiTools - ToolsInfo - Tool - CAcTcUiToolPaletteSet - ToolPalettes, подузлы ToolPalette) создается подузел ToolOrder, описывающий последовательность отображения инструментов в палитру
Единственное отличие версии 2009 - почему-то изменения фиксируются не только в Profile.aws, но и в FixedProfile.aws.
В итоге:
- Добавление нового каталога палитр сразу вносит изменения в Profile.aws. В AutoCAD 2009 дополнительно меняется файл FixedProfile.aws
- После закрытия AutoCAD дополнительно вносятся изменения в Profile.aws, указывая на активную палитру и (для активированных ранее палитр) переписывается порядок следования инструментов