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

6.2. Построение фасок и скруглений в твердотельных моделях прикладных библиотек

Фаски и скругления являются добавляемыми компонентами к уже имеющейся твердотельной модели, поэтому программный код рассматриваемой прикладной библиотеки будет продублирован. В качестве основы для построения твердотельной модели будет взят эскиз, представленный на рисунке 35.

Рис. 35. Эскиз для построения твердотельной модели

Ключевые точки для построения эскиза не будут вынесены в структуру как в предыдущем примере, а войдут в состав команд графических примитивов LineSeg и ArcByPoint, предварительно объединив все элементы контуром (Contour(1)).

Листинг прикладной библиотеки приведен ниже:

void CreateFas( 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 );

//CreateExtrusion ( part );

if ( part )

{

switch ( comm )

{

case 1 :CreateExtrusion(part); break; //операция выдавливания

case 2 :OperationRotated(part); break;// операции вращения

case 3 :CreateFas( part ); break; //создание фасок и скруглений

} }

Doc3d->UpdateDocumentParam();

Doc3d->Save();

}

void CreateFas( 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( 0 );

// Создадим эскиз

entitySketch->Create();

// Войти в режим редактирования эскиза

if ( sketchDefinition->BeginEdit() )

{reference p;

//Определение контура

Contour(1);

LineSeg(150,-30,55,-30,1);

ArcByPoint (55,-55,25,55,-30,55,-80,1,1);

LineSeg(55,-80,150,-80,1);

LineSeg(150,-80,150,-30,1);

p = EndObj();

Circle(60,-55,15,1);

// Выйти из режима редактирования эскиза

sketchDefinition->EndEdit();

}

// Оперция выдавливани

IEntityPtr entityExtrusion( part->NewEntity( o3d_baseExtrusion ), false );

if ( entityExtrusion )

{

// Интерфейс базовой операции выдавливания

IBaseExtrusionDefinitionPtr extrusionDefinition( IUnknownPtr( entityExtrusion->GetDefinition(), false ) );

if ( extrusionDefinition )

{

// Установка параметров операции выдавливания

extrusionDefinition->SetDirectionType( dtNormal );

//Направление выдавливания ( dtNormal - прямое // направление, для тонкой стенки - наружу,

// dtReverse-обратное направление, для тонкой стенки - внутрь // dtBoth - в обе стороны, dtMiddlePlane от средней плоскости )

// Изменить параметры выдавливания в одном направлении

extrusionDefinition->SetSideParam( true,

// Направление выдавливания ( TRUE - прямое направление, // FALSE - обратное направление )

etBlind,

// Тип выдавливания ( etBlind - строго на глубину, // etThroughAll -через всю деталь, etUpToVertexTo - на

// расстояние до вершины, // etUpToVertexFrom - на расстояние за вершину, etUpToSurfaceTo //- на расстояние до поверхности, etUpToSurfaceFrom - на

// расстояние за поверхность, // etUpToNearSurface - до ближайшей поверхности )

20, // Глубина выдавливания

0, // Угол уклона

false );

//Направление уклона (TRUE - уклон наружу,FALSE - уклон внутрь )

// Изменить параметры тонкой стенки

extrusionDefinition->SetThinParam( false,

// Признак тонкостенной операции

0, // Направление построения тонкой стенки

0, // Толщина стенки в прямом направлении

0 );

// Толщина стенки в обратном направлении

extrusionDefinition->SetSketch( entitySketch );

// Эскиз операции выдавливания

// Создать операцию выдавливания

entityExtrusion->Create();

//Формирует массив объектов и возвращает указатель на его //интерфейс - массив граней компонента

IEntityCollectionPtr entityCollection( part->EntityCollection( o3d_edge ), false );

if ( (bool)entityCollection && entityCollection->SelectByPoint( 150, -55, 20 ) && // Выбор по точке

entityCollection->GetCount() )

// Получить количество элементов в массиве

{

// Скругление

IEntityPtr entityFillet( part->NewEntity( o3d_fillet ), false );

if ( entityFillet )

{

// Получить указатель на интерфейс параметров объектов и элементов

IFilletDefinitionPtr filletDefinition( IUnknownPtr( entityFillet->GetDefinition(), false ) );

if ( filletDefinition )

{

// Установка параметров скругления

// Радиус скругления

filletDefinition->SetRadius( 4 );

// Продолжить по касательной

filletDefinition->SetTangent( false );

// Динамический массив объектов

IEntityCollectionPtr arrayFilletDefinition( filletDefinition->Array(), false );

if ( arrayFilletDefinition )

{

// Получение граней для скругления

for ( int i = 0, count = entityCollection->GetCount(); i < count; i++ ) {

IEntityPtr ent( entityCollection->GetByIndex(i), false );

arrayFilletDefinition->Add( ent );

}

// Создать операцию скругления

entityFillet->Create();

}

}

}

// Формирует массив объектов и возвращает указатель на его //интерфейс - массив граней компонента

IEntityCollectionPtr entityCollection2( part->EntityCollection( o3d_edge ), false );

if ( (bool)entityCollection2 && entityCollection2->SelectByPoint( 75, -55,20 ) &&

// Выбор по точке

entityCollection2->GetCount() )

// Получить количество элементов в массиве

{// Фаска

IEntityPtr entityChamfer( part->NewEntity( o3d_chamfer ), false );if ( entityChamfer )

{// Получить указатель на интерфейс параметров объектов и элементов

IChamferDefinitionPtr chamferDefinition( IUnknownPtr( entityChamfer->GetDefinition(), false ) );

if ( chamferDefinition )

{// Установка параметров фаски

// Продолжить по касательной

chamferDefinition->SetTangent( false );

// Признак направления фаски

chamferDefinition->SetChamferParam( true, 1.6, // Размер первого катета фаски

1.6 ); // Размер второго катета фаски

// Динамический массив объектов

IEntityCollectionPtr arrayChamferDefinition( chamferDefinition->Array(), false );

if ( arrayChamferDefinition )

{

// Получение граней для фаски

for ( int i = 0, count = entityCollection2->GetCount(); i < count; i++ ) {

IEntityPtr ePtr ( entityCollection2->GetByIndex( i ), false );

arrayChamferDefinition->Add( ePtr );

}

// Создание фаски

entityChamfer->Create();

} } } } } } } } } }

Результат работы показан на рисунке 36.

рис. 36. Построения фаски 1,6x45º на ребре отверстия и скругления радиусом 4 мм на ребре ближней грани

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

IEntityCollectionPtr entityCollection2( part->EntityCollection( o3d_edge ), false );

if ( (bool)entityCollection2 && entityCollection2->SelectByPoint( 75, -55,20 ) && entityCollection2->GetCount() )

{

//Выполняемый код в случае успешного выполнения

}

Если же требуется построить фаску по контуру твердотельной модели и кромки отверстия, в приведенном коде значение o3d_edge меняется на o3d_face и указывается точка, принадлежащая требуемой плоскости.

IEntityCollectionPtr entityCollection2( part->EntityCollection( o3d_face ), false );

if ( (bool)entityCollection2 && entityCollection2->SelectByPoint( 100, -40,20 ) && entityCollection2->GetCount() )

{

//Выполняемый код в случае успешного выполнения

}

Результат работы показан на рисунке 37.

рис. 37. Построения фаски 2,5x45º по контуру детали и на ребре отверстия