Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 300075.doc
Скачиваний:
4
Добавлен:
30.04.2022
Размер:
300.03 Кб
Скачать

ГОУВПО “Воронежский государственный

технический университет”

Кафедра автоматизированного оборудования

машиностроительного производства

Методические указания

к выполнению лабораторных работ №8 – 9

по дисциплине “Программное обеспечение

проектирования станочного оборудования”

для студентов специальности 151002

“Металлообрабатывающие станки и комплексы”,

очной формы обучения

Воронеж 2010

Составители: д-р техн. наук М.И. Чижов,

канд. техн. наук М.В. Паринов

УДК 621.87.621.357.74

Методические указания к выполнению лабораторных работ №8 – 9 по дисциплине “Программное обеспечение проектирования станочного оборудования” для студентов специальности 151002 “Металлообрабатывающие станки и комплексы”, очной формы обучения /ГОУВПО “Воронежский государственный технический университет”, М.И. Чижов, М.В. Паринов. Воронеж 2010. 77с.

Методические указания содержат практический материал по изучению CAD системы “Компас-3D”. Рассмотрены вопросы формирования твердотельных моделей различными методами, создания сборок, сборочных чертежей и программирования прикладных библиотек с помощью API функций.

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

Методические указания подготовлены в электронном виде в текстовом редакторе MSWord 2010 и содержатся в файле POPSO2.doc.

Ил. 33. Библиогр.: 3 назв.

Рецензент канд. техн. наук, доц. Л.А. Иванов

Ответственный за выпуск зав. кафедрой профессор

В.М. Пачевский.

Издается по решению редакционно-издательского совета Воронежского государственного технического университета.

ГОУВПО “Воронежский государственный

технический университет”, 2010

Лабораторная работа №8 Проектирование прикладной библиотеки трехмерного моделирования втулки для сапр Компас-3d

1. Цель работы: ознакомиться с созданием прикладной библиотеки трехмерного моделирования 3D-модели детали.

2. Указание к выполнению лабораторных работ

К выполнению лабораторной работы следует приступить после получения первоначальных навыков твердотельного моделирования и программирования в среде Borland Delphi.

3. Содержание работы

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

Библиотека разработана на языке Object Pascal в визуальной среде Borland Delphi 7.0. В качестве инструментов разработки можно использовать и другие программные средства. Структура исходного текста прикладных библиотек системы Компас-3D V7 не зависимо от среды разработки практически не изменяется. Внутренние функции САПР КОМПАС одинаковы для любых средств разработки.

Библиотека служит для получения трехмерной модели втулки, конструкция которой приведена на рис. 8.1.

В работе реализованы два варианта получения втулки:

1) с нефиксированными размерами

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

Во втором случае, для повышения степени автоматизации, используется база данных.

Рис. 8.1. Проектируемая втулка

3.2 Разработка файла проекта.

1. Запускаем среду разработки Borland Delphi.

2. Закрываем без сохранения заготовки для создания нового приложения (new application), выбираем в меню File пункт New, далее выбираем Other... (рис. 8.2) В открывшемся диалоге выбираем пункт DLL Wizard (рис. 8.3), откроется модуль текущего проекта новой библиотеки.

Рис. 8.2. Создание проекта Рис. 8.3. Выбор DLL проекта

3. В меню Project выберем пункт Options. (рис. 8.4). Откроется диалог, показанный на рис. 8.5. В нем следует выбрать вкладку Application, найти на ней блок Output Settings и задать тип компилируемого файла: rtw (рис. 8.5). Определить тип получаемого файла можно и другим методом: установив директиву в исходный текст основного модуля проекта библиотеки. Директива: {$E rtw}.

Рис. 8.4. Запуск диалога Рис. 8.5. Опции проекта

4. В меню Run выбираем пункт Parameters. (рис. 8.6) откроется диалог, показанный на рис. 8.7. В блоке Host Application необходимо указать путь к основному запускаемому файлу САПР Компас-3D V7. В случае необходимости заполнить остальные параметры диалога.

Рис. 8.6. Параметры Рис. 8.7. Указание пути к “Компас-3D”

Переходим в окно редактирования исходного файла проекта.

5. В случае необходимости в блоке uses подключим дополнительные модули.

6. Добавим процедуру инициализации.

procedure Initialize();

begin

try

if Application = nil then

// Если объект приложения удален, то создаем заново

Application := TApplication.Create(nil);

if Application <> nil then begin

// производим его инициализацию Application.Initialize;

// Создаем форму

Application.Create Form(TForm 1, Form 1);

// Запускаем приложение

Application.Run;

// После завершения работы освобождаем ресурсы

Application.Free();

Application := nil;

end;

except

if Application <> nil then

begin

// Если есть исключения, то завершаем процесс Application.Terminate;

Application.Free();

Application := nil;

end;

end;

end;

Данная процедура может быть использована в неизменном виде для разработки любой библиотеки. В ходе анализа предложенной процедуры можно увидеть, что она в некоторой степени перегружена проверками различных ошибок. Данные операции выполняются при помощи конструкций if - then. Конструкция try - except работает следующим образом: если в ходе исполнения содержимого блока, располагающегося между try и except, происходит ошибка, вместо данного блока выполняется код, расположенные после except (до end). Часть проверок и обработчиков ошибок (или все полностью) можно удалить. При этом приложение останется работоспособным, но его надежность снизится. Ключевые строки рассмотренной процедуры:

Application.Initialize - производит инициализацию приложения;

Application.CreateForm - создает форму приложения; Application.Run - производит запуск приложения.

7. Любая прикладная библиотека системы Компас-3D V7 должна обязательно содержать 3 функции: имя библиотеки, идентификатор библиотеки и точку входа в библиотеку.

а) Функция имени библиотеки задает строку, которая будет определять название разрабатываемой библиотеки. Пример функции приведен далее:

function LibraryName(): PChar; pascal;

begin

// Возвращаем имя библиотеки

Result := PChar('ВТУЛКА');

end;

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

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

function LibraryId(): LongWord; pascal;

begin

// Возвращаем идентификатор библиотеки

Result := 1000;

end;

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

procedure LibraryEntry(command: WORD); pascal;

begin

// При вызове входной функции инициализируем приложение

Initialize();

end;

При построении библиотеки аналогично предложенному шаблону данная функция не требует изменений. 8. Составляем блок библиотеки exports. В него помещается список всех экспортируемых библиотекой функций. В нашем случае это три функции, описанных в пункте 7. Пример блока exports приведен далее:

exports

LibraryName name 'LIBRARYNAME',

LibraryId name 'LIBRARYID',

LibraryEntry name 'LIBRARYENTRY';

Далее приведен весь текст модуля проекта библиотеки:

library Vtulka;

uses

SysUtils,

Classes,

Forms,

Unit1 in 'Unit1.pas' {Form1};

{$E rtw}

{$R *.res}

procedure Initialize();

begin

try

if Application = nil then

// Если объект приложения удален, то создаем заново

Application := TApplication.Create(nil);

if Application <> nil then

begin

// производим его инициализацию

Application.Initialize;

// Создаем форму

Application.CreateForm(TForm1, Form1);

// Запускаем приложение

Application.Run;

// После завершения работы освобождаем ресурсы

Application.Free();

Application := nil;

end;

except

if Application <> nil then

begin

// Если есть исключения, то завершаем процесс

Application.Terminate;

Application.Free();

Application := nil;

end;

end;

end;

(*****************************************************)

function LibraryName(): PChar; pascal;

begin

// Возвращаем имя библиотеки

Result := PChar('ВТУЛКА');

end;

(*****************************************************)

function LibraryId(): LongWord; pascal;

begin

// Возвращаем идентификатор библиотеки

Result := 1000;

end;

(*****************************************************)

procedure LibraryEntry(command: WORD); pascal;

begin

// При вызове входной функции инициализируем приложение

Initialize();

end;

(*****************************************************)

exports

LibraryName name 'LIBRARYNAME',

LibraryId name 'LIBRARYID',

LibraryEntry name 'LIBRARYENTRY';

begin

end.

Примечания: в ходе разработки необходимо время от времени сохранять результаты работы. Для этого можно воспользоваться функцией Save All, располагающейся в меню File (рис. 8.8) или аналогичной иконкой на панели (рисунок 8.9)

Рис. 8.8. Сохранение проекта Рис. 8.9. Сохранение проекта

При первом сохранении следует указать папку, в которой будут сохранены файлы. Открыть сохраненные исходные файлы библиотеки можно через меню File среды Borland Delphi или двойным кликом на соответствующей иконке в проводнике Windows. Если после открытия исходный файл проекта библиотеки не отображается, следует выбрать View Source в меню Project (рис. 8.10).

9. В случае необходимости пишем в исходном файле проекта дополнительные функции и процедуры.

3.3. Создаем диалоговое окно библиотеки. Для этого в меню File выбираем подменю New, в котором выбираем Form (рис. 8.11).

Рис. 8.10. Создание формы Рис. 8.11. Показать код проекта

Настраиваем свойства созданной формы при помощи Object Inspector, размещаем на форме компоненты, необходимые для реализации интерфейса библиотеки. Форма с диалоговым окном рассматриваемого примера библиотеки приведена на рис. 8.12. Представленный интерфейс целиком создан при помощи стандартных компонент среды Borland Delphi. Пояснительные надписи являются компонентом TLabel, поля ввода - TEdit, кнопка "Построить" - TButton.

Рис. 8.12. Интерфейс библиотеки

В левом нижнем углу расположены два компонента типа TCheckBox, они применяются для выбора определенных условий при помощи установки или снятия галочки. Верхний TCheckBox отвечает за тип отверстия (сквозное/несквозное), а нижний - за количество фасок (одна или две). Правее от CheckBox расположены два невизуальных (неотображаемых на форме готового приложения) компонента: TOpen-Dialog и TADOTable. Первый из них обеспечивает реализацию стандартного диалога Windows открытия файла, второй применяется для работы с базой данных. В правом верхнем углу находится "контейнер" для компонентов TGroupBox. Он применяется для группировки компонентов согласно принципу, выбранному разработчиком. На панели TGroupBox располагается компонент TLabel, служащий пояснительной надписью, выпадающий список TComboBox и кнопка типа TBitBtn. TComboBox применяется для выбора из списка определенного значения, компонент также позволяет вводить значения с клавиатуры. В библиотеке данный компонент используется для выбора типа втулки из базы данных. TBitBtn является кнопкой, которая отличается от обычной кнопки TButton возможностью размещения маленького рисунка на кнопке.

Рисунок устанавливается при помощи свойства Glyph. Рисунок втулки на форме является компонентом Image вкладки Additional (рис. 8.13)

Рис. 8.13. Компонент Image

Переходим в окно редактирования исходного текста модуля формы.

1. Подключаем в секции uses необходимые модули и файлы, в секции var описываем переменные, которые будут доступны для всех процедур модуля. В случае необходимости вводим дополнительные типы и классы.

2. Создаем процедуру построения трехмерной модели детали согласно введенным параметрам.

3. Создаем процедуру обработки событий формы. В приведенном примере следует обрабатывать событие нажатия кнопки "Построить".

3.4 Разработка блок-схемы библиотеки втулок

Пункты 2 и 3 являются основными, на них приходится большая часть программного кода. При разработке библиотеки будут использоваться операции вращения, выдавливания, создания фаски. Блок-схема создания модели втулки приведена на рис. 8.14, а размеры стандартных втулок в таблице 1. При разработке библиотеки широко используется справочное руководство, интегрированное в САПР Компас-3D V7 является, основным инструментом.

Рис. 8.14. Блок-схема построения 3D-модели втулки

Таблица 8.1

Геометрия втулки

ГОСТ 12215-66

Тип

Высота, L

Диаметр втулки, Dmax

Диаметр отверстия, Dotv

Глубина отверстия

Сторона фаски, da

Число фасок

Тип1

4

6

2,5

сквозное

0,2

2

Тип2

6

8

4

сквозное

0,2

2

Тип3

8

10

6

сквозное

0,6

2

Окончание таблицы 8.1

Тип4

10

12

8

сквозное

0,6

2

Тип5

12

16

10

сквозное

0,6

2

Тип6

14

18

12

сквозное

0,6

2

Тип7

14

22

12

сквозное

0,6

2

Тип8

18

22

16

сквозное

0,6

2

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

Модуль Unitl:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,

Forms,

Dialogs, StdCtrls, Buttons, LDefin2D, LDefin3D, ksAuto, ksTLB,

math,

ExtCtrls, jpeg, DB, ADODB, Menus;

type

TForm1 = class(TForm)

EdL: TEdit;

EdDmax: TEdit;

EdDotv: TEdit;

EdLotv: TEdit;

Eda: TEdit;

Button1: TButton;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

CsB1: TCheckBox;

GroupBox1: TGroupBox;

ComboBox1: TComboBox;

Label6: TLabel;

CsB2: TCheckBox;

ADOTable1: TADOTable;

BitBtn1: TBitBtn;

OpenDialog1: TOpenDialog;

MainMenu1: TMainMenu;

N1: TMenuItem;

N2: TMenuItem;

N3: TMenuItem;

N4: TMenuItem;

N5: TMenuItem;

N6: TMenuItem;

Image1: TImage;

procedure Button1Click(Sender: TObject);

procedure CsB1Click(Sender: TObject);

procedure BitBtn1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure ComboBox1Change(Sender: TObject);

procedure N6Click(Sender: TObject);

procedure N3Click(Sender: TObject);

procedure N5Click(Sender: TObject);

procedure N2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

iKompasObject: KompasObject;

iDocument3D: ksDocument3D;

L,Dmax,Dotv,Lotv,a:REAL;

dve: boolean;

s:string;

implementation

uses Unit2, Unit3, Unit4;

{$R *.dfm}

procedure VtulkaPaint;

var

iPart : ksPart; //деталь

iSketchEntity : ksEntity;

iSketchDef : ksSketchDefinition;

iPlaneEntity : ksEntity;

iSketchDocument2D : ksDocument2D;

iBaseRotatedEntity : ksEntity;

iBaseRotatedDef : ksBaseRotatedDefinition;

iRotatedProperty : ksRotatedParam;

iSketch2Entity : ksEntity;

iSketch2Def : ksSketchDefinition;

iSketch2Document2D : ksDocument2D;

iCutExtrusion : ksEntity;

iCutExtrusionDef : ksCutExtrusionDefinition;

iEntityCollection : ksEntityCollection;

iChamferEntity : ksEntity;

iEntityArray : ksEntityCollection;

iChamferDef : ksChamferDefinition;

Begin

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

// новый компонент

if iPart <> nil then

begin

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

if iSketchEntity <> nil then

begin

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

iSketchDef := ksSketchDefinition(iSketchEntity.GetDefinition);

if iSketchDef <> nil then

begin

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

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

if iPlaneEntity <> nil then

begin

iSketchDef.SetPlane( iPlaneEntity ); // установим плоскость XOZ

базовой для эскиза

iSketchEntity.Create; // создадим эскиз

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

iSketchDocument2D :=ksDocument2D(iSketchDef.BeginEdit);

if iSketchDocument2D <> nil then

begin

// введем новый эскиз

iSketchDocument2D.ksLineSeg(0, 0, Dmax/2, 0, 1);

iSketchDocument2D.ksLineSeg(Dmax/2, 0, Dmax/2, L, 1);

iSketchDocument2D.ksLineSeg(Dmax/2, L, 0, L, 1);

iSketchDocument2D.ksLineSeg(0, L, 0, 0, 3);

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

end;

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

if iBaseRotatedEntity <> nil then

begin

iBaseRotatedDef := ksBaseRotatedDefinition(iBaseRotatedEntity.

GetDefinition);

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

if iBaseRotatedDef <> nil then

begin

iRotatedProperty := ksRotatedParam(iBaseRotatedDef. Rotated-

Param);

if iRotatedProperty <> nil then

begin

iRotatedProperty.direction := dtNormal;

iRotatedProperty.toroidShape := false;

end;

iBaseRotatedDef.SetSideParam(TRUE, 360);

iBaseRotatedDef.SetSketch( iSketchEntity );

// эскиз операции вращения

iBaseRotatedEntity.Create; // создать операцию

end;

end;

end;

end;

end;

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

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

if iSketch2Entity <> nil then

begin

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

iSketch2Def := ksSketchDefinition(iSketch2Entity.GetDefinition);

if iSketchDef <> nil then

begin

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

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

if iPlaneEntity <> nil then

begin

iSketch2Def.SetPlane( iPlaneEntity ); // установим плоскость

iSketch2Entity.Create; // создадим эскиз

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

iSketch2Document2D := ksDocument2D( iSketch2Def.BeginEdit );

// введем новый эскиз - окружность

iSketch2Document2D.ksCircle(0, 0, dotv/2, 1);

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

// вырежем выдавливанием

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

if iCutExtrusion <> nil then

begin

iCutExtrusionDef := ksCutExtrusionDefinition

(iCutExtrusion. GetDefinition);

if iCutExtrusionDef <> nil then

begin

iCutExtrusionDef.SetSketch( iSketch2Entity );

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

iCutExtrusionDef.DirectionType := dtReverse;

iCutExtrusionDef.SetSideParam(false, etBlind, Lotv, 0, false);

end;

iCutExtrusion.Create;

// создадим операцию вырезание выдавливанием

end;

end;

end;

end;

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

iEntityCollection:= ksEntityCollection(iPart.EntityCollection(

o3d_edge ));

if (iEntityCollection <> nil) and

(iEntityCollection.SelectByPoint(dmax/2, 0, -1*L)) and

(iEntityCollection.GetCount > 0 ) then

begin

iChamferEntity := ksEntity(iPart.NewEntity( o3d_chamfer ));

if iChamferEntity <> nil then

begin

iChamferDef := ksChamferDefinition(iChamferEntity. GetDefinition);

if iChamferDef <> nil then

begin

iChamferDef.Tangent := false;

iChamferDef.SetChamferParam( false, a, a);

iEntityArray:= ksEntityCollection( iChamferDef.Array_ );

// динамический массив объектов

if iEntityArray <> nil then

begin

iEntityArray.Add( iEntityCollection.GetByIndex(0) );

iChamferEntity.Create;

end;

end;

end;

end;

if dve=true then //проверка, требуется ли вторая фаска

begin

//вторая фаска

iEntityCollection:= ksEntityCollection

(iPart.EntityCollection(o3d_edge ));

if (iEntityCollection <> nil) and

(iEntityCollection.SelectByPoint(dmax/2, 0, 0)) and

(iEntityCollection.GetCount > 0 ) then

begin

iChamferEntity := ksEntity(iPart.NewEntity( o3d_chamfer ));

if iChamferEntity <> nil then

begin

iChamferDef := ksChamferDefinition(iChamferEntity. GetDefinition);

if iChamferDef <> nil then

begin

iChamferDef.Tangent := false;

iChamferDef.SetChamferParam( false, a, a);

iEntityArray:= ksEntityCollection( iChamferDef.Array_ );

// динамический массив объектов

if iEntityArray <> nil then

begin

iEntityArray.Add( iEntityCollection.GetByIndex(0) );

iChamferEntity.Create;

end;

end;

end;

end;

end;

If iDocument3D.IsDetail then

begin

iDocument3D.fileName:='vtulka.m3d';

iDocument3D.UpdateDocumentParam;

iDocument3D.Save;

end;

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

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

begin

//ввод параметров моделируемой втулки

L := StrToFloat(EdL.Text);

Dmax := StrToFloat(EdDmax.Text);

Dotv := StrToFloat(EdDotv.Text);

a:= StrToFloat(Eda.Text);

//определение типа отверстия (сквозное\несквозное)

if csb1.Checked=false then

Lotv:= StrToFloat(EdLotv.Text)

else

Lotv:=L;

//проверка количества фасок

if Csb2.Checked then

dve:=true

else

dve:=false;

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

iKompasObject := KompasObject(CreateKompasObject);

if iKompasObject <> nil then

begin

iDocument3D := ksDocument3D(iKompasObject.Document3D);

if idocument3d.Create(false,true) then

begin

if (iDocument3D <> nil) then

begin

VtulkaPaint;

end;

end;

end;

end;

//обработка события изменения типа отверстия (сквоз-

ное\несквозное)

procedure TForm1.CsB1Click(Sender: TObject);

begin

if csb1.Checked then

begin

EdLotv.Enabled:=false;

EdLotv.Text:='сквозное';

end

else

begin

EdLotv.Enabled:=true;

EdLotv.Text:='30';

end;

end;

//обработка события нажатия на кнопку "редактировать базу данных"

procedure TForm1.BitBtn1Click(Sender: TObject);

begin

ADOTable1.Active:=false;

Form2.Show;

end;

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

procedure TForm1.FormCreate(Sender: TObject);

begin

//запуск диалога открытия файла, с помощью которого определяем

путь к БД (s)

If OpenDialog1.Execute() then

s:=OpenDialog1.FileName;

//устанавливаем строку подключения к БД, активируем БД, переходим на первую позицию выбранной таблицы

ADOTable1.ConnectionString:='Provider=Microsoft.Jet.

OLEDB.4.0; Data Source='+s+';Mode=ReadWrite;Persist

Security Info=False';

ADOtable1.Active:=true;

ADOTable1.First;

//в данном цикле осуществляется заполнение выпадающего списка

выбора втулок из БД

repeat

ComboBox1.Items.Add(ADOTable1.

FieldByName('Тип').AsString);

ADOTable1.Next;

until ADOTable1.Eof;

//деактивирование БД

ADOTable1.Active:=false;

end;

//процедура обработки события выбора пункта из списка типов втулок из БД

procedure TForm1.ComboBox1Change(Sender: TObject);

begin

//активация таблица, переход на первую позицию

ADOtable1.Active:=true;

ADOTable1.First;

//цикл, в котором осуществляется выбор требуемых значений из БД согласно выбранному типу втулки

repeat

// данное условие определяет строку БД, которое соответствует

выбранному пункту списка

if ComboBox1.

Items[ComboBox1.ItemIndex]=

ADOTable1.FieldByName('Тип').AsString then

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

begin

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

EdL.Text:=ADOTable1.FieldByName('Высота').AsString;

EdDmax.Text:=ADOTable1.FieldByName

('Диаметр втулки').AsString;

EdDotv.Text:=ADOTable1.FieldByName

('Диаметр отверстия').AsString;

EdLotv.Text:=ADOTable1.FieldByName

('Глубина отверстия').AsString;

Eda.Text:=ADOTable1.FieldByName('Сторона фаски').AsString;

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

if ADOTable1.FieldByName('Число фасок').AsString='2' then

Csb2.Checked:=true

else

Csb2.Checked:=false;

if EdLotv.Text='сквозное' then

begin

EdLotv.Enabled:=false;

Csb1.Checked:=true;

end

else

begin

EdLotv.Enabled:=true;

Csb1.Checked:=false;

end;

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

Break;

end;

// переход на следующую строку таблицы БД, выполняется, если вы-

шестоящее условие не выполнилось

ADOTable1.Next;

until ADOTable1.Eof;

// деактивация таблицы

ADOTable1.Active:=false;

end;

procedure TForm1.N6Click(Sender: TObject);

begin

Form3.Show();

end;

procedure TForm1.N3Click(Sender: TObject);

begin

close();

end;

procedure TForm1.N5Click(Sender: TObject);

begin

Form4.Show();

end;

procedure TForm1.N2Click(Sender: TObject);

begin

L := StrToFloat(EdL.Text);

Dmax := StrToFloat(EdDmax.Text);

Dotv := StrToFloat(EdDotv.Text);

if csb1.Checked=false then

Lotv:= StrToFloat(EdLotv.Text)

else

Lotv:=L;

a := StrToFloat(Eda.Text);

if Csb2.Checked then

dve:=true

else

dve:=false;

iKompasObject := KompasObject(CreateKompasObject);

if iKompasObject <> nil then

begin

iDocument3D := ksDocument3D(iKompasObject.Document3D);

if idocument3d.Create(false,true) then

begin

if (iDocument3D <> nil) then

begin

VtulkaPaint;

end;

end;

end;

end;

end.

3.5 Разработка процедур реализации библиотеки

Процедура VtulkaPaint полностью написана программистом. В ней нет конструкций, построенных автоматически средой Borland Delphi. Структура данной процедуры типична для языка Object Pascal. После объявления процедуры идет блок описания переменных var. Отдельное внимание следует уделить типам используемых переменных. В отличие от привычных для большинства программистов численных строковых и других распространенных типов они относятся к системе САПР Компас. Все переменные начинаются с букв ks, что определяет их отношение к Компасу. Несмотря на то, что других типов переменных в данной процедуре нет, данный факт не означает, что они не могут применяться. По желанию разработчика в процедуру можно добавить переменные любых типов.

Тело процедуры помещено между ключевыми операторами (begin и end) и располагается сразу после секции описания переменных. Далее будет дано подробно описание процедуры. Все строки и конструкции исходного текста будут помещены в круглые одинарные скобки. Как уже было замечено ранее, текст программного средства несколько перегружен количеством проверок выполнения различных условий. Их можно удалить частично или полностью. При этом может произойти значительное снижение надежности разрабатываемой прикладной библиотеки.

Первой строкой (iPart:= ksPart(iDocument3D.GetPart( pNew_Part))) создаем новую трехмерную деталь. Далее следует проверка исполнения операции (iPart <> nil). В случае положительного результата выполняется строка (iSketchEntity:= ksEntity(iPart.NewEntity( o3d_sketch ))), в которой переменной присваивается значение интерфейса элемента модели (плоскости, оси, формообразующие элементы и так далее). Очередная проверка выполнения операции (iSketchEntity <> nil). При ее положительном выполнении выполняется следующая строка (iSketchDef:= ksSketchDefinition (iSketchEn-tity.GetDefinition)). В строке присваивается переменной (iSketchDef) значение интерфейса параметров эскиза. Следующее действие начинается с очередной проверки предыдущего (iSketchDef <> nil). Строка (iPlaneEntity:= ksEn-tity(iPart.GetDefaultEntity (o3d_planeXOZ ))) устанавливает переменную (iPlaneEntity) в значение "плоскость XOZ". Опять проверяется предыдущая операция (iPlaneEntity <> nil), после чего плоскость XOZ устанавливается в качестве базовой для эскиза (iSketchDef.SetPlane( iPlaneEntity )). Строка (iSketchEntity.Create) создает на ней эскиз.

Теперь немного отвлечемся от исходного текста модуля библиотеки и рассмотрим рассмотренный выше фрагмент так, как будто мы работаем в Компасе и создаем втулку вручную. Данный фрагмент эквивалентен следующим действиям: в меню Компас-3D V7 Файл выбрали Создать..., далее Деталь, перешли в дерево построения, выбрали плоскость XOZ и открыли на ней редактирование эскиза.

Строка (iSketchDocument2D:= ksDocument2D (iSketchDef.BeginEdit)) задает переменную интерфейса эскиза. В случае положительного выполнения дан-ной операции, о чем свидетельсвует удачная проверка условия (iSketchDocument2D <> nil) осуществляется переход к построению эскиза. Построение эскиза (рис. 8.15) осуществляется при помощи следующего блока:

(iSketchDocument2D.ksLineSeg(0, 0, Dmax/2, 0, 1); iSketchDocument2D.ksLineSeg(Dmax/2, 0, Dmax/2, L, 1); iSketchDocument2D.ksLineSeg(Dmax/2, L, 0, L, 1); iSketchDocument2D.ksLineSeg(0, L, 0, 0, 3);)

Рис. 8.15. Эскиз

Хорошо заметна однотипность строк, входящих в него. Каждая из них выполняет один из отрезков в эскизе. Операция производится при помощи изменения свойства интерфейса эскиза. Текст (iSketchDocument2D) является переменной. Конструкция (iSketchDocument2D.ksLineSeg(x1,y1, x2,y2, type)) строит отрезок с координатами (x1,y1, x2,y2), тип линии определяется числом (type). Например, тип 1 соответствует основной линии, а тип 3 - осевой. Редактирование эскиза завершается строкой (iSketchDef.EndEdit). Суть рассмотренного выше фрагмента заключается в следующем: осуществляется построение эскиза, представляющего собой прямоугольник, в дальнейшем вращением которого получается твердотельная цилиндрическая модель втулки. Проектируемая втулка могла быть получена только при помощи одной операции вращения.

Следующий этап ответственен непосредственно за операцию вращения. Он начинается с присвоением переменной (iBaseRotatedEntity) соответствующего значения (iBaseRotatedEntity:= ksEntity(iPart.NewEntity( o3d_baseRotated ))). Далее производится стандартная проверка выполнения операции (iBaseRotatedEntity <> nil). В случае положительного результата выполняется строка (iBaseRotatedDef:= ksBaseRotatedDefinition(iBaseRotatedEntity.GetDefinition)). В ней переменной (iBaseRotatedDef) присваивается значение интерфейса параметров основания элемента вращения. Опять проводится проверка (iBaseRotatedDef <> nil). В случае положительного результата производится присвоение переменной (iRotatedProperty) интерфейса параметров вращения (iRotatedProperty := ksRotatedParam(iBaseRotatedDef.RotatedParam)). Проверка (iRotatedProperty <> nil), после прохождения которой происходит непосредственное указание параметров вращения. Строка (iRotatedProperty.direction:= dtNormal) определяет направление вращения (нормальное, прямое). Строка (iRotatedProperty.toroidShape:= false) определяет тип полученного элемента: тороид или сфероид. В данном случае сфероид (требуемый цилиндр является сплошным твердым телом). Если необходимо получить тороид необходимо значение false изменить на true. Следующая строка (iBaseRotatedDef. SetSideParam(TRUE, 360)) определяет направление и угол вращения. В данном случае прямое направление и угол 360 градусов. Строка (iBaseRotatedDef.SetSketch(iSketchEntity )) определяет эскиз (переменную), который необходимо вращать. Операция вращения осуществляется строкой (iBaseRotatedEntity.Create).

Если вернуться к аналогии с ручным построением, на предыдущем этапе было сделано следующее: применили к построенному эскизу операцию вращения, указали параметры операции вращения (направление вращения, тип получаемого объекта (сфероид), угол поворота) и подтвердили операцию. Результат показан на рис. 8.16.

Рис. 8.16. Результат операции вращения

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

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

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

if iSketch2Entity <> nil then

begin

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

iSketch2Def := ksSketchDefinition(iSketch2Entity.GetDefinition);

if iSketchDef <> nil then

begin

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

iPlaneEntity := ksEntity(iPart.GetDefaultEntity( o3d_planeXOY

));

if iPlaneEntity <> nil then

begin

iSketch2Def.SetPlane( iPlaneEntity );

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

iSketch2Entity.Create; // создадим эскиз

Для выдавливания используем эскиз в виде окружности радиусом Dotv/2. За его построение отвечает строка (iSketch2Document2D.ksCircle(0, 0, dotv/2, 1)). В данном случае 0,0 - это координаты центра окружности, dotv/2 - радиус окружности, 1- тип линии (основная) – рис. 8.17.

Рис. 8.17. Эскиз

Окончание построения эскиза следует отметить строкой (iSketch2Def.EndEdit).

По аналогии с предыдущей операцией следующей строкой следует присвоение переменной (iCutExtrusion) значения, соответствующего операции выдавливания (iCutExtrusion := ksEntity(iPart.NewEntity(o3d_cutExtrusion))). Далее производится стандартная проверка выполнения операции (iCutExtrusion <> nil). В случае положительного результата выполняется строка (iCutExtru-sionDef:=ksCutExtrusionDefinition(iCutExtrusion.GetDefinition)), в которой переменной (iCutExtrusionDef) присваивается значение интерфейса операции выдавливания. Следующая строка (iCutExtrusionDef <> nil) является проверкой предыдущей операции. При ее положительном выполнении выполняется блок кода, устанавливающий конкретные параметры операции выдавливания.

Первая строка данного блока (iCutExtrusionDef.SetSketch (iSketch2Entity)) нам знакома по операции вращения. С ее помощью устанавливается эскиз, который будет использоваться в операции.Строка (iCutExtrusionDef.DirectionType := dtReverse) определяет направление выдавливания. В данном случае обратное.

В третьей строке (iCutExtrusionDef.SetSideParam( false, etBlind , Lotv, 0, false);) устанавливаются следующие параметры операции выдавливания: направление выдавливания (true - прямое, false (в данном случае) - обратное, тип выдавливания, etBlind (в данном случае) - на заданную глубину, глубина отверстия (Lotv), угол наклона (0), направление наклона (true -наружу, false-внутрь; так как угол в нашем примере равен нулю, значение данного параметра неважно)).

Операция выдавливания создается строкой (iCutExtrusion. Create). Примечание: (iCutExtrusion) - это название переменной, оно может быть различным и определяться по усмотрению разработчика, создание осуществляется методом (Create).

Описанный выше фрагмент программного кода эквивалентен операции выдавливания, выполняемой вручную в системе Компас. Рассмотрим подробнее эквивалентное ручное построение (на данном этапе му уже имеем цилиндр-заготовку втулки). Сначала в плоскости XOY мы открываем эскиз, построим окружность с центром с координатами (0,0) радиусом Dotv/2. Далее закончим редактирование эскиза. Выбираем эскиз, переходим к операции выдавливания. Указываем параметры операции выдавливания: направление выдавливания (обратное), тип выдавливания (на расстояние). Устанавливаем глубину выдавливания, устанавливаем (нулевое) значение уклона и (любое) направление уклона. Подтверждаем операцию выдавливания. Результат работы прикладной библиотеки на данном этапе показан на рис. 8.18.

Рис. 8.18. Результат операции выдавливания

Следующий блок исходного текста модуля отвечает за создание фаски. Началом блока является строка (iEntityCollection:= ksEntityCollection(iPart.EntityCollection(o3d_edge))). Она присваивает переменной (iEntityCollection) значение интерфейса массива объектов модели. Далее следует проверка, состоящая из трех условий. Для положительного результата требуется выполнение всех трех условий одновременно, так как они связаны логическим оператором and. Первое условие (iEntityCollection <> nil) проверяет факт присвоения значения. Второе условие (iEntityCollection.SelectByPoint(dmax/2, 0, 0)) проверяет есть ли в массиве объекты, содержащие точку, заданную в массиве (координаты точки задаются стандартно: x,y,z). Третье условие (iEntityCollection.GetCount > 0) проверяет, не пустой ли массив. Строка (iChamferEntity := ksEntity(iPart.NewEntity( o3d_chamfer ))) уже нам хорошо знакома, она водит переменную элемента (фаски) трехмерной модели. Далее следует проверка выполнения (iChamferEntity <> nil). В случае положительного результата выполняется строка (iChamferDef:= ksChamferDefinition (iChamferEntity.GetDefinition)), которая указывает на интерфейс массива граней и ребер, на которых строится фаска. Производится очередная проверка выполнения предыдущей операции (iChamferDef <> nil). При положительном результате выполняется блок, задающий параметры фаски и выполняющий ее построение. Строка (iChamferDef.Tangent := false) поределяет следует ли продолжать фаску по касательным ребрам: true - следует, false (в данном случае) - не следует. Строка (iChamferDef. SetChamferParam (false, a, a)) устанавливает параметры фаски. Значения в скобках: (признак направления фаски (false - в данном случае), размер первого катета фаски (a- в данном случае), размер второго катета фаски (a- в данном случае)).

Строка (iEntityArray:= ksEntityCollection (iChamferDef.Array)) вводит динамический массив элементов. Далее следует проверка данной операции (iEntityArray <> nil). При положительном результате добавляем объект в массив при помощи строки (iEntityArray.Add( iEntityCollection.GetByIndex(0) )), где (0) - индекс добавляемого элемента. Построение фаски осуществляется строкой (iChamferEntity.Create).

Количество фасок определяется пользователем и устанавливается в главном диалоговом окне библиотеки при помощи галочки (компонент TCheckBox). Одна фаска строится обязательно при любых входных параметрах. Построение второй фаски осуществляется, если выполняется условие (if dve=true then). В данном случае (dve) является логической переменной типа Boolean, присвоение ей значения будет рассмотрено далее. Методика создания фаски полностью повторяет первую фаску, за исключением ключевой точки (взята точка на противолежащем ребре).

Построение фасок, описанное выше эквивалентно ручному построению данного элемента. При ручном аналогичном построении (на данном этапе мы имеем деталь, показанную на рис. 8.18) сначала мы выбираем ребро, с ко-торой будет снята фаска, далее указываем параметры фаски: способ получения (по 2 сторонам), направление, длина катетов, продолжение по касательным ребрам (не продолжать). После ввода параметров подтверждаем создание фаски. Результат показан на рисунке 19.

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

If iDocument3D.IsDetail then begin

iDocument3D.fileName:='vtulka.m3d';

iDocument3D.UpdateDocumentParam;

iDocument3D.Save;

end;

Рис. 8.19. Деталь

Условие (iDocument3D.IsDetail) определяет, является ли спроектированная модель деталью. В случае его выполнения происходит присвоение имени файла (iDocument3D.fileName:='vtulka.m3d'). Следующая строка (iDocument3D.UpdateDocumentParam) активизирует измененные свойства документа. Сохранение файла осуществляется конструкцией (iDocument3D.Save). По умолчанию файл сохраняется в папке Bin каталога, в который установлен Компас.

Вторая процедура модуля прикладной библиотеки построения трехмерной модели втулки является обработчиком события нажатия кнопки "Построить". Далее приводится ее полный текст:

L := StrToFloat(EdL.Text);

Dmax := StrToFloat(EdDmax.Text);

Dotv := StrToFloat(EdDotv.Text);

if csb1.Checked=false then

Lotv:= StrToFloat(EdLotv.Text)

else

Lotv:=L;

a := StrToFloat(Eda.Text);

if Csb2.Checked then

dve:=true

else

dve:=false;

iKompasObject := KompasObject(CreateKompasObject);

if iKompasObject <> nil then

begin

iDocument3D := ksDocument3D(iKompasObject.Document3D);

if idocument3d.Create(false,true) then

begin

if (iDocument3D <> nil) then

begin

VtulkaPaint;

end;

end;

end;

end;

Блок:

if csb1.Checked=false then

Lotv:= StrToFloat(EdLotv.Text)

else

Lotv:=L;

проверяет состояние компонента TCheckBox, отвечающего за определение типа отверстия. В текущем примере данный компонент имеет имя csbl. Имя задается разработчиком и может изменяться в широких пределах. Имя не определяет тип компонента. По умолчанию Borland Delphi именует компоненты следующим образом: название типа без буквы T + порядковый номер. Например, CheckBox3. Через точку после имени компонента указано свойство (Checked: принимает значения true или false в зависимости от того установлена галочка или нет). Таким образом, условие проверяет, установлена галочка или нет. Если условие выполняется (галочка не установлена, отверстие глухое) глубина отверстия определяется согласно поля ввода. В противном случае глубина отверстия устанавливается на всю длину втулки. Аналогично проверяется количество фасок:

//проверка количества фасок if Csb2.Checked then dve:=true else

dve:=false;

В результате приведенной выше проверки переменная (dve) принимает значение true или false. Применение данной переменной рассмотрено выше. (конструкция (Csb2.Checked) равноценна (Csb2.Checked:=true).) Процедура (TForm1.CsB1Click) обрабатывает событие изменения состояния компонента типа TCheckBox с именем csbl. Данный компонент отвечает за установку типа отверстия. Ниже приведен текст процедуры:

procedure TForm1.CsB1Click(Sender: TObject);

begin

if csb1.Checked then

begin

EdLotv.Enabled:=false; EdLotv.Text:='сквозное'; end else

begin

EdLotv.Enabled:=true;

EdLotv.Text:='30';

end;

end;

При установке или снятии галочки происходит запуск процедуры. Если галочка была установлена (csb1.Checked), значит отверстие сквозное. При этом запрещается редактирование поля установки глубины отверстия (Ed-Lotv.Enabled:=false), и оно заполняется текстом "сквозное" (Ed-Lotv.Text: = 'сквозное'). Блок, следующий после (else) выполняется при снятии галочки, что показывает на глухое отверстие. При этом разрешается редактирование поля, задающего глубину отверстия (Ed-Lotv.Enabled:=true) и задается глубина отверстия в 30 мм (Ed-Lotv.Text: = '30'). Примечание: числа в компонент TEdit вводятся как текст, то есть в одинарных кавычках.

Шаблон данной процедуры может быть создан автоматически. Для этого необходимо выбрать компонент, событие которого должно быть обрабо-тано (кнопку "Построить" в данном случае) и в Object Inspector на закладке Events осуществить двойной клик левой кнопки мыши напротив события OnClick, аналогичный результат можно получить двойным кликом левой кнопки мыши на кнопке разрабатываемой формы.

В начале процедуры обработки нажатия кнопки осуществляется ввод параметров проектируемой детали. За это отвечает следующий фрагмент программного кода:

L := StrToFloat(EdL.Text);

Dmax := StrToFloat(EdDmax.Text);

Dotv := StrToFloat(EdDotv.Text);

Lotv := StrToFloat(EdLotv.Text);

a := StrToFloat(Eda.Text);

Все строки однотипны, поэтому мы рассмотрим только одну из них (L := StrToFloat(EdL.Text). L - переменная. В данном случае она определяет дину втулки. L объявлена в секции var модуля Unitl. StrToFloat() - функция преобразования строкового типа в вещественный. Выражение в скобках (EdL.Text) возвращает свойство текст (введенный текст) компонента, имя которого стоит впереди (EdL - в данном случае (компонент TEdit)). Имена компонентов и названия переменных могут быть установлены по желанию разработчика, их можно устанавливать в произвольной форме по собственному желанию.

Строка (iKompasObject: = KompasObject (CreateKompasObject)) присваивает переменной (iKompasObject) значение интерфейса объекта системы КОМПАС. Строка (iKompasObject <> nil) выполняет роль стандартной проверки выполнения операции. При положительном результате создается документ 3D модели Компас (iDocument3D := ksDocument3D(iKompasObject. Document3D)). После чего осуществляется очередная проверка последовательно по двум условиям (idocument3d.Create(false,true)) и (iDocument3D <> nil). В строке (idocument3d.Create(false,true)) в скобках помещается следующая информация: (режим редактирования документа: true - невидимый, false - видимый (в данном случае); тип документа: true - деталь (в данном случае) false- сборка). При положительных результатах проверки строкой (VtulkaPaint) производится вызов процедуры построения втулки, которая была описана выше.

3.6 Разработка базы данных библиотеки втулки

Вторая форма и соответствующий ей программный модуль представляют собой редактор базы данных. Основные функции представленного редактора обеспечиваются стандартными компонентами Delphi. При изучении формы редактора, показанной на рис. 8.20, можно увидеть следующие стандартные компоненты: TADOTable, TDataSource, TDBGrid, TDBNavigator.

Компонент "TDBGrid" , находится на странице Data Controls, компонент визуальный, отображается на том месте, где его разместил разработчик. Компонент представляет собой таблицу с отображением данных по строкам и столбцам, ориентированную на работу с базами данных. TDBGrid может применяться для просмотра и редактирования таблиц баз данных. В учебном примере используется только одно свойство данного компонента: "DataSource". Оно указывает источник данных (компонент "TDataSource").

Компонент "TDataSource" , находится на странице Data Access, компонент невизуальный (то есть на интерфейсной форме не отображается), используется в качестве промежуточного звена между таблицей (компонент "TADOTable" ) и такими компонентами, как "TDBGrid", "TDBNavigator" и так далее. В учебном примере используется только одно свойство данного компонента: "TDataSource". Оно указывает на таблицу базы данных (компонент "TADOTable").

Компонент "DBNavigator" , находится на странице Data Controls, компонент визуальный, отображается на том месте, где его разместил разработчик. Компонент представляет собой панель для навигации и редактирования таблицы базы данных. Пример компонента: В нашем случае используется только одно свойство данного компонента: "TDataSource". Оно указывает на источник данных (компонент " TDataSource ").

Текст программного модуля Unit2.pas содержит две процедуры. Первая из них:

procedure TForm2.FormActivate(Sender: TObject);

begin

//осуществляется подключение и активация БД

ADOTable1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;

Data Source='+s+';Mode=ReadWrite;Persist Security Info=False';

ADOtable1.Active:=true;

end;

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

Вторая процедура:

procedure TForm2.FormClose(Sender: TObject; var Action:

TCloseAction);

begin

//стираем содержимое списка типов, доступных в БД

Form1.ComboBox1.Items.Clear;

//переход на первую строку

ADOTable1.First;

// забиваем список типов, доступных из БД, заново

repeat

Form1.ComboBox1.Items.Add(ADOTable1.FieldByName('').AsString);

ADOTable1.Next;

until ADOTable1.Eof;

//деактивация таблицы

ADOtable1.Active:=false;

end;

выполняется при закрытии редактора база данных. Содержимое данной процедуры полностью аналогично обработке события создания первой формы за исключением первой строки (Form1.ComboBox1.Items.Clear). С ее помощью происходит удаление всего содержимого выпадающего списка выбора типа втулки из базы данных. Далее следует блок, который вновь заполняет удаленные позиции. Смысл этой конструкции таков: при редактировании базы данных пользователь мог добавить новые или удалить (изменить название) старые строки. В этом случае старые данные (если их не менять) в выпадающем списке будут недостоверны.

Текст модуля Unit2.pas:

unit Unit2;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,

Forms, Dialogs, ExtCtrls, DBCtrls, Grids, DBGrids, DB,

ADODB;

type

TForm2 = class(TForm)

ADOTable1: TADOTable;

DataSource1: TDataSource;

DBGrid1: TDBGrid;

DBNavigator1: TDBNavigator;

procedure FormActivate(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

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

procedure TForm2.FormActivate(Sender: TObject);

begin

//осуществляется подключение и активация БД

ADOTable1.

ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data

Source='+s+';Mode=ReadWrite;Persist Security Info=False';

ADOtable1.Active:=true;

end;

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

procedure TForm2.FormClose(Sender: TObject; var Action:

TCloseAction);

begin

//стираем содержимое списка типов, доступных в БД

Form1.ComboBox1.Items.Clear;

//переход на первую строку

ADOTable1.First;

// забиваем список типов, доступных из БД, заново

repeat

Form1.ComboBox1.Items.Add(ADOTable1.FieldByName('').AsString);

ADOTable1.Next;

until ADOTable1.Eof;

//деактивация таблицы

ADOtable1.Active:=false;

end;

end.

Диалоговое окно редактора базы данных показано на рис. 8.20.

Рис. 8.20. Диалоговое окно редактора

Чтобы приступить к рассмотрению исходного текста программного модуля, требуется изложить базовые сведения о работе с базами данных в среде Borland Delphi посредствам технологии ADO. В этом случае основной СУБД является MS Access. Данный вариант организации базы данных прикладной библиотеки является далеко не единственным: существуют и другие средства с аналогичными функциями: BDE, Interbase, SQL, Oracle и так далее. Выбор технологии ADO совместно с СУБД MS Access обусловлен следующими причинами: простота и удобства создания баз данных, высокая скорость работы, легкость в освоении для разработчика. Следует отметить, что при создании серьезных приложений с большими базами данных выбранные нами средства значительно ослабят свои позиции, но прикладные библиотеки САПР Компас к таким программам не относятся. Для работы с базами данных при помощи технологии ADO существуют палитра компонентов, которая находится в меню компонентов на отдельной вкладке "ADO". Наиболее важным компонентом является "ADOTable" Компонент является аналогом более известного компонента "Table" со страницы "Data Access". Функциональность компонента состоит в установлении связи между программой и таблицей базы данных. Основные свойства компонента: "Active" - определяет, активна таблица или нет, соответственно, принимает значения "True" или "False". "ConnectionString" - строка подключения базы данных, определяет расположение базы данных и некоторые дополнительные параметры. Данную строку можно ввести вручную, но гораздо удобнее и надежней использовать специальный встроенный в Delphi диалог. Он вызывается нажатием кнопки I, которая располагается справа от наименования свойства "ConnectionString". При его вызове появится окно, показанное на рис. 8.21.

Рис. 8.21. ConnectionString Рис. 8.22. Настройка связи с БД

Для подключения файла базы данных требуется нажать кнопку "Build". Далее появится многостраничное диалоговое окно (рис. 8.22), где требуется изменить некоторые параметры. На вкладке "Поставщик данных" следует выбрать название поставщика базы данных: при работе с базой, формата "*.mdb, MS Access" необходимо выбрать "Microsoft Jet 4.0 OLE DB Provider". На вкладке "Подключение" с помощью стандартно диалога Windows следует указать путь к подключаемой базе данных. Поля "Имя пользователя" и "Пароль", а также другие опции безопасности заполняются согласно настройкам базы данных. По умолчанию имя пользователя неважно, а пароль не используется. После настройки подключения рекомендуется провести проверку. Для этого предусмотрена кнопка "проверить подключение". На вкладке "Дополнительно" расположены сетевые настройки и настройки доступа к базе данных. В учебном примере выбрана настройка "ReadWrite", что позволяет читать и изменять базу данных.Вкладка "Все" содержит общую информацию о текущих параметрах настройки строки подключения.

Следующее важное свойство, которое широко применяется в рассматриваемой библиотеке - "TableName" С его помощью осуществляется выбор текущей таблицы. Для формата баз данных "*.mdb, MS Access" данное свойство имеет высокую актуальность, так как в одном файле обычно хранится несколько таблиц. Даже при условии, что файл базы данных содержит только одну таблицу, значение этого свойства требуется обязательно установить. Свойство "Active" используется для активации или деактивации таблицы (значения true и false соответственно). Все действия над таблицей производятся в активном режиме. Смена таблицы может осуществляться только в неактивном режиме. По завершению работы с таблицей ее рекомендуется деактивировать.

Вернемся снова к тексту рассматриваемого программного модуля. Следующая процедура:

procedure TForm1.BitBtn1Click(Sender: TObject); begin

ADOTable1.Active:=false;

Form2.Show;

end;

обрабатывает нажатие на кнопку "редактировать базу данных". Первая строка (ADOTable1.Active:=false) деактивирует таблицу. Данное действие необязательно и применяется для повышения надежности программного средства. Строка (Form2.Show) обеспечивает отображение второй формы приложения.

Процедура: procedure TForm1.FormCreate(Sender: TObject); запускается в момент создания основной формы приложения (Forml).

procedure TForm1.FormCreate(Sender: TObject);

begin

//запуск диалога открытия файла, с помощью которого определяем путь к БД (s)

If OpenDialog1.Execute() then

s:=OpenDialog1.FileName;

//устанавливаем строку подключения к БД, активируем БД, переходим на первую позицию выбранной таблицы

ADOTable1.

ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data

Source='+s+';Mode=ReadWrite;Persist Security Info=False';

ADOtable1.Active:=true;

ADOTable1.First;

//в данном цикле осуществляется заполнение выпадающего списка выбора втулок из БД

repeat

ComboBox1.Items.Add(ADOTable1.FieldByName('Тип').

AsString);

ADOTable1.Next;

until ADOTable1.Eof;

//деактивирование БД

ADOTable1.Active:=false;

end;

Условие (If OpenDialog1.Execute() then) относится к компоненту TOpenDialog. Оно отвечает за запуск диалога. При выборе файла выполняется текст (s:=OpenDialog1.FileName). Данная строка присваивает переменой (s) строковое значение пути к выбранному файлу базы данных. Для того чтобы пользователю облегчить выбор требуемого файла, в учебном примере у компонента TOpenDialog соответствующим образом настроено свойство Filter: в качества фильтра жестко задано (*.mdb). Таким образом, файлы с расширением, отличным от *.mdb в диалоге отображаться не будут. Строка (ADOTable1.ConnectionString:= 'Provider = Micro-soft.Jet.OLEDB.4.0;DataSource='+s+'; Mode=ReadWrite;Pers ist Security) служит для установки вручную строки подключения. Она не является обязательной, ее можно удалить вместе с диалогом открытия базы данных. В случае, когда база данных всегда находится по одному и тому же адресу, достаточно строки, автоматически созданной при настройке параметров подключения базы данных в процессе разработки библиотеки. Если же мы хотим добиться возможности свободно переносить библиотеку на различные компьютеры и менять положение базы данных, требуется возможность изменения пути к ней. Строка, показанная выше, сформирована следующим образом: скопирована строка, созданная Borland Delphi в процессе настройки подключения, из нее удален текущий путь к базе данных, в месте, где ранее находился путь строка разбивается на две части; первая часть завершается кавычкой, вторая начинается с кавычки, между частями ставится через + записывается строковая переменная, содержащая верный путь, после переменной также устанавливается +.

Строка (ADOtable1.Active:=true) активирует таблицу, имя активируемой таблицы жестко задается в процессе разработки. Далее выбирается первая строка таблицы (ADOTable1.First).

В цикле (repeat-until) происходи последовательный перебор строк таблицы. Цикл закончится, когда будет достигнут конец таблицы (ADOTable1.Eof). В строке (ComboBox1.Items.Add (ADOTable1.FieldByName (' Тип').AsString)) осуществляется заполнение позиций выпадающего списка. Данную строку следует рассматривать как совокупность двух крупных конструкций. Первая из них (ComboBox1.Items.Add()) осуществляет добавление в список пункта, название которого указывается в скобках. Вторая конструкция (ADOTable1.FieldByName(' Тип').AsString) отвечает за выборку из таблицы значения, находящегося в текущей строке в столбце, который указан в качестве аргумента (в данном случае "Тип"). Строка (ADOTable1.Next) обеспечивает переход на следующую строку в таблице. По окончанию заполнения списка таблица деактивируется (ADO-Table1.Active:=false).

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

procedure TForm1.ComboBox1Change(Sender: TObject);

begin

//активация таблица, переход на первое поле

ADOtable1.Active:=true;

ADOTable1.First;

//цикл, в котором осуществляется выбор требуемых значений из БД согласно выбранному типу втулки

repeat

// данное условие определяет поле БД, которое соответствует выбранному пункту списка

if ComboBox1.

Items[ComboBox1.ItemIndex]=ADOTable1.

FieldByName('Тип').AsString then

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

begin

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

EdL.Text:=ADOTable1.FieldByName('Высота').AsString;

EdDmax.Text:=ADOTable1.FieldByName('Диаметр втулки').AsString;

EdDotv.Text:=ADOTable1.FieldByName('Диаметр

отверстия').AsString;

EdLotv.Text:=ADOTable1.FieldByName('Глубина

отверстия').AsString;

Eda.Text:=ADOTable1.FieldByName('Сторона фаски').AsString;

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

if ADOTable1.FieldByName('Число фасок').AsString='2' then

Csb2.Checked:=true

else

Csb2.Checked:=false;

if EdLotv.Text='сквозное' then

begin

EdLotv.Enabled:=false;

Csb1.Checked:=true;

end

else

begin

EdLotv.Enabled:=true;

Csb1.Checked:=false;

end;

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

Break;

end;

// переход на следующее поле таблицы БД, выполняется, если вышестоящее условие не выполнилось

ADOTable1.Next;

until ADOTable1.Eof;

// деактивация таблицы

ADOTable1.Active:=false;

end;

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

Наибольший интерес и сложность представляет собой конструкция условия, определяющего нужную строку (if ComboBox1.Items[ComboBox1.ItemIndex]= ADOTable1.FieldByName('Тип').AsString then). Его следует рассматривать, разбив на две части. Вторая часть уже была описана ранее, поэтому перейдем к к рассмотрению первой. Конструкцию (ComboBox1.Items[ComboBox1.ItemIndex]) в свою очередь также следует разделить на два элемента. Свойство (Com-boBox1.Items[]) определяет строку в выпадающем списке, порядковый номер которой указан в прямоугольных скобках. Свойство (Com-boBox1.ItemIndex) определяет порядковый номер, выбранной в данный момент строки списка. Таким образом, рассмотренная конструкция определяет дословное название строки, выбранной в текущее время. Соответственно, условие выполнится, когда название выбранного пункта выпадающего списка совпадет с содержанием ячейки таблицы базы данных, которые перебираются в цикле.

В случае выполнения условия производится заполнение полей ввода из базы данных (EdL.Text:=ADOTable1.FieldByName ('Высота'). AsString и так далее).

Затем в условии (if ADOTablel. FieldByName ('Число фасок' ) .AsString=' 2 ' then) устанавливается количество фасок а условием (if EdLotv.Text='сквозное ' then) задается тип отверстия.

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

Если на данном этапе требуемые данные не найдены (условие не выполнилось), происходит переход на следующую строку (ADOTable1.Next) и цикл повторяется.

По окончанию выборки (после цикла) таблица деактивируется (ADO-Table1.Active:=false).

3.7 Разработка главного меню библиотеки

Компонент, располагающийся в верхнем левом углу формы, является невизуальным и отвечает за главное меню (TMainMenu). Для того, чтобы создать главное меню необходимо проделать следующие действия. На закладке компонентов Standard выбрать компонент "TMainMenu" кликнуть его мышкой и перетащить на форму. Затем на компоненте следует сделать двойной клик мышью. Откроется окно редактирования главного меню (рис. 8.23).

Рис. 8.23. Создание главного меню

Чтобы добавить пункты, требуется навести курсор ниже желаемой позиции, нажать правую кнопку мыши и в контекстном меню выбрать команду "insert". Название пунктам меню задается путем изменения свойства "Caption" в Object Inspector. В текущем примере главное меню было добавлено в конце разработки, поэтому с его содержанием не возникло никаких вопросов. Несмотря на это, рекомендуется включать его в проект как можно раньше, так как наличие главного меню уменьшает доступный для использования размер клиентской области, а это необходимо учитывать. В случае необходимости состав главного меню может редактироваться на любом этапе разработки.

Для того чтобы отделить несколько пунктов меню горизонтальной чертой необходимо создать дополнительный пункт (в том месте, где должен быть разделитель) и ввести в свойство "Caption" знак "-". Процедура:

procedure TForm1.N6Click(Sender: TObject);

begin

Close;

end;

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

procedure TForm1.N6Click(Sender: TObject);

begin

Form3.Show;

end;

Данная процедура выводит на экран форму со справочной информацией, показанную на рис. 8.24. Методика добавления формы заключается в следующем. В меню File выбирается пункт New, затем Form. Вся информация размещена при помощи компонентов TLabel. Изменение шрифтов (в том числе и текста) осуществляются свойством Font данного компонента.

Рис. 8.24. Окно справочной информации

procedure TForm1.N5Click(Sender: TObject);

begin

Form4.Show;

end;

Данная процедура выводит на экран форму со справочной информацией, показанную на рис. 8.25.

Методика добавления формы заключается в следующем. В меню File выбирается пункт New, затем Form. Вся информация размещена при помощи компонента TMemo. Для этого в Object Inspector на вкладке Properties выбираем пункт Lines, затем TStrings и в появившемся окне (рис. 8.26) в контекстном меню по правой кнопке мыши выбираем Load. Окно (рис. 8.27) позволяет выбрать текстовый файл с информацией о помощи. Подтвердив выбор файла нажатием кнопки Открыть, увидим в окне String List Editor (рис. 8.28) содержание выбранного файла помощи.

Рис. 8.25. Окно справочной информации

Рис. 8.26 Настройка Memo Рис. 8.27 Загрузка файла в Memo

Рис. 8.28 Окно с файлом помощи

При необходимости размещаем на форме ScroollBars. Для этого в Object Inspector на вкладке Properties выбираем пункт ScroollBars и местоположение, например, Vertical. Изменение шрифтов (в том числе и текста) осуществляются свойством Font данного компонента.

Компиляция разработанной библиотеки осуществляется выбором команды Run из меню Run или нажатием клавиши F9. Результат сохраняется автоматически в папке с исходными файлами проекта. Готовая библиотека имеет расширение rtw, имя - vtulka.rtw.

Подключение библиотеки к системе компас-3D V7 может быть осуществлено различными методами. Самый простой из них: перетащить мышью скомпилированный файл в окно Компаса. При этом библиотека должна автоматически подключиться и запуститься на выполнение. Результат приведен на рис. 8.29.

Рис. 8.29. Окно запущенной библиотеки

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

Рис. 8.30. Подключение прикладной библиотеки

Далее следует указать путь к файлу библиотеки и указать свойства библиотеки. Прикладную библиотеку можно включить в состав соответствующего раздела по усмотрению пользователя.

4. Отчет о работе должен содержать:

1. Цель работы.

2. Краткие теоретические сведения.

3. Подробное описание всех шагов лабораторной работы.

4. Выводы по лабораторной работе.