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

6.4. Работа со сборками

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

Рассмотренный далее пример характеризует общие принципы построения сборок посредством наложения ограничений между двумя твердотельными моделями. Модели строятся в отдельных функциях и показаны на рисунках 39 и 40 соответственно.

Рис. 39. Твердотельная модель оси

Рис. 40. Твердотельная модель платформы

Листинг программы приведен ниже.

void FirstModelingPart (IPartPtr& part);

void SecondModelingPart(IPartPtr& part2);

// Головная функция библиотеки

void WINAPI LIBRARYENTRY( UINT comm )

{

//создание сборки

IDocument3DPtr my_doc_assembly(ksGet3dDocument(), false);

my_doc_assembly->Create(false, false);

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

my_doc_assembly->SetFileName(_T( "D:\\Узел.a3d" ) );

//Создание детали №1 с сохранением на логическом разделе

IDocument3DPtr my_doc_detail(ksGet3dDocument(), false);

my_doc_detail->Create(false, true);

IPartPtr part(my_doc_detail->GetPart(pNew_Part), false);

//Присвоение объекту имени

part->SetName(_T("Ось.m3d"));

//Отрисовка объекта в контурных (каркасных) видимых линиях

my_doc_detail->SetDrawMode(0);

//Функция построения детали

FirstModelingPart(part);

my_doc_detail->SetFileName( _T( "D:\\Ось.m3d" ) );

my_doc_detail->UpdateDocumentParam();

my_doc_detail->Save();

my_doc_detail->Close();

//Создание детали №2 с сохранением на логическом разделе

//Присвоение объекту имени

IDocument3DPtr my_doc_detail2(ksGet3dDocument(), false);

my_doc_detail2->Create(false, true);

IPartPtr part2(my_doc_detail2->GetPart(pNew_Part), false);

part2->SetName(_T("Платформа.m3d"));

//Отрисовка объекта в полутоновом представлении

my_doc_detail2->SetDrawMode(3);

//Функция построения детали

SecondModelingPart(part2);

my_doc_detail2->SetFileName( _T( "D:\\Платформа.m3d" ) );

my_doc_detail2->UpdateDocumentParam();

my_doc_detail2->Save();my_doc_detail2->Close();

my_doc_assembly->SetActive();

IPartPtr partPin1(my_doc_assembly->GetPart(pNew_Part));

partPin1->SetName(_T("Ось"));

my_doc_assembly->SetPartFromFile(_T("D:\\Ось.m3d"), partPin1,

false);

my_doc_assembly->SetActive();

IPartPtr partPin2(my_doc_assembly->GetPart(pNew_Part));

partPin2->SetName(_T("Платформа"));

my_doc_assembly->SetPartFromFile(_T("D:\\Платформа.m3d"),

partPin2, false);

IEntityPtr entity1( partPin1->GetDefaultEntity(o3d_planeYOZ ), false );

IEntityPtr entity2( partPin2->GetDefaultEntity(o3d_planeYOZ ), false );

my_doc_assembly->AddMateConstraint(mc_Coincidence,entity1, entity2, 0,0,0);

IEntityPtr entity3( partPin1->GetDefaultEntity(o3d_planeXOY), false );

IEntityPtr entity4( partPin2->GetDefaultEntity(o3d_planeXOY), false );

my_doc_assembly->AddMateConstraint(mc_Distance,entity3, entity4, 0,1,20);

IEntityPtr entity5( partPin1->GetDefaultEntity(o3d_planeXOZ), false );

IEntityPtr entity6( partPin2->GetDefaultEntity(o3d_planeXOZ), false );

my_doc_assembly->AddMateConstraint(mc_Distance,entity5, entity6, 0,1,30);

//Обновить и сохранить документ

my_doc_assembly->UpdateDocumentParam();

my_doc_assembly->Save();

}

void FirstModelingPart( IPartPtr& part )

{EntityPtr entitySketch( part->NewEntity(o3d_sketch), false );

if ( entitySketch )

{

ISketchDefinitionPtr sketchDefinition( IUnknownPtr( entitySketch->GetDefinition(), false) );

if ( sketchDefinition )

{

IEntityPtr basePlane( part->GetDefaultEntity( o3d_planeXOY), false );

sketchDefinition->SetPlane( basePlane );

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

entitySketch->Create();

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

if ( sketchDefinition->BeginEdit() )

{

reference p;

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

Contour(1);

Circle(0,0,10,1);

p = EndObj();

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

sketchDefinition->EndEdit();

}

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

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

if ( entityExtrusion )

{

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

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

if ( extrusionDefinition )

{

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

extrusionDefinition->SetDirectionType( dtNormal);

// Параметры выдавливания

extrusionDefinition->SetSideParam( true,

etBlind,

20,

0,

false );

extrusionDefinition->SetSketch( entitySketch );

entityExtrusion->Create();

} } } } }

void SecondModelingPart( IPartPtr& part )

{

// Создадим новый эскиз

IEntityPtr entitySketch( part->NewEntity(o3d_sketch), false );

if ( entitySketch )

{

ISketchDefinitionPtr sketchDefinition( IUnknownPtr( entitySketch->GetDefinition(), false) );

if ( sketchDefinition )

{

IEntityPtr basePlane( part->GetDefaultEntity( o3d_planeXOY ), false);

sketchDefinition->SetPlane( basePlane );

sketchDefinition->SetAngle( 0 );

entitySketch->Create();

if ( sketchDefinition->BeginEdit() )

{

reference p;

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

Contour(1);

LineSeg(20,45,-20,45,1);

LineSeg(-20,45,-20,-45,1);

LineSeg(-20,-45,20,-45,1);

LineSeg(20,-45,20,45,1);

p = EndObj();

Circle(0,30,10,1);

Circle(0,-30,10,1);

sketchDefinition->EndEdit();

}

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

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

if ( entityExtrusion )

{

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

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

if ( extrusionDefinition )

{

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

extrusionDefinition->SetDirectionType( dtNormal );

extrusionDefinition->SetSideParam( true,

etBlind,

5,

0,

false );

extrusionDefinition->SetSketch( entitySketch );

entityExtrusion->Create();

}

}

}

}

}

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

Рис. 41. Компоненты сборки с ограничениями по 3-м плоскостям

Один из ключевых методов AddMateConstraint, позволяющий добавлять сопряжения между твердотельными компонентами, имеет следующий формат:

BOOL AddMateConstraint (long constraintType, LPENTITY obj1, LPENTITY obj2, short direction, short fixed, double val) где,

constraintType - тип сопряжения из перечисления MateConstraintType;

object1 - указатель на интерфейс первого объекта, на который накладывается сопряжение для объекта COM (IEntity);

object2 - указатель на интерфейс второго объекта, на который накладывается сопряжение для объекта COM (iEntity);

direction - ориентация (1 - объекты однонаправленные, 0-направление не учитывается, -1 -объекты разнонаправленные);

fixed - признак фиксации деталей перед выполнением (0-детали не фиксируются, 1 - фиксируется первая деталь, 2 - фиксируется вторая деталь);

val - параметр для ограничений (расстояние или угол между объектами).

Диапазон констант типов ограничений MateConstraintType следующий:

mc_Coincidence - совпадение объектов;

mc_Parallel – параллельность;

mc_Perpendicular – перпендикулярность;

mc_Tangency – касательность;

mc_Concentric – концентричность;

mc_Distance - постоянное расстояние между объектами;

mc_Angle - постоянный угол между объектами;

mc_InPlace - создание компонента "на месте" (эквивалентно совпадению системы координат плоскости, на которой создается компонент, и системы координат плоскости первого эскиза этого компонента.

Для того чтобы работать с компонентами (готовыми или программно-созданными), необходимо создать сборочный документ и сохранить его под некоторым именем в любом разделе логического диска с указанием рабочего пути.

//создание сборки

IDocument3DPtr my_doc_assembly(ksGet3dDocument(), false);

my_doc_assembly->Create(false, false);

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

my_doc_assembly->SetFileName(_T( "D:\\Узел.a3d" ) );

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

my_doc_assembly->SetActive();

IPartPtr partPin1(my_doc_assembly->GetPart(pNew_Part));

partPin1->SetName(_T("Ось"));

my_doc_assembly->SetPartFromFile(_T("D:\\Ось.m3d"), partPin1,

false);

my_doc_assembly->SetActive();

IPartPtr partPin2(my_doc_assembly->GetPart(pNew_Part));

partPin2->SetName(_T("Платформа"));

my_doc_assembly->SetPartFromFile(_T("D:\\Платформа.m3d"),

partPin2, false);

Чтобы объединить два компонента между собой, необходимо получить интерфейсы этих компонентов, н-р с помощью метода GetDefaultEntity, в котором определена одна из плоскостей первого и второго элемента. Для однозначного определения одного компонента относительно другого достаточно иметь три пространственных сопряжения.

IEntityPtr entity1( partPin1->GetDefaultEntity(o3d_planeYOZ ), false );

IEntityPtr entity2( partPin2->GetDefaultEntity(o3d_planeYOZ ), false );

my_doc_assembly->AddMateConstraint(mc_Coincidence,entity1, entity2, 0,0,0);

Записать результаты построения в файл можно посредством повторного вызова метода Save();

//Обновить и сохранить документ

my_doc_assembly->UpdateDocumentParam();

my_doc_assembly->Save();