Разработка системы автоматизированного проектирования

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Разработка системы автоматизированного проектирования

Содержание

Задание

Функциональное описание процесса разработки объекта

Математическая модель

Описание входных/выходных данных

Описание структуры программы

Описание работы программы

Результаты работы программы

Список используемой литературы

Приложение 1

Функциональное описание процесса разработки

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

Составим функциональное описание процесса разработки курсовой работы по курсу «Разработка САПР».

Рис. 1. Нулевой функциональный блок IDEF0 диаграммы.

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

Входными данными для данного блока является задание на курсовую работу. Управлением являются теоретические сведения, которые нужны для решения математической части задания, и задание на КР, которым нужно руководствоваться при её выполнении. На выходе мы создаем отчет и презентацию.

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

Детализируем то, что представлено в блоке А0 (проведем декомпозицию).

Рис. 2. IDEF0 — 1 уровень.

Из приведенной диаграммы видно, что, получив задание, мы приступаем к выполнению проекта.

Для начала анализируем, какие данные будут являться входными, а какие выходными.

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

Далее осуществляется математическая постановка задачи. По завершению этапа получаем её математическое решение.

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

На этапе программирования создается программный код. Механизмом исполнения, помимо студента, является среда программирования Delphi7. На выходе данного этапа формируется программа, по результатам проверки которой данные отправляются для создания отчета.

Здесь формируется отчет о проделанной работе, согласно заданию и требованиям, предъявляемым к оформлению отчета. Отчет оформляется с помощью программ MS Word и MS Visio. На выходе этого этапа формируется готовый отчет о проделанной работе.

Рис. 3. Декомпозиция уровня программирования

Математическая модель

система автоматическое проектирование

Рис. 4. Устройство внутренней поверхности емкости

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

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

Чтобы оставить одно неизвестное в уравнении, выразим высоту h через объем емкости

(1)

Получим зависимость S®:

(2)

Чтобы найти минимум функции S, найдем её производную и приравняем к нулю:

(3)

Решение уравнения в общем виде:;

Следовательно, площадь будет минимальна при

(4)

Для построения потребуется высота h, для её расчета используем формулу (1).

Описание входных/выходных данных

Входные данные для расчета параметров цилиндрической емкости:

· Объем V

· минимальный и максимальный радиусы основания

· минимальная и максимальная высота

· минимальный и максимальный объем

Выходные данные:

· высота h

· радиус основания R

· площадь поверхности S

Пользователь вводит значение объема емкости и получает на выходе открытые файл чертежа (*. cdw) и файл 3D-сборки (*. a3d)

Описание структуры программы

Рис. 5 Блок-схема процедуры расчета

V — заданный объём

h — высота емкости

S — площадь поверхности

R — радиус основания

Код программы содержится в двух файлах:

KompasAPI. pas — содержит стандартные функции взаимодействия с Компас 3D. В этом модуле открываются все детали сборки, переменные R и h передаются в соответствующие внешние переменные сборки и с их использованием сборка перестраивается.

Unit1. pas — обработка событий, процедура расчета calc, построения, вывод результатов расчета.

Кнопка Расчет обрабатывает входной параметр, запускает процедуру расчета calc, делает доступными кнопки Модель и Чертеж.

кнопка Модель вызывает модуль KompasAPI. pas, который запускает установленный Компас3D и выполняет перестроение сборки с измененными параметрами.

кнопка Чертеж вызывает модуль KompasAPI. pas, который выполняет перестроение чертежа на основе ранее построенной сборки с измененными параметрами.

Описание работы программы

Рис. 5. Окно программы при запуске

После получения результата становятся доступны кнопки построений.

Рис. 6. Окно программы после выполнения расчета

После запуска программы от пользователя требуется ввести в поле ввода значение объема (по умолчанию это значение равно 1000), Затем нажать кнопку Расчет. После этого выводится решение задачи. Пользователь может нажать на доступные теперь кнопки Модель и Чертеж, чтобы выполнились все необходимые построения. Компас3D запустится автоматически (в случае его присутствия на машине пользователя).

Результат работы программы

Рис. 7. Окно программы с результатами расчета

Рис. 8 Окно «Компас3D» с построенным чертежом

Рис. 9 Окно «Компас3D» с построенной сборкой

Список использованной литературы

1. Конспект лекций по дисциплине «Разработка САПР», проф., доц. Ямникова О. А., 2010 г. ;

2. Методические указания по выполнению курсовой работы по курсу «Разработка САПР», проф., доц. Ямникова О. А., 2010 г.

Приложение 1

Код модуля Unit1. pas

unit Unit1;

interface

uses

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

Dialogs, ComObj, OleCtrls, ksTLB, ComCtrls, StdCtrls, KompasAPI, DB,

Grids, DBGrids, ADODB, ExtCtrls, Buttons, jpeg, XPMan, math;

type

TForm1 = class (TForm)

Button4: TButton;

LabeledEdit1: TLabeledEdit;

OD1: TOpenDialog;

m: TMemo;

Button1: TButton;

Button2: TButton;

OD2: TOpenDialog;

procedure Button4Click (Sender: TObject);

procedure Button2Click (Sender: TObject);

procedure Button1Click (Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

iDocument2D1: ksDocument2D;

r, v, h, s: real;

implementation

{$R *. dfm}

procedure calc;

begin

if (v> =990) and (v< =1010)then

begin

r: =power ((v/pi), 1/3);

s: =2*v/r+pi*power (r, 2);

h: =v/(pi*r*r);

with form1. m do

begin

lines. Add ('---Результаты вычисления---');

lines. Add ('Заданный объем емкости: '+floattostr (v));

lines. Add ('Высота: '+floattostr (h));

lines. Add ('Радиус вращения: '+floattostr®);

lines. Add ('Площадь поверхности: '+floattostr (s));

end;

end

else

MessageDlg ('Значение объема выходит за допустимые пределы!', mtWarning,[mbOk], 0);

end;

procedure TForm1. Button4Click (Sender: TObject);

VAR

c: TStringList;

t: TPartVars;

function full (ch: boolean):real;

begin

if ch then result: =0

else result: =1;

end;

BEGIN

if OD1. Execute then

StartKompas (OD1. FileName);

c: =TStringList. Create;

ReadParts (c);

t: =GetPartVars (c[1]);

ChangeVar ('','h', h);

ChangeVar ('','r', r);

t: =GetPartVars (c[1]);

c. Free;

Button1. Enabled:=true

end;

procedure TForm1. Button2Click (Sender: TObject);

begin

m. Clear;

try

V: =strtofloat (LabeledEdit1. Text);

except

MessageDlg ('Некорректный ввод!', mtWarning,[mbOk], 0);

end;

calc;

button4. Enabled:=true;

end;

procedure TForm1. Button1Click (Sender: TObject);

begin

if OD2. Execute then

StartKompas2d (OD2. FileName);

iDocument2D1 := KompasAPI. doc2d;

end;

end.

Код модуля KompasAPI. pas

unit KompasAPI;

interface

uses ComObj, OleCtrls, ksTLB, Classes, SysUtils;

TYPE TPartVar=RECORD

VarName: STRING;

VarNote: STRING;

VarValue: REAL

END;

TPartVars=ARRAY OF TPartVar;

VAR

kompas: KompasObject;

Doc: ksDocument3D;

KompasHandle: THandle;

prt: TStringList; // список имен деталей

partvar: TPartVars;

iDocument2D: ksDocument2D;

doc2d: ksDocument2D;

function StartKompas (filename: string):boolean;

function StartKompas2d (filename: string):boolean;

procedure ReadParts (s: TStringList);

function GetPartVars (partname: STRING):TPartVars;

PROCEDURE ChangeVar (partname, varname: STRING; value_: REAL);

implementation

function StartKompas (filename: string):boolean;

const ka='Kompas. Application. 5';

begin

// подключение к КОМПАС 3D

Result: =true;

try

kompas: =KompasObject (GetActiveOleObject (ka)); // если уже запущен

except

try

kompas: =KompasObject (CreateOleObject (ka)); // если не запущен

except

result: =false;

exit

end

end;

// получение ссылки на окно КОМПАС

KompasHandle := kompas. ksGetHWindow;

// делаем окно КОМПАСа видимым

kompas. Visible:=true;

// получение ссылки на текущий документ КОМПАСа

Doc := ksDocument3D (kompas. ActiveDocument3D);

// если такой документ есть…

if Assigned (Doc) then

// то закрываем его

Doc. close;

// создаем новый документ…

Doc := ksDocument3D (kompas. Document3D);

// и загружаем в него сборку с именем filename

Doc. Open (Trim (filename), False);

// активируем API

kompas. ActivateControllerAPI

end;

function StartKompas2d (filename: string):boolean;

//var doc2d: ksDocument2D;

const ka='Kompas. Application. 5';

begin

// подключение к КОМПАС 3D

Result: =true;

try

kompas: =KompasObject (GetActiveOleObject (ka)); // если уже запущен

except

try

kompas: =KompasObject (CreateOleObject (ka)); // если не запущен

except

result: =false;

exit

end

end;

// получение ссылки на окно КОМПАС

KompasHandle := kompas. ksGetHWindow;

// делаем окно КОМПАСа видимым

kompas. Visible:=true;

// получение ссылки на текущий документ КОМПАСа

Doc2d := ksDocument2D (kompas. ActiveDocument2D);

// если такой документ есть…

if Assigned (Doc2d) then

// то закрываем его

Doc2d. ksCloseDocument;

// создаем новый документ…

doc2d: =ksDocument2D (Kompas. Document2D);

doc2d. ksOpenDocument (FileName, false);

// активируем API

kompas. ActivateControllerAPI

end;

procedure ReadParts (s: TStringList);

var i, num: word;

parts: ksPartCollection;

part: ksPart;

begin

// получение ссылки на список деталей

parts: =ksPartCollection (doc. PartCollection (true));

// число деталей

num: =parts. GetCount;

s. Clear;

// деталь с номером -1 есть сама сборка

s. Add (ksPart (doc. GetPart (-1)). name);

// цикл по деталям

for i: =0 to num-1 do

begin

// получение ссылки на деталь номер i

part: =ksPart (parts. GetByIndex (i));

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

s. Add (part. name);

end

end;

function GetPartVars (partname: STRING):TPartVars;

var vr: ksVariableCollection;

parts: ksPartCollection; // сборка

part: ksPart;

univar: ksVariable;

j, numpart: INTEGER;

begin

parts: =ksPartCollection (doc. PartCollection (true));

// ссылка на деталь с именем partname

if partname='' then

part: =ksPart (doc. GetPart (-1)) // сборка

else

part: =ksPart (parts. GetByName (partname, True, True));

// ссылка на список переменных детали

vr: =ksVariableCollection (part. VariableCollection);

// цикл по переменным детали

numpart: =vr. GetCount;

SetLength (result, numpart);

for j: =0 to numpart-1 do

begin

// ссылка на отдельную переменную

univar: =ksVariable (vr. GetByIndex (j));

with result[j] do

begin

VarName: =univar. name;

VarNote: =univar. note;

VarValue: =univar. value

end

end

end;

PROCEDURE ChangeVar (partname, varname: STRING; value_: REAL);

VAR vr: ksVariableCollection;

parts: ksPartCollection;

part: ksPart;

vvv: ksVariable;

Feature: ksFeature;

BEGIN

// Список деталей

parts: =ksPartCollection (doc. PartCollection (true));

// Ищем деталь или сборку

if partname='' then

begin

Part: =ksPart (Doc. GetPart (-1));

Feature: =ksFeature (Part. GetFeature);

vr: =ksVariableCollection (Feature. VariableCollection);

end

else

begin

part: =kspart (parts. GetByName (partname, true, true));

vr: =ksVariableCollection (part. VariableCollection)

end;

// Ищем переменную по имени

vvv: =ksVariable (vr. GetByName (varname, true, true));

// Начинаем редактировать деталь

if partname< >'' then

part. BeginEdit;

// Меняем значение переменной

vvv. value:=value_;

// Обновляем модель

vr. refresh;

part. RebuildModel;

part. Update;

// Завершаем редактирование детали с сохранением изменений

if partname< >'' then

part. EndEdit (true)

else

begin

doc. RebuildDocument;

doc. UpdateDocumentParam

end;

// Обновляем сборку

parts. refresh

END;

initialization

begin

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

prt: =TStringList. Create;

SetLength (partvar, 0)

end;

finalization

begin

// освобождение памяти

finalize (partvar);

prt. Free

end;

end.

ПоказатьСвернуть
Заполнить форму текущей работой