13/05/2014
Внутри палитр инструментов AutoCAD часть 1 - Подключение дополнительного каталога
Что происходит, когда пользователь (ну или программист - неважно) подключает дополнительный каталог палитр? Где и как это фиксируется? А если в файлы палитр вносить изменения, чего будет? Вот со всем этим богатством и попробую разобраться. По крайней мере попытаюсь "охватить" все ;)В вертикальных решениях (типа AutoCAD Architecture / AutoCAD MEP etc) есть прекрасный механизм синхронизации серверных и локальных палитр инструментов (ToolPalettes). В "чистом" AutoCAD такой возможности нет.
В вертикалках такое решение называется ContentBrowser и позволяет синхронизировать серверные палитры и их содержимое на компьютере пользователя. Синхронизация выполняется либо автоматически при старте вертикалки, либо принудительно. При этом имеющийся механизм (расскажу для тех, кто с ним не сталкивался) обладает несколькими очень интересными особенностями:
- Можно "поставить" на сихнронизацию определенную группу палитр. При этом в дальнейшем будут синхронизироваться только те палитры, которые были в группе на момент первого запуска: добавление новой палитры в группу не добавит ее к интерфейсу пользователя.
- При соответствующих настройках изменения, которые внес CAD-менеджер в серверные палитры, моментально отображаются у пользователей.
- Синхронизация не "рушит" пользовательские группировки палитр
- CAD-менеджер настраивает палитру и выполняет ее экспорт. Потом сообщает пользователям об изменении палитр, а сами пользователи уже
- удаляют старую палитру у себя на компьютере
- выполняют импорт палитры
- Пользователям устанавливается путь к ToolPalettes, располагающихся на сервере. Пишется небольшая программка, которая по некоторым условиям (например, изменились файлы серверных палитр) выполняет замену пути к ToolPalettes сначала на какой-то "левый" каталог, а потом возвращает его к серверному.
Тоже вариант, но:- остается открытым вопрос - как поступать, если пользователь установил несколько каталогов к палитрам
- Практически гарантированно "слетят" группировки
Эксперименты будем проводить над 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'ов корректно запустится и закроется.
В результате получаем картину наподобие:
Теперь начнем (естественно, последовательно по каждой версии AutoCAD) выполнять такие действия:
- Показать ToolPalettes. Изменения в файлах
- Контроль изменений в файлах при все еще открытом AutoCAD
- Закрываем AutoCAD. Контроль изменений в файлах
Забегая вперед, скажу, что из общего ряда выбивается только AutoCAD 2009. Но убедился в этом я только после проведения всех экспериментов.
Показ ToolPalettes | ||
Открытый AutoCAD | После закрытия AutoCAD | |
AutoCAD 2009 | Нет | Изменений очень много, но все они находятся в %appdata%:
|
AutoCAD 2010 | Нет | Фактически изменения такие же., за исключением файла FixedProfile.aws: SourceTree не показал, что в него были внесены изменения. |
AutoCAD 2013 | Нет | Все то же самое |
AutoCAD 2015 | Нет | Все то же самое |
Открываем AutoCAD нужной версии, подключаем новый каталог в качестве дополнительного пути к палитрам, экспортируем реестр и смотрим на изменения файлов. Все, как раньше:
- Добавить каталог ToolPalettes
- Контроль изменений в файлах при все еще открытом AutoCAD
- Закрываем AutoCAD. Контроль изменений в файлах
Добавление каталога к новым ToolPalettes (без активации новой палитры) | ||
Открытый AutoCAD | После закрытия AutoCAD | |
AutoCAD 2009 | Изменен Profile.aws. В узел Profile - StorageRoot - ToolPaletteScheme - ToolPaletteSets - ToolPaletteSet - AcTcUiToolPaletteSet - ToolPalettes добавляются узлы, описывающие дополнительные палитры:
Код - XML: [Выделить]
Значение 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, указывая на активную палитру и (для активированных ранее палитр) переписывается порядок следования инструментов
Автор: Алексей Кулик
Обсуждение: http://adn-cis.org/forum/index.php?topic=729
Опубликовано 13.05.2014Отредактировано 13.05.2014 в 10:52:10