- •Введение
- •1. Создание проектов прикладных библиотек
- •2. Работа с графическими объектами на плоскости
- •2.1. Функции для работы с графическими документами
- •2.2. Функции построения составных объектов
- •2.3. Функции ввода параметров
- •3. Методы и их составляющие для проведения вспомогательных построений
- •3.1. Математические функции
- •3.2. Функции вычисления пересечений
- •3.3. Функции вычисления длин, расстояний, углов
- •4. Работа с базами данных
- •5. Примеры проектирования библиотек в 2d
- •5.1. Построение графиков функций
- •5.2. Построение фигур
- •5.3. Построение эскизов
- •6. Твердотельное моделирование объектов в компас 3d
- •6.1. Построение твердотельных деталей посредством операций вращения и выдавливания
- •Элементы системы координат
- •Элементы детали
- •Конструктивные элементы
- •Операции
- •6.2. Построение фасок и скруглений в твердотельных моделях прикладных библиотек
- •6.3. Построение объектов в цвете
- •6.4. Работа со сборками
- •6.5. Включение в сборочные узлы твердотельных моделей без истории построения
- •6.6. Построение сборочных узлов и компонентов с параметрами посредством диалога
- •7. Пример Разработки твердотельных моделей компонентов и Сборочного узла направляющего патрубка
- •Заключение
- •Библиографический список
- •Оглавление
- •3 94026 Воронеж, Московский просп., 14
6.1. Построение твердотельных деталей посредством операций вращения и выдавливания
Принципы построения твердотельных моделей для ряда CAD/CAM систем имеют общие закономерности получения форм деталей. Изначально необходимо выбрать плоскость и выполнить построение эскиза, применяя набор инструментальных средств интегрированной среды системы посредством геометрических примитивов (линии, дуги окружностей, сплайновые кривые и т.д). Эскиз выполняется с учетом требуемых размеров и компонентов, позволяющих однозначно определить его на выбранной плоскости. Дальнейшие действия над эскизом осуществляются путем операций, зарезервированных в системе CAD/CAM, которые задают условия формирования конечной твердотельной модели. Например, для того, чтобы получить объемный цилиндр в пространстве, необходимо в основании объекта начертить окружность и, посредством операции выдавливания с указанием высоты подъема, сформировать твердотельную модель. Для операции вращения кроме эскиза на плоскости основным условием построения является наличие осевой линии, вокруг которой контур эскиза сформирует требуемый твердотельный элемент. Далее приводится механизм построения твердотельных моделей для вышеуказанных операций путем программной реализации в системе Компас 3D. Для этой цели будет модифицирован код программы из предыдущего раздела путем добавления двух функций, строящих тела методом выдавливания и вращения.
//
Описания используемых функций void
CreateExtrusion( IPartPtr& part ); void
OperationRotated( IPartPtr& part );
//
Головная
функция
библиотеки void
WINAPI LIBRARYENTRY( UINT comm ) {
IDocument3DPtr
Doc3d( ksGet3dDocument(), false ); Doc3d->Create(
false, true ); Doc3d->SetAuthor(
_T( "Иванов Андрей" ) ); Doc3d->SetComment(_T("Проектирование
прикладных библиотек с использованием
API 3D")); Doc3d->SetFileName(_T("C:\\Деталь.m3d"
)); IPartPtr
part( Doc3d->GetPart( pNew_Part ), false ); if
( part ) { switch
( comm ) { case
1 : CreateExtrusion (part); break;// операция
выдавливания case
2 : OperationRotated (part ); break; // операции
вращения } } Doc3d->UpdateDocumentParam(); Doc3d->Save(); } //
Оперция
выдавливания,
работа
с
экизом void
CreateExtrusion( IPartPtr& part ) { //
Создадим
новый
эскиз IEntityPtr
entitySketch( part->NewEntity(o3d_sketch), false ); if
( entitySketch ) { //Получить
указатель на интерфейс параметров
объектов и //элементов
ISketchDefinitionPtr
sketchDefinition( IUnknownPtr( entitySketch->GetDefinition(),
false ) ); if
( sketchDefinition ) { //
Получим
интерфейс
базовой
плоскости
XOY IEntityPtr
basePlane( part->GetDefaultEntity (o3d_planeXOY), false);
//
Установка параметров эскиза //
Установим плоскость XOY базовой для
эскиза
sketchDefinition->SetPlane(
basePlane );
// Угол
поворота
эскиза
sketchDefinition->SetAngle(
45 );
//
Создадим
эскиз
entitySketch->Create(); //При
построении эскиза пользуемся элементами
2D
API //Координаты
ключевых точек и значение радиуса
//(для
окружностей)
struct position
{
double x;
double y;
double rad;
} *am;
//Выделяем
память под хранение данных на 12 позиций, //каждая
из которых включает по 3 элемента
am=new
position[12];
am[0].x=26.0564;am[0].y=37.0658; am[1].x=80.5036;am[1].y=-17.3814; am[2].x=91.8173;am[2].y=-6.0677;am[2].rad=16; am[3].x=103.1310;am[3].y=5.2460; am[4].x=81.9178;am[4].y=26.4592; am[5].x=88.9889;am[5].y=33.5302;am[5].rad=10; am[6].x=81.9178;am[6].y=40.6013; am[7].x=120.1016;am[7].y=78.7851; am[8].x=93.9387;am[8].y=104.9480; am[9].x=56.1084;am[9].y=40.9549;am[9].rad=10; am[10].x=73.0790;am[10].y=57.9254;am[10].rad=5; am[11].x=90.0496;am[11].y=74.8960;am[11].rad=10;
//Войти
в режим редактирования эскиза if
( sketchDefinition->BeginEdit()
) { reference
p; //Определение
контура Contour(1);
LineSeg(am[0].x,am[0].y,am[1].x,am[1].y,1); ArcByPoint
(am[2].x,am[2].y,am[2].rad,am[1].x,am[1].y,am[3].x,am[3].y,1,1); LineSeg(am[3].x,am[3].y,am[4].x,am[4].y,1); ArcByPoint
(am[5].x,am[5].y,am[5].rad,am[4].x,am[4].y,am[6].x,am[6].y,-1,1); LineSeg(am[6].x,am[6].y,am[7].x,am[7].y,1); LineSeg(am[7].x,am[7].y,am[8].x,am[8].y,1); LineSeg(am[8].x,am[8].y,am[0].x,am[0].y,1);
p = EndObj(); Circle(am[9].x,am[9].y,am[9].rad,1); Circle(am[10].x,am[10].y,am[10].rad,1); Circle(am[11].x,am[11].y,am[11].rad,1); //
Выйти из режима редактирования эскиза
sketchDefinition->EndEdit(); } //Очищаем
динамически выделенную память
delete [] am; //
Оперция
выдавливани IEntityPtr
entityExtrusion( part->NewEntity( o3d_baseExtrusion ), false); if
( entityExtrusion
) { //
Интерфейс базовой операции выдавливания
IBaseExtrusionDefinitionPtr
extrusionDefinition( IUnknownPtr( entityExtrusion->GetDefinition(),
false ) ); if
( extrusionDefinition ) { //
Установка параметров операции
выдавливания //
Направление выдавливания ( dtNormal - прямое //
направление, для тонкой стенки - наружу, //
dtReverse-обратное направление, для тонкой
стенки - внутрь //
dtBoth - в обе стороны, dtMiddlePlane от средней
плоскости )
extrusionDefinition->SetDirectionType(
dtNormal );
//
Изменить параметры выдавливания в
одном направлении
extrusionDefinition->SetSideParam(
true,
//
Направление выдавливания ( TRUE - прямое
направление, //
FALSE - обратное направление ) etBlind,
// Тип выдавливания ( etBlind - строго на
глубину,
// etThroughAll - через всю деталь,
etUpToVertexTo - на //расстояние до вершины,
//etUpToVertexFrom-на расстояние за
вершину,etUpToSurfaceTo - на
// расстояние до
поверхности, etUpToSurfaceFrom - на расстояние
//за поверхность,
// etUpToNearSurface - до ближайшей
поверхности ) 10,
// Глубина выдавливания 0,
// Угол уклона false
); // Направление уклона ( TRUE - уклон
наружу, FALSE - //уклон внутрь ) extrusionDefinition->SetSketch(
entitySketch );
//
Эскиз
операции
выдавливания //
Создать операцию выдавливания
entityExtrusion->Create();
MessageT(
_T("Операция выдавливания") );
}
} } } } //
Операции вращения void
OperationRotated( IPartPtr & part )
{
// Создадим
новый
эскиз IEntityPtr
entitySketch( part->NewEntity(o3d_sketch), false ); if
( entitySketch ) { //
Получить указатель на интерфейс
параметров объектов
//
Интерфейс
свойств
эскиза
ISketchDefinitionPtr
sketchDefinition( IUnknownPtr( entitySketch->GetDefinition(),
false ) ); if
( sketchDefinition ) { //
Получим
интерфейс
базовой
плоскости
XOY IEntityPtr
basePlane( part->GetDefaultEntity( o3d_planeXOY ), false ); //
Установка
параметров
эскиза sketchDefinition->SetPlane(
basePlane );
//
Установим плоскость XOY
базовой для эскиза //
Создадим эскиз
entitySketch->Create(); //
Войти в режим редактирования эскиза if
( sketchDefinition->BeginEdit() ) { //
Введем
новый
эскиз reference
p; //Определение
контура Contour(1);
LineSeg(
0, 0, 40, 0, 1); LineSeg(
40, 0, 48, 6, 1); LineSeg(
48, 6, 58, 6, 1);
LineSeg(
58, 6, 58, 28, 1); LineSeg(
58, 28, 75, 28, 1); LineSeg(
75, 28, 85, 18, 1); LineSeg(
85, 18, 85, -10, 1); LineSeg(
85, -10, 70, -10, 1); LineSeg(
70, -10, 70, -22, 1); LineSeg(
70, -22, 0, -22, 1); LineSeg(
0, -22, 0, 0, 1); p
= EndObj(); //Осевая
линия LineSeg(
-5, -37, 90, -37, 3); //
Выйти из режима редактирования эскиза
sketchDefinition->EndEdit(); } //
Операции
вращения IEntityPtr
entityRotate( part->NewEntity( o3d_baseRotated ), false);
if
( entityRotate )
{ //
Получить указатель на интерфейс
параметров объектов //
Интерфейс
базовой
операции
вращения IBaseRotatedDefinitionPtr
baseRotatedDefinition( IUnknownPtr( entityRotate->GetDefinition(),
false) );
if
( baseRotatedDefinition )
{
baseRotatedDefinition->SetToroidShapeType(
true ); // Признак
тороида
( TRUE - тороид,
FALSE - сфероид
)
baseRotatedDefinition->SetDirectionType(
dtBoth ); // Направление
вращения
( dtNormal - прямое
направление,
для
//тонкой
стенки
- наружу
//
dtReverse - обратное
направление,
для
тонкой
стенки
- внутрь,
//dtBoth - в
обе
стороны, //
dtMiddlePlane - от средней плоскости) //
Изменить параметры выдавливания в
одном направлении
baseRotatedDefinition->SetSideParam(
true,
//
Направление
вращения
( TRUE - прямое,
FALSE - обратное
) 0
);
//
Угол вращения //
Изменить параметры выдавливания в
одном направлении
baseRotatedDefinition->SetSideParam(
false, // Направление вращения (
TRUE - прямое, FALSE - обратное ) 275
);
//
Угол вращения
baseRotatedDefinition->SetSketch(
entitySketch
); // Эскиз операции выдавливания
//
Создать операцию
entityRotate->Create();
MessageT(
_T("Базовая операция вращения") );
} } } }
}
Эскизы для получения твердотельных моделей методами выдавливания и вращения показаны на рисунках 31 и 32.
Рис. 31. Программная реализация эскиза получения модели посредством операции выдавливания |
Рис. 32. Программная реализация эскиза получения модели посредством операции вращения |
Спроектированные объекты в результате выполнения прикладной библиотеки показаны на рисунках 33 и 34.
Рис. 33. Твердотельная модель, полученная операцией “выдавливания” |
Рис. 34. Твердотельная модель, полученная операцией “вращения” |
Функции по созданию моделей (вращением и выдавливанием) в тексте прикладной библиотеки содержат подробные комментарии, однако необходимо следовать некоторому алгоритму действий при создании объектов в объеме. Для построения тел методом выдавливания последовательность действий будет следующая:
- Создать новый объект-эскиз. Для этого следует подготовить элемент построения эскиза посредством интерфейса IEntityPtr:
IEntityPtr
entitySketch( part->NewEntity(o3d_sketch), false );
- Получить интерфейс некоторой опорной плоскости и установить параметры эскиза:
IEntityPtr
basePlane( part->GetDefaultEntity(
o3d_planeXOY ), false ); sketchDefinition->SetPlane(
basePlane );
- Создать эскиз и зайти в режим его редактирования:
entitySketch->Create(); if
( sketchDefinition->BeginEdit()
) { //Здесь
формируется объект, состоящий из 2D
графических //примитивов. Если объект
имеет сложно-выраженную структуру, то
//построение ведется с указанием контура
объекта
//Для
операции вращения необходимо в эскизе
наличие осевой //линии!
sketchDefinition->EndEdit(); }
- Создать операцию для получения модели методом вращения и указать параметры, определяющие режимы для проведения данной процедуры (направление вращения, угол, сведения о том, является ли будущий объект тонкостенным, ссылка на эскиз для проведения заданной операции).
IEntityPtr
entityRotate( part->NewEntity( o3d_baseRotated ), false); if
( entityRotate )
{
IBaseRotatedDefinitionPtr baseRotatedDefinition( IUnknownPtr(
entityRotate->GetDefinition(), false) );
if
( baseRotatedDefinition )
{
baseRotatedDefinition->SetToroidShapeType( true );
baseRotatedDefinition->SetDirectionType(
dtBoth );
baseRotatedDefinition->SetThinParam(
true,dtBoth,1,1);
baseRotatedDefinition->SetSideParam(
true,0);
baseRotatedDefinition->SetSideParam(
false, 275);
baseRotatedDefinition->SetSketch(
entitySketch ); entityRotate->Create(); }
Значительное количество элементов построения имеют указатель на интерфейс IEntityPtr. Для доступа к списку элементов служит функция EntityCollection. Перечень всех типов объектов документа-модели EntityCollection приведен ниже: