Структура файла палитры инструментов

Начал я тут разбираться с палитрами инструментов - что и как в них хранится. В результате получилась вот такая "шпаргалка", в продолжение заметки Палитры инструментов через лисп + xml.

Все, что написано ниже, во-первых, касается чистого AutoCAD, и, во-вторых, касается только палитр инструментов, а не всего, что их напоминает.

Файлы палитр инструментов (ToolPalettes, или TP) имеют расширение atc и являются фактически "почти-xml" файлами. В этом нетрудно убедиться, если открыть такой файл, например, в Notepad++ и отформатировать его как xml. Файлы пишутся в кодировке UTF-8 (без BOM - маркера последовательности байтов, чтобы это ни значило).

Но сейчас интерес представляет не это, а собственно структура документа atc.

Как и любой "валидный" (т.е. правильно написанный) xml, у atc есть главный, или родительский узел:

1
<Palette FileRevision="19.1.0" Revision="19.1.0" option="0">

Palette - как минимум просто название узла. Как максимум - боюсь даже предполагать :)
FileRevision и Revision - зависят от того, в какой версии AutoCAD последний раз выполнялось открытие этой палитры. Конкретно эту палитру последний раз я открывал в AutoCAD 2014 (R19.1), что и получило свое отражение в файле atc.

Следовательно, получается, что а) файлы палитр меняются "на лету" и б) эти изменения зависят от версии AutoCAD, в которой открывается палитра. Не очень радостная весть... Если на компьютере установлено несколько версий AutoCAD, и каждая из этих версий должна работать с одними и теми же палитрами, то желательно "раскидывать" их по отдельным подкаталогам. Так, что ли?

Другой вопрос, что явных проблем именно из-за этой строки я пока не ловил, но мало ли чего я не ловил...

Идем дальше. Следующий узел:

1
<ItemID idValue="{...}"/>

Это GUID палитры. Задается AutoCAD'ом при создании или импорте палитры. Именно основываясь на этом GUID, AutoCAD определяет, какая палитра отображается в какой группе (или не отображается вообще ;))

Следом указываются свойства (Properties) палитры: ее отображаемое имя, время создания, модификации и последней регенерации (по крайней мере я понял эти данные именно так). Время на самом деле назначается очень странно - все три атрибута имеют одинаковые значения вплоть до секунд.

Смысл узлов CustomData и Source я не понял. В палитрах, созданных в AutoCAD 2009, например, узла CustomData вообще нет, он появился позже.

А вот дальше, в узле Tools, начинается перечень всех инструментов, показываемых палитрой.

Каждый инструмент "обрамлен" в собственный узел Tool. Внутри уже описываются параметры инструмента (некритичные элементы я пропустил; значения GUID заменил на многоточие):

1
<ItemID idValue="{...}"/>
GUID инструмента
Узел Properties

1
<ItemName>...</ItemName>
Отображаемое имя инструмента
1
<ToolType>...</ToolType>
Тип инструмента. Очень интересное значение, вдобавок критически важное:
1 : Команда AutoCAD. Причем абсолютно неважно - это штатная команда AutoCAD или пользовательская. М.б. даже просто вызовом lisp-функции.
2 : Выпадающий список. Доступен только для штатных команд AutoCAD (по крайней мере я увидел только для них)
3 : Текстовое пояснение
4 : Горизонтальный разделитель
1
<Images>...</Images>
Существует только для типов 1 и 2. Обязательно содержит как минимум один подузел Image вида:

1
2
<Image cx=".." cy=".."
src=".\Images\ИмяФайлаРисунка.png"/>

Если рисунок берется из ресурсной dll, то подузел становится

1
2
3
<Image cx=".." cy=".."
resource="IdРесурса"
src="ИмяРесурснойDll.dll"/>

Для штатных команд можно встретить и такую запись:

1
2
3
<Image cx=".." cy=".."
resource="RCDATA_32_PLINE"
src="%ProgramBtnRes%"/>

Достаточно интересный узел, но вносить в него изменения бесполезно

1
<Data>...</Data>
Узел существует только для инструментов типа 1 и 2. Внутри него для типа 1 есть 2 подузла: GeneralProperties и Command. GeneralProperties хранит информацию о том, какой слой активировать (и при необходимости создавать) при вызове инструмента, какой цвет устанавливать активным и т.п.
Внутри подузла Command есть подузел вида

1
2
3
<Macro>
  <![CDATA[^C^C_pline]]>
</Macro>

Именно здесь хранится собственно та строка, которая передается в ком.строку AutoCAD'a.

Я не разобрался с инструментом вставки блока: для него в узле Data создается еще один подузел - Block, который в себе содержит безумное количество информации. И я сильно подозреваю, что вся она достаточно жестко между собой связана, т.е. вносить туда изменения или создавать подобные элементы - себе дороже.

Теперь коснемся поведения atc-файла. Тут не все однозначно :(

Если открыть AutoCAD, показать палитру и добавить какой-либо инструмент, то изменения в atc сохраняются моментально. А вот перегруппировка или удаление инструментов сохраняется внутри atc только после выхода из AutoCAD (простое закрытие палитр ситуацию не спасает). Если AutoCAD открыт, то внесение любых изменений в atc-файл никакого смысла иметь не будет: палитра не обновится.

Подводя небольшие итоги, можно сказать, что, обладая механизмом чтения (хотя бы чтения) xml-файлов, можно "разобрать" весь файл палитры по косточкам. Самое главное - можно выцепить GUID'ы самой палитры и всех ее инструментов.

Размещено в AutoCAD, Новости, Разное · Метки: , , ,



Комментарии

Есть 4 коммент. к “Структура файла палитры инструментов”
  1. Владимир пишет:

    На практике необходимо было сделать блоки вставляемые + чтобы файл в котором хранится блок мог располагаться в любом месте. Печаль была в том что Автокад прописывал абсолютный путь (на 2010 версии это все было). Опять же Notepad++, поиск имени файла и мы получаем абсолютно автономное/переносимое решение.
    А вообще палитры очень мощная штука для создания адаптивных решений.
    Например туда можно даже засунуть целую таблицу с настроенным стилем и связями данных (а данные брать из эксель таблички с относительным путем или вообще без пути). Да, к сожалению делать это ручками приходится :(

  2. Кулик Алексей aka kpblc пишет:

    Нет в жизни счастья :) другой момент, что при наличии некоторых инструментов можно прямо в момент работы AutoCAD'а вносить изменения в палитры и подсовывать измененные данные AutoCAD'у. Мне кажется, это достаточно удобно.

  3. Михаил пишет:

    "...при наличии некоторых инструментов можно прямо в момент работы AutoCAD’а вносить изменения в палитры и подсовывать измененные данные AutoCAD’у..."
    1. Если я из "Адаптации палитр" убираю палитру из группы - результат тут же отображается.
    2. Если удаляю ID из описания группы в profile.aws - никакого эффекта. Закрытие-открытие Автокада не помогает (восстанавливается существовавшее состояние).
    Видимо есть какой-то кэш...
    Судя по цитате - ты знаешь как менять палитры "на лету". Поделись знанием пожалуйста.

  4. Кулик Алексей aka kpblc пишет:

    Насколько я помню (делал достаточно давно, кода не сохранилось) - предварительно надо было закрывать палитры, выполнять изменения в файлах палитр, и потом повторно их открывать.

Поделитесь своим мнением


Я не робот.