Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000392.doc
Скачиваний:
18
Добавлен:
30.04.2022
Размер:
2.94 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("Базовая операция вращения") );

}

}

}

}

}

Эскизы для получения твердотельных моделей методами выдавливания и вращения показаны на рис. 27 и 28.

Рис. 27. Программная реализация эскиза получения модели посредством операции выдавливания

Рис. 28. Программная реализация эскиза получения модели посредством операции вращения

Результаты работы прикладной библиотеки системы Компас 3D показаны на рис. 29 и 30.

Рис.29. Модель детали, выполненная посредством операции выдавливания

Рис.30. Модель детали, выполненная посредством операции вращения

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

- Создать новый объект-эскиз. Для этого следует подготовить элемент построения эскиза посредством интерфейса 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 приведен ниже:

o3d_unknown 0 неизвестный (включает все объекты)

o3d_planeXOY 1 плоскость XOY

o3d_planeXOZ 2 плоскость XOZ

o3d_planeYOZ 3 плоскость YOZ

o3d_pointCS 4 точка начала системы координат

Элементы детали

o3d_sketch 5 эскиз

o3d_face 6 поверхность

o3d_edge 7 ребро

o3d_vertex 8 вершина

Конструктивные элементы

o3d_axis2Planes 9 ось по двум плоскостям

o3d_axis2Points 10 ось по двум точкам

o3d_axisConeFace 11 ось конической грани

o3d_axisEdge 12 ось, проходящая через ребро

o3d_axisOperation 13 ось операции

o3d_planeOffset 14 смещённая плоскость

o3d_planeAngle 15 плоскость под углом

o3d_plane3Points 16 плоскость по 3-м точкам

o3d_planeNormal 17 нормальная плоскость

o3d_planeTangent 18 касательная плоскость

o3d_planeEdgePoint 19 плоскость через ребро и вершину

o3d_planeParallel 20 плоскость через вершину параллельно другой плоскости

o3d_planePerpendicular 21 плоскость через вершину перпендикулярно ребру

o3d_planeLineToEdge 22 плоскость через ребро параллельно/перпендикулярно другому ребру

o3d_planeLineToPlane 23 плоскость через ребро параллельно /перпендикулярно грани

Операции

o3d_baseExtrusion 24 базовая операция выдавливания

o3d_bossExtrusion 25 приклеивание выдавливанием

o3d_cutExtrusion 26 вырезать выдавливанием

o3d_baseRotated 27 базовая операция вращения

o3d_bossRotated 28 приклеивание вращением

o3d_cutRotated 29 вырезать вращением

o3d_baseLoft 30 базовая операция по сечениям

o3d_bossLoft 31 приклеивание по сечениям

o3d_cutLoft 32 вырезать по сечениям

o3d_chamfer 33 операция "фаска"

o3d_fillet 34 операция "скругление"

o3d_meshCopy 35 операция копирования по сетке

o3d_circularCopy 36 операция копирования по концентрической сетке

o3d_curveCopy 37 операция копирования по кривой

o3d_circPartArray 38 операция массив по концентрической сетке для сборки

o3d_meshPartArray 39 операция массив по сетке для сборки

o3d_curvePartArray 40 операция массив по кривой для сборки

o3d_derivPartArray 41 операция массив по образцу для сборки

o3d_incline 42 операция "уклон"

o3d_shellOperation 43 операция "оболочка"

o3d_ribOperation 44 операция "ребро жесткости"

o3d_baseEvolution 45 кинематическая операция

o3d_bossEvolution 46 приклеить кинематически

o3d_cutEvolution 47 вырезать кинематически

o3d_mirrorOperation 48 операция "зеркальный массив"

o3d_mirrorAllOperation 49 операция "зеркально отразить все"

o3d_cutByPlane 50 операция "сечение поверхностью"

o3d_cutBySketch 51 операция "сечение эскизом"

o3d_holeOperation 52 отверстие

Кривые

o3d_polyline 53 ломаная

o3d_conicSpiral 54 коническая спираль

o3d_spline 55 сплайн

o3d_cylindricSpiral 56 цилиндрическая спираль

o3d_importedSurface 57 импортированная

o3d_thread 58 условное изображение резьбы

o3d_EvolutionSurface 59 кинематическая поверхность

o3d_ExtrusionSurface 60 поверхность выдавливания

o3d_RotatedSurface 61 поверхность вращения

o3d_LoftSurface 62 поверхность по сечениям

o3d_MacroObject 63 макрообъект 3D

o3d_UnionComponents 64 операция объединения компонентов

o3d_MoldCavity 65 операция вычитания компонентов

Объединенные типы объектов для создания EntityCollection

o3d_constrElement 109 конструктивные элементы-плоскости и оси (конструктивные от o3d_axis2Planes до o3d_plane3Points)

o3d_operationElement 110 операции (от o3d_baseExtrusion до o3d_cylindricSpiral)

o3d_curveElement 111 кривые (пространственные и ребра)

Внимательно изучив код указанных выше функций разработанной прикладной библиотеки КОМПАС 3D, аналогичным образом создаются функции построения моделей по сечениям и подготавливаются операции: оболочка, уклон, сечение плоскостью, сечение эскизом.