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

Лабораторная работа № 9 Проектирование прикладной библиотеки сборочной единицы для сапр Компас-3d

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

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

К выполнению лабораторной работы следует приступить после выполнения лабораторной работы №8.

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

В предыдущих работах была подробно рассмотрена разработка прикладных библиотек для создания трехмерных деталей в среде Компас-3D. В текущей работе студентам предлагается ознакомиться с созданием простейшей трехмерной сборки, в состав которой входят пять деталей. Общий вид сборки показан на рис. 9.1. В состав сборки входят четыре одинаковые втулки, проектированием которых занимались ранее и пластина, показанная на рис. 9.2.

Рис. 9.1. Пластина  Рис. 9.2. Сборка

Размеры пластины изменяются динамически в зависимости от заданных параметров втулки. Толщина пластины соответствует длине втулки. Отверстия под крепежные болты жестко привязаны к краям пластины, их диаметр постоянен и равен 12 мм. Диаметр отверстий под втулки соответствует внешнему диаметру втулок. Расстояние (по прямой) между центрами отверстий под втулки равно удвоенному внешнему диаметру втулки. Аналогичное расстояние устанавливается между краем пластины и центром отверстия. На рис. 9.3 представлен вид пластины сверху с указанием размеров и правилами их изменения.

Рис. 9.3. Чертеж пластины

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

Изменения программного модуля

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

procedure plastina;

var

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

iPlaneEntity:ksEntity;

iSketch2Entity : ksEntity;

iSketch2Def : ksSketchDefinition;

iSketch2Document2D : ksDocument2D;

iBaseExtrusion : ksEntity;

iBaseExtrusionDef : ksBaseExtrusionDefinition;

Begin

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

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

if iPart <> nil then

begin

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

if iSketch2Entity <> nil then

begin

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

iSketch2Def :=ksSketchDefinition (iSketch2Entity.GetDefinition);

if iSketch2Def <> 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.ksLineSeg(0,0,0,6*Dmax,1);

iSketch2Document2D.ksLineSeg(0,6*Dmax,6*Dmax,6*Dmax,1);

iSketch2Document2D.ksLineSeg(6*Dmax,6*Dmax,6*Dmax,0,1);

iSketch2Document2D.ksLineSeg(6*Dmax,0,0,0,1);

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

под втулки

iSketch2Document2D.ksCircle(2*Dmax,2*Dmax, dmax/2,1);

iSketch2Document2D.ksCircle(4*Dmax,2*Dmax, dmax/2,1);

iSketch2Document2D.ksCircle(2*Dmax,4*Dmax, dmax/2,1);

iSketch2Document2D.ksCircle(4*Dmax,4*Dmax, dmax/2,1);

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

под крепеж

iSketch2Document2D.ksCircle(18, 18,6, 1);

iSketch2Document2D.ksCircle(6*Dmax-18, 18, 6, 1);

iSketch2Document2D.ksCircle(18,6*Dmax-18, 6, 1);

iSketch2Document2D.ksCircle(6*Dmax-18, 6*Dmax-18, 6, 1);

iSketch2Def.EndEdit; // завершение

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

// получим выдавливанием

iBaseExtrusion :=

ksEntity(iPart.NewEntity( o3d_baseExtrusion ));

if iBaseExtrusion <> nil then

begin

iBaseExtrusionDef :=

ksBaseExtrusionDefinition(iBaseExtrusion.GetDefinition);

if iBaseExtrusionDef <> nil then

begin

iBaseExtrusionDef.SetSketch(iSketch2Entity );

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

iBaseExtrusionDef.DirectionType:= dtReverse;

iBaseExtrusionDef.SetSideParam(false, etBlind, L, 0,false);

end;

iBaseExtrusion.Create;

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

end;

end;

end;

end;

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

If iDocument3D.IsDetail then

begin

iDocument3D.fileName:='plastina.m3d';

iDocument3D.UpdateDocumentParam;

iDocument3D.Save;

end;

end;

end;

Процедура "plastina" используется для создания трехмерной детали, показанной на рисунке 2. Конструкция процедуры во многом аналогична процедуре "vtulkapaint". Поэтому далее будут описаны только ключевые аспекты данного фрагмента программного кода. Основную часть показанной выше процедуры составляет блок построения эскиза. Прямоугольная область пластины строится при помощи четырех отрезков. Например, (iSketch2Document2D. ksLineSeg(6*Dmax,6*Dmax,6*Dmax,0,1)) задает правый горизонтальный отрезок, образующий квадрат. Координаты заданы через внешний диаметр втулки. Отверстия под крепеж диаметром 12 мм задаются при помощи четырех строк типа: (iSketch2Document2D.ksCircle(6*Dmax-18, 18, 6, 1)). Часть координат задается жестко, а другая часть - динамически, привязываясь к максимальному внешнему диаметру втулки. Пластина формируется методом выдавливания:

iBaseExtrusionDef:=ksBaseExtrusionDefinition

(iBaseExtrusion.GetDefinition);

if iBaseExtrusionDef <> nil then

begin

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

iBaseExtrusionDef.SetSketch

(iSketch2Entity);

iBaseExtrusionDef.DirectionType:=dtReverse;

iBaseExtrusionDef.SetSideParam

(false, etBlind, L, 0, false);

end;

iBaseExtrusion.Create;

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

//===============================================

//процедура создания 3Д сборки

procedure CreateA3D;

var

iPart1 : ksPart;

iPart2 : ksPart;

iPart3 : ksPart;

iPart4 : ksPart;

iPart5 : ksPart;

plac : ksPlacement;

plac2 : ksPlacement;

plac3 : ksPlacement;

plac4 : ksPlacement;

plac5 : ksPlacement;

ColorParam:ksColorParam;

ColorParam2:ksColorParam;

begin

iKompasObject := KompasObject(CreateKompasObject);

if iKompasObject <> nil then

begin

iDocument3D := ksDocument3D(iKompasObject.Document3D);

if idocument3d.Create(false,false) then

begin

if (iDocument3D <> nil) then

begin

iDocument3D.fileName := 'Sborka.a3d';

// Имя файла Документа

iDocument3D.UpdateDocumentParam(); //

Обновить параметры Документа

// для каждой детали подготовим свой интерфейс

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

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

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

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

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

//вставляем пластину и задаем ее цвет

//связываем деталь с файлом-источником

iDocument3D.SetPartFromFile('plastina.m3d',ipart1,false);

//вводим переменную первой детали нулевым номером

iPart1 := ksPart( iDocument3D.GetPart(0) );

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

iPart1.BeginEdit;

//задаем переменную кординирования детали

plac := ksPlacement(ipart1.GetPlacement);

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

plac.SetOrigin(0, 0, 0 );

//изменяем местоположение компонента, заданное

предыдущей строкой

iPart1.UpdatePlacement;

//обновляем свойства компонента

iPart1.Update;

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

iPart1.EndEdit(False);

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

iPart1.fixedComponent:=true;

//указываем на деталь, цвет которой необходимо

задать

iPart1:=ksPart(iDocument3D.GetPart(0));

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

iPart1.useColor:=0;

//задаем переменную параметров цвета детали1

ColorParam:=ksColorParam(iPart1.ColorParam);

//задаем цвет в виде числового значения

ColorParam.color:=$00788845;

//задаем параметры цвета детали

iPart1.SetAdvancedColor(ColorParam.

color,ColorParam.ambient,

ColorParam.diffuse,ColorParam.specularity,ColorParam.shin

iness,ColorParam.transparency,ColorParam.emission);

//обновляем деталь

iPart1.Update;

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

iDocument3D.SetPartFromFile('Vtulka.m3d',ipart2,false);

iPart2 := ksPart( iDocument3D.GetPart(1) );

iPart2.BeginEdit;

plac2 := ksPlacement(ipart2.GetPlacement);

plac2.SetOrigin(2*Dmax, 2*Dmax, 0);

iPart2.UpdatePlacement;

iPart2.Update;

iPart2.EndEdit(False);

iPart2.fixedComponent:=true;

iPart2:=ksPart(iDocument3D.GetPart(1));

iPart2.useColor:=0;

ColorParam2:=ksColorParam(iPart2.ColorParam);

ColorParam2.color:=$001253671;

iPart2.SetAdvancedColor(ColorParam2.color,

ColorParam2.ambient,

ColorParam2.diffuse,ColorParam2.specularity,

ColorParam2.shininess,

ColorParam2.transparency,ColorParam2.emission);

iPart2.Update;

//добавляем вторую втулку и задаем ее цвет

iDocument3D.SetPartFromFile('Vtulka.m3d',ipart3,false);

iPart3 := ksPart( iDocument3D.GetPart(2) );

iPart3.BeginEdit;

plac3 := ksPlacement(ipart3.GetPlacement);

plac3.SetOrigin(4*Dmax, 2*Dmax, 0);

iPart3.UpdatePlacement;

iPart3.Update;

iPart3.EndEdit(False);

iPart3.fixedComponent:=true;

iPart3:=ksPart(iDocument3D.GetPart(2));

iPart3.useColor:=0;

ColorParam2:=ksColorParam(iPart3.ColorParam);

ColorParam2.color:=$001253671;

iPart3.SetAdvancedColor(ColorParam2.color,

ColorParam2.ambient,ColorPram2.diffuse, ColorParam2.specularity,ColorParam2.shininess, ColorParam2.transparency,ColorParam2.emission);

iPart3.Update;

//добавляем третью втулку и задаем ее цвет

iDocument3D.SetPartFromFile('Vtulka.m3d',ipart4,false);

iPart4 := ksPart( iDocument3D.GetPart(3) );

iPart4.BeginEdit;

plac4 := ksPlacement(ipart4.GetPlacement);

plac4.SetOrigin(2*Dmax, 4*Dmax, 0);

iPart4.UpdatePlacement;

iPart4.Update;

iPart4.EndEdit(False);

iPart4.fixedComponent:=true;

iPart4:=ksPart(iDocument3D.GetPart(3));

iPart4.useColor:=0;

ColorParam2:=ksColorParam(iPart3.ColorParam);

ColorParam2.color:=$001253671;

iPart4.SetAdvancedColor(ColorParam2.color,

ColorParam2.ambient,ColorParam2.diffuse,

ColorParam2.specularity,

ColorParam2.shininess,ColorParam2.transparency,

ColorParam2.emission);

iPart4.Update;

//добавляем четвертую втулку и задаем ее цвет

iDocument3D.SetPartFromFile('Vtulka.m3d',ipart5,false);

iPart5 := ksPart( iDocument3D.GetPart(4) );

iPart5.BeginEdit;

plac5 := ksPlacement(ipart5.GetPlacement);

plac5.SetOrigin(4*Dmax, 4*Dmax, 0);

iPart5.UpdatePlacement;

iPart5.Update;

iPart5.EndEdit(False);

iPart5.fixedComponent:=true;

iPart5:=ksPart(iDocument3D.GetPart(4));

iPart5.useColor:=0;

ColorParam2:=ksColorParam(iPart3.ColorParam);

ColorParam2.color:=$001253671;

iPart5.SetAdvancedColor(ColorParam2.color,

ColorParam2.ambient,ColorParam2.diffuse,

ColorParam2.specularity,ColorParam2.shininess,

ColorParam2.transparency,

ColorParam2.emission);

iPart5.Update;

//перестраиваем сборку

IDocument3D.RebuildDocument;

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

iDocument3D.fileName:='sborka.a3d';

iDocument3D.UpdateDocumentParam;

iDocument3D.Save;

end;

end;

end;

end;

Процедура создания сборки является основным нововведением в четвертой работе. Начало процедуры аналогично созданию документа трехмерной детали. Отличие заключается в строке (idocument3d.Create(false,false)), где оба аргумента устанавливаются в значение "false".

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

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

************************

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

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

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

Ниже приведен один из блоков позиционирования детали:

iDocument3D.SetPartFromFile('Vtulka.m3d',ipart2,false);

iPart2 := ksPart( iDocument3D.GetPart(1) );

iPart2.BeginEdit;

plac2 := ksPlacement(ipart2.GetPlacement);

plac2.SetOrigin(2*Dmax, 2*Dmax, 0);

iPart2.UpdatePlacement;

iPart2.Update;

iPart2.EndEdit(False);

iPart2.fixedComponent:=true;

Первая строка (iDocument3D.SetPartFromFile ('Vtulka.m3d',ipart2,false)) осуществляет связь переменной, задающей деталь в сборке с файлом, в котором хранится трехмерная модель данной детали. В скобках последовательно указывается путь к файлу и его имя (путь не обязателен, когда файлы находятся в той же директории), переменная, которая указывает на эту деталь, признак сохранения связи с фалом источником (да или нет (true или false)). Следующая строка задает номер детали в сборке (iPart2 := ksPart ( iDocument3D.GetPart(1)), в данном случае - это 1. Примечание: нумерация начинается с 0. Строка (iPart2.BeginEdit) разрешает редактирование детали на месте. Далее задается переменная, определяющая положение детали в сборке (plac2 := ksPlacement (ipart2 . GetPlacement)). Строка (plac2 . SetOrigin (2*Dmax, 2*Dmax, 0)) задает новое положение детали в сборке (в приведенном примере координаты указываются через максимальный внешний диаметр втулки (см рисунок 3)). Для завершения позиционирования детали необходимо обновить ее положение строкой (iPart2.UpdatePlacement) и обновить деталь (iPart2.Update). Далее следует закончить редактирование детали на месте (iPart2.EndEdit(False)). Фиксация детали в заданных координатах осуществляется строкой (iPart2.fixedComponent:=true).

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

iPart2:=ksPart(iDocument3D.GetPart(1));

iPart2.useColor:=0;

ColorParam2:=ksColorParam(iPart2.ColorParam);

ColorParam2.color:=$001253671;

iPart2.SetAdvancedColor(ColorParam2.color,ColorParam2.ambient,

ColorParam2.diffuse,ColorParam2.specularity,ColorPar

am2.shininess,

ColorParam2.transparency,ColorParam2.emission);

iPart2.Update;

Некоторые строки данного блока нам уже знакомы, поэтому мы не будем их рассматривать. Строка (iPart2.useColor:=0) определяет источник цвета (цвет собственный, хозяина, источника). 0 указывает на собственный цвет. Строка (ColorParam2: = ksColorParam(iPart2.ColorParam)) задает переменную, определяющую параметры цвета детали. Цвет детали непосредственно задается следующей строкой (ColorParam2.color:=$001253 671) в виде числового значения. Конструкция (iPart2.SetAdvancedColor (ColorParam2.color,ColorParam2.ambient,ColorParam2.diffuse,ColorParam2.specularity,ColorParam2.shininess,ColorParam2.transparency,ColorParam2.emission)) задает полную характеристику параметров цвета детали. В данном случае используется только цвет (ColorParam2.color). Система дополнительно допускает задать следующие параметры: общий свет (ColorParam2.ambient), диффузию (ColorParam2.diffuse), зеркальность (ColorParam2.specularity), блеск (ColorParam2. shininess), прозрачность (ColorParam2.transparency), излучение (ColorParam2.emission).

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

Блок, обеспечивающий сохранение в файл:

iDocument3D.fileName:='sborka.a3d';

iDocument3D.UpdateDocumentParam;

iDocument3D.Save;

//===============================================

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

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;

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

iKompasObject := KompasObject(CreateKompasObject);

if iKompasObject <> nil then

begin

iDocument3D :=ksDocument3D(iKompasObject.Document3D);

if idocument3d.Create(false,true) then

begin

if (iDocument3D <> nil) then

begin

plastina;

end;

end;

end;

//построение сборки путем запуска процедуры CreateA3D

iKompasObject := KompasObject(CreateKompasObject);

if iKompasObject <> nil then

begin

iDocument3D :=

ksDocument3D(iKompasObject.Document3D);

if (iDocument3D <> nil) then

begin

CreateA3D;

end;

end;

iKompasObject.ksCalculateReset;

end;

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

iKompasObject := KompasObject(CreateKompasObject);

if iKompasObject <> nil then

begin

iDocument3D :=ksDocument3D(iKompasObject.Document3D);

if (iDocument3D <> nil) then

begin

CreateA3D;

end;

end;

Назначение входящего в него программного кода уже рассматривалось в предыдущих работах. Напомним его кратко: создается объект типа Компас, далее осуществляется проверка, при ее положительном прохождении создается 3D документ, опять проводится проверка и только тогда запускается процедура, создающая модель (в текущем примере создается сборка).

Пожертвовав надежность программного средства, рассмотренный выше блок можно упростить, удалив из него обе проверки:

iKompasObject := KompasObject(CreateKompasObject);

iDocument3D := ksDocument3D(iKompasObject.Document3D);

CreateA3D;

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

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

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

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

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