Разработка системы автоматизированного проектирования
Входными данными для данного блока является задание на курсовую работу. Управлением являются теоретические сведения, которые нужны для решения математической части задания, и задание на КР, которым нужно руководствоваться при её выполнении. На выходе мы создаем отчет и презентацию. Содержание Задание Функциональное описание процесса разработки объекта Математическая модель Описание… Читать ещё >
Разработка системы автоматизированного проектирования (реферат, курсовая, диплом, контрольная)
Разработка системы автоматизированного проектирования
Содержание Задание Функциональное описание процесса разработки объекта Математическая модель Описание входных/выходных данных Описание структуры программы Описание работы программы Результаты работы программы Список используемой литературы Приложение 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.