Пишем менеджеры управления стилями AutoCAD

  • Дата публикации: 29.06.2010
Состояние: Данная статья устарела - мною написана более новая версия менеджеров управления стилями (реализовано два интерфейса). Реализовано два менеджера - текстовых стилей и табличных стилей. Более новая версия опубликована здесь.

Описание проблемы
Все чертежи должны оформляться в соответствии с определёнными правилами. В серьёзных организациях эти правила оформляются в виде стандарта предприятия. Такому стандарту должны следовать все проектировщики организации в процессе формирования проектной документации. Часть этих правил решается в AutoCAD при помощи стилей:
  • Стили текста
  • Стили размеров
  • Стили выносок
  • Стили таблиц
  • Стили мультилиний
  • Стили точек
При оформлении проекта, во всех чертежах используется, как правило, один и тот же набор стилей. На практике часто встречаются ситуации, когда в состав проекта следует включить набор чертежей, созданных сторонними организациями. В идеале, в подобных случая следует предварительно оговаривать то, как должны быть оформлены чертежи. Можно выслать субподрядчику свой стандарт и потребовать, чтобы конечная документация полностью ему соответствовала. 

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

В подобных случаях на помощь обычно приходят модули нормоконтоля. Однако такие модули в базовой поставке AutoCAD существуют не на всё, что нам бы хотелось проверить... Если говорить применительно к стилям, то в базовой поставке нет модулей проверяющих стили выносок, таблиц, мультилиний и точек. Отсутствие модулей, проверяющих стили мультилиний и точек - не столь существенно, как их отсутствие для стилей выносок и таблиц. Конечно можно (и даже нужно) самостоятельно писать модули нормоконтроля, но во всех них есть ряд существенных (на мой взгляд) общих недостатков:
  1. В процессе работы модуля нормоконтроля тот, для каждого элемента не удовлетворяющего предъявляемым требованиям, запрашивает эталон, к которому следует привести исходный объект. Приходится вручную сидеть и указывать нужный вариант замены для каждого обнаруженного несоответствия. Зачастую на этот процесс уходит много времени.
  2. Модуль нормоконтроля не в состоянии произвести пакетную обработку файлов, в процессе которой все файлы были бы не только проанализированы на предмет несоответствия стандартам, но и исправлены.
У меня есть своя задумка, о том, как реализовать проверку стилей на соответствие утверждённым корпоративным стандартам, но для этого мне, как программисту нужно иметь под рукой ряд инструментов:
  1. Модуль пакетной обработки чертежей (это я уже сделал - результат здесь)
  2. Удобный и понятный набор классов, реализующий общий интерфейс (interface) и позволяющий легко и просто выполнять любую операцию с нужным мне стилем (решению этого вопроса как раз и посвящена данная статья).

Формирование требований
Мне, как программисту, хотелось бы иметь под рукой удобный набор инструментов, благодаря которому я смог бы управлять любыми стилями из тех, что существуют в AutoCAD. Используя такие инструменты, процесс разработки плагинов, в составе которых должны обрабатываться стили, существенно ускорится.

Описания всех утверждённых к использованию стилей удобно хранить в xml-файле, который должен располагаться в сети, в общедоступном для чтения месте. Нужен класс, который мог бы производить в чертеже определённый набор действий, отталкиваясь от тех настроек, которые заложены в указанном выше xml-файле. Определяюсь с набором операций, которые этот класс должен уметь выполнять применительно к конкретному типу стилей, на работу с которым данный класс ориентирован:
  • Добавлять в базу данных чертежа новые стили
  • Добавлять в xml-файл настроек определение нового стиля
  • Проверять, можно ли удалить стиль из базы данных чертежа (если его используют примитивы, то удалить не удастся - сначала нужно назначать таким примитивам другой стиль)
  • Переназначать примитивам другой стиль
  • Создавать xml-объект на основе стиля
  • Сравнивать стиль, определённый в базе данных чертежа с одноимённым стилем, определённым в xml-файле настроек
  • Проверять стиль на наличие его в чертеже
  • Проверять стиль на наличие его в xml-файле настроек
  • Получать из чертежа нужный стиль по его имени
  • Получать список всех стилей текущего чертежа
  • Получать список всех стилей в составе чертежа, которые не удовлетворяют стандартам, описанным в xml-файле настроек
  • Получение стиля из xml-файла по имени этого стиля.
  • Получать список всех стилей, описанных в xml-файле настроек
  • Импортировать в базу данных чертежа новый стиль, согласно его настройкам в xml-файле
  • Изменять в xml-файле настроек определения стилей
  • Удалять стили из чертежа
  • Удалять из xml-файла настроек определения стилей
  • Сохранение изменений в xml-файле настроек (если сохранение не выполнено - все произведённые в xml-файле изменения не должны сохраняться).
  • Производить синхронизацию сразу всех стилей чертежа со стандартом, описанным в xml-файле настроек. При этом все стили, для которых в xml-файле отсутствуют одноимённые аналоги, должны заменяться на тот стиль, который помечен используемым по умолчанию (т.е. вместо группы ненужных стилей останется один нужный)
  • Производить синхронизацию конкретного стиля
  • Объединять группу не нужных в чертеже стилей в один нужный (остаётся один стиль, соответствующий стандарту, а все стили в составе указанной группы удаляются)
  • Объединять два существующих в чертеже стиля в один (остаётся один стиль, соответствующий стандарту, а второй удаляется)
Весь перечисленный выше функционал должен так же работать и в пакетном режиме, т.е. чтобы в случае необходимости можно было мгновенно обработать целый набор файлов (для подобных задач мною разработан менеджер пакетной обработки чертежей).

Программный интерфейс

Весь перечисленный выше набор действий в равной степени применим к любому типу стиля из тех, которые существуют в AutoCAD или его вертикальных решениях. Т.о. имеет смысл определить единый интерфейс, который должны реализовывать все классы, каждый из которых ориентирован на работу с конкретным типом стилей. Эти классы будут называться менеджерами стилей. С учётом всего выше изложенного, общий интерфейс будет выглядеть так:


Свойство Drawing указывает на чертёж, работу с которым следует выполнить.
Свойство StyleSettingsXmlFilePath указывает место нахождения xml-файла, содержащего настройки утверждённых к применению стилей.

Структура xml-файла настроек

Xml-файл должен группировать в себе стили в соответствии с их типами. Информация в каждом стиле должна быть сгруппирована так, как это выполнено в диалоговых окнах настроек стилей AutoCAD (чтобы было удобней ориентироваться). Учитывая эти требования показываю простой пример xml-файла, в котором описаны только два текстовых стиля, утверждённых стандартом предприятия к использованию:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="utf-8" ?>
<!--Разработчик: Андрей Бушман (Санкт-Петербург, июнь 2010г)-->
<!--Файл настроек различных стилей, применяемый в AutoCAD-->
<Settings>
  <Styles>
    <!--Текстовые стили-->
    <TextStyles Type="TextStyleTableRecord" DefaultStyle="Тип А курсив">
      <TextStyle Name="Тип А курсив" Use="True">
        <Font FontName="mipgost.shx" BigFont=""/>
        <Size Annotative ="True" OrientationToLayout ="False" TextHeight="0"/>
        <Effects WidthFactor="0.85" ObliqueAngle="15" UpsideDown ="False" Backwards ="False"  Vertical="False"/>
      </TextStyle>
      <TextStyle Name="Тип А прямой" Use="True">
        <Font FontName="mipgost.shx" BigFont=""/>
        <Size Annotative ="True" OrientationToLayout ="False" TextHeight="0"/>
        <Effects WidthFactor="0.85" ObliqueAngle="0" UpsideDown ="False" Backwards ="False"  Vertical="False"/>
      </TextStyle>
    </TextStyles>
    <!--Табличные стили-->
    <TableStyles></TableStyles>
    <!--Размерные стили-->
    <DimensionStyles></DimensionStyles>
    <!--Стили выносок-->
    <MultiLeaderStyles></MultiLeaderStyles>
  </Styles>
</Settings>

Корневым элементом xml-файла является блок Settings, в котором размещается блок Styles. Я не стал делать корневым блок Styles, т.к. со временем может возникнуть необходимость добавить в данный файл некоторую дополнительную информацию, которая не относится к конкретным типам стилей, а предназначена для настроек плагинов, оперирующих этим файлом.

Элемент Settings содержит дочерние элементы TextStyles, TableStyles, DimensionStyles, MultiLeaderStyles. При желании можно добавлять и другие группы, например   для стилей точек и/или мультилиний. В приведённом выше файле видно, что элемент TextStyles содержит два дочерних элемента TextStyle, в каждом из которых, в свою очередь размещается информация о настройках конкретного текстового стиля. Информация в составе объекта TextStyle сгруппирована в блоки Font, Size и Effects. Если мы откроем диалоговое окно менеджера текстовых стилей, то увидим, что именно таким образом эта информация сгруппирована в открытом нами окне:


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

Comments