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

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 приведен ниже: