вторник, 10 декабря 2013 г.

Пользовательские свойства групп листов в подшивке AutoCAD

Стандартная реализация менеджера подшивок AutoCAD такова, что пользователь может создавать произвольное количество пользовательских свойств уровней подшивки и листа, но не набора листов. Компания Autodesk неоднократно получала от своих пользователей просьбы исправить эту досадную недоработку однако, руководствуясь маркетинговой политикой компании, эти просьбы были проигнорированы. Лично я не питаю никаких иллюзий на тему того, что в обозримом будущем ситуация исправится. Однако отсутствующий функционал достаточно востребован среди пользователей, как русских, так и зарубежных. Возникает вопрос: можно ли это как-то исправить?

К счастью, данная задача легко решается программно (правда не на AutoLISP\Visual LISP). Для её реализации потребуется найти ответы два вопроса:
  1. Как программно создавать\читать\изменять пользовательские свойства групп листов в составе подшивки?
  2. Как связывать пользовательские свойства групп листов с полями (Fields), присутствующими в составе текстов и атрибутов?
Ответ на первый вопрос достаточно прост: следует воспользоваться Sheet Set Manager API (читайте справку acad_sso.chm) - код элементарен, поэтому не буду его здесь приводить. Читая обозначенный файл вы увидите, что пользовательское свойство может относиться к одной из четырёх категорий:

   1:  public enum PropertyFlags {
   2:      EMPTY = 0,
   3:      CUSTOM_SHEETSET_PROP = 1,
   4:      CUSTOM_SHEET_PROP = 2,
   5:      IS_CHILD = 4,
   6:  }

Со значениями CUSTOM_SHEETSET_PROP и CUSTOM_SHEET_PROP всё ясно - это пользовательские свойства уровня подшивки и уровня листа. Значение EMPTY используется для инициализации переменной перед получением пользовательского свойства. Значение IS_CHILD в данный момент не используется и предназначено для будущих расширений (читать как "никогда не будет задействовано", поскольку время показывает, что на развитии механизма подшивок, к сожалению, давно поставлен крест, как это когда-то произошло и с развитием AutoLISP\Visual LISP). Т. о. при желании, значение IS_CHILD можно использовать в своих программах, по своему усмотрению, не боясь конфликтов её интерпретации программным кодом Autodesk.

Теперь по поводу второго вопроса... К сожалению, по умолчанию AutoCAD не предоставляет возможности сослаться на пользовательское свойство группы листов. Однако решение может быть получено путём некоторого компромисса, прозрачного для конечных пользователей: создавать поля, значения которых будут обновляться вами программно за счёт подписки на следующие события: открытия\закрытия документа, регенерации, предварительного просмотра и печати. Код поля можно формировать например следующим образом:
  1. %<\AcDiesel $(nth, 0"Expressed value", "Description""CompanySite", "AssemblyName", "ClassName", "MethodName", "ParameterValue")>%
Параметры, передаваемые в метод, следуют в самом конце. Количество параметров может быть произвольным - столько, сколько требуется для работы указанного метода. В качестве одного из "ParameterValue" можно, к примеру, передавать числовое значение handle объекта, подлежащего обработке. Используя Reflection в вашем коде, зарегистрированном на указанные выше события, можно вычислить искомый результат и записать его вместо "Expressed value". Этот результат и будет отображаться полем (Field) в качестве значения. В "CompanySite" записывается адрес вашего сайта (как разработчика). В  "Description", в случае необходимости, можно записать некоторую поясняющую текстовую информацию.

Когда заказчик получит комплект чертежей (вместе с подшивкой), то все поля будут содержать корректные значения даже несмотря на то, что написанный вами программный код отсутствует на его машине. Поскольку заказчик по умолчанию не имеет доступа к пользовательским свойствам групп листов, то и изменить их он не сможет. Соответственно, значения, программно записанные вами в состав поля, остаются корректными даже при отсутствии вашей программы.

Наличие положительного ответа на второй вопрос позволяет вам написать свою версию диспетчера подшивок, более удобную в использовании чем та, что в AutoCAD присутствует по умолчанию. Но это отдельная тема...

P.S. Полезные ссылки по теме:
  1. "Своё" поле с указанием отображаемого текста
  2. Флаги пользовательских свойств подшивок

Комментариев нет: