• Создание библиотек фрагментов и моделей
  • Создание библиотек шаблонов
  • Создание библиотек с помощью КОМПАС-Макро
  • КОМПАС-Мастер
  • Технология COM, автоматизация и интерфейсы IDispatch
  • Базовые интерфейсы API системы КОМПАС
  • Пример программной реализации трехмерной операции
  • Первая библиотека к КОМПАС-3D
  • Разработка мини-САПР зубчатых колес
  • Резюме
  • Глава 6

    Расширение возможностей системы

    • Создание библиотек фрагментов и моделей

    • Создание библиотек шаблонов

    • Создание библиотек с помощью КОМПАС-Макро

    • КОМПАС-Мастер

    • Резюме


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

    Огромное количество различных по своей сути технологий, использующих САПР, – это первая причина, почему любая из современных CAD-систем должна быть максимально открытой и обязательно включать в себя инструменты для создания пакета пользовательских библиотек. Еще одним фактором является ориентация на спрос на рынке. Если 90 из 100 предприятий, использующих, например, КОМПАС, заняты тяжелым машиностроением, а остальные 10 – выпуском медицинского оборудования, то разработчики прикладных библиотек для КОМПАС (как и самого КОМПАС) в первую очередь ориентируются на тех, кто проектирует машиностроительные агрегаты.

    Возникает вопрос: а что же делать тем предприятиям и проектным организациям, которые со своими специфическими требованиями не попадают под большинство, и их не устраивают стандартные библиотеки КОМПАС? На самом деле проблемы нет – они могут делать библиотеки сами!

    Создать собственную библиотеку можно одним из четырех способов:

    • организовать библиотеку параметризированных фрагментов (эскизов) или моделей на основе базовых возможностей системы КОМПАС-3D;

    • создать библиотеку шаблонов с помощью специального приложения – Менеджера шаблонов;

    • использовать специальную макросреду КОМПАС-Макро для подготовки пользовательского приложения;

    • применить инструментальные средства КОМПАС-Мастер, то есть собственно написать (создать при помощи программирования) библиотеку неограниченной сложности. С использованием КОМПАС-Мастер были разработаны библиотеки Редуктор-2D и Редуктор-3D, описанные в предыдущей главе.

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

    Под сложностью библиотеки следует понимать уровень автоматизации тех конструкторских решений, которые будут реализованы в создаваемом приложении. Однако не стоит думать, что чем более автоматизированной получится библиотека, тем она будет лучше. Это не всегда так, особенно если ваше творение будут применять на практике другие люди. Слишком автоматизированные библиотеки не оставляют места инициативе и не дают возможность варьировать решения, а это очень плохо – не нужно, чтобы ваш модуль старался быть умнее конструктора, его использующего.

    Создание библиотек фрагментов и моделей

    Для создания этого типа библиотек вам не потребуется никаких специальных навыков, кроме умения работать в КОМПАС-График или КОМПАС-3D. Библиотеки фрагментов или моделей формируются с помощью стандартных инструментов, предназначенных для работы с подключаемыми модулями, и могут содержать в себе как простые изображения, так и сложные параметрические эскизы и модели.

    Суть разработки таких библиотек состоит в том, чтобы дать возможность каждому проектировщику сформировать свой набор наиболее используемых типовых элементов, чтобы облегчить к ним доступ при разработке новых чертежей или моделей. Однажды построенное и сохраненное изображение можно будет многократно использовать в каждом новом чертеже или эскизе, что избавит вас от необходимости тратить время на частое рисование типовых элементов.

    Библиотека фрагментов (файл с расширением LFR) или библиотека моделей (файл L3D) могут включать в себя неограниченное количество подразделов, а каждый раздел может вмещать сколько угодно эскизов или деталей.

    Создать свою библиотеку фрагментов совсем несложно. Для этого в окне менеджера библиотек нужно воспользоваться командой контекстного меню Добавить описание > библиотеки документов. В появившемся диалоговом окне открытия библиотеки следует выбрать тип файла: КОМПАС-Библиотеки фрагментов (*.lfr), если вы создаете хранилище для чертежей или эскизов, или КОМПАС-Библиотеки моделей (*.l3d), для наполнения будущей библиотеки 3D-моделями. Далее в поле Имя файла необходимо набрать название вашей библиотеки и нажать кнопку Открыть. Поскольку самого файла библиотеки фрагментов еще не существует, система выдаст запрос, создавать ли его, на который следует ответить утвердительно. В результате в окне менеджера библиотек должна появиться ваша библиотека, пока еще пустая. После ее запуска в ней можно помещать новые разделы, добавлять или формировать фрагменты и модели с помощью команд контекстного меню.

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

    Разумеется, сначала необходимо вычертить и параметризировать само изображение паза. Для этого создайте документ КОМПАС-Фрагмент, сохраните его куда-нибудь на жесткий диск. Включите в этом документе параметризацию ввода графических объектов (если вы помните, по умолчанию при вводе объектов в графических документах параметризация отключена). Чтобы включить автоматическую параметризацию при вводе, выполните команду Сервис > Параметры, после чего на вкладке Текущий фрагмент появившегося диалогового окна в разделе Параметризация установите флажки для всех типов объектов и операций (рис. 6.1).

    Рис. 6.1. Включение автоматической параметризации для текущего фрагмента


    Далее, пользуясь вспомогательной геометрией, самостоятельно вычертите изображение шпоночного паза так, чтобы его геометрический центр совпадал с началом координат фрагмента (рис. 6.2). В начале координат установите графический объект точка (команда Точка) и зафиксируйте ее. Чтобы зафиксировать точку, нажмите кнопку Зафиксировать точку

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

    Рис. 6.2. Параметрическое изображение профиля шпоночного паза


    Примечание

    Если после параметризации у вас на чертеже не отображаются ограничения, наложенные на графические объекты (вертикальность, совпадение точек), выполните команду Отображать ограничения

    (кнопка находится на панели Параметризация).

    Теперь необходимо установить размеры паза и переменные, соответствующие каждому размеру.

    1. Перейдите на панель инструментов Размеры и с помощью команды Линейный размер постройте четыре размера: первые два обозначающие ширину и рабочую длину паза, остальные два – расстояние от начала координат до крайней точки по ширине и крайней точки по длине (до скругления). Очевидно, что последние два размера равны половине соответствующих им первых двух размеров. После этого вызовите команду Радиальный размер и установите размеры радиусов закругления краев шпонки.

    2. Вернитесь на панель инструментов Параметризация и нажмите кнопку Установить значение размера

    По очереди щелкайте на каждом созданном размере и в окне Установить значение размера (рис. 6.3) вводите имена переменных фрагмента: для ширины и длины паза задайте переменные b и l, для двух других линейных размеров – b_2 и l_2, переменные, отвечающие радиусам скругления, установите равными b_2. Кроме того, все размеры, кроме длины и ширины паза, должны отмечаться как информационные (то есть их нельзя будет поменять вручную – изменяются они только в результате перестроения паза при изменении одной или нескольких неинформационных переменных).

    Рис. 6.3. Установка значения размера и имени переменной


    3. Вызовите окно редактора формул (кнопка Переменные на панели инструментов Стандартная). На вкладке Переменные появившегося окна в столбцах напротив переменных, отвечающих рабочей длине и ширине паза, установите флажок Внешняя (рис. 6.4), а на вкладке Уравнения задайте соотношения между параметрическими переменными: b=b_2*2 и l=l_2*2.

    Рис. 6.4. Завершение выполнения параметрического чертежа шпоночного паза


    Примечание

    Вкладка (панель) Уравнения вызывается щелчком на одноименной кнопке панели инструментов редактора формул.

    Формирование параметрического фрагмента закончено. Теперь можно приступить к созданию библиотеки.

    1. Выполните команду Добавить описание > библиотеки документов, в появившемся окне введите имя библиотеки – Шпоночный паз. После утвердительного ответа на запрос о создании библиотеки (рис. 6.5) вам будет предложено задать имя библиотеки, которое будет отображаться в менеджере библиотек. Введите, например, Профиль шпоночного паза и нажмите OK для подтверждения создания библиотеки.

    Рис. 6.5. Запрос подтверждения создания библиотеки фрагментов


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

    Рис. 6.6. Добавление фрагмента в библиотеку


    Примечание

    Вы можете создать фрагмент прямо в библиотеке. Для этого служит команда контекстного меню Новый фрагмент.

    После добавления фрагмента библиотека будет выглядеть следующим образом (рис. 6.7).

    Рис. 6.7. Фрагмент добавлен в библиотеку


    Теперь вы можете вставлять изображения профиле шпоночного паза из новой библиотеки в любой графический документ системы КОМПАС или в эскиз трехмерной операции. Для этого достаточно дважды щелкнуть на элементе в окне менеджера библиотек. При вставке элемента на вкладке Переменные панели свойств (рис. 6.8) вы можете изменять параметры фрагмента (те, которые были объявлены внешними в исходном документе).

    Рис. 6.8. Изменение значения внешних переменных фрагмента из библиотеки


    Файлы параметризированного фрагмента (Шпоночный паз.frw) и самой библиотеки фрагментов (Шпоночный паз.lfr) находятся на прилагаемом к книге компакт-диске в папке Examples\Глава 6.

    Аналогично создаются библиотеки моделей. Рассмотрим небольшой пример.

    Создавать параметрический трехмерный элемент нет необходимости, вы можете воспользоваться готовым, который был разработан в примерах к третьей главе (файл Параметризация.m3d в папке Examples\Глава 3). Как вы помните, в этом примере была выполнена параметрическая модель куба со скругленными ребрами, перестраивающаяся при изменении длины ребра. Однако перед дальнейшим использованием этой модели в библиотеке необходимо ее немного доработать.

    Откройте файл модели в КОМПАС-3D и вызовите редактор формул. Как вы видите, в данном элементе несколько характерных переменных, но только одна независимая. Переменную h необходимо объявить внешней, чтобы пользователи библиотеки моделей могли изменять ее значение при вставке.

    Для этого измените формулы в редакторе формул для файла Параметризация.m3d так, как это показано на рис. 6.9 (необходимо, чтобы значением внешней переменной в строке уравнений было число, а не ссылка на другую переменную). После этого выделите переменную h в списке переменных и выполните команду Внешняя контекстного меню. При этом ячейка в столбце Имя напротив переменной должна стать синей.

    Рис. 6.9. Объявление переменной модели внешней


    Далее порядок действий такой же, как и при формировании библиотеки фрагментов. Выполняем команду контекстного меню Добавить описание > библиотеки документов, только в списке Тип файла выбираем КОМПАС-Библиотеки моделей (*.l3d) и создаем библиотеку. Имя можете присвоить произвольное, например Куб.l3d.

    В библиотеку моделей вы можете добавлять как сборки, так и модели. Предусмотрена возможность создавать сборку или модель непосредственно в библиотеке. Элемент в состав библиотеки добавляется так же, как и для библиотек фрагментов, – с помощью контекстного меню. После добавления модели куба в библиотеку она будет выглядеть следующим образом (рис. 6.10).

    Рис. 6.10. Простая пользовательская библиотека моделей


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

    Список переменных с их текущими значениями размещается на вкладке Параметры панели свойств (рис. 6.11).

    Рис. 6.11. Настройки вставки параметрического элемента из библиотеки моделей


    Изменить значения переменных можно также и после вставки элемента в сборку. Для этого следует воспользоваться командой Редактировать контекстного меню, которое появляется при щелчке правой кнопкой мыши на узле данного элемента в дереве построений.

    Файл библиотеки моделей Куб.l3d, а также измененный файл параметрического куба Параметризация.m3d находятся на прилагаемом к книге компакт-диске в папке Examples\Глава 6.

    Главное преимущество библиотек фрагментов и моделей – простота создания и применения. Несомненно, эти приложения – наиболее используемые на практике пользовательские модули. Наверняка те, кто постоянно работает с системой КОМПАС, имеют целые комплекты таких библиотек-хранилищ, накопленные за годы проектирования.

    Еще одним плюсом библиотек фрагментов является то, что при появлении новых версий КОМПАС вам не нужно будет подгонять или изменять структуру библиотек под новую версию программы. Достаточно будет просто загрузить старый файл библиотеки в менеджере библиотек, и, можете не сомневаться, все будет работать.

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

    Более широкими возможностями, по сравнению с библиотеками фрагментов, обладают библиотеки шаблонов КОМПАС-3D.

    Создание библиотек шаблонов

    Приложение для создания библиотек шаблонов (по своей сути также прикладная библиотека к КОМПАС-3D, названная Менеджером шаблонов) позволяет создавать особый вид пользовательских прикладных библиотек. Эти библиотеки состоят из базового параметризированного чертежа или трехмерной модели, таблицы переменных, набранной в соответствии с некоторыми правилами в табличном редакторе Excel, и схемы – документа КОМПАС-3D или рисунка, содержащего имена переменных. Сама библиотека – это файл с расширением TLM, с помощью которого переменным параметризированного фрагмента или детали ставятся в соответствие значения, набранные в Excel-таблице.

    Разработку шаблона следует начинать с создания фрагмента (для двухмерного шаблона) или детали (для трехмерного), пользуясь стандартными средствами КОМПАС-График или КОМПАС-3D соответственно. После этого необходимо параметризировать вычерченный фрагмент или эскизы модели и определить как внешние все переменные, которые вы планируете вводить в таблице Excel. Если вы хотите, чтобы отдельные составляющие фрагмента-шаблона вставлялись в документ в различных комбинациях, их следует поместить на отдельные слои. С помощью менеджера создаваемый шаблон можно настроить таким образом, чтобы при вставке, в зависимости от названия, отдельные слои чертежа-заготовки удалялись из графического документа или удалялись все объекты, ограниченные графическими компонентами, которые входят в слои.

    Следующим шагом является создание таблицы Excel. В ней необходимо ввести названия переменных (при этом важно проследить, чтобы их имена и количество точно совпадали с именами и количеством внешних переменных фрагмента или модели); установить видимость колонок значений в менеджере шаблонов. Можно задать интервал значений, которые будет принимать переменная (в том числе сформировать раскрывающийся список ее дискретных значений, который будет отображен в соответствующей ячейке в таблице менеджера). И, наконец, заполнить таблицу необходимыми данными. Подробно о правилах заполнения таблиц для шаблонов вы можете узнать из файла-справки и примеров, поставляемых вместе с менеджером шаблонов.

    Формирование еще одной составной части шаблона – схемы параметров – не вызовет особых затруднений. Схема – это заставка, изображение конструктивного элемента, которое будет показано на одной из панелей менеджера шаблонов. Схемой может быть любой графический файл системы КОМПАС-3D (чертеж, фрагмент, деталь или сборка) или файл-рисунок в формате BMP, GIF, JPG и JPEG.

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

    Рис. 6.12. Начало создания библиотеки шаблонов


    Далее необходимо оформить древовидную структуру библиотеки, то есть разделы и подразделы, в которых будут размещены подготовленные вами шаблоны. Для этой цели на панели инструментов и в меню менеджера шаблонов есть команда Создать раздел. Завершающий этап подготовки библиотеки – наполнение разделов соответствующими шаблонами, для чего нужно воспользоваться командой Редактор > Создать шаблон. После ее выполнения появится окно, в котором для каждого шаблона нужно будет ввести имя, указать файл с параметризированным фрагментом или моделью, файл таблицы параметров Excel и заставку (необязательно).

    В результате библиотека шаблонов будет полностью готова к работе (рис. 6.13).

    Рис. 6.13. Пример библиотеки шаблонов сварных швов


    Все значения переменных, набранные в редакторе электронных таблиц Excel (рис. 6.14), будут ассоциированы с соответствующими им переменными шаблона. Теперь в окне менеджера шаблонов можно выбирать определенный шаблон, вводить значения переменных и вставлять его в документ.

    Рис. 6.14. Таблица параметров для одного из шаблонов библиотеки сварных швов


    Чем же существенно отличаются библиотеки шаблонов от библиотек фрагментов? Как уже говорилось, возможностью вставки в документ не всего фрагмента, а отдельных слоев и возможностью задавать список четко определенных значений для переменной, из которых пользователь может выбирать необходимую (например, стандартные модули зубчатых колес, диаметры резьбы, длину шпоночного паза и пр.). Кроме того, в шаблонах можно использовать различные типы переменных, среди которых логические и строковые, а в размерных надписях фрагмента-заготовки можно резервировать переменные для текстовых подстановок (они должны выделяться с обеих сторон знаком #). Однако самым главным преимуществом библиотек шаблонов перед библиотеками фрагментов является то, что при выборе и вставке шаблона вам не нужно будет изменять вручную параметризованные переменные, как это делалось бы при вставке фрагмента или модели из библиотеки фрагментов. Значения всех переменных будут автоматически выбраны из соответствующей шаблону таблицы.

    Безусловно, на разработку шаблонов уходит больше времени, а при создании и работе с библиотекой уже не обойтись одними навыками работы с КОМПАС-3D – нужно изучить принципы работы менеджера библиотек (для чего изрядно попотеть над справкой). Зато библиотека шаблонов дает возможность широко автоматизировать создание типовых элементов и, вместе с тем, не запрещает динамично управлять процессом формирования и вставки библиотечного элемента в графический или трехмерный документы.

    Создание библиотек с помощью КОМПАС-Макро

    КОМПАС-Макро – это интегрированная в систему КОМПАС-3D среда разработки конструкторских приложений на основе языка программирования Python. Почему за основу взят именно Python? Во-первых, Python распространяется бесплатно и, как следствие, нет никаких ограничений на использование программ, написанных на нем. И, во-вторых, на сегодняшний день Python – один из самых простых и понятных языков программирования. И при всей своей простоте он мало в чем уступает таким китам объектно-ориентированного программирования, как C++ или Delphi.

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

    При создании приложений в КОМПАС-Макро можно пользоваться как функциями КОМПАС-Мастер (о них будет рассказано ниже), так и специальными функциями макросреды, облегчающими разработку прикладных библиотек. Среди специальных функций КОМПАС-Макро следует отметить возможности простановки угловых, линейных и радиальных размеров, функцию вставки в документ фрагмента, рисования линии-выноски и пр. Синтаксис перечисленных методов значительно проще их аналогов, реализованных в КОМПАС-Мастер (например, вместо вызова одной функции создания линейного размера, при работе с API-функциями в КОМПАС-Мастер приходится объявлять и инициализировать три интерфейса).

    Чтобы использовать библиотеку КОМПАС-Макро, нужно обладать знаниями лексики и приемов работы с языком Python.

    Если же вы не понаслышке знакомы с основами объектно-ориентированного программирования и у вас есть желание разрабатывать настоящие библиотеки на базе КОМПАС-3D, то для вас есть один путь – использование инструментальных средств разработки прикладных библиотек КОМПАС-Мастер.

    КОМПАС-Мастер

    Во многих случаях одних средств параметризации для автоматизации тех или иных действий в процессе проектирования недостаточно, и новые проектируемые 3D-модели или чертежи хоть и схожи с эталоном, но имеют различия, не позволяющие использовать параметрические зависимости при построении. Например, когда какие-либо значения принимаются конструктивно или выбираются из справочников в зависимости от третьих величин. Иногда расчетные параметры модели изменяются дискретно (например, модуль зубчатых колес всегда согласовывается со стандартными значениями и не может принимать значений, отличных от приведенных в ГОСТ) или не связаны аналитически с любым другим параметром. Для определения таких параметров в библиотеку необходимо заложить достаточно сложный и гибкий алгоритм. Он может включать расчеты любой сложности, условия определения параметров, различные ограничения, связь с файлами данных и т. п. В таком случае никак не обойтись без программирования.

    Для этой цели программный пакет КОМПАС-3D располагает очень мощными инструментальными средствами разработки дополнительных модулей (прикладных 500 библиотек) – КОМПАС-Мастер, которые позволяют использовать всю силу современного объектно-ориентированного программирования совместно с функциями КОМПАС для создания очень гибких и функциональных приложений. Хорошо владея одним из языков программирования и основами трехмерного моделирования в КОМПАС-3D, можно научиться самостоятельно разрабатывать различные по структуре программные модули для решения узко-профильных задач конструирования. Такие приложения смогут производить сложные вычисления, самостоятельно выбирать необходимые параметры из баз данных, обмениваться данными с внешними приложениями и, в конце концов, построить 3D-модель или чертеж неограниченной сложности с учетом всех параметров (вспомните хотя бы Редуктор3D, описанный в гл. 5).

    Выбор того, что применять (параметризацию или программирование), зависит от поставленных перед вами задач. Если вам необходим просто набор надежно хранимых и удобных в использовании параметрических элементов, а главное – если с созданием самих этих элементов нет никаких проблем, конечно, лучше прибегнуть к параметризации и создавать простые библиотеки типовых элементов. Однако если вы планируете вводить в проектируемый модуль сложные аналитические расчеты, предполагаете, что модуль будет принимать решения вместо проектировщика, взаимодействовать с внешними приложениями, считывать или сохранять данные, то этот модуль должен быть полноценной программой. Другими словами, к средствам программирования следует прибегать лишь тогда, когда вам необходимо создавать мини-САПР.

    Конечно, практика разработки подключаемых модулей на языках Delphi, C++ и др. далеко не нова. Очень много известных приложений трехмерной графики формируют свою архитектуру открытой, предоставляя пользователям возможность расширять функциональность программ. Такими приложениями являются AutoCAD, Adobe Photoshop, 3ds Max (некоторые плагины для 3ds Max значительно расширяют функционал программы) и др. В этом разделе будет рассказано о создании пользовательских приложений на базе КОМПАС-3D в одной из самых популярных на сегодня сред программирования – Borland Delphi 7.

    Внимание!

    Данный раздел рассчитан на читателей как минимум знакомых с основами объектно-ориентированного программирования и имеющих представление о работе в программной среде Delphi 7. Вы должны знать основополагающие понятия программирования, такие как класс, объект, интерфейс, метод и пр. В противном случае рекомендую вам изучить какую-либо книгу о программировании в Delphi.

    КОМПАС-Мастер предоставляет доступ как к функциям КОМПАС-График, так и к функциям трехмерного моделирования в КОМПАС-3D. Сам доступ может реализоваться двумя путями:

    • с использованием экспортных функций, оформленных в виде DLL-модулей, которые разработчик подключает к своей программе при создании плоских чертежей, и с применением СОМ-объектов – при программном формировании твердотельных моделей;

    • при помощи технологии Automation (автоматизации). Эта технология реализована через API (Application Programming Interface, интерфейс прикладного программирования) системы КОМПАС. Управление и взаимодействие с системой при этом оформлено через интерфейсы IDispatch.

    Далее в этом разделе пойдет речь о программировании прикладных библиотек, работающих именно с трехмерным редактором КОМПАС-3D. По этой причине необходимо сказать о том, благодаря чему возможно создание таких прикладных модулей.

    Технология COM, автоматизация и интерфейсы IDispatch

    Поскольку программирование не является темой данной книги, мы не будем углубляться в суть понятий технологии COM и автоматизации. Я опишу эти вопросы вкратце, чтобы вы имели некоторое представление.

    С начала 1990 годов корпорация Microsoft разрабатывает технологию, позволяющую создавать гибкие модульные программы таким образом, чтобы отдельные модули можно было писать на разных языках программирования, но чтобы при этом обеспечивалась их полная взаимозаменяемость при использовании в различных программных пакетах. На сегодня эта технология полностью сформирована и называется COM (Component Object Model, модель компонентных объектов).

    Технология COM описывает методологию реализации компонентов программного обеспечения: объектов, которые могут повторно использоваться, могут быть неоднократно подключены к разным приложениям. Повторное использование компонентов стало логическим следствием эволюции объектно-ориентированного программирования и получило название компонентно-ориентированного подхода. Концепция компонентно-ориентированного программирования предусматривает полное отделение внутренних функций компонента от функций доступа к нему извне. Теперь, обращаясь к компоненту, необязательно знать его внутреннее устройство, для этого достаточно лишь иметь информацию о том, как вызывать его функции. Другими словами, необходимо знать, как взаимодействовать с компонентом и какой у него интерфейс. Такая функциональность в COM достигается за счет поддержки одного или нескольких интерфейсов, которые используются другими программами для доступа к внутренним членам и методам компонента.

    Таким образом, интерфейс – это то, что размещено между двумя объектами и обеспечивает связь между ними. Интерфейс-ориентированное программирование представляет собой технологию разработки программного обеспечения, жестко нацеленную на использование интерфейсов. Интерфейс является своего рода связующим звеном, предоставленным управляющей программе для доступа к COM-объекту.

    Объект COM – конкретный экземпляр COM-класса, завершенный объект с собственными членами данных и методами, который может легко встраиваться в программы или распространяться как отдельный программный продукт. COM-объект представляет собой или DLL-библиотеку или ЕХЕ-программу для Wіndows, которые можно создавать в любой среде программирования, способной поддерживать нужный формат представления. COM-объект может иметь много функций, доступ к которым происходит через его интерфейсы. Любой COM-объект должен иметь по крайней мере одни интерфейс ІUnknown, хотя на самом деле имеет их значительно больше.

    В свое время разработчики технологии COM пришли к заключению, что должен существовать некоторый механизм запроса интерфейса для определения его возможностей. Этот запрос также должен существовать для того, чтобы обеспечить обновление клиентскими программами значения счетчика ссылок на данный интерфейс. Данный счетчик определяет, как долго интерфейс будет оставаться доступным, прежде чем он будет удален из памяти. Именно для этой цели существует специальный интерфейс, который называется ІUnknown. Он имеет настолько важное значение, что основной принцип спецификации СОМ требует, чтобы все СОМ-объекты кроме своих специализированных интерфейсов поддерживали интерфейс ІUnknown. Причем каждый определенный для объекта интерфейс должен происходить от ІUnknown или от интерфейса, который в свою очередь сам происходит от ІUnknown. Данный принцип называется наследованием интерфейсов. В интерфейсе ІUnknown реализовано лишь три метода: Queryіnterface(), AddRef() и Release(). Метод Queryіnterface() определяет, является ли полученный интерфейс нужным. Методы AddRef() и Release() используются для подсчета ссылок на данный интерфейс при его применении многими программами. Перед началом использования COM-объекта клиент вызывает метод СОМ, тем самым увеличивая количество ссылок на интерфейс на единицу. После окончания работы с интерфейсом клиент должен вызвать функцию Release(), чтобы уменьшить количество ссылок на единицу. Когда счетчик ссылок для всех интерфейсов станет равным нулю, значит, объект больше никем не используется и его можно выгружать из памяти.

    На сегодняшний день технология СОМ используется практически во всех серьезных программах. Приведу один пример. Предположим, что пользователю в каком-нибудь отчете нужно поместить электронную таблицу с расчетами, которые ссылаются на определенные параметры в тексте. Чтобы выполнить любые вычисления без использования технологии СОМ, пришлось бы постоянно переключаться между двумя программами (Word и Excel), а информацию копировать (вырезать и вставлять). При помощи технологии COM можно применять функции электронной таблицы прямо в текстовом редакторе и автоматически форматировать полученный результат. Возможность реализовать операции такого рода называется автоматизацией.

    Цель автоматизации состоит в том, чтобы дать возможность программе предоставлять в использование сервисы, которые в ней присутствуют. Основной особенностью автоматизации является возможность комбинировать функции различных специализированных приложений в одном модуле. СОМ дает возможность программам передавать свою информацию в другие приложения и модули. Если бы каждая программа или приложение-сценарий могли бы поддерживать указатели и процедуру обхода указателей, то проблема была бы решена. Однако в некоторых языках программирования есть определенная трудность с процедурой обхода таблицы указателей. Некоторые из них, например Vіsual Basіc, не поддерживают указатели напрямую. Для решения этой проблемы был разработан специальный интерфейс, который разрешает любым языкам программирования, в том числе таким, как Vіsual Basіc, обращаться к методам COM-компонентов. Этот интерфейс получил название ІDіspatch.

    Итак, любая программа, которая предоставляет свои возможности другим приложениям (поддерживает автоматизацию), может делать это через интерфейс ІDіspatch. Интерфейс ІDіspatch происходит от базового интерфейса модели СОМ ІUnknown, тем не менее, в отличие от других COM-интерфейсов, ІDіspatch содержит метод Іnvoke(). Его можно использовать для действительного выполнения методов, которые поддерживает COM-объект. Клиент может выполнить любой метод COM-объекта, вызвав метод Іnvoke() интерфейса ІDіspatch. Этот механизм работает при помощи диспинтерфейса (интерфейса диспетчеризации). Диспинтерфейс определяет методы, которые будут доступны благодаря использованию метода Іnvoke() интерфейса ІDіspatch.

    Интерфейсы IDispatch можно применять в любой из наиболее распространенных сегодня сред программирования (Visual C++ Studio, Borland Delphi, Borland C++Builder, Visual Basic). Именно этим КОМПАС-Мастер выгодно отличается от КОМПАС-Макро: вам не придется изучать малознакомый язык программирования, вы можете создавать свои приложения в той среде, к которой привыкли.

    Базовые интерфейсы API системы КОМПАС

    Как вы уже поняли, взаимодействие внешнего приложения или подключаемого модуля с системой КОМПАС (с функциями моделирования, математическими функциями ядра системы и пр.) осуществляется посредством программных интерфейсов, называемых API. В КОМПАС на данный момент существуют API двух версий: API 5 и API 7. Сразу предостерегаю вас от ошибочного мнения, что API 7 – это усовершенствованный и более новый вариант программных интерфейсов пятой версии. На самом деле обе версии реализуют различные функции системы и взаимно дополняют друг друга. Отсюда, полагаю, очевидно, что обе версии программных интерфейсов в равной мере поддерживаются и развиваются с учетом самих изменений в системе.

    В основном, для создания полноценных подключаемых модулей достаточно методов и свойств интерфейсов API 5.

    Примечание

    В этом разделе рассмотрены главные интерфейсы и их методы, касающиеся только работы в трехмерном редакторе КОМПАС-3D.

    Главным интерфейсом API системы КОМПАС является KompasObject. Получить указатель на этот интерфейс (если быть точным, на интерфейс приложения API 5) можно с помощью экспортной функции CreateKompasObject(). Методы этого интерфейса, главные из которых представлены в табл. 6.1, реализуют наиболее общие функции работы с документами системы, системными настройками, файлами, а также дают возможность получить указатели на другие интерфейсы (интерфейсы динамического массива, работы с математическими функциями, библиотек моделей или фрагментов и различных структур параметров определенного типа).

    Таблица 6.1. Методы интерфейса KompasObject

    Описание прототипов всех приведенных функций, а также других методов, составляющих интерфейс KompasObject, вы найдете в справке по API КОМПАС. Файл этой справки размещается в каталоге SDK, находящейся в папке, в которой установлен КОМПАС (например, по умолчанию это C:\Program Files\ASCON\KOMPAS-3D V10\SDK).

    Другой важный интерфейс API 5 – интерфейс документа модели ksDocument3D.

    Получить его можно с помощью методов интерфейса KompasObject:

    • ActiveDocument3D – для уже существующего и активного в данный момент документа;

    • Document3D – если вы планируете создавать новый трехмерный документ.

    Примечание

    Графические документы имеют собственный интерфейс – ksDocument2D, со своими специфическими свойствами и методами. Этот интерфейс здесь не описывается, но нам не раз придется с ним сталкиваться даже при трехмерном программировании, поскольку изображения в эскизах трехмерных операций создаются именно с помощью функций, присутствующих в ksDocument2D.

    Свойства (члены данных) этого интерфейса позволяют динамически управлять настройками любого трехмерного документа системы из вашего модуля. Наиболее используемые из них приведены в табл. 6.2.

    Таблица 6.2. Свойства интерфейса ksDocument3D

    Методы этого интерфейса позволяют программно управлять трехмерным документом, как сборкой и ее компонентами, так и отдельной деталью. Обратите внимание: именно управлять самим документом, но не выполнять в нем трехмерные операции! Методы, которые могут пригодиться вам при программировании подключаемых модулей, собраны в табл. 6.3.

    Таблица 6.3. Методы интерфейса ksDocument3D

    Важнейший из перечисленных в табл. 6.3 методов – ksDocument3D::GetPart. Входящим параметром этой функции является целочисленная переменная type_, которая определяет, интерфейс какого именно компонента сборки возвращать. Данная переменная имеет несколько предопределенных значений (констант):

    • plnPlace_Part (равняется –4) – метод возвращает указатель на компонент, который находится в режиме контекстного редактирования (то есть редактирования «на месте»);

    • pNew_Part (–3) – создает в модели новый компонент и возвращает указатель на него;

    • pEdit_Part (–2) – возвращает указатель на редактируемый компонент (с помощью библиотеки);

    • pTop_Part (–1) – верхний компонент, в состав которого входит или новый, или редактируемый, или указанный компонент;

    • все остальные значения (от 0 и выше) отвечают номеру компонента в дереве построения, то есть возвращается указатель на существующий в сборке компонент.

    Метод ksDocument3D::GetPart возвращает указатель на интерфейс детали или компонента сборки – ksPart. Свойства и методы этого интерфейса (часть из которых приведена в табл. 6.4 и табл. 6.5) управляют состоянием компонентов сборки, они почти полностью дублируют команды контекстного меню и панели свойств, доступные пользователю при работе с тем или иным компонентом.

    Таблица 6.4. Свойства интерфейса ksPart

    Как видите, все эти методы лишь управляют состоянием компонента (задают видимость, размещение, определяют, запущено ли редактирование компонента), но не дают возможность ничего создавать (выполнять операции).

    Для программной реализации всех трехмерных операций, которые пользователи выполняют в трехмерных документах системы КОМПАС-3D, в API реализован единый интерфейс ksEntity – интерфейс элемента модели. Этот интерфейс можно получить с помощью метода ksPart::NewEntity, которому необходимо передать тип создаваемого элемента. Типов элементов в системе, как и в API системы, большое множество. Каждому из них отвечает своя целочисленная константа и свой собственный интерфейс параметров. Именно с помощью настроек (свойств и методов) этих интерфейсов и создаются любые возможные объекты в деталях и сборках КОМПАС-3D. Некоторые константы с описанием типа элемента и интерфейса, к которому они относятся, приведены в табл. 6.6. Сведения об остальных вы можете почерпнуть из файла справки SDK.hlp, поставляемого вместе с системой КОМПАС.

    Таблица 6.5. Методы интерфейса ksPart
    Таблица 6.6. Типы объектов трехмерного документа

    Члены данных интерфейса ksEntity соответствуют свойствам трехмерных элементов модели (о свойствах трехмерной модели читайте в подразд. «Свойства трехмерных объектов» разд. «Твердотельное моделирование в КОМПАС-3D» гл. 3).

    Среди методов наиболее важными являются три следующих:

    • Create – создает трехмерную операцию или объект вспомогательной геометрии по заданным настройкам;

    • ColorParam – возвращает указатель на интерфейс настроек цвета и оптических свойств элемента;

    • GetDefinition – получает указатель на интерфейс параметров объекта определенного типа (параметры данного трехмерного элемента). Именно с помощью этого метода можно получить указатель на любой интерфейс, приведенный в столбце «Интерфейс параметров» табл. 6.6.

    Таким образом, создание какой-либо трехмерной операции пользовательской программой сводится к такой последовательности шагов.

    1. Инициализация главного интерфейса приложения API – KompasObject. Он инициализируется один раз для всего сеанса работы программы.

    2. Инициализация интерфейса трехмерного документ ksDocument3D, с последующим созданием нового документа или получением указателя на активный документ.

    3. Создание компонента и получение на него указателя (интерфейс ksPart). Для сборки это может быть готовый компонент, компонент, вставленный из файла или созданный «на месте». Для детали необходимо получить указатель на компонент типа pTop_Part.

    4. Создание с помощью метода ksPart::NewEntity интерфейса нужной нам операции. При этом в метод передается соответствующий идентификатор (например, для выдавливания – o3d_bossExtrusion).

    5. Получение с помощью метода ksEntity::GetDefinition указателя на интерфейс параметров конкретной операции (для выдавливания этим интерфейсом является ksBossExtrusionDefinition). Настройка этих параметров необходимым пользователю образом.

    6. Создание операции с помощью метода ksEntity::Create.

    Кроме перечисленных, в API системы КОМПАС существует еще большое множество различных интерфейсов, отвечающих за тот или иной аспект работы с программой. Небольшая их часть описана в табл. 6.7.

    Таблица 6.7. Некоторые дополнительные интерфейсы API КОМПАС

    Пример программной реализации трехмерной операции

    Рассмотрим выполнение трехмерной формообразующей операции вручную (то есть в самом КОМПАС) и с помощью воображаемого подключаемого модуля. В качестве примера выберем обычную операцию выдавливания на основе несложного эскиза, содержащего изображение окружности. Раздел var функции, реализующей выполнение операции, должен выглядеть подобно листингу 6.1.

    Листинг 6.1. Раздел объявлений функции построения операции выдавливания

    var

    doc3 : ksDocument3D;

    // интерфейс трехмерного документа

    doc2 : ksDocument2D;

    // интерфейс графического документа

    // используется для создания изображения в эскизе

    iPart : ksPart;

    // интерфейс детали

    planeXOY : ksEntity;

    // интерфейс плоскости, на которой будет размещен эскиз

    iSketch : ksEntity;

    // интерфейс эскиза

    iSketchDef : ksSketchDefinition;

    // интерфейс параметров эскиза

    iBossExtrusion : ksEntity;

    // интерфейс операции выдавливания

    iBossDef : ksCutExtrusionDefinition;

    // интерфейс параметров операции выдавливания

    color : ksColorParam;

    // интерфейс параметров цвета операции выдавливания

    Предположим, что документ-деталь и эскиз с окружностью радиусом 40 мм на плоскости XY уже созданы (это значит, что объекты doc3, doc2, planeXOY, iSketch, iSketchDef уже созданы и проинициализированы).

    Для выполнения операции выдавливания пользователь на панели инструментов Редактирование детали нажимает кнопку Операция выдавливания. При этом на панели свойств, которая по умолчанию закреплена в нижней части окна программы, отображаются вкладки с настройками данной операции (некоторые значения установлены по умолчанию), в результате чего пользователь получает возможность изменять эти настройки (рис. 6.15).

    Рис. 6.15. Настройки операции выдавливания на панели свойств


    Программно это все реализуется следующим образом (листинг 6.2).

    Листинг 6.2. Получение интерфейсов операции выдавливания и ее параметров

    // iPart – указатель на объект класса ksPart,

    // верхний элемент дерева построения детали

    // создание интерфейса операции выдавливания

    // с помощью метода ksPart::NewEntity,

    // которому передаем идентификатор o3d_bossExtrusion

    iBossExtrusion := ksEntity(iPart.NewEntity(o3d_bossExtrusion));

    if (iBossExtrusion <> nil) then

    begin

    // если создание прошло успешно

    // инициализируем интерфейс настроек операции выдавливания

    iBossDef := ksBossExtrusionDefinition(iBossExtrusion.GetDefinition);

    if (iBossDef <> nil) then

    begin

    end;

    end;

    Несколько замечаний. Данный фрагмент кода будет работать лишь в версиях КОМПАС-3D V8 Plus или выше, поскольку в этих версиях появилась возможность многотельного моделирования. При написании программ для более ранних версий КОМПАС, в качестве первой (подчеркиваю – лишь первой) операции выдавливания вместо константы типа o3d_bossExtrusіon следует использовать o3d_baseExtrusіon, то есть базовую операцию выдавливания (так как в КОМПАС-3D V8 и более ранних версиях в детали могло быть лишь одно тело, имеющее общую базовую формообразующую операцию). Для всех следующих операций нужно применять o3d_bossExtrusіon, как и в КОМПАС-3D V8 Plus и более поздних версиях. Еще одно отличие версии КОМПАС-3D V8 Plus от предыдущих состоит в названии класса для получения определения интерфейса (параметров операции). При многотельном моделировании можно сразу использовать ksBossExtrusіonDefіnіtіon, в более ранних версиях КОМПАС первым всегда должен применяться интерфейс ksBaseExtrusіonDefіnіtіon, а все следующие за ним – ksBossExtrusіonDefіnіtіon. Это, тем не менее, не приводит к серьезным усложнениям, так как методы и свойства этих двух классов идентичны.

    Все сказанное касается и других формообразующих операций (за исключением вырезания, которое по определению не может быть базовой операцией). Из чего следует, что в более ранних версиях КОМПАС и для кинематической операции, и для операции по сечениям первой всегда следует реализовать базовую операцию.

    Совет

    Даже если вы создаете плагин для версии КОМПАС-3D V8 Plus или выше, все равно желательно не забывать о первой операции, как о базовой. Мало ли в какой версии КОМПАС будут работать пользователи с вашей программой.

    Теперь рассмотрим параметры операции выдавливания и способы их настройки.

    1. Направление выдавливания в КОМПАС выбирается из раскрывающегося списка Направление на панели свойств (рис. 6.16).

    Рис. 6.16. Выбор направления операции выдавливания


    Программным аналогом направления является свойство directionType (тип – SmallInt) интерфейса ksBossExtrusіonDefіnіtіon (или ksBaseExtrusіonDefіnіtіon). Для него предопределены четыре значения:

    • dtNormal (прямое направление) – направление добавления материала совпадает с направлением нормали к базовой плоскости (то есть плоскости, в которой размещается эскиз выдавливания);

    • dtReverse (обратное направление) – направление выдавливания противоположно направлению нормали;

    • dtBoth (в оба направления) – величина выдавливания задается отдельно для каждого направления;

    • dtMіddlePlane (средняя плоскость) – выдавливание происходит в обе стороны от базовой плоскости на одинаковое расстояние, равное половине от указанной пользователем величины выдавливания.

    Направление выдавливания устанавливается очень просто (листинг 6.3).

    Листинг 6.3. Задание направления выдавливания

    iBossExtrusion := ksEntity(iPart.NewEntity(o3d_bossExtrusion));

    if (iBossExtrusion <> nil) then

    begin

    iBossDef := ksBossExtrusionDefinition(iBossExtrusion.GetDefinition);

    if (iBossDef <> nil) then

    begin

    // задаем направление выдавливания

    iBossDef.directionType := dtNormal;

    end;

    end;

    2. Способ выдавливания (рис. 6.17).

    Рис. 6.17. Выбор способа выдавливания


    Для этого типа настроек в API системы также предусмотрены константы:

    • etBlіnd (на расстояние) – проводит выдавливание на величину, заданную в поле Расстояние 1 (или Расстояние 2, если задано направление dtReverse или dtBoth);

    • etThroughAll (через все) – при наличии другой геометрии (других формообразующих операций) выдавливание происходит через все тело детали; значение величины выдавливания игнорируется;

    • etUpToVertexTo, etUpToVertexFrom (до вершины) – система переходит в режим ожидания указания пользователем вершины, до которой будет осуществлено выдавливание. Введенное значение величины выдавливания игнорируется. В программе эту вершину следует задать явно еще на этапе разработки проекта;

    • etUpToSurfaceTo, etUpToSurfaceFrom (до поверхности) – аналогично режиму построения до вершины, в данном режиме система ожидает выбора пользователем трехмерной поверхности. Значение величины выдавливания также игнорируется. Как и для вершины, плоскость в программе следует указывать явно;

    • etUpToNearSurface (к ближайшей поверхности) – выдавливание проводится к ближайшей поверхности, которую система автоматически определяет в направлении выдавливания.

    3. Расстояние выдавливания – вводится пользователем в соответствующем текстовом поле (полях).

    4. Угол наклона операции выдавливания. На панели свойств задается направление наклона (внутрь или наружу), а также сам угол наклона.

    Параметры операции, описанные в пп. 2–4, устанавливаются с помощью единого метода интерфейса ksBossExtrusіonDefіnіtіon::SetSideParam (листинг 6.4).

    Листинг 6.4. Задание способа, величины выдавливания, а также угла наклона

    iBossExtrusion := ksEntity(iPart.NewEntity(o3d_bossExtrusion));

    if (iBossExtrusion <> nil) then

    begin

    iBossDef := ksBossExtrusionDefinition(iBossExtrusion.GetDefinition);

    if (iBossDef <> nil) then

    begin

    iBossDef.directionType := dtNormal;

    // Если первый параметр имеет значение true,

    // это значит, что все следующие параметры

    // задаются для направления выдавливания dtNormal.

    // Если установить значение параметра равным false,

    // значит все следующие параметры

    // определяются для обратного направления.

    // Второй параметр задает способ выдавливания (etBlind);

    // третий параметр – величина выдавливания (25 мм);

    // четвертый параметр false – уклон вглубь (true – наружу)

    // последний параметр – величина уклона в градусах

    iBossDef.SetSideParam(true, etBlind, 25, false, 10);

    end;

    end;

    5. На вкладке Тонкая стенка пользователь может управлять параметрами толщины и способа формирования тонкой стенки или установить режим выдавливания сплошного тела (рис. 6.18).

    Рис. 6.18. Выбор режима построения тонкой стенки


    В программе это задается следующим образом (листинг 6.5). В примере выполняется операция выдавливания без тонкой стенки.

    Листинг 6.5. Задание параметров тонкой стенки

    iBossExtrusion := ksEntity(iPart.NewEntity(o3d_bossExtrusion));

    if (iBossExtrusion <> nil) then

    begin

    iBossDef := ksBossExtrusionDefinition(iBossExtrusion.GetDefinition);

    if (iBossDef <> nil) then

    begin

    iBossDef.directionType := dtNormal;

    iBossDef.SetSideParam(true, etBlind, 25, false, 10);

    // первый параметр false указывает на то,

    // надо ли строить тонкую стенку

    // второй параметр задает направление выдавливания

    // третий и четвертый параметры определяют толщину стенки

    // в прямом и обратном направлениях соответственно

    iBossDef.SetThinParam(false, dtNormal, 0, 0);

    // устанавливаем эскиз операции

    iBossDef.SetSketch(iSketch);

    end;

    end;

    В этом фрагменте кода также был задан эскиз операции с помощью метода ksBossExtrusіonDefіnіtіon::SetSketch. Мы приняли, что сам эскиз, как и упоминалось ранее, был создан до начала выполнения операции выдавливания.

    На вкладке Свойства можно также настроить цвет и оптические свойства создаваемого элемента. При программном построении элемента для этого сначала необходимо инициализировать еще один дополнительный интерфейс – ksColorParam. С помощью его свойств можно управлять визуальными характеристиками трехмерного элемента. Внесенные в функцию построения изменения показаны в листинге 6.6.

    Листинг 6.6. Установка визуальных свойств

    iBossExtrusion := ksEntity(iPart.NewEntity(o3d_bossExtrusion));

    if (iBossExtrusion <> nil) then

    begin

    // присваиваем имя трехмерной операции,

    // которое будет отображено в дереве построения

    iBossExtrusion.name := “Программная операция выдавливания”;

    // получаем указатель на интерфейс параметров цвета

    // и оптических свойств

    color := ksColorParam(iBossExtrusion.ColorParam);

    // с помощью макроса RGB задаем цвет – красный

    color.color := RGB(255, 0, 0);

    // задаем уровень зеркальности (в долях единицы)

    color.specularity := 0.8;

    // и блеск

    color.shininess := 1;

    iBossDef := ksBossExtrusionDefinition(iBossExtrusion.GetDefinition);

    if (iBossDef <> nil) then

    begin

    iBossDef.directionType := dtNormal;

    iBossDef.SetSideParam(true, etBlind, 25, false, 10);

    iBossDef.SetThinParam(false, dtNormal, 0, 0);

    iBossDef.SetSketch(iSketch);

    end;

    end;

    Теперь все свойства настроены нужным образом, и можно создавать саму трехмерную операцию выдавливания. В КОМПАС для этого необходимо нажать кнопку Создать объект, в программе – вызвать метод Create объекта интерфейса ksEntity. Окончательный вид функции приведен в листинге 6.7.

    Листинг 6.7. Операция выдавливания

    iBossExtrusion := ksEntity(iPart.NewEntity(o3d_bossExtrusion));

    if (iBossExtrusion <> nil) then

    begin

    iBossExtrusion.name := “Программная операция выдавливания”;

    color := ksColorParam(iBossExtrusion.ColorParam);

    color.color := RGB(255, 0, 0);

    color.specularity := 0.8;

    color.shininess := 1;

    iBossDef := ksBossExtrusionDefinition(iBossExtrusion.GetDefinition);

    if (iBossDef <> nil) then

    begin

    iBossDef.directionType := dtNormal;

    iBossDef.SetSideParam(true, etBlind, 25, false, 10);

    iBossDef.SetThinParam(false, dtNormal, 0, 0);

    iBossDef.SetSketch(iSketch);

    iBossExtrusion.Create; // создаем операцию

    end;

    end;

    Результат проделанной работы, как «вручную», так и с помощью подключаемого модуля, показан на рис. 6.19. Изображенный трехмерный элемент, как вы только что сами убедились, вполне может быть создан без какого-либо вмешательства пользователя, с помощью API КОМПАС.

    Рис. 6.19. Трехмерный элемент, созданный программно


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

    Первая библиотека к КОМПАС-3D

    Приведенный выше пример, демонстрирующий общий принцип программного выполнения трехмерных операций из внешнего приложения (плагина), вряд ли объяснил, как все-таки создать прикладную библиотеку для КОМПАС-3D. В этом разделе подробно рассмотрим разработку простейшей библиотеки, выводящей в среде КОМПАС сообщение «Привет из КОМПАСа!». Структура всех приложений для КОМПАС практически не отличается, поэтому такую библиотеку можно будет в дальнейшем использовать как заготовку для других более сложных утилит.

    Прикладная библиотека для КОМПАС-3D представляет собой обычную DLL (Dynamic Link Library – динамически подключаемая библиотека Windows), только с расширением RTW. Такая библиотека подключается к КОМПАС, как и любая другая, уже известным нам способом: через менеджер библиотек посредством команды контекстного меню Добавить описание > прикладной библиотеки.

    Для выполнения примера создайте на жестком диске папку FirstLib, а в ней папку dcu, в которой будут храниться файлы библиотек КОМПАС.

    Теперь можно приступить к выполнению проекта.

    1. Запустите Delphi и создайте шаблон DLL-библиотеки, который предлагается по умолчанию. Для этого выполните команду File > New > Other. Появится окно New Items (рис. 6.20) со всевозможными шаблонами Windows-приложений и файлами Delphi (исполняемый EXE-файл, консольное приложение, форма или компонент Delphi и пр.). На вкладке New этого окна выберите пункт DLL Wizard и нажмите кнопку OK.

    Рис. 6.20. Диалоговое окно New Items


    Если вы хорошо знакомы с Delphi, например не раз выполняли в этой среде динамически подключаемые библиотеки, то для вас будет привычным созданный файл-заготовка проекта, начинающийся со служебного слова library. Сохраните его на жесткий диск в папку FirstLib под именем Hello_KOMPAS.dpr.

    2. Теперь нужно связать этот файл с библиотеками типов КОМПАС, чтобы можно было пользоваться интерфейсами API. Выполните команду Project > Import Type Library, затем из списка Import Type Library появившегося окна выберите пункт Kompas6API5 (Version 1.0). При этом в текстовом поле под списком должен отобразиться путь к файлу библиотек типов КОМПАС (например,  C:\Program Files\ASCON\KOMPAS-3D V10\Bin\kAPI5.TLB). Выбрав указанный пункт, нажмите кнопку Create Unit (рис. 6.21).

    Рис. 6.21. Подключение библиотеки типов КОМПАС к Delphi


    Примечание

    Если в списке Import Type Library нет необходимого пункта, вы можете добавить его вручную, нажав кнопку Add и отыскав файл kAPI5.TLB (он находится в каталоге Bin папки, в которой установлен КОМПАС).

    3. За несколько секунд Delphi сгенерирует PAS-файл с именем Kompas6API5-TLB, который будет иметь описание всех интерфейсов API 5. Измените имя (заголовок) скомпилированного модуля (автоматически добавленного в проект библиотеки), с Kompas6API5-TLB на ksTLB и сохраните проект.

    4. Закройте окно, в котором был открыт файл Kompas6API5-TLB.pas, в редакторе кода Delphi и измените имя файла на ksTLB.pas. Сгенерированный файл Kompas6API5-TLB.pas с интерфейсами размещается в каталоге Imports папки, в которой установлен Delphi, например C:\Program Files\Borland\Delphi7\Imports.

    5. Скопируйте переименованный файл в каталог FirstLib\dcu вашего проекта.

    6. Перейдите в главное окно проекта. В разделе uses замените следующую строку: Kompas6API5-TLB in “C:\Program Files\Borland\Delphi7\Imports\Kompas6API5-TLB.pas” на ksTLB. Напомню вам о том, что путь к Kompas6API5-TLB.pas может быть другим (он зависит от того, где установлен Delphi). Однако это не имеет значения, поскольку запись генерируется системой автоматически при компиляции файла библиотек типов. Указывать путь к модулю ksTLB, который был скопирован в папку dcu проекта, нет необходимости.

    7. При компиляции прикладной библиотеки будут использованы множество различных файлов с описаниями интерфейсов, констант и пр. В принципе, они могут быть размещены где угодно (при этом в разделе uses следовало бы задавать каждый путь явно), но для удобства работы с проектом рекомендую хранить их в папке dcu, где уже находится файл ksTLB.pas. Где бы все эти файлы ни находились, в Delphi необходимо указать путь к ним. Для этого выполните команду Project > Options, после чего на вкладке Directories/Conditionals открывшегося окна настроек проекта (рис. 6.22) задайте пути к файлам проекта:

    Output directory – путь, по которому Delphi будет сохранять скомпилированный файл прикладной библиотеки (в нашем примере подойдет каталог FirstLib);

    Unit output directory и Search path – полный путь к каталогу FirstLib\dcu. По этим путям система будет искать необходимые файлы библиотек КОМПАСа, а также сохранять скомпилированные DCU-файлы.

    Рис. 6.22. Задание путей к файлам проекта прикладной библиотеки


    8. Перейдите на вкладку Application диалогового окна настроек проекта. В поле Target file extension введите расширение, которое будет применяться для файла будущей библиотеки – RTW. Нажмите OK, чтобы сохранить настройки.

    Теперь можете сохранить проект и выполнить компиляцию (для этого воспользуйтесь командой Project > Compile Hello_KOMPAS или сочетанием клавиш Ctrl+F9). В результате в папке FirstLib должна появиться пока еще пустая и бесполезная библиотека, файл которой назван системой Hello_KOMPAS.rtw.

    Чтобы RTW-библиотека, написанная на Delphi, могла взаимодействовать с КОМПАС, в ней обязательно должны присутствовать как минимум три функции (для сред программирования на базе языка C или C++ достаточно двух, так как функции LibraryName и LibraryId объединены в одну – unsigned int WINAPI LIBRARYID()):

    • LibraryEntry – точка входа в библиотеку;

    • LibraryName – возвращает имя библиотеки, отображаемое в менеджере библиотек;

    • LibraryId – возвращает идентификатор библиотеки (позже его можно использовать при работе с самой библиотекой, для подключения списка меню ее команд и пр.).

    Все эти функции обязательно должны быть экспортными, то есть экспортируемыми из данной DLL, чтобы система КОМПАС могла их видеть и вызывать. По этой причине их обязательно нужно вынести в раздел exports прикладной библиотеки.

    Добавьте описание этих функций в вашу библиотеку (листинг 6.8).

    Листинг 6.8. Три базовых функции RTW-библиотеки

    library Hello_KOMPAS;

    uses

    SysUtils, Classes, ksTLB;

    {$E rtw}

    {$R *.res}

    function LibraryName: PChar; pascal;

    begin

    Result := “Первая библиотека”;

    end;

    function LibraryId: integer; pascal;

    begin

    Result := 100;

    end;

    procedure LibraryEntry(command: WORD); pascal;

    begin

    end;

    exports

    LibraryName name “LIBRARYNAME”,

    LibraryId name “LIBRARYID”,

    LibraryEntry name “LIBRARYENTRY”;

    begin

    end.

    Скомпилируйте полученный код и подключите файл библиотеки к КОМПАС. Убедитесь, что в окне менеджера отобразилось заданное в функции LibraryName имя библиотеки. Запускать приложение не нужно, поскольку все равно ничего не произойдет – будет вызываться пустая функция точки входа в библиотеку LibraryEntry.

    Совет

    Любая создаваемая вами на Delphi библиотека будет иметь три указанные функции. Вы можете сохранить проект на данном этапе в какую-либо другую папку и в дальнейшем при разработках новых библиотек использовать его как заготовку.

    Теперь нужно сделать так, чтобы библиотека стала рабочей.

    Сначала необходимо в раздел uses добавить еще один подключаемый модуль – ksAuto, а сам файл этого модуля (ksAuto.pas) перенести в каталог FirstLib\dcu. Файл ksAuto.pas вместе с другими файлами библиотек API системы КОМПАС находится в каталоге SDK\Include папки, в которой установлена текущая версия КОМПАС-3D.

    Внутри ksAuto.pas есть многочисленные ссылки на другие файлы с определением классов КОМПАС API. Явно подключать их в разделе uses не нужно, но следует перенести в один каталог с файлом ksAuto.pas. Для данного проекта достаточно всего четыре файла (для более сложных понадобятся, конечно, и другие): ks2DCOM-TLB.pas, LDefin2D.pas, LibTool.pas и LtDefine.pas. Просто скопируйте эти файлы из SDK\Include в папку FirstLib\dcu вашего проекта.

    В файле проекта объявите глобальную переменную kompas типа KompasObject, а в процедуру входа в библиотеку добавьте следующий код (листинг 6.9).

    Листинг 6.9. Вывод текстового сообщения

    uses

    SysUtils, Classes, ksTLB, ksAuto;

    {$E rtw}

    {$R *.res}

    // глобальная переменная приложения КОМПАС API

    var kompas : KompasObject;

    // код пропущен

    procedure LibraryEntry(command: WORD); pascal;

    begin

    // инициализация объекта KompasObject

    // с помощью функции CreateKompasObject

    kompas := KompasObject(CreateKompasObject);

    // если все прошло успешно

    if (kompas = nil) then exit;

    // выводим первое сообщение

    kompas.ksMessage(“Привет из КОМПАСа!”);

    // обнуляем переменную kompas

    kompas := nil;

    end;

    Сохраните и скомпилируйте проект, после чего запустите библиотеку и выполните ее единственную команду. В результате библиотека выдаст первое приветственное сообщение (рис. 6.23).

    Рис. 6.23. Сообщение, посланное библиотекой


    Внимание!

    При компиляции проекта прикладная библиотека должна быть обязательно отключена в менеджере библиотек, иначе компилятор сообщит об ошибке.

    Исходные файлы этой простейшей библиотеки, а также сам исполняемый файл приложения Hello_KOMPAS.rtw находятся на прилагаемом к книге компакт-диске в папке Examples\Глава 6\Delphi Programming\FirstLib. При попытке компиляции исходных файлов на своем компьютере вы должны учитывать, что куда бы ни были скопированы исходники с диска, пути к файлам библиотек КОМПАС, указанные в настройках проекта, будут отличаться. По этой причине перед компиляцией обязательно отредактируйте эти пути (см. рис. 6.22) и лишь после этого выполняйте сборку библиотеки.

    Разработка мини-САПР зубчатых колес

    Для лучшего усвоения прочитанного материала разработаем мини-САПР, создающую по минимальному количеству исходных данных 3D-модель зубчатого колеса (как прямозубого, так и косозубого). В общих чертах задача такова: после вызова библиотеки пользователем появляется диалоговое окно, в котором он задает модуль, количество зубьев, ширину зубчатого венца, а также угол наклона зубьев колеса. По введенным параметрам, после нажатия кнопки Построение, библиотека должна сгенерировать трехмерную модель колеса.

    Выполните заготовку конструкторской библиотеки, как это было описано в предыдущем разделе. Чтобы немного облегчить себе задачу, вы можете воспользоваться готовым шаблоном, для чего скопируйте все исходные файлы предыдущего примера в новую директорию (назовем ее Gears3D) и сохраните проект под новым именем (Gears3D.dpr). Обязательно отредактируйте пути к файлам библиотек КОМПАС (то есть к папке Gears3D\dcu) в настройках проекта. Измените название библиотеки на Gears miniCAD и оставьте старый идентификатор библиотеки. Скопируйте из папки SDK\Include в каталог Gears3D\dcu еще один файл с описаниями констант, использующимися при инициализации различных интерфейсов, – ksConstTLB.pas. Затем можно, наконец, приступать к выполнению проекта.

    Поскольку взаимодействие с пользователем планируется осуществлять с помощью диалогового окна, в проект необходимо добавить диалоговую форму. Для этого выполните команду File > New > Form, после чего в инспекторе объектов настройте часть свойств формы (табл. 6.8), оставив остальные заданными по умолчанию.

    Таблица 6.8. Настройка свойств формы диалогового окна библиотеки

    После создания формы Delphi автоматически сгенерировал модуль (unit) с кодом ее описания. Удалите из этого модуля описание глобальной переменной GearsForm типа TGearsForm и сохраните модуль под именем BuildUnit.pas.

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

    Разместите указанные элементы управления приблизительно так, как показано на рис. 6.24.

    Рис. 6.24. Форма будущего диалогового окна библиотеки


    После создания формы необходимо обеспечить ее вывод в окне КОМПАС. Задача, на первый взгляд, сложная, но решается просто. Для вывода диалогового окна библиотеки нужно сделать следующее.

    1. Получить дескриптор главного окна КОМПАС.

    2. Запретить доступ пользователю к главному окну программы.

    3. Создать объект диалогового окна и вывести его на экран в модальном режиме.

    4. После закрытия пользователем окна библиотеки уничтожить окно и вернуть управление главным окном КОМПАС пользователю.

    5. Обнулить дескриптор приложения.

    Реализовать эту последовательность действий лучше всего в процедуре точки входа в библиотеку (листинг 6.10).

    Листинг 6.10. Вывод диалогового окна библиотеки

    procedure LibraryEntry(command: WORD); pascal;

    var GearsForm : TGearsForm;

    begin

    kompas := KompasObject(CreateKompasObject);

    if (kompas = nil) then exit;

    // получаем дескриптор главного окна КОМПАС

    Application.Handle := kompas.ksGetHWindow;

    // запрещаем доступ к главному окну

    kompas.ksEnableTaskAccess(0);

    // создаем объект диалогового окна

    GearsForm := TGearsForm.Create(Application);

    GearsForm.ks := kompas;

    // выводим диалог на экран

    GearsForm.ShowModal;

    // удаляем объект

    GearsForm.Free;

    // возвращаем доступ к окну

    kompas.ksEnableTaskAccess(1);

    Application.Handle := 0;

    kompas := nil;

    end;

    В приведенном фрагменте кода есть одна, на первый взгляд, непонятная строка – GearsForm.ks := kompas;. В действительности, здесь все просто. Поскольку обработка построения зубчатого колеса будет выполнена внутри класса формы TGearsForm, то для того, чтобы в нем не получать заново указатель на интерфейс KompasObject, этот указатель передается внешней переменной ks класса TGearsForm. Разумеется, эту переменную (типа KompasObject) необходимо предварительно добавить в раздел public описания класса формы. Перед этим подключите в разделе uses модуля BuildUnit следующие файлы (модули): ksTLB, ksAuto, ksConstTLB, LDefin3D, LDefin2D и math (последний не относится к КОМПАС API, это стандартный модуль математических функций Delphi).

    Скомпилируйте проект и подключите полученную библиотеку Gears3D.rtw к КОМПАС. Запустите ее и убедитесь, что после выполнения ее единственной команды в центре главного окна появляется созданное нами диалоговое окно.

    Перейдем к реализации обработчиков щелчка на кнопках. Начнем со второй (Отмена), поскольку ее обработчик чрезвычайно прост. Щелкните дважды в редакторе форм на кнопке Отмена и в обработчике, автоматически созданном в редакторе кода, введите всего одну строку, закрывающую форму (листинг 6.11).

    Листинг 6.11. Обработчик щелчка на кнопке Отмена

    procedure TGearsForm.Button2Click(Sender: TObject);

    begin

    if CloseQuery then Close;

    end;

    Процедура обработки нажатия кнопки Построение намного сложнее. Условно ее можно разделить на три части.

    1. Расчет геометрических параметров зубчатого колеса по введенным исходным данным.

    2. Создание пустого документа КОМПАС-Деталь.

    3. Собственно построение модели зубчатого колеса.

    Программное построение модели колеса реализуем такой последовательностью трехмерных операций.

    1. Сначала программно в плоскости XOY создается эскиз, содержащий контур половины сечения колеса (такой же, какой мы выполняли при моделировании вручную в гл. 3). На основании этого эскиза выполняется операция вращения, формирующая заготовку зубчатого колеса.

    2. Далее в плоскости YOZ строится второй эскиз с четырьмя окружностями, над которыми выполняется операция вырезания в два направления. Таким образом, мы получим отверстия в диске.

    3. Следующим шагом является выполнение выреза между зубьями в венце колеса. Для построения выреза воспользуемся первым из способов, предложенных в гл. 3. Напомню, этот способ заключается в построении выреза с помощью операции Вырезать по сечениям. При этом в модели колеса строится ряд эскизов-сечений, плоскости которых удалены от боковой поверхности колеса на величину l = i · b / (nс – 1) (где b – ширина колеса, nс – количество сечений или эскизов, i – порядковый номер эскиза). Для нашей библиотеки достаточно будет трех эскизов: по два на торцевых плоскостях колеса и один посредине – на плоскости YOZ. Это значит, что библиотека должна будет построить две вспомогательные плоскости, удаленные в обе стороны от плоскости YOZ на половину ширины венца зубчатого колеса. В каждой из трех плоскостей (двух вспомогательных и ортогональной YOZ) будет создано изображение эскиза выреза между зубьями, повернутое относительно вертикальной оси на угол ? = 2 · l · tg ? / dк, где ? – угол наклона линии зуба, dк – делительный диаметр зубчатого колеса (обоснование этой зависимости приведено в гл. 3). Для первой плоскости вместо l необходимо подставить 0, для второй (YOZ) – b/2, для третьей – b.

    4. В завершении создается ось на пересечении плоскостей XOZ и XOY. Относительно этой оси формируется массив по концентрической сетке вырезов между зубьями колеса. Количество копий устанавливается равным количеству зубьев колеса.

    Начнем с первого этапа реализации построения: расчета геометрических характеристик создаваемого колеса (листинг 6.12).

    Листинг 6.12. Расчет параметров колеса

    procedure TGearsForm.Button1Click(Sender: TObject);

    var

    // раздел объявления переменных

    // все объекты приведенных интерфейсов используются при построении

    doc3 : ksDocument3D;

    iPart : ksPart;

    PlaneXOY : ksEntity;

    PlaneXOZ : ksEntity;

    PlaneYOZ : ksEntity;

    SketchEntity : ksEntity;

    iSketchDef : ksSketchDefinition;

    doc : ksDocument2D;

    r : reference;

    iBaseRotatedEntity : ksEntity;

    Color : ksColorParam;

    iBaseRotatedDef : ksBaseRotatedDefinition;

    iSketch1Entity : ksEntity;

    iSketch1Def : ksSketchDefinition;

    iCutExtrusion : ksEntity;

    iCutExtrusionDef : ksCutExtrusionDefinition;

    iOffsetPlaneEntity : ksEntity;

    iOffsetPlaneDef : ksPlaneOffsetDefinition;

    iSketch2Entity : ksEntity;

    iSketch2Def : ksSketchDefinition;

    iSketch3Entity : ksEntity;

    iSketch3Def : ksSketchDefinition;

    iOffsetPlane1Entity : ksEntity;

    iOffsetPlane1Def : ksPlaneOffsetDefinition;

    iSketch4Entity : ksEntity;

    iSketch4Def : ksSketchDefinition;

    iCutLoftEntity : ksEntity;

    iCutLoftDef : ksCutLoftDefinition;

    Collect : ksEntityCollection;

    iAxis : ksEntity;

    iAxis2PlDef : ksAxis2PlanesDefinition;

    iCircularCopy : ksEntity;

    iCirCopyDef : ksCircularCopyDefinition;

    Collect1 : ksEntityCollection;

    // геометрические параметры колеса

    module : double;

    Lm, Dm : double;

    Dv : double;

    b_k, c : double;

    d_k, d_fk, d_ak : double;

    delta0 : double;

    z : integer;

    beta : double;

    Dotv : double;

    alfa1, alfa2 : double;

    begin

    Hide; // прячем диалоговое окно

    // считываем параметры, введенные пользователем в окне

    module := StrToFloat(Edit1.Text);

    z := StrToInt(Edit2.Text);

    Lm := StrToFloat(Edit3.Text);

    beta := StrToFloat(Edit4.Text);

    // диаметр отверстия под вал

    Dv := round(Lm/1.4);

    // ширину маточины и ширину колеса принимаем равными

    b_k := Lm;

    // диаметр маточины

    Dm := 1.8*Dv;

    // толщина диска, соединяющего маточину с ободом

    c := round(0.35*b_k);

    // толщина обода

    delta0 := round(2.5*module/cos(DegToRad(beta)));

    d_k := module*z; // делительный диаметр колеса

    d_ak := d_k+2*module; // диаметр выступов

    d_fk := d_k-2.5*module; // диаметр впадин

    // диаметр размещения центров отверстий в диске

    Dotv := (d_fk – 2*delta0 + Dm)/2;

    // создание детали...

    // построение модели...

    Close; // закрываем форму

    end;

    Если сейчас собрать приложение и попробовать запустить библиотеку, ничего происходить не будет, потому что пока ничего не создается и не строится.

    Следующий этап построения намного более интересен – он заключается в программном создании документа КОМПАС-Деталь (листинг 6.13). В данном листинге раздел описания переменных и расчет параметров колеса пропущен, а приведен только фрагмент кода, реализующий создание документа-детали. В процедуру построения (обработчик нажатия кнопки Построение) этот фрагмент должен быть вставлен сразу после расчетов.

    Листинг 6.13. Создание документа детали

    // получаем указатель на интерфейс трехмерного документа

    doc3 := ksDocument3D(ks.Document3D());

    // создаем документ

    // параметр false – в видимом режиме

    // параметр true – документ-деталь

    if doc3.Create(false, true) then

    begin

    // заполняем параметры документа

    doc3.author := “Максим Кидрук”;

    doc3.comment := “Зубчатое колесо”;

    doc3.drawMode := 3;

    doc3.perspective := true;

    doc3.UpdateDocumentParam();

    end else exit;

    // проверяем, как прошла инициализация

    if (doc3 = nil) then

    begin

    ks.ksMessage(“Не удалось создать документ!”);

    exit;

    end;

    Откомпилировав и запустив приложение, вы сможете наблюдать, как после закрытия диалогового окна (нажатия кнопки Построение) программа сама создаст пустой документ КОМПАС-Деталь.

    В листинге 6.14 приведен с небольшими сокращениями код построения трехмерной модели. Недостающие фрагменты кода вы можете взять из файла Examples\Глава 6\Delphi Programming\Gears3D\BuildUnit.pas на диске. Фрагмент кода содержит достаточно подробные комментарии, поэтому, полагаю, разобраться в нем будет несложно.

    Листинг 6.14. Построение модели колеса

    // получаем указатель на интерфейс детали

    iPart := ksPart(doc3.GetPart(pNew_Part));

    if (iPart <> nil) then

    begin

    // интерфейсы ортогональных плоскостей

    PlaneXOY := ksEntity(iPart.GetDefaultEntity(o3d_planeXOY));

    PlaneXOZ := ksEntity(iPart.GetDefaultEntity(o3d_planeXOZ));

    PlaneYOZ := ksEntity(iPart.GetDefaultEntity(o3d_planeYOZ));

    // интерфейс эскиза (половина контура сечения колеса)

    iSketchEntity := ksEntity(iPart.NewEntity(o3d_sketch));

    if (iSketchEntity <> nil) then

    begin

    // интерфейс параметров эскиза

    iSketchDef := ksSketchDefinition(iSketchEntity.GetDefinition);

    if (iSketchDef <> nil) then

    begin

    if (PlaneXOY <> nil) then

    begin

    // устанавливаем плоскость,

    // на которой создается эскиз

    iSketchDef.SetPlane(PlaneXOY);

    iSketchEntity.Create;

    // запускаем процесс редактирования эскиза

    // doc – указатель на интерфейс ksDocument2D

    doc := ksDocument2D(iSketchDef.BeginEdit);

    if (doc <> nil) then

    begin

    // вычерчиваем изображение эскиза

    // с помощью методов интерфейса ksDocument2D

    // код пропущен

    end;

    // завершение редактирования эскиза

    iSketchDef.EndEdit;

    end;

    end;

    end;

    // интерфейс базовой операции вращения

    iBaseRotatedEntity := ksEntity(iPart.NewEntity(o3d_baseRotated));

    // интерфейс параметров цвета и визуальных свойств

    Color := ksColorParam(iBaseRotatedEntity.ColorParam);

    Color.specularity := 0.8;

    Color.shininess := 1;

    if (iBaseRotatedEntity <> nil) then

    begin

    // интерфейс параметров вращения

    iBaseRotatedDef :=

    ksBaseRotatedDefinition(iBaseRotatedEntity.GetDefinition);

    if (iBaseRotatedDef <> nil) then

    begin

    // настройка параметров вращения

    iBaseRotatedDef.SetThinParam(false, dtNormal, 1, 1);

    iBaseRotatedDef.SetSideParam(true, 360);

    iBaseRotatedDef.toroidShapeType := false;

    iBaseRotatedDef.SetSketch(iSketchEntity);

    // создаем операцию вращения

    // результат – заготовка зубчатого колеса

    iBaseRotatedEntity.Create;

    end;

    end;

    // интерфейс эскиза (отверстия в диске)

    iSketch1Entity := ksEntity(iPart.NewEntity( o3d_sketch ));

    if (iSketch1Entity <> nil) then

    begin

    iSketch1Def := ksSketchDefinition(iSketch1Entity.GetDefinition);

    if (iSketch1Def <> nil) then

    begin

    if (PlaneYOZ <> nil) then

    begin

    // размещаем эскиз на плоскости YOZ

    iSketch1Def.SetPlane(PlaneYOZ);

    iSketch1Entity.Create;

    doc := ksDocument2D(iSketch1Def.BeginEdit);

    if (doc <> nil) then

    begin

    // изображение в эскизе – 4 окружности

    // создаются вызовом метода ksDocument2D::ksCircle

    doc.ksCircle(0, Dotv/2, 0.4*(d_fk/2-delta0-Dm/2), 1);

    doc.ksCircle(0, -Dotv/2, 0.4*(d_fk/2-delta0-Dm/2), 1);

    doc.ksCircle(Dotv/2, 0, 0.4*(d_fk/2-delta0-Dm/2), 1);

    doc.ksCircle(-Dotv/2, 0, 0.4*(d_fk/2-delta0-Dm/2), 1);

    end;

    iSketch1Def.EndEdit;

    end;

    end;

    end;

    // интерфейс операции Вырезать выдавливанием

    iCutExtrusion := ksEntity(iPart.NewEntity(o3d_cutExtrusion));

    if (iCutExtrusion <> nil) then

    begin

    // интерфейс параметров вырезания

    iCutExtrusionDef :=

    ksCutExtrusionDefinition(iCutExtrusion.GetDefinition);

    if (iCutExtrusionDef <> nil) then

    begin

    // настройка параметров

    iCutExtrusionDef.SetSketch(iSketch1Entity);

    // направление

    iCutExtrusionDef.directionType := dtBoth;

    // величина вырезания по каждому из направлений

    iCutExtrusionDef.SetSideParam(true, etBlind, c/2,

    0, false);

    iCutExtrusionDef.SetSideParam(false, etBlind, c/2,

    0, false);

    iCutExtrusionDef.SetThinParam(false, 0, 0, 0);

    // создаем отверстия в диске

    iCutExtrusion.Create;

    end;

    end;

    // интерфейс смещенной плоскости

    iOffsetPlaneEntity := ksEntity(iPart.NewEntity(o3d_planeOffset));

    if (iOffsetPlaneEntity <> nil) then

    begin

    // интерфейс параметров смещенной плоскости

    iOffsetPlaneDef :=

    ksPlaneOffsetDefinition(iOffsetPlaneEntity.GetDefinition);

    if (iOffsetPlaneDef <> nil) then

    begin

    // величина, базовая плоскость и другие параметры смещения

    iOffsetPlaneDef.Offset := b_k/2;

    iOffsetPlaneDef.SetPlane(PlaneYOZ);

    iOffsetPlaneDef.direction := false;

    // делаем плоскость скрытой

    iOffsetPlaneEntity.Hidden := true;

    // создаем вспомогательную плоскость

    iOffsetPlaneEntity.Create;

    end;

    end;

    // эскиз первого выреза между зубьями

    iSketch2Entity := ksEntity(iPart.NewEntity(o3d_sketch));

    if (iSketch2Entity <> nil) then

    begin

    iSketch2Def := ksSketchDefinition(iSketch2Entity.GetDefinition);

    if (iSketch2Def <> nil) then

    begin

    // базовая плоскость – вспомогательная iOffsetPlaneEntity

    iSketch2Def.SetPlane(iOffsetPlaneEntity);

    iSketch2Entity.Create;

    doc := ksDocument2D(iSketch2Def.BeginEdit);

    alfa1 := 360/z;

    doc.ksMtr(0, 0, 90, 1, 1);

    // вычерчивание изображения эскиза

    // вместо эвольвент для простоты

    // берем обычные дуги по трем точкам

    // код пропущен

    doc.ksDeleteMtr;

    iSketch2Def.EndEdit;

    end;

    end;

    // интерфейс второго эскиза выреза между зубьями

    iSketch3Entity := ksEntity(iPart.NewEntity(o3d_sketch));

    if (iSketch3Entity <> nil) then

    begin

    iSketch3Def := ksSketchDefinition(iSketch3Entity.GetDefinition);

    if (iSketch3Def <> nil) then

    begin

    // строим на плоскости YOZ

    iSketch3Def.SetPlane(PlaneYOZ);

    iSketch3Entity.Create;

    doc := ksDocument2D(iSketch3Def.BeginEdit);

    alfa2 := -RadToDeg(b_k*tan(DegToRad(beta))/d_k);

    doc.ksMtr(0, 0, 90, 1, 1);

    // вычерчивание изображения эскиза

    // вместо эвольвент для простоты

    // берем обычные дуги по трем точкам

    // код пропущен

    doc.ksDeleteMtr;

    iSketch3Def.EndEdit;

    end;

    end;

    // вторая смещенная плоскость

    iOffsetPlane1Entity := ksEntity(iPart.NewEntity(o3d_planeOffset));

    if (iOffsetPlane1Entity <> nil) then

    begin

    iOffsetPlane1Def :=

    ksPlaneOffsetDefinition(iOffsetPlane1Entity.GetDefinition);

    if (iOffsetPlane1Def <> nil) then

    begin

    // величина смещения та же

    iOffsetPlane1Def.Offset := b_k/2;

    // направление противоположное

    iOffsetPlane1Def.direction := true;

    iOffsetPlane1Def.SetPlane(PlaneYOZ);

    // делаем плоскость скрытой

    iOffsetPlane1Entity.Hidden := true;

    // создаем смещенную плоскость

    iOffsetPlane1Entity.Create;

    end;

    end;

    // третий (последний) эскиз выреза между зубьями

    iSketch4Entity := ksEntity(iPart.NewEntity(o3d_sketch));

    if (iSketch4Entity <> nil) then

    begin

    iSketch4Def := ksSketchDefinition(iSketch4Entity.GetDefinition);

    if (iSketch4Def <> nil) then

    begin

    // базовая плоскость – только что созданная смещенная

    iSketch4Def.SetPlane(iOffsetPlane1Entity);

    iSketch4Entity.Create;

    doc := ksDocument2D(iSketch4Def.BeginEdit);

    alfa2 := -RadToDeg(2*b_k*tan(DegToRad(beta))/d_k);

    doc.ksMtr(0, 0, 90, 1, 1);

    // вычерчивание изображения эскиза

    // вместо эвольвент для простоты

    // берем обычные дуги по трем точкам

    // код пропущен

    doc.ksDeleteMtr;

    iSketch4Def.EndEdit;

    end;

    end;

    // интерфейс операции Вырезать по сечениям

    iCutLoftEntity := ksEntity(iPart.NewEntity(o3d_cutLoft));

    if (iCutLoftEntity <> nil) then

    begin

    // интерфейс параметров операции по сечениям

    iCutLoftDef := ksCutLoftDefinition(iCutLoftEntity.GetDefinition);

    if (iCutLoftDef <> nil) then

    begin

    // интерфейс массива ksEntityCollection

    // коллекции эскизов для вырезания по сечениям

    Collect := ksEntityCollection(iCutLoftDef.Sketchs);

    // добавляем эскизы в колекцию

    Collect.Add(iSketch2Entity);

    Collect.Add(iSketch3Entity);

    Collect.Add(iSketch4Entity);

    // создаем операцию по сечениям

    // результат – первый вырез между зубьями в венце колеса

    iCutLoftEntity.Create;

    end;

    end;

    // интерфейс вспомогательной оси на пересечении двух плоскостей

    iAxis := ksEntity(iPart.NewEntity(o3d_axis2Planes));

    if (iAxis <> nil) then

    begin

    // интерфейс параметров вспомогательной оси

    // на пересечении плоскостей

    iAxis2PlDef := ksAxis2PlanesDefinition(iAxis.GetDefinition);

    if (iAxis2PlDef <> nil) then

    begin

    // задаем плоскости

    iAxis2PlDef.SetPlane(1, PlaneXOZ);

    iAxis2PlDef.SetPlane(2, PlaneXOY);

    // делаем ось невидимой

    iAxis.hidden := true;

    // создаем вспомогательную ось

    iAxis.Create;

    end;

    end;

    // интерфейс операции Массив по концентрической сетке

    iCircularCopy := ksEntity(iPart.NewEntity(o3d_circularCopy));

    if (iCircularCopy <> nil) then

    begin

    // интерфейс параметров операции копирования по массиву

    iCirCopyDef :=

    ksCircularCopyDefinition(iCircularCopy.GetDefinition);

    if (iCirCopyDef <> nil) then

    begin

    // коллекция операций для копирования

    Collect1 :=

    ksEntityCollection(iCirCopyDef.GetOperationArray);

    // операция всего лишь одна – вырезание зуба

    Collect1.Add(iCutLoftEntity);

    // количество копий, равно количеству зубьев

    iCirCopyDef.count2 := z;

    iCirCopyDef.factor2 := true;

    // ось копирования

    iCirCopyDef.SetAxis(iAxis);

    // создаем концентрический массив – колесо готово!

    iCircularCopy.Create;

    end;

    end;

    end;

    Если вы разобрались в приведенном фрагменте кода, добавьте его в создаваемый проект. Недостающие части скопируйте из файла модуля построения, который находится на прилагаемом к книге компакт-диске. В них нет ничего сложно, обычная последовательность ввода графических примитивов с помощью методов ksLineSeg, ksArcByAngle и ksCircle интерфейса ksDocument2D, просто они достаточно громоздки, чтобы приводить их полностью на страницах книги.

    Вновь соберите (перекомпилируйте) библиотеку. Перейдите в окно КОМПАС и запустите приложение из менеджера библиотек. Введите исходные данные для зубчатого колеса (например, модуль – 3, 5 мм, количество зубьев – 56, ширина зубчатого венца – 60 мм и угол наклона линии зубьев – 15°) и нажмите кнопку Построение.

    Внимание!

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

    Всего за несколько секунд программа построит по указанным данным 3D-модель косозубого зубчатого колеса (рис. 6.25).

    Рис. 6.25. Трехмерная модель зубчатого колеса, созданная программно


    С помощью такой небольшой утилиты вы можете создавать зубчатые колеса практически любых размеров, с произвольным углом наклона зубьев, а также прямозубые. Все исходные файлы проекта, а также сам файл библиотеки находятся на прилагаемом к книге компакт-диске в папке Examples\Глава 6\Delphi Programming\Gears3D. Если вы собираетесь рассматривать уже готовый проект, не забудьте после копирования его на жесткий диск изменить в настройках пути к подключаемым модулям КОМПАС API. Только после этого выполняйте компиляцию.

    Немного усовершенствуем прикладную библиотеку так, чтобы формируемая модель не создавалась в документе-детали, а вставлялась в текущую сборку с помощью трехмерного фантома. Для этого выполните следующее.

    1. В модуле BuildUnit в разделе public класса формы объявите новую переменную cancel типа boolean. Эта переменная будет служить индикатором действий пользователя: true – если пользователь прервал работу приложения и false – если построение зубчатого колеса было начато. После этого в обработчике события OnCreate создания формы присвойте данной переменной значение true (чтобы создать обработчик, достаточно дважды щелкнуть кнопкой мыши в любой точке формы, не занятой элементом управления).

    2. В обработчике щелчка на кнопке Отмена перед закрытием формы также установите значение переменной cancel равным true (хотя это необязательная операция). Только при нажатии кнопки Построение переменная cancel должна получить значение false.

    3. В вызове метода создания трехмерного документа doc3.Create(false, true) замените первый параметр на true – doc3.Create(true, true). В результате модель зубчатого колеса будет строиться в невидимом режиме.

    4. В самый конец процедуры обработки нажатия кнопки Построение перед закрытием диалогового окна добавьте код, сохраняющий построенную модель на жесткий диск (листинг 6.15). В примере деталь сохраняется в папку C:\gear.m3d. Путь, как и название файла, вы можете выбирать произвольными, при желании можете организовать их запрос у пользователя.

    Листинг 6.15. Сохранение построенной детали

    // doc3 – указатель на интерфейс ksDocument3D

    // построенной детали

    doc3.SaveAs(“C:\gear.m3d”);

    doc3.close;

    // закрытие диалогового окна

    Close;

    5. Перейдите в главный файл проекта. В раздел uses подключите три дополнительных модуля: ksConstTLB, LDefin3D и LDefin2D. Эти модули понадобятся для объявления объектов интерфейсов, участвующих в создании трехмерного фантома. В начало процедуры входа в библиотеку, сразу после инициализации объекта KompasObject, добавьте код проверки активного документа (листинг 6.16).

    Листинг 6.16. Проверка типа активного документа

    // получаем указатель на активный трехмерный документ

    doc3 := ksDocument3D(kompas.ActiveDocument3D());

    // если указатель nil или документ является деталью

    if (doc3 = nil) or (doc3.IsDetail) then

    begin

    // выдаем сообщение и прекращаем работу библиотеки

    kompas.ksMessage(“Текущий документ не является сборкой!”);

    kompas := nil;

    exit;

    end;

    6. После закрытия диалогового окна библиотеки документ КОМПАС-Деталь, который и так создавался в невидимом режиме, закрывается, поэтому ничего пока происходить не будет. Чтобы организовать вставку модели фантомом в произвольную точку сборки, после завершения модального показа окна библиотеки должен выполниться следующий код (листинг 6.17). Разумеется, переменные doc3, rInfo и iPart должны быть предварительно объявлены в разделе var функции LibraryEntry.

    Листинг 6.17. Вставка модели колеса в сборку фантомом

    // если построение не было отменено

    if not GearsForm.cancel then

    begin

    // возвращаем доступ к главному окну

    kompas.ksEnableTaskAccess(1);

    // получаем интерфейс новой детали в сборке

    iPart := ksPart(doc3.GetPart(pNew_Part));

    // устанавливаем имя файла компонента

    iPart.fileName := “C:\gear.m3d”;

    // интерфейс запроса пользователя об указании

    // точки вставки

    rInfo := ksRequestInfo3D(doc3.GetRequestInfo(iPart));

    // задаем функцию обратной связи

    rInfo.SetCallBack(“SELECTCALLBACKPROC”, hInstance, nil);

    // создаем фантом колеса

    rInfo.CreatePhantom;

    // если пользователь установил компонент

    if doc3.UserGetPlacementAndEntity(0) then

    begin

    // размещаем его

    iPart.SetPlacement(rInfo.GetPlacement);

    doc3.SetPartFromFile(“C:\gear.m3d”, iPart, true);

    iPart.UpdatePlacement;

    end;

    end

    else kompas.ksEnableTaskAccess(1);

    7. После завершения работы библиотеки (пользователь указал точку вставки и зафиксировал компонент) уничтожаем форму и обнуляем все использовавшиеся переменные (листинг 6.18).

    Листинг 6.18. Обнуление переменных

    GearsForm.Free; // освобождаем объект формы

    Application.Handle := 0; // обнуляем дескриптор главного окна

    doc3.SetActive; // делаем активным окно текущей сборки

    doc3 := nil; // обнуляем указатель на документ

    kompas := nil; // и на КОМПАС

    В листинге 6.17 одним из методов интерфейса ksRequestInfo3D объекту этого интерфейса передается адрес функции обратного вызова SELECTCALLBACKPROC. Эту функцию система вызывает из библиотеки каждый раз, когда пользователь указывает какой-либо объект в окне документа или фиксирует точку. В общем случае внутри этой функции происходит фильтрация указанных пользователем объектов и реализация определенных действий по результатам фильтрации. Например, при вставке болта из библиотеки стандартных изделий вы сначала указываете цилиндрическую поверхность, куда вставится болт (то есть отверстие под болт), а потом плоскую грань, на которую установится шапочка болта. Причем система точно знает, что именно вы указали (сначала цилиндрическую грань, затем плоскую) и какие сопряжения в зависимости от заданного трехмерного элемента накладывать на библиотечный элемент. Это и есть пример действия функции обратного вызова.

    В нашей программе мы не будем реализовывать фильтр выбранных объектов, то есть при вставке модели колеса в документ нужно будет просто указать точку в трехмерном пространстве сборки. По этой причине функция обратного вызова будет чрезвычайно проста (листинг 6.19).

    Листинг 6.19. Функция обратного вызова

    function SelectCallBackProc(entity: ksEntity; rInfo: ksRequestInfo3D): integer;

    stdcall; Export;

    begin

    Result := 1;

    end;

    Чтобы КОМПАС мог вызывать эту функцию из библиотеки, ее обязательно следует объявить как экспортную (листинг 6.20).

    Листинг 6.20. Добавление функции обратного вызова в раздел exports

    exports

    LibraryName name “LIBRARYNAME”,

    LibraryId name “LIBRARYID”,

    LibraryEntry name “LIBRARYENTRY”,

    SelectCallBackProc name “SELECTCALLBACKPROC”;

    На этом все. Скомпилируйте проект и запустите библиотеку. Теперь КОМПАС будет создавать трехмерную модель в скрытом режиме. Сразу же после завершения построения трехмерная модель колеса появится в окне активной сборки в фантомном отображении, перемещаясь за указателем мыши (рис. 6.26).

    Рис. 6.26. Вставка модели, созданной библиотекой, в виде фантома в произвольную точку сборки


    Чтобы вставить модель зубчатого колеса в сборку, необходимо указать точку вставки, щелкнув кнопкой мыши в нужном месте окна представления документа или задав координаты вручную, после чего обязательно нажать кнопку Создать объект на панели специального управления (или воспользоваться сочетанием клавиш Ctrl+Enter).

    Еще одной важнейшей особенностью этого приложения является то, что оно запускается только при активном документе типа КОМПАС-Сборка. Для всех других типов документов или для случая, когда активных документов вообще нет, библиотека будет выдавать сообщение (рис. 6.27) и сразу прекращать работу.

    Рис. 6.27. Сообщение библиотеки о неверном типе документа


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

    Рис. 6.28. Трехмерные модели зубчатых колес, создаваемые библиотекой Gears miniCAD


    Файлы с исходными кодами этой версии мини-САПР зубчатых колес вы найдете на прилагаемом к книге компакт-диске в папке Examples\Глава 6\Delphi Programming\GearsEx. В этом же каталоге размещен уже скомпилированный файл библиотеки GearsEx.rtw.

    Таким образом, КОМПАС-Мастер – это очень мощные инструментальные средства разработки приложений (библиотек) неограниченной сложности, функционирующих в среде КОМПАС-3D. С помощью этих средств программист может получить доступ ко всем без исключения функциям системы. Все, что пользователь делает вручную (будь то создание или редактирование графического документа, открытие и закрытие файлов, работа со спецификациями, создание таблиц, оформление чертежей, сохранение файлов в различных форматах, вставка рисунков и т. д.), можно автоматизировать с использованием КОМПАС-Мастер.

    Однако при использовании КОМПАС-Мастер, в отличие от библиотек фрагментов или шаблонов, не обойтись одними знаниями КОМПАС. Для программирования библиотек в первую очередь надо четко определить задачу, которая будет решаться с помощью создаваемого приложения, а также выяснить все возможные пути ее решения (для составления правильного алгоритма). Естественно, необходимо досконально освоить приемы работы с одной из вышеназванных сред программирования, чтобы все это правильно спрограммировать. Разработчик прикладных САПР должен быть одновременно и инженером, и программистом, и при этом обладать немалым терпением. Нужно быть готовым тратить время и нервы на нелегкую отладку программ, ведь каким бы профессионалом вы ни были, ошибки будут всегда, а их поиск и устранение могут быть не менее долгими и утомительными, чем сам процесс написания библиотеки.

    Зато, преодолев все эти трудности, вы получите удобное и гибкое приложение, обладающее функционалом и интерфейсом, полностью удовлетворяющими вашим требованиям. Уровень автоматизации выполнения процессов, достигаемый в нем при использовании КОМПАС-Мастер, ничем не ограничен (только вашим желанием трудиться и вашими способностями). В программу можно заложить не только возможность чертить или строить что-либо, ее можно заставить «думать» – самостоятельно выбирать, анализировать и обрабатывать необходимые данные, производить определенные действия в зависимости от прочитанных значений, выполнять сложные расчеты и делать выводы по их результатам и пр. Все это может максимально облегчить работу инженера.

    Резюме

    В данной главе рассмотрены способы расширения стандартных возможностей, предоставляемых системой КОМПАС-3D.

    В начале идет краткое обоснование, почему необходимо обеспечивать возможность расширения функционала любой CAD-системы, а также описание того, что в этом отношении предлагает КОМПАС-3D. Пользователи для максимального приближения возможностей системы к своим потребностям могут применить один из четырех способов: создание библиотеки фрагментов, создание библиотеки шаблонов, использование КОМПАС-Макро или КОМПАС-Мастер. Затем в главе более подробно рассказывается о каждом из способов.

    Большая часть главы посвящена инструментальным средствам разработки прикладных библиотек для системы КОМПАС – макросреде КОМПАС-Мастер. В соответствующем разделе приведена информация о принципах организации КОМПАС API, о базовых интерфейсах системы, а также об особенностях создания приложений для трехмерного редактора КОМПАС. В качестве примера подробно разобран процесс разработки в среде Delphi 7 мини-САПР, создающей трехмерные модели зубчатых колес в КОМПАС-3D. Все примеры снабжены достаточно подробными комментариями, а файлы с их исходными кодами вы можете найти на прилагаемом к книге компакт-диске.

    Глава будет полезна всем, кто хочет получить от КОМПАС больше, научиться расширять его функционал, максимально упрощая и ускоряя процесс проектирования и выпуска документации.