Реферат Курсовая Конспект
САПР в машиностроении - раздел Машиностроение, ...
|
Федеральное агентство по образованию
САНКТ-ПЕТЕРБУРГСКИЙ
ГОСУДАРСТВЕННЫЙ ПОЛИТЕХНИЧЕСКИЙ
УНИВЕРСИТЕТ
Л. Н. Розанов, М. М. ДОНСКАЯ, Б. ф. Гончаров
ОГЛАВЛЕНИЕ
Введение ………………………………………………………………….. | |
Лабораторная работа № 1. Библиотека фрагментов……………...……….. | |
Лабораторная работа №2.Создание параметрических фрагментов…... | |
Лабораторная работа №3.Библиотека 2D-шаблонов……………............... | |
Лабораторная работа № 4. Ввод/вывод данных в Delphi……………........ | |
Лабораторная работа № 5. Прикладная библиотека графических элементов…………………………………………………………………………….. | |
Лабораторная работа № 6. Разработка прикладной библиотеки чертежей…………………………………………………………………..………….. |
ВВЕДЕНИЕ
Применение информационных технологий является технологически и экономически выгодным способом повышения эффективности процесса проектирования на современном предприятии. Основным инструментом автоматизации конструкторских и технологических работ в машиностроении стали системы автоматизированного проектирования (САПР), в том числе программный комплекс систем КОМПАС-3D.
Проектирование машиностроительных узлов и деталей в CAD-системах, предполагает применение библиотек, поставляемых стандартной конфигурацией. В случае использования большого количества нестандартных типовых деталей, целесообразно создание пользовательских прикладных библиотек типовых элементов.
Для расширения возможностей САПР КОМПАС реализован механизм динамически подключаемых библиотек.
Предлагаемый комплекс лабораторных работ ориентирован на изучение студентами инструментов создания конструкторских библиотек и освоение способов их создания:
§ создание библиотек фрагментов;
§ создание библиотек параметрических шаблонов средствами Менеджера шаблонов;
§ создание прикладных библиотек, обладающих полным доступом к API(Application Programming Interface)-функциями среды КОМПАС для выполнения различных построений и манипуляций с графическими объектами и документами.
В последнем случае, создание библиотеки предусматривает организацию интерфейса с основной системой средствами системы программирования Delphi. Интеграция с такой мощной системой позволяет, помимо применения графического инструментария КОМПАС, использовать в создаваемых модулях все преимущества современного объектно-ориентированного программирования.
В каждой лабораторной работе приводятся теоретические сведения, порядок и пример выполнения работы. Предложены варианты заданий для выполнения лабораторных работ, а также вопросы для контроля освоения материала.
Надеемся, что представленный лабораторный практикум будет способствовать формированию профессиональных качеств инженера-механика у студентов механико-машиностроительного факультета.
Пособие рекомендовано студентам высших учебных заведений, обучающихся по направлениям и специальностям в области техники и технологии при изучении дисциплины «САПР в машиностроении» и может быть полезно для студентов, обучающихся по другим специальностям, для реализации своих проектов на более высоком профессиональном уровне.
Теоретическая часть
Библиотеки Компас управляются Менеджером библиотек, окно которого открывается в подменю Сервис главного меню Компас. Окно Менеджера может содержать несколько вкладок. На первой вкладке «Библиотеки КОМПАС»отображается структура Менеджера: списки разделов и библиотек. Если в разделе имеются подключенные библиотеки, то его пиктограмма отображается серым цветом, если нет — голубым.
Слева от названия каждой библиотеки находится пиктограмма, характеризующая тип этой библиотеки:
– прикладная библиотека,
– библиотека фрагментов,
– библиотека моделей.
На остальных вкладках Менеджера отображается содержимое подключенных на данный момент библиотек фрагментов, моделей и прикладных библиотек, работающих в режиме панели. Подключенные библиотеки отмечены красной «галочкой». Менеджер библиотек использует собственный механизм буфера обмена, отличающийся от стандартного буфера Windows.
Для управления Менеджером библиотек предназначены команды контекстного меню области просмотра разделов. Эти команды представлены ниже:
Команда | Описание | |
Добавить описание | Добавление библиотеки в Менеджер библиотек. | |
Вид | Настройка внешнего вида панели Менеджера библиотек. | |
Создать раздел | Создание нового раздела (подраздела) в Менеджере библиотек. | |
Удалить | Удаление выделенного раздела из Менеджера библиотек. Раздел удаляется вместе со своими подразделами. | |
Вставить | Вставить в выделенный раздел Менеджера библиотеку, находящуюся в буфере обмена. Если буфер обмена пуст, команда недоступна. | |
Обновить Менеджер библиотек | Удаление библиотек, файлы которых отсутствуют по заданным для них путям, и добавление библиотек, указанных в файлах *.lms, находящихся в подпапке Sys главной папки системы. | |
Очистить Менеджер библиотек | Удаление из Менеджера всех библиотек, кроме подключенных на момент вызова команды. | |
Для управления библиотеками предназначены команды контекстного меню библиотеки, выделенной в списке. Эти команды представлены ниже:
Команда | Описание |
Запустить | Запуск библиотеки, выделенной в списке. Запуск библиотек фрагментов и моделей происходит также при их подключении. |
Подключить | Подключение библиотеки, выделенной в списке. Подключение необходимо, чтобы функции библиотеки были доступны пользователю. Команда доступна для неподключенных библиотек. Выбранная библиотека подключается в установленном для нее режиме. В поле рядом с названием библиотеки появляется красная «галочка» — признак того, что библиотека подключена. Для отключения библиотеки повторно вызовите команду Подключить. Можно также щелкнуть мышью в поле с красной «галочкой» рядом с названием библиотеки. |
Режим работы | Выбор режима работы библиотеки, выделенной в списке. |
Свойства | Настройка свойств библиотеки, выделенной в списке. После вызова команды на экране появляется настроечный диалог. Команда доступна для неподключенных библиотек. |
Удалить | Удаление библиотеки, выделенной в списке, из Менеджера библиотек означает отключение доступа к ней. Никаких действий с файлом библиотеки на диске при этом не производится. |
Вырезать | Удаление библиотеки, выделенной в списке, из Менеджера библиотек и помещение ее в буфер обмена Менеджера. Вырезание в буфер очередной библиотеки удаляет его предыдущее содержимое. |
Вставить | Вставка библиотеки из буфера в текущий раздел Менеджера. |
Отключить все | Отключение от системы КОМПАС-3D всех подключенных библиотек. |
При работе в КОМПАС вы можете сохранять созданные изображения типовых деталей во фрагментах, а затем вставлять их в новые чертежи. Если во время работы часто возникает необходимость вставлять в чертежи одни и те же фрагменты, удобно пользоваться библиотеками фрагментов. В библиотеках можно упорядоченно хранить различные типовые фрагменты с произвольными комментариями к ним. Использование библиотек фрагментов упрощает поиск и вставку в документ готовых изображений.
Каждая библиотека фрагментов представляет собой отдельный файл с расширением lfr. Фрагменты библиотеки не являются отдельными файлами на диске, а входят составными частями в единый файл библиотеки. Фрагменты хранятся в виде упорядоченных списков в подразделах и корневом разделе библиотеки. Имена фрагментов и разделов библиотеки могут состоять из любых символов, количество фрагментов и разделов не ограничено. В стандартный комплект поставки КОМПАС-3D включены некоторые библиотеки фрагментов (например, библиотека технологических обозначений). Каждая библиотека фрагментов отображается на отдельной вкладке Менеджера библиотек. Для настройки внешнего вида вкладки служит команда Вид из ее контекстного меню.
Чтобы создать новую библиотеку фрагментов, выполните следующие действия.
1. Вызовите из контекстного меню списка разделов Менеджера команду Добавить описание — Библиотеки документов.
2. В появившемся диалоге введите имя несуществующей библиотеки и подтвердите ее создание.
3. В появившемся диалоге свойств библиотеки введите ее название в Менеджере. Созданная библиотека появится в списке библиотек текущего раздела Менеджера. Эта библиотека пока не подключена.
4. Выделите созданную библиотеку и вызовите из контекстного меню команду Подключить. В окне Менеджера библиотек появится вкладка, соответствующая созданной библиотеке. Эта вкладка пуста, поскольку вновь созданная библиотека еще не содержит фрагменты.
5. Сформируйте структуру библиотеки с помощью команды Создать раздел из контекстного меню вкладки.
6. Включите фрагменты в разделы. Это можно сделать двумя способами:
– поместить в библиотеку готовые фрагменты,
– создать фрагменты непосредственно в библиотеке.
Если имеются готовые фрагменты, которые будут храниться в библиотеке, выполните следующие действия.
6.1. Вызовите из контекстного меню вкладки команду Добавить фрагмент в библиотеку....
6.2. В появившемся диалоге укажите каталог и имя файла (файлов) *.frw для включения в библиотеку.
6.3. В появившемся диалоге задания имени фрагмента установите имя по умолчанию (полное или относительное) или введите произвольное имя фрагмента (фрагментов) в библиотеке. Выбранные фрагменты будут помещены в текущий раздел библиотеки под заданными именами.
Если готовых фрагментов нет, выполните следующие действия.
6.4. Вызовите из контекстного меню вкладки команду Новый фрагмент.
6.5. В появившемся диалоге введите имя фрагмента в библиотеке.
КОМПАС откроет новое окно фрагмента.
6.6. Создайте изображение, которое будет храниться во фрагменте.
6.7. Сохраните и закройте фрагмент. Созданный фрагмент будет помещен в текущий раздел библиотеки.
В дальнейшем, чтобы отредактировать библиотечный фрагмент, выделите его в списке и вызовите из контекстного меню команду Редактировать. Для управления структурой библиотеки служат команды Удалить, Копировать, Вырезать и Вставить контекстного меню. С их помощью вы можете переносить фрагменты и подразделы между разделами, а также удалять ставшие ненужными разделы и фрагменты. Кроме того, с помощью команд копирования, вырезания и вставки возможен обмен разделами и фрагментами между различными библиотеками фрагментов.
Чтобы вставить фрагмент из библиотеки в текущий графический документ, выполните следующие действия.
1. Выделите в списке фрагмент, который требуется вставить, и вызовите из контекстного меню команду Вставить фрагмент в документ. Можно также дважды щелкнуть мышью по имени нужного фрагмента. Система перейдет в режим вставки фрагмента. На Панели свойств появятся элементы управления вставкой.
2. Настройте параметры вставки на Панели свойств и укажите базовую точку фрагмента.
3. Выполните необходимое количество вставок и нажмите кнопку Прервать команду.
Если какая-либо из библиотек фрагментов больше не требуется, вызовите из контекстного меню одноименной вкладки командуЗакрыть. Библиотека будет отключена от системы КОМПАС. При работе с библиотекой фрагментов доступны сервисные функции, вызываемые командами контекстного меню вкладки. Эти команды представлены ниже:
Команда | Описание |
Оптимизировать | Служит для приведения размера файла в соответствие с количеством хранящихся в нем фрагментов. После вызова команды из файла библиотеки исключаются свободные участки. |
Втянуть внешние ссылки | Копирование в библиотеку всех объектов, существующих в ней в виде ссылок на файлы: типов атрибутов из библиотек типов атрибутов, стилей линий, штриховок, текстов из соответствующих библиотек, фрагментов, вставленных внешней ссылкой. Перечень ссылок можно просмотреть в диалоге информации о документе на вкладке Внешние ссылки во время редактирования библиотечного документа. Для вызова диалога информации служит команда Файл — Свойства.Втянутые ссылки исчезают из списка внешних ссылок в диалоге информации о документе. Ссылки на библиотеки оформлений (они присутствуют в документе, если в нем есть объекты спецификации), а также ссылки сборки на ее компоненты втянуть невозможно. Эти ссылки остаются в документах, т.е. после вызова команды Втянуть внешние ссылки они по-прежнему отображаются в диалоге информации о документе. Для корректной работы с библиотечными документами, ссылающимися на внешние файлы, необходимо наличие этих файлов по путям, указанным в диалоге информации о документе. |
Сохранить фрагмент в файл как... | Сохранение фрагмента библиотеки в отдельном файле на диске. После вызова команды на экране появляется диалог, в котором требуется указать каталог и имя файла для записи. |
Сведения | Вывод на экран диалога информации о выбранном фрагменте. Две последние команды доступны только в контекстном меню библиотечного фрагмента. |
Пример выполнения задания
Разработаем чертёж вакуумной схемы (Рис.1.4) при a = 25 и h = 4 при помощи библиотеки фрагментов условных обозначений элементов вакуумных схем (Рис.1.1).
Рис.1.4. Вакуумная схема: 1 – вращательный насос, 2,14 – натекатель, 3,4,6,8 – клапан с пневмоприводом, 5 – двухроторный насос, 7 – ловушка охлаждаемая, 9 – вакуумная камера, 10,15 – тепловой вакуумметр, 11 – комбинированный насос, 12 – затвор, 13 – магнитный вакуумметр.
Открываем КОМПАС и создаем в нем необходимые для вычерчивания вакуумной схемы количество условных обозначений – фрагментов. Записываем их в текущий каталог с расширением frw. Чтобы создать библиотеку фрагментов, выполняем следующие действия:
1. Вызовите из контекстного меню списка разделов Менеджера команду Добавить описание — Библиотеки документов.
2. В появившемся диалоге вводим имя разрабатываемой библиотеки «Vacschem» и подтверждаем ее создание.
3. В появившемся диалоге свойств библиотеки вводим ее название в Менеджере: «Условные обозначения элементов вакуумных схем»». Созданная библиотека появилась в списке библиотек текущего раздела Менеджера. Эта библиотека пока не подключена.
4. Выделяем созданную библиотеку и вызываем из контекстного меню команду Подключить. В окне Менеджера библиотек появляется вкладка, соответствующая созданной библиотеке. Эта вкладка пуста, поскольку вновь созданная библиотека еще не содержит фрагментов.
Рис.1.5. Чертеж вакуумной схемы
5. С помощью команды Создать раздел из контекстного меню вкладки сформируем структуру библиотеки: насосы, ловушки, клапаны, вакуумметры и камеры.
6. Включим подготовленные фрагменты в разделы. Вызываем из контекстного меню вкладки команду Добавить фрагмент в библиотеку....В появившемся диалоге указываем каталог и имя файла (файлов) *.frw для включения в библиотеку. В появившемся диалоге задания имени фрагмента введём произвольное имя фрагмента (фрагментов) в библиотеке. Выбранные фрагменты помещены в текущий раздел библиотеки под заданными именами.
1.6. Содержание отчёта
1.Титульный лист.
2. Задание.
3. Краткая теоретическая часть.
4. Содержательное описание библиотеки фрагментов.
5. Протокол оператора при создании библиотеки.
6. Протокол оператора при создании чертежа схемы.
7. Чертеж схемы.
8. Выводы.
Контрольные вопросы
1.Какова цель создания библиотеки фрагментов?
2. Какое расширение имеет файл библиотеки фрагментов?
3. Каков порядок создания новой библиотеки фрагментов?
4. Где хранится файл библиотеки фрагментов?
5. Каково назначение команды «Подключить»?
6. Каково назначение команды «Оптимизировать»?
7. Как создать разделы в библиотеке?
8. Каково назначение команды « Втянуть внешние ссылки»?
9.Как производится редактирование библиотеки?
10. Какой порядок работы с библиотекой при создании чертежа?
Библиография
1. КОМПАС-3D. Руководство пользователя. СПб, Аскон, 2007
Основные понятия
В случае использования большого количества нестандартных типовых деталей, целесообразно создание пользовательских прикладных библиотек шаблонов типовых деталей и сборок, представленных в виде параметрических фрагментов. Библиотека шаблонов — это прикладная библиотека, предназначенная для создания и использования библиотек шаблонов при работе в КОМПАС.
Шаблоны библиотеки представляют собой конструктивные элементы, которые наиболее часто встречаются при проектировании машиностроительных чертежей: втулки, прокладки, крепежные элементы, и т. п.
Шаблон (рис. 3.1) состоит из следующих элементов:
• основа — документ КОМПАС, представляющий собой параметрический фрагмент, содержащий внешние переменные. Также это может быть чертеж, деталь или сборка;
Рис. 3.1 Вид Менеджера шаблонов при открытом шаблоне
• таблица переменных (таблица параметров) — электронная таблица Microsoft Excel, в которой описаны внешние переменные основы, в соответствии с определенными правилами, а также их возможные значения;
• схема шаблона (заставка) — изображение, поясняющее расположение и обозначение переменных параметров (фрагмент или деталь КОМПАС-3D либо файл графического формата).
Шаблон может быть снабжен комментариями.
Для создания библиотек шаблонов используется специальное приложение Менеджер шаблонов. Библиотека представляет собой файл с расширением *.tlm. При создании шаблона, с помощью этого приложения, переменным параметризованного фрагмента или детали ставятся в соответствие значения, набранные в таблице переменных.
Готовый шаблон может быть вставлен в активный документ КОМПАС-3D, после предварительного выбора значений его параметров из ряда данных, которые содержатся в EXCEL-файле, ассоциированным с вставляемым фрагментом. При этом, после вставки шаблона в документ, значения его параметров будут соответствовать выбранным значениям переменных. Менеджер шаблонов позволяет при вставке шаблона в документ вводить значения параметров, автоматически получать объект спецификации для созданной по шаблону детали, выбирать раздел спецификации, в который следует поместить запись о сгенерированном объекте.
Создание раздела библиотеки
Раздел предназначен для упорядочения размещение шаблонов в библиотеке. В состав раздела могут входить шаблоны и подразделы, в которых будут храниться шаблоны. Для создания раздела, выделите библиотеку, в которой хотите создать новый раздел, вызовите команду Создать раздел пункта меню Редактор, и заполните поля Заставка и Комментарий, аналогично предыдущим действиям.
Варианты задания Приложение 3.1
End.
В окне кода жирным шрифтом выделяются зарезервированные слова, необходимые компилятору для анализа текста программы.
В качестве ограничителей многострочных комментариев используют фигурные скобки {} или пары символов (* *). Комментарии, ограниченные одной строкой, обозначают //.
{Это комментарий}
(*Это тоже комментарий*)
//Все символы до конца этой строки составляют комментарий
Файл модуля
Модули - предназначены для размещений фрагментов программ. В программном коде реализуется вся поведенческая сторона программы.
Ниже приведён сгенерированный шаблон текста модуля формы, не содержащей элементов управления.
unit Umnik1; // Заголовок модуля
interface// Раздел интерфейсных объявлений
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
Type
TForm1 = class(TForm)
Private
{ Private declarations }
Public
{ Public declarations }
End;
Var
Form1: TForm1;
Implementation
{$R *.dfm}
End.
Заголовок модуля. Заголовок открывается зарезервированным словом Unit за которым следует имя модуля и точка с запятой, unit Umnik1;
Раздел интерфейсных объявлений. Раздел обеспечивает взаимодействие модуля с главной программой, начинается с зарезервированного слова Interface. В секции интерфейсных объявлений перечисляют программные элементы, которые будут доступны в главной программе и других программных модулх проекта.
Раздел реализации модуля. Здесь приводят полное описание процедур и функций, которые перечислены в интерфейсном разделе, атакже процедур и функций, необходимых для работы программы. Раздел реализации открывается словом implementation. Здесь приводят список подключаемых модулей, типов, переменных, констант, полный текст описаний процедур и функций.
Структура модуля может быть дополнена ещё двумя разделами initialization и finalizazion. В разделе initializationразмещают операторы, которые исполняются до передачи управления главной программе и обычно используются для подготовки её работы. В разделе finalizazionразмещают операторы, выполняющиеся после завершения работы главной программы.
End;
Разработка программного кода для вывода текста.
Вариант 1.Для вывода текста в процедуре обработки события необходимо задать значение строковой константы (Str1), а затем свойству .Caption присвоить это значение.
procedure TForm1.FormClick(Sender: TObject);
Const Str1= 'Мы все учились понемногу,' #10+ //#10 – перевод строки
'Чему-нибудь и как-нибудь.'; // + объединение строк
Begin
Label2.Caption := Str1 ;
End;
Вариант 2. Значение строковой константы (Str1) задано в разделеimplementation, а в процедуре обработки события свойству Caption присвоено значение константы.
Implementation
………………
Const Str1= 'Мы все учились понемногу, '#10+ //#10 – перевод строки
'Чему-нибудь и как-нибудь.'; // + объединение строк
procedure TForm1.FormClick(Sender: TObject);
Begin
Label2.Caption := Str1 ;
End;
Если константа (или переменная) используется в нескольких процедурах, то вариант 2 предпочтительнее.
Begin
Str2:= Edit1.Text; //Переменной присвоено значение
Edit2.Text:= Str2; //В Edit2 выведено значение Str2
End;
Begin
Memo1.Lines[0] := M; //вывод в строку 0 константы М
Memo1.Lines[1] := MM; //вывод в строку 1 константы ММ
Memo2.Text := M; //вывод константы М в текущую строку Memo2.Text :=Memo2.Text + #13#10 + MM; {к тексту в поле добавлено ММ с новой строки (#13#10)}
Memo3.Lines.Add(MМ) //добавление в конец поля с новой стоки ММ
end;
Компонент удобно использовать для представления текстовых данных из внешних файлов.
Begin
Ind := ListBox1.ItemIndex ; // индекс выбранного элемента списка
Label1.Caption := ListBox1.Items[Ind]; //вывод по значению индекса
{вариант без непосредственного определения переменной Indx
Label1.Caption := ListBox1.Items[ListBox1.ItemIndex];}
end;
Компонент класса TComboBox
Компонент классаTComboBox панели Standard определяет раскрывающийся список выбора. Представляет собой комбинацию списка TListBox выбора и текстового поля TEdit, большая часть его свойств и методов заимствована у этих компонентов.
End;
Компонент класса TButton
Компонент класса TButton панели Standard используют для управления программой.
Основные свойства и события:
Cancel: Boolean - если установлено значение True, событие OnClick возникает при нажатии клавиши Esc;
Default: Boolean - если установлено значение True, событие OnClick возникает при нажатии клавиши Enter;
OnClick - нажатие кнопки.
Доступ к внешнему файлу, операции с файлами
Для работы с файлами необходимо:
· Установить связь между физическим файлом и логическим.
· Инициироватьфайл – открыть доступ к файлу и указать для него направление передачи данных.
· Выполнитьоперации с файлом (чтение, запись).
· Закрыть доступк файлу.
Установка связи
Процедура AssignFiie(var f; FileName: string) устанавливает связь файловой переменной f с именем внешнего файла FileName.
AssignFile(F, ‘MyFile.Dat’); Файл находится в текущем каталоге.
Name := ‘D:StudIvanMy_F2.Dat’;
AssignFile( F2, Name); Файл находится в другом каталоге.
Закрытие доступа к файлу
CloseFile(F) - закрывает файл, при нормальном завершении программы процедуры Close выполняются автоматически, без обращения к ним.
Запись в текстовый файл
Дано: поле Memo с введённым многострочным текстом.
Требуется записать в новый файл текст из поля Memo.
.........................
В разделе implementationописаны:
Var F : TextFile; // файловая переменная
………………………
Вариант 1. Запись в новый файл (или перезаписи)
procedure TForm1.Button1Click(Sender: TObject);
Begin
ifSaveDialog1.Execute {выполняется диалог ‘Сохранить как’, задаём имя файла (FileName) }
Then begin
AssignFile(F, SaveDialog1.FileName); {связываем имя файла с файловой переменной}
Rewrite(F); //файл открыт для записи
Write(F, Memo1.Text); //записывается текст из Memo1
End;
CloseFile(F);
……….
Вариант 2. Запись в новый файл методом Memo1.Lines.SaveToFile
procedure TForm1.Button1Click(Sender: TObject);
Begin
ifSaveDialog1.Execute {выполняется диалог ‘Сохранить как’, задаём имя файла (FileName) }
Then begin
AssignFile(F, SaveDialog1.FileName);{связываем имя файла с файловой переменной}
Memo1.Lines.SaveToFile(SaveDialog1.FileName);{запись в файл методом Lines.SaveToFile }
end;
end;
Вариант 3. Добавление записей в конец файла
procedure TForm1.Button1Click(Sender: TObject);
Begin
ifOpenDialog1.Execute //выполняется диалог открыть существующий файл
then AssignFile(F, OpenDialog1. FileName);
{$I-} //отключён контроль ввода-вывода
Append(F); // открыт на запись в конец файла
{$I+} //включён контроль ввода-вывода
if IOresult = 0 //нет ошибок
Then Write(F, Memo1.Text) // запись в конец файла
Else Exit;
………………………..
Чтение из текстового файла с последующим выводом в Memo
Дано: текстовый файл с многострочным текстом.
Требуется: записать в поле Memo этот файл.
.........................
В разделе implementationописаны:
Var F : TextFile; // файловая переменная
var Str1 :String; //строка из текстового файла
............................
procedure TForm1.Button1Click(Sender: TObject);
Begin
if OpenDialog1.Execute //выполняется диалог открыть существующий файл
then AssignFile(F, OpenDialog1. FileName);
{$I-} //отключён контроль ввода-вывода
Reset(f2); // открыть для чтения
{$I+} //включён контроль ввода-вывода
if IOresult = 0 //нет ошибок
Then//открыть цикл While
While not Eof(F) do//пока не достигнут конец файла Eof(F)
Begin
Readln(F, str1); //считана одна строка
Memo1.Text:= Memo1.Text+ #13#10+Str1;
//добавить с новой строки ( #13 + #10 ) в Memo считанную строку Str1
End
Else Exit;
End;
4.5. Пример выполнения работы
В качестве примера выполнения работы выберем из пункта 4.2. задание №1 «Анкета». На рис.4.5 показана форма для ввода данных.
Рис.4.5.Форма «Анкета»
Код модуля Anketa.pas приведён ниже. Данные из формы будут сохранены в файле Anketa.doc.
unit Anketa;
Interface
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
Type
TForm1 = class(TForm)
Label1: TLabel; //Анкета
LabeledEdit1: TLabeledEdit; //фамилия
LabeledEdit2: TLabeledEdit; //имя
LabeledEdit3: TLabeledEdit; //отчество
RadioGroup1: TRadioGroup; //пол
LabeledEdit4: TLabeledEdit; //год рождения
ComboBox1: TComboBox; //раскрывающийся список
Label2: TLabel; //иностранные языки
CheckBox1: TCheckBox; //английский
CheckBox2: TCheckBox; //немецкий
CheckBox3: TCheckBox; //французский
LabeledEdit5: TLabeledEdit; //другие языки
Memo1: TMemo;
Label4: TLabel; //Автобиография
Button1: TButton;
Label5: TLabel; //указание к действию
SaveDialog1: TSaveDialog; //диалог Windows сохранения файла
procedureFormActivate(Sender: TObject);
procedureComboBox1Exit(Sender: TObject);
procedure Button1Click(Sender: TObject);
End;
varForm1: TForm1;
Implementation
{$R *.dfm}
Var F: TextFile;
Uch_Zv, S: String; //Uch_Zv - учёное звание, S - вспомогательная пер.
const S_in_no ='Иностранными языками не владею.';
procedureTForm1.FormActivate(Sender: TObject);
begin//присваивает Uch_Zv значение при загрузке
Uch_Zv:= ComboBox1.Text;
End;
procedureTForm1.ComboBox1Exit(Sender: TObject);
begin//Присваивает Uch_Zv выбранное значение при потери фокуса
Uch_Zv:= Uch_Zv + ComboBox1.Items[ComboBox1.ItemIndex];
End;
procedure TForm1.Button1Click(Sender: TObject);
Begin
Case RadioGroup1.ItemIndex of //выбор пола
0: S := RadioGroup1.Items[0]; // выбран первый
1: S := RadioGroup1.Items[1]; //выбран второй
end;
if SaveDialog1.Execute //выполняется диалог сохранения файла
thenAssignFile(F, SaveDialog1. FileName); //задать имя файла
{$I-} //отключён контроль ошибок ввода-вывода
Rewrite(F); // открыт на запись
{$I+} //включён контроль ошибок
if IOresult <> 0 //ошибка IOresult <> 0,на выход
Then Exit;
Writeln(F, LabeledEdit1.Text + ' ' + //запись ФИО
LabeledEdit2.Text+ ' ' + LabeledEdit3.Text);
Write(F, #13#10 + RadioGroup1.Caption + ' ' + S + ' ');
Writeln(F, LabeledEdit4.Editlabel.Caption + ' ' + LabeledEdit4.Text );//год р.
// Формирование в строке S перечня иностранных языков
S := ''; //пустое значение
if CheckBox1.Checked = true
then S:= CheckBox1.Caption;
if (CheckBox2.Checked = true) and (S <> '')
then S:= S + ', ' + CheckBox2.Caption;
if(CheckBox3.Checked = true) and (S <> '')
then S:=S + ', ' + CheckBox3.Caption;
if(LabeledEdit5.Text <> '') and (S <> '')
Then begin
S:=S + ', ' + LabeledEdit6.Text;
Writeln(F, Label2.Caption + ' '+ S);
End
else Writeln(F, #13#10 + S_in_no);//Иностранными языками не владею
Writeln(F, #13#10 + Memo1.Text);
CloseFile(F);
End;
end.
Теоретическая часть
Для расширения возможностей САПР КОМПАС без изменения исходного кода в ней реализован механизм динамически подключаемых библиотек. Каждая библиотека – это файл с расширением .rtw. На самом деле это самая обычная dll-библиотека, у которой расширение dll заменено на rtw. Такую библиотеку легко написать, например, на Delphi. Она будет подключаться к КОМПАС так же, как и все прочие библиотеки, и будет иметь полный доступ к API КОМПАС для выполнения различных построений и манипуляций с графическими объектами и документами.
Библиотека может иметь свою экранную форму, что резко упрощает ввод данных – можно использовать любые компоненты Delphi, подключить базы данных и т.д. В большинстве случаев результатом работы библиотеки должно быть построение какого-либо фрагмента чертежа. Поскольку построение выполняется полностью программным путем, на получаемые модели не накладывается никаких ограничений – можно создать библиотеку, строящую зубчатое колесо с произвольным числом зубьев, фланцевое соединение с различной формой уплотняющего элемента и т.д.
Для запуска 2D библиотеки необходимо открыть – чертеж или фрагмент. Рассмотрим создание 2D библиотек. После каждой компиляции библиотеки ее надо заново подключать к КОМПАСу, предварительно удалив предыдущую версию. В противном случае КОМПАС "держит" файл библиотеки и Delphi не может его перезаписать, выводя соответствующее сообщение об ошибке. Последовательность действий при подключении библиотеки:
- изменили код библиотеки в Delphi;
- в КОМПАСе закрыли и удалили библиотеку;
- в Delphi откомпилировали библиотеку;
- в КОМПАСе подключили и запустили библиотеку.
В комплект поставки КОМПАС входит каталог SDK с файлом помощи sdk.hlp, содержащим минимум информации по объектам, процедурам и функциям API. Кроме того, в каталоге SDKPascalDelphi приведен ряд полезных примеров по созданию библиотек на Delphi.
Все построения осуществляются при помощи объекта Document2D, имеющего ряд методов. Все методы возвращают ссылку на созданный объект, которую можно запомнить в переменную типа Reference. Стили линий имеют коды, приведенные в Приложении 5.2.
Рассмотрим основные методы создания 2D геометрии:
Точка
Примитив «Точка» реализуется методом ksPoint(x,y,style) и ставит точку с координатами x,y и стилем style. Стили точек приведены в приложении 5.1.
Отрезок
Метод «Отрезок» ksLineSeg(x1,y1,x2,y2,type) проводит отрезок стилем линии type из точки (x1,y1) в точку (x2,y2).
Прямая
Метод «Прямая» ksLine(x,y,angle) проводит бесконечную прямую через точку x,y под углом angleв градусахк положительному направлению оси ОХ.
Дуга
Метод «Дуга1» ksArcBy3Points (x1, y1, x2,y2, x3, y3, type) строит дугу по трем точкам стилем линии type.
Метод «Дуга2» ksArcByAngle (xc, yc, rad, f1, f2, direction, type) строит дугу: xc, yc - координаты центра дуги, rad - радиус дуги, f1, f2 - начальный и конечный угол дуги в градусах, direction – направление отрисовки дуги:1 - против часовой стрелки, (-1) - по часовой стрелке, type - стиль линии.
Метод «Дуга3» ksArcByPoint (xc, yc, rad, x1, y1, x2, y2, direction, type) строит дугу: xc, yc - координаты центра дуги, rad - радиус дуги, x1, y1 – координаты начальной точки дуги, x2, y2 - координаты конечной точки дуги, direction -направление отрисовки дуги:1 - против часовой стрелки,(-1) - по часовой стрелке, type - стиль линии.
Окружность
Метод «Окружность» ksCircle(xc, yc, rad, type) строит окружность с центром в точке xc,yc, радиусом rad и стилем линии type.
Вид
Чертеж в КОМПАСе делится на виды. По умолчанию все отрисовываемые объекты оказываются на системном виде, что в общем-то неудобно. Элементы чертежа надо группировать по видам. Кроме того, каждый вид имеет свою систему координат и свой масштаб, что позволит пользователю библиотеки легко перемещать и масштабировать построенное программой изображение. Поэтому все построения будут делаться на новом виде. Процедуру создания вида необходимо запустить до начала рисования графических изображений. Начало координат вида (точка привязки) устанавливается в точке x0 и y0. В строку параметров также передаётся масштаб, угол поворота, цвет, статус и имя вида. Приведем пример процедуры создания вида.
procedure MakeView(x0,y0:DOUBLE; nm:STRING);
varpar:ksViewParam; n:INTEGER;
Begin
par := ksViewParam( kompas.GetParamStruct(ko_ViewParam) );
with par do
Begin
Init;
// точка привязки вида
x:= x0;
y:= y0;
scale_ := 1;
Angle:= 0;
//цвет вида, когда он активен
Color:= clRed;
state:= stACTIVE;
name:= nm
end;
n:=0;
iDocument2D.ksCreateSheetView( par, n )
end;
5.5. Пример разработки 2D-библиотеки «Отрезок1»
Поставим задачу создания простейшей 2D библиотеки, которая выполняла бы следующие действия: создавала бы в чертеже вид с началом координат в точке x0, y0, выводила бы на экран форму для ввода координат (x0,y0,x1,y1,x2,y2) и в текущем чертеже проводила бы отрезок из точки x1,y1 в точку x2,y2. В Delphi создаем новый проект типа "DLL library" (вспоминаем курс "Информатика"). В файле .dpr такого проекта содержится заголовок библиотеки со списком экспортируемых процедур. Для того, чтобы КОМПАС подключил нашу библиотеку, она должна экспортировать следующие процедуры и функции:
LibraryName - функция, возвращающая текстовое название библиотеки;
LibraryId – функция, возвращающая целый идентификатор библиотеки;
LibraryEntry – точка входа в библиотеку, или, проще говоря, процедура,выполняемая при запуске библиотеки.
Чтобы создаваемая библиотека автоматически получила расширение rtw, а не dll, надо использовать директиву компилятора {$E rtw}. Тогда dpr-файл нашего проекта будет иметь вид:
library OTREZOK1;
{$E rtw}
usesSysUtils, Classes, KsTLB,main1 in ‘main1.pas’,former1 in‘former1.pas;
Exports
LibraryName name 'LIBRARYNAME',
LibraryId name 'LIBRARYID',
LibraryEntry name 'LIBRARYENTRY';
Begin
End.
Как видно, в операторе USES подключается модуль KsTLB, обеспечивающий взаимодействие с API КОМПАС, а также модули данной библиотеки main1 и former1, в которых располагается форма и программный код. Файл KsTLB (а также другие необходимые для компиляции модули) находится в каталоге Program FilesAscon KOMPASSDKInclude. Необходимо сказать Delphi, чтобы поиск файлов при компиляции выполнялся и в вышеуказанном каталоге. Идем в меню ToolsEnvironment OptionsLibraryLibrary Path и добавляем в список путей поиска файлов каталог Include.
Создаем новый модуль (FileNewUnit), сохраняем его (например, под именем main1). В этом модуле мы должны описать реализацию процедур и функций LibraryName, LibraryId, LibraryEntry.
unitmain1;
Interface
//добавляем библиотеку Forms и модуль формы former1
uses Windows, SysUtils, LDefin2D, ksConstTLB, ksAuto,
ksTLB, Forms, former1;
// заголовки процедур
procedureLIBRARYENTRY(command: WORD); Pascal;
function LIBRARYNAME : PChar; Pascal;
functionLIBRARYID : Cardinal; Pascal;
// ссылки на КОМПАС и 2D документ
Var
Kompas: KompasObject;
iDocument2D: ksDocument2D;
Implementation
// своя процедура запуска
procedure Run;
Var
form : TMainForm; // ссылка на форму
Begin
// делаем нашу форму дочерней формой КОМПАСа
Application.Handle := kompas.ksGetHWindow;
// закрыть доступ к компасу
kompas.ksEnableTaskAccess(0);
// создаем форму
form:=TMainForm.Create(Application);
// вывод формы
form.ShowModal;
// открыть доступ к компасу
kompas.ksEnableTaskAccess(1);
// отключаем нашу форму от КОМПАСа
Application.Handle := 0
end;
//--------------------------------------------------
functionLIBRARYNAME: PChar; pascal;
Begin
// произвольное название библиотеки
Result := 'Отрезок'
end;
//--------------------------------------------------------------------
function LIBRARYID: UINT; pascal;
Begin
// произвольный идентификатор от 100 и выше
Result := 100;
end;
//---------------------------------------------------------------------
procedureLIBRARYENTRY (command:WORD); pascal;
Begin
// связываем переменную Kompas с API КОМПАСа
Kompas := KompasObject(CreateKompasObject);
// если все в порядке…
if Kompas <> nil then
Begin
// связываем переменную iDocument2D с текущим 2D документом
iDocument2D := ksDocument2D(Kompas.ActiveDocument2D());
ifiDocument2D= nil then
// сообщение об ошибке
Kompas.ksMessage('Текущий документ не является чертежом или фрагментом')
Else
Begin
// своя процедура запуска библиотеки
Run;
Kompas.ksMessage('Работа библиотеки завершена')
end;
// освобождение памяти
iDocument2D := nil;
end;
Kompas := nil
end;
end.
Процедура LibraryEntry может получать на вход целочисленный параметр, задействованный при вызове библиотеки из пунктов меню или с панели инструментов. Нам он пока не понадобится. Внутри процедуры выполняется проверка – является ли текущий документ 2D-документом. Мы пока не можем пользоваться никакими средствами Delphi для ввода-вывода, поэтому сообщения выводятся вызовом метода ksMessage объекта Kompas, т.е. средствами самого КОМПАСа.
Создадим форму (FileNewForm) и сохраним новый модуль под именем former1.pas. Сохраним проект. Самой форме дадим имя OTREZOK. В этом модуле мы создадим форму для ввода начальных значений и после нажатия на кнопку «Построить» создадим в текущем чертеже вид1 и построим отрезок.
unit former1;
Interface
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,LDefin2D, ksConstTLB, ksAuto, ksTLB;
Type
TMainForm = class(TForm)
Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel;
Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit;
Button2: TButton; Button3: TButton;
procedureButton3Click(Sender: TObject);
Private
{ Private declarations }
Public
{ Public declarations }
end;
Var
MainForm: TMainForm;
Implementation
uses main1;
{$R *.dfm}
//----------------------------------------------------------------------------
procedure DrawOtrezok1(x0,y0,x1,y1,x2,y2:double; nm:string);
//создание вида в текущем чертеже
procedure MakeView(x0,y0:DOUBLE; nm:STRING);
varpar:ksViewParam; n:INTEGER;
Begin
par := ksViewParam( kompas.GetParamStruct(ko_ViewParam) );
with par do
Begin
Init;
// точка привязки вида
x:= x0;
y:= y0;
scale_ := 1;
Angle:= 0;
//цвет вида, когда он активен
Color:= clRed;
state:= stACTIVE;
name:= nm
end;
n:=0;
iDocument2D.ksCreateSheetView( par, n )
end;
//выполняем процедуру DrawOtrezok
Begin
// cоздаём вид
MakeView(x0,y0,nm);
// отрезок
iDocument2D.ksLineSeg(x1,y1,x2,y2,1);
end;
//начало работы библиотеки
procedureTMainForm.Button3Click(Sender: TObject);
varX0,Y0,X1,Y1,X2,Y2:double;
Begin
Try
X1:=StrToFloat(Edit1.Text);
Y1:=StrToFloat(Edit2.Text);
X2:=StrToFloat(Edit3.Text);
Y2:=StrToFloat(Edit4.Text);
X0:=StrToFloat(Edit5.Text);
Y0:=StrToFloat(Edit6.Text)
Except
Kompas.ksMessage(‘Неверные данные');
abort
end;
DrawOtrezok1(X0,Y0,X1,Y1,X2,Y2,'otrezok')
end;
end.
Поместим на форму четыре компонента типа TEdit для ввода координат точек отрезка и два компонента типа TEdit для ввода начала координат вида, компоненты типа TLabel для размещеня надписей, кнопку "Отрезок" и кнопку "Готово"(Рис. 5.1). Как и в любой другой библиотеке, форма не создается автоматически – ее надо вручную создать и отобразить.
Рис.5.1. Форма библиотеки Отрезок
На время работы с формой надо отключить доступ к элементам интерфейса КОМПАС, иначе неизбежны попытки одновременного рисования в документе пользователем и библиотекой. Процедура Run в модуле main1 все это выполняет. Форма будет выводиться в модальном режиме. Это означает, что она заблокирует все остальные формы и, пока мы ее не закроем, доступ к КОМПАСу будет запрещен, что и требовалось. Чтобы модальную форму корректно закрыть, не обязательно выполнять метод Close. Достаточно в свойствах кнопки "Закрыть" установить ModalResult в значение mrOK. Это равносильно закрытию формы при нажатии на данную кнопку.
Для рисования отрезка используем имеющиеся в API команды построения изображений. Все они являются методами объекта iDocument2D. Построим отрезок в procedure TMainForm.Button3Click (Sender: TObject) при помощи метода ksLineSeg. На рисунке 5.2. показан чертёж с результатами работы библиотеки Отрезок1.
Рис.5.2. Пример применения библиотеки Отрезок1
5.6.Содержание отчёта
1.Титульный лист.
2. Задание.
3. Краткая теоретическая часть.
4. Содержательное описание прикладной библиотеки.
5. Файлы библиотеки с программным кодом.
6. Пример работы с библиотекой.
7. - подготовить отчёт по проделанной работе в текстовом формате KDW с переходом через формат JPG в формат PDF.
Контрольные вопросы
1.Что такое прикладная библиотека?
2. Как подключить к Компасу прикладную библиотеку?
3. Каков порядок создания нового проекта библиотеки в Delphi?
4. Каково назначение файла проекта?
5. Каково назначение файла формы?
6. Каково назначение файла программного модуля?
7. Какие функции должна экспортировать прикладная библиотека для её подключения к Компасу?
8. Какие основные методы создания графических примитивов имеются в API Компас?
9.Как производится отладка библиотеки?
10. Какой порядок работы с библиотекой при создании чертежа?
Библиография
1. Богуславский А.А. Си++ и компьютерная графика. М.,Компьютер Пресс,2003,352стр.
2.Карпов Б. Delphi:специальный справочник. СПб, Питер, 2001, 688стр.
3.Троицкий Д.И. Разработка 2D-библиотек для Компас. Тула, ТГУ, 2007, 26стр.
Приложение 5.1. Стили точек
0 - точка
1 - крестик
2 - х-точка
3 - квадрат
4 - треугольник
5 - окружность
6 - звезда
7 - перечеркнутый квадрат
8 - утолщенный плюс
Приложение 5.2. Коды стилей линий
1 - основная линия
2 - тонкая линия
3 - осевая линия
4 - штриховая линия
5 - для линии обрыва
6 - вспомогательная линия
7 - утолщенная
8 - штрихпунктирная линия с двумя точками
9 - штриховая толстая линия
10 - осевая толстая линия
11 - тонкая линия, включаемая в штриховку
12 - ISO штриховая линия
13 - ISO штриховая линия (дл. пробел)
14 - ISO штрихпунктирная линия (дл. штрих)
15 - ISO штрихпунктирная линия (дл. штрих 2 пунктира)
16 - ISO штрихпунктирная линия (дл. штрих 3 пунктира)
17 - ISO пунктирная линия
18 - ISO штрихпунктирная линия (дл. и кор. штрихи)
19 - ISO штрихпунктирная линия (дл. и 2 кор. штриха)
20 - ISO штрихпунктирная линия
21 - ISO штрихпунктирная линия (2 штриха)
22 - ISO штрихпунктирная линия (2 пунктира)
23 - ISO штрихпунктирная линия (3пунктира)
24 - ISO штрихпунктирная линия (2 штриха 2 пунктира)
25 - ISO штрихпунктирная линия (2 штриха 3 пунктира)
Begin
// создание структуры данных
par := ksEllipseParam(kompas.GetParamStruct(ko_EllipseParam));
withpardo
Begin
Init; // создание структуры
xc := 50; // координаты центра
yc := 40;
a := 20; // оси
B := 10;
style := 1; // стиль линии
end;
iDocument2D.ksEllipse(par) // построение эллипса
End;
NURBS-сплайн.
Сплайн – это составной объект, определяемый набором опорных точек. Сплайны используются в чертежах, например, при построении профиля зубчатых колес. Рассмотрим пример построения сплайна:
var par : ksNurbsPointParam;
Begin
par := ksNurbsPointParam(kompas.GetParamStruct(ko_NurbsPointParam));
with par do
Begin
Init;
// 3 – порядок сплайна
// FALSE – незамкнутый (TRUE – замкнутый)
// 1 – стиль линии
iDocument2D.ksNurbs(3,False,1);
x := 0;
y := 0;
weight := 1;
// добавили точку с координатами x,y и "весом" weight
iDocument2D.ksNurbsPoint(par);
x := 20;
y := 20;
weight := 1;
iDocument2D.ksNurbsPoint(par);
x := 50;
y := 10;
weight := 1;
iDocument2D.ksNurbsPoint(par);
x := 70;
y := 20;
weight := 1;
iDocument2D.ksNurbsPoint(par);
x := 100;
y := 0;
weight := 1;
iDocument2D.ksNurbsPoint(par);
x := 50;
y := -50;
weight := 1;
iDocument2D.ksNurbsPoint(par);
// завершили создание объекта
iDocument2D.ksEndObj
End
end;
Здесь сплайн 3-го порядка задан шестью точками.
Текст
Текст отрисовывается методом ksParagraph. Это также составной объект. Для каждого элемента текста можно указывать большое количество параметров, приведенных в Приложении 6.2. Рассмотрим код, выводящий текст, показанный на
рис. 6.1.
Var
par : ksParagraphParam; // абзац
itemParam : ksTextItemParam; // текст
itemFont : ksTextItemFont; // шрифт
Begin
par := ksParagraphParam(
kompas.GetParamStruct(ko_ParagraphParam) );
par.Init;
// параметры абзаца
with par do
begin
x := 30; // левая верхняя точка
y := 30;
height := 25; // высота
width := 20; // ширина
end;
// создаем абзац
iDocument2d.ksParagraph( par );
// параметры текста
itemParam := ksTextItemParam(
kompas.GetParamStruct(ko_TextItemParam));
itemParam.Init;
// параметры шрифта
itemFont := ksTextItemFont(itemParam.GetItemFont);
itemFont.Init;
with itemFont do
Begin
// c новой строчки
SetBitVectorValue( NEW_LINE, true );
// наименование шрифта
FontName:='Arial';
// высота текста в мм
Height:=5;
end;
// собственно текст
ItemParam.s:= 'Первая строка';
// выводим текст
iDocument2d.ksTextLine( itemParam );
// следующая строка
itemFont.Init;
with itemFont DO
Begin
SetBitVectorValue( NEW_LINE, true );
SetBitVectorValue( BOLD_ON, true );
Height:=10;
End;
ItemParam.s := 'Вторая строка (жирный)';
iDocument2d.ksTextLine(itemParam);
iDocument2d.ksEndObj
end;
Метод SetBitVectorValue управляет оформлением текста и его разбивкой на строки (обратите внимание на константу NEW_LINE). Текст в основной надписи чертежа редактируется другими методами.
Рис. 6.1 Результат отрисовки текста.
Осевые линии
Как известно, осевые линии окружностей и дуг в КОМПАС строятся автоматически. Рассмотрим пример построения окружности с осевыми. Для их построения нужно запомнить ссылку на окружность в переменную типа Reference.
varpar:ksCentreParam;
c:reference;
Begin
// окружность, в с запомнили ссылку на нее
c:=iDocument2D.ksCircle(150,150,20,1);
// создаем структуру для параметров осевых
par:=ksCentreParam(kompas.GetParamStruct(ko_CentreParam));
with par do
Begin
init;
// ссылка на окружность
BaseCurve:=c;
// число осевых - две
type_:=2;
// длина осевой от центра вправо
LenXPTail:=25;
// длина осевой от центра влево
LenXmTail:=25;
// длина осевой от центра вверх
LenYPTail:=25;
// длина осевой от центра вниз
LenYmTail:=25;
end;
// создание осевых
iDocument2D.ksCentreMarker(par)
end;
Var
param : ksLDimParam;
dPar : ksDimDrawingParam;
sPar : ksLDimSourceParam;
tPar : ksDimTextParam;
str : ksChar255;
arrText : ksDynamicArray;
obj : Reference;
Begin
// структура для параметров размера
param := ksLDimParam
( kompas.GetParamStruct(ko_LDimParam) );
// параметры отрисовки размера
dPar := ksDimDrawingParam( param.GetDPar );
// положение размерной линии
sPar := ksLDimSourceParam( param.GetSPar );
// параметры размерного текста
tPar := ksDimTextParam ( param.GetTPar );
dPar.Init;
dPar.textBase := 0; // способ размещения текста
// тип первой стрелки (1- внутри, 2 – снаружи)
dPar.pt1 := 2;
dPar.pt2 := 2; // тип второй стрелки
dPar.ang := -30; // угол наклона выноски
dPar.lenght := 20; // длина выноски
sPar.Init;
// начало первой выносной линии
sPar.x1 := 50;
sPar.y1 := 50;
// начало второй выносной линии
sPar.x2 := 150;
sPar.y2 := 50;
// смещение размерной линии
sPar.dx := 0;
sPar.dy := 20;
// относительно какой точки задается смещение:
// 1 - от 1,y1,
// 2 - от x2,y2
sPar.basePoint := 1;
tPar.Init( False );
// автопростановка номинала
tPar.SetBitFlagValue( _AUTONOMINAL, true );
// будет текст перед номиналом
tPar.SetBitFlagValue( _PREFIX, true );
// будет проставлено отклонение
tPar.SetBitFlagValue( _DEVIATION, true );
// будет проставлена единица измерения
tPar.SetBitFlagValue( _UNIT, true );
// будет текст после номинала
tPar.SetBitFlagValue( _SUFFIX, true );
// знак диаметра перед текстом
tPar.sign := 1;
// строка в 255 символов
str := ksChar255( kompas.GetParamStruct(ko_Char255));
// массив текстовых строк
arrText := ksDynamicArray( tPar.GetTextArr );
// текст до номинала
str.str := '+';
// добавили в массив
arrText.ksAddArrayItem( -1, str );
// верхнее отклонение
str.str := '+0,2';
// добавили в массив
arrText.ksAddArrayItem( -1, str );
// нижнее отклонение
str.str := '-0,4';
// добавили в массив
arrText.ksAddArrayItem( -1, str );
// единица измерения
str.str := ' мм';
// добавили в массив
arrText.ksAddArrayItem( -1, str );
// текст после размера
// &04 - знак "х"
// &01 - знак градуса
str.str := '2&0445&01';
arrText.ksAddArrayItem( -1, str );
// создаем размер
iDocument2d.ksLinDimension(param)
end;
Угловые, диаметральные размеры, знаки шероховатости, выноски
Делаются аналогично. Примеры их построения приведены в файле step99.pas, входящем в примеры библиотек из комплекта поставки КОМПАС.
Смена системы координат
В ряде случаев удобно вычислять координаты не в абсолютной системе координат, а во временной пользовательской. Для ее создания есть метод
ksMtr(x, y, Angle, scaleX, scaleY)
Здесь x, y - координаты начала локальной системы координат, angle – угол наклона системы координат в градусах, scaleX - масштаб локальной системы координат по оси Х, scaleY - масштаб локальной системы координат по оси Y. Отменяется действие локальной системы координат методом ksDeleteMtr.
Основная надпись
В документе типа "Чертеж" можно автоматизировать заполнение основной надписи. Каждая клетка основной надписи имеет свой номер (Рис. 6.3). Например, заполним поля "Разработал" (ячейка 110) и "Дата" (ячейка 130):
Var
stamp : ksStamp;
itemParam : ksTextItemParam;
Begin
// получаем ссылку на основную надпись
stamp := ksStamp( iDocument2d.GetStamp );
itemParam := ksTextItemParam(
kompas.GetParamStruct(ko_TextItemParam) );
itemParam.Init;
// открываем ее для редактирования
stamp.ksOpenStamp;
// Сделать ячейку с номером 110 текущей
Stamp.ksColumnNumber(110);
// Поместить в текущую ячейку одну текстовую строку
ItemParam.s := ' Иванов Д.И.';
Stamp.ksTextLine( ItemParam );
// Сделать ячейку с номером 130 текущей
Stamp.ksColumnNumber(130);
// Поместить в текущую ячейку одну текстовую строку -
// сегодняшнюю дату
ItemParam.s := DateToStr(Now);
Stamp.ksTextLine( ItemParam );
// закрываем основную надпись
stamp.ksCloseStamp
end;
Как проверить, какого типа 2D документ является текущим – фрагмент или чертеж? (в фрагменте нет основной надписи и попытка работы с ней вызовет сообщение об ошибке)
// получаем ссылку на основную надпись
stamp := ksStamp( iDocument2d.GetStamp );
itemParam := ksTextItemParam(
kompas.GetParamStruct(ko_TextItemParam) );
itemParam.Init;
// открываем ее для редактирования
if stamp.ksOpenStamp=0 then
Рис. 6.3.Нумерация ячеек основной надписи.
Begin
kompas.ksMessage
('Текущий документ не является чертежом');
Exit
end;
Для облегчения разработки программы заготовим несколько процедур, выполняющих построение повторяющихся элементов. Прежде всего, это размеры. Создадим общую процедуру простановки линейного размера:
procedureLinDim(x1,y1,x2,y2,dx,dy:DOUBLE; diamsign:boolean; pl1,pl2:boolean);
// простановка линейного размера
// x1,y2,x2,y2 - координаты начал выносных линий
// dx,dy - смещение размерной линии относительно точки x1,x2
// diamsign - проставлять ли знак диаметра
// pl1, pl2 - рисовать ли первую и вторую выносные линии
Var
param : ksLDimParam;
dPar : ksDimDrawingParam;
sPar : ksLDimSourceParam;
tPar : ksDimTextParam;
str : ksChar255;
arrText : ksDynamicArray;
Begin
// структура для параметров размера
param := ksLDimParam( kompas.GetParamStruct(ko_LDimParam) );
// параметры отрисовки размера
dPar := ksDimDrawingParam( param.GetDPar );
// положение размерной линии
sPar := ksLDimSourceParam( param.GetSPar );
// параметры размерного текста
tPar := ksDimTextParam ( param.GetTPar );
dPar.Init;
dPar.textBase := 0; // способ размещения текста
// тип первой стрелки (1-изнутри, 2-снаружи)
dPar.pt1 := 1;
dPar.pt2 := 1; // тип второй стрелки
// вкл/выкл. выносные линии
dPar.pl1 :=not(pl1);
dPar.pl2 :=not(pl2);
dPar.ang := 0; // угол наклона выноски
dPar.lenght := 0; // длина выноски
sPar.Init;
// начало первой выносной линии
sPar.x1 := x1;
sPar.y1 := y1;
// начало второй выносной линии
sPar.x2 := x2;
sPar.y2 := y2;
// смещение размерной линии
sPar.dx := dx;
sPar.dy := dy;
// относительно какой точки задается смещение:
// 1 - от 1,y1, 2 - от x2,y2
sPar.basePoint := 1;
tPar.Init( False );
// автопростановка номинала
tPar.SetBitFlagValue( _AUTONOMINAL, true );
if diamsign then
tPar.sign := 1;
// создаем размер
iDocument2d.ksLinDimension( param )
end;
Для заполнения ячеек основной надписи заготовим процедуру, заносящую текст в ячейку с указанным номером:
procedure Stamp(c:byte; t:string);
Var
stamp : ksStamp;
itemParam : ksTextItemParam;
Begin
// получаем ссылку на основную надпись
stamp := ksStamp( iDocument2d.GetStamp );
itemParam :=
ksTextItemParam( kompas.GetParamStruct(ko_TextItemParam) );
itemParam.Init;
// открываем ее для редактирования
if stamp.ksOpenStamp=0 then
Begin
kompas.ksMessage
('Текущий документ не является чертежом');
Exit
end;
// Сделать ячейку текущей
Stamp.ksColumnNumber(c);
// Поместить в текущую ячейку одну текстовую строку
ItemParam.s := t;
Stamp.ksTextLine( ItemParam );
// закрываем основную надпись
stamp.ksCloseStamp
End;
6.5.Пример разработки прикладной библиотеки «Втулка»
Пользуясь полученными знаниями, создадим полноценную библиотеку, выполняющую построение 2D чертежа втулки (Рис. 6.4) и заполнение основной надписи.
Рис. 6.4 Содержательная часть чертежа втулки.
Одну точку чертежа надо будет зафиксировать. Примем левую нижнюю точку контура за (0,0) относительно системы координат вида.
Приведем теперь все три файла проекта библиотеки «Втулка».
Первый файл проекта:
librarychanel;
{$E rtw}
Uses
SysUtils,Classes,KsTLB,main in 'main.pas',former in 'former.pas' {MainForm};
Exports
LibraryName name 'LIBRARYNAME',
LibraryId name 'LIBRARYID',
LibraryEntry name 'LIBRARYENTRY';
Begin
End.
Второй файл проекта (главный модуль):
unitmain;
Interface
uses Windows, SysUtils, LDefin2D, ksConstTLB, ksAuto, ksTLB, former, Forms ;
procedure LIBRARYENTRY(command: WORD); Pascal;
functionLIBRARYNAME : PChar; Pascal;
function LIBRARYID : Cardinal; Pascal;
Var
Kompas: KompasObject;
iDocument2D: ksDocument2D;
Implementation
// LibraryName
functionLIBRARYNAME: PChar; pascal;
Begin
Result := 'Втулка';
end;
procedure Run;
Var
form : TMainForm;
Begin
Application.Handle := kompas.ksGetHWindow;
kompas.ksEnableTaskAccess( 0 ); // закрыть доступ к компасу
// создаем форму
form:=TMainForm.Create( Application );
form.ShowModal; // вывод формы
kompas.ksEnableTaskAccess( 1 ); // открыть доступ к компасу
Application.Handle := 0
end;
//------------------------------------------------------------------------------------------
procedure LIBRARYENTRY (command:WORD); pascal;
Begin
Kompas := KompasObject(CreateKompasObject);
if Kompas <> nil then
Begin
iDocument2D := ksDocument2D(Kompas.ActiveDocument2D());
if iDocument2D=nil then
Kompas.ksMessage( 'Текущий документ не является чертежом или фрагментом' )
else
Run;
iDocument2D := nil;
End;
Kompas := nil
End;
//------------------------------------------------------------------------------------------
functionLIBRARYID: UINT; pascal;
Begin
Result := 100;
end;
end.
Рис.6.5. Форма библиотеки «Втулка»
Третий файл проекта - модуль формы(рис.6.5):
unitformer;
Interface
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,LDefin2D, ksConstTLB, ksAuto, ksTLB;
Type
TMainForm = class(TForm)
Edit1: TEdit; Edit2: TEdit; Edit4: TEdit; Button2: TButton; Button3: TButton;
Label1: TLabel; Label2: TLabel; Label3: TLabel;
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Var
MainForm: TMainForm;
Implementation
uses main;
{$R *.dfm}
//--------------------------------------------------------------------------------------
procedure DrawBusher(x0,y0:double; nm:string; D1,D2,L:double);
// D1 - внутренний диаметр; D2 - наружный диаметр; L - длина втулки
// x0,y0 - координаты левого нижнего угла вида; mn - имя вида
procedureMakeView(x0,y0:DOUBLE; nm:STRING);
var par:ksViewParam;
n:INTEGER;
Begin
par := ksViewParam( kompas.GetParamStruct(ko_ViewParam) );
withpar do
Begin
Init;
// точка привязки вида
x:= x0;
y:= y0;
scale:= 1;
Angle:= 0;
// цвет вида, когда он активен
Color:= clRed;
state:= stACTIVE;
name:= nm
end;
n:=0;
iDocument2D.ksCreateSheetView( par, n )
end;
//---------------------------------------------------------------------------------------
procedure Stamp(c:byte; t:string);
Var
stamp : ksStamp;
itemParam : ksTextItemParam;
Begin
// получаем ссылку на основную надпись
stamp := ksStamp( iDocument2d.GetStamp );
itemParam := ksTextItemParam( kompas.GetParamStruct(ko_TextItemParam) );
itemParam.Init;
// открываем ее для редактирования
if stamp.ksOpenStamp=0 then
Begin
kompas.ksMessage('Текущий документ не является чертежом');
Exit
End;
// Сделать ячейку текущей
Stamp.ksColumnNumber(c);
// Поместить в текущую ячейку одну текстовую строку
ItemParam.s := t;
Stamp.ksTextLine( ItemParam );
// закрываем основную надпись
stamp.ksCloseStamp
end;
//------------------------------------------------------------------------------------
procedure Contour1;
Begin
iDocument2D.ksLineSeg(0,D2-(D2-D1)/2,L,D2-(D2-D1)/2,1);
iDocument2D.ksLineSeg(0,D2-(D2-D1)/2,0,D2,1);
iDocument2D.ksLineSeg(L,D2-(D2-D1)/2,L,D2,1);
iDocument2D.ksLineSeg(0,D2,L,D2,1)
end;
//----------------------------------------------------------------------------------------
procedureContour2;
Begin
iDocument2D.ksLineSeg(0,0,L,0,1);
iDocument2D.ksLineSeg(L,0,L,(D2-D1)/2,1);
iDocument2D.ksLineSeg(L,(D2-D1)/2,0,(D2-D1)/2,1);
iDocument2D.ksLineSeg(0,(D2-D1)/2,0,0,1)
end;
//-----------------------------------------------------------------------------------------
procedure LinDim(x1,y1,x2,y2,dx,dy:DOUBLE; diamsign:boolean; pl1,pl2:boolean);
// простановка линейного размера
// x1,y2,x2,y2 - координаты начал выносных линий
// dx,dy - смещение размерной линии относительно точки x1,x2
// diamsign - проставлять ли знак диаметра
// pl1, pl2 - рисовать ли первую и вторую выносные линии
Var
param : ksLDimParam;
dPar : ksDimDrawingParam;
sPar : ksLDimSourceParam;
tPar : ksDimTextParam;
str : ksChar255;
arrText : ksDynamicArray;
begin
// структура для параметров размера
param := ksLDimParam( kompas.GetParamStruct(ko_LDimParam) );
// параметры отрисовки размера
dPar := ksDimDrawingParam( param.GetDPar );
// положение размерной линии
sPar := ksLDimSourceParam( param.GetSPar );
// параметры размерного текста
tPar := ksDimTextParam ( param.GetTPar );
dPar.Init;
dPar.textBase := 0; // способ размещения текста
dPar.pt1 := 1; // тип первой стрелки (1- внутри, 2 – снаружи)
dPar.pt2 := 1; // тип второй стрелки
//вкл/выкл размерные линии
dPar.pl1 :=not(pl1);
dPar.pl2 :=not(pl2);
dPar.ang := 0; // угол наклона выноски
dPar.lenght := 0; // длина выноски
sPar.Init;
// начало первой выносной линии
sPar.x1 := x1;
sPar.y1 := y1;
// начало второй выносной линии
sPar.x2 := x2;
sPar.y2 := y2;
// смещение размерной линии
sPar.dx := dx;
sPar.dy := dy; {20}
// относительно какой точки задается смещение:
// 1 - от 1,y1,
// 2 - от x2,y2
sPar.basePoint := 1;
tPar.Init( False );
// автопростановка номинала
tPar.SetBitFlagValue( _AUTONOMINAL, true );
if diamsign then
tPar.sign := 1;
// создаем размер
iDocument2d.ksLinDimension( param )
end;
//---------------------------------------------------------------------------------
Begin
// создали вид
MakeView(x0,y0,nm);
// осевая линия
iDocument2D.ksLineSeg(-5,D2/2,L+5,D2/2,3);
Contour1;
// штриховка контура1
iDocument2D.ksHatch(0,45,1,5,5,D2-(D2-D1)/2+5);
Contour1;
iDocument2D.ksEndObj;
Contour2;
// штриховка контура2
iDocument2D.ksHatch(0,45,1,5,0,0);
Contour2;
iDocument2D.ksEndObj;
// внешний контур
iDocument2D.ksLineSeg(0,D2-(D2-D1)/2,0,(D2-D1)/2,1);
iDocument2D.ksLineSeg(L,D2-(D2-D1)/2,L,(D2-D1)/2,1);
// длина
LinDim(0,0,L,0,0,-20,false,true,true);
// наружный диаметр
LinDim(0,0,0,D2,-20,0,true,true,true);
// внутренний диаметр
LinDim(0,(D2-D1)/2,0,(D2-D1)/2+D1,-10,0,true,true,true);
// Основная надпись
Stamp(1,'Втулка');
Stamp(3,'Сталь 40Х');
Stamp(9,'ИМТ');
Stamp(8,'1');
Stamp(110,'Иванов И.И.');
Stamp(130,DateToStr(Now))
end;
//--------------------------------------------------------------------------
procedure TMainForm.Button3Click(Sender: TObject);
var d1,d2,l:double;
Begin
Try
d1:=StrToFloat(Edit2.Text);
d2:=StrToFloat(Edit1.Text);
l:=StrToFloat(Edit4.Text)
Except
Kompas.ksMessage('Неверные данные');
abort
end;
if d1>=d2 then
Begin
Kompas.ksMessage('Внутренний диаметр больше наружного');
abort
end;
DrawBusher(100,100, 'busher',d1, d2, l)
End;
End.
На рисунке 6.6. показан чертёж с результатами работы библиотеки «Втулка».
Рис.6.6. Чертёж втулки, созданный прикладной библиотекой
6.6.Содержание отчёта
1.Титульный лист.
2. Задание.
3. Краткая теоретическая часть.
4. Содержательное описание прикладной библиотеки.
5. Файлы библиотеки с программным кодом.
6. Пример работы с библиотекой.
7. - подготовить отчёт по проделанной работе в текстовом формате KDW с переходом через формат JPG в формат PDF.
6.7. Контрольные вопросы
1.Чем отличается проект прикладной библиотеки от обычного проекта Delphi?
2. Какую папку из ресурсов Компаса нужно подключить к Delphi при создании прикладной библиотеки?
3. Какие модули входят в состав проекта библиотеки в Delphi?
4. Какие задачи решает файла проекта библиотеки?
5. Какие процедуры содержатся в файле формы библиотеки?
6. Какие процедуры содержатся в файла программного модуля библиотеки?
7. Какие процедуры и функции используются библиотекой при создании формы?
8. Какие методы создания сложных графических изображений имеются в API Компас?
9.Какие средства Delphi можно использовать для отладки библиотеки?
10. Какие параметры используются библиотекой при создании вида?
6.8. Библиография
1. Богуславский А.А. Си++ и компьютерная графика. М., Компьютер Пресс,2003,352стр.
2.Карпов Б. Delphi:специальный справочник. СПб, Питер, 2001, 688стр.
3.Троицкий Д.И. Разработка 2D-библиотек для Компас. Тула, ТГУ, 2007, 26стр.
Приложение 6.1. Коды стилей штриховок
0 - металл
1 - неметалл
2 - дерево
3 - камень естественный
4 - керамика
5 - бетон
6 - стекло
7 - жидкость
8 - естественный грунт
9 - насыпной грунт
10 - камень искусственный
11 - железобетон
12 - напряженный железобетон
13 - дерево в продольном сечении
14 – песок
Приложение 6.2. Коды свойств текста
Константа – Шестнадцатиричное значение
INVARIABLE - 0 (не менять флаги текста)
NUMERATOR - $1 (числитель)
DENOMINATOR - $2 (знаменатель)
END_FRACTION - $3 (конец дроби)
UPPER_DEVIAT - $4 (верхнее отклонение)
LOWER_DEVIAT - $5 (нижнее отклонение)
END_DEVIAT - $6 (конец отклонений)
S_BASE - $7 (основание выражения с под или над строкой)
S_UPPER_INDEX - $8 (верхний индекс выражения с под или над строкой)
S_LOWER_INDEX - $9 (нижний индекс выражения с под или над строкой)
S_END - $10 (конец выражения с под или надстрокой)
SPECIAL_SYMBOL - $11 (спецзнак)
SPECIAL_SYMBOL_END - $12 (конец спецзнака для спецзнаков с текстом)
RETURN_BEGIN - $13 (начало для ввода следующих строк в спецзнаке с текстом, дробях, отклонениях)
RETURN_DOWN - $14 (для ввода следующих строк в спецзнаке с текстом, дробях, отклонениях)
RETURN_RIGHT - $15 (для ввода строк справа в спецзнаке с текстом, дробях, отклонениях)
TAB - $16 (табуляция по текущему стилю)
FONT_SYMBOL - $17 (символ фонта)
ITALIC_ON - $40 (включить наклон)
ITALIC_OFF - $80 (выключить наклон)
BOLD_ON - $100 (включить жирное начертание)
BOLD_OFF - $200 (выключить жирное начертание)
UNDERLINE_ON - $400 (включить подчеркивание)
UNDERLINE_OFF - $800 (выключить подчеркивание)
NEW_LINE - $1000 (новая строка в параграфе)
Приложение 6.3. Коды размеров
1.Стрелки (свойства pt1,pt2)
0 - стрелки нет
1 - стрелка внутри
2 - стрелка снаружи
3 - засечка
4 - точка
2.Положение текста (свойство textBase)
0 - в центре
1 - на расстояние (или угол) textPos относительно первой точки
2 - на расстояние (или угол) textPos относительно второй точки
3.Управление размерным текстом (свойство bitFlag)
Константа - Шестнадцатиричное значение
_AUTONOMINAL - $1 (автоматическое определение номинального значения размера)
_RECTTEXT - $2 (текст в рамке)
_PREFIX - $4 (есть текст до номинала)
_NOMINALOFF - $8 (нет номинала)
_TOLERANCE - $10 (проставлять квалитет)
_DEVIATION - $20 (проставлять отклонения)
_UNIT - $40 (единица измерения)
_SUFFIX - $80 (есть текст после номинала)
_DEVIATION_INFORM - $100 (при включенном флаге)
_UNDER_LINE - $200 (размер с подчеркиванием)
_BRACKETS - $400 (размер в скобках)
_SQUARE_BRACKETS - $800 (размер в квадратных скобках,
используется вместе с _BRACKETS)
4.Значок перед размерным текстом (свойство Sign)
0 - нет значка
1 - диаметр
2 - квадрат
3 - радиус R
>3 - код символа из шрифта "Symbol type A"
Розанов Леонид Николаевич, Донская Марина Михайловна, Гончаров Борис Федорович
– Конец работы –
Используемые теги: САПР, машиностроении0.042
Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: САПР в машиностроении
Если этот материал оказался полезным для Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Твитнуть |
Новости и инфо для студентов