- •Введение
- •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.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º по контуру детали и на ребре отверстия |