- •Гоувпо «Воронежский государственный технический университет» м.И. Чижов а.Н. Юров
- •Введение
- •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. Работа с твердотельными моделями и объектами
- •6.1. Построение твердотельных деталей посредством операций вращения и выдавливания
- •6.2. Построение фасок и скруглений в твердотельных моделях прикладных библиотек
- •6.3. Построение объектов в цвете
- •6.4. Работа со сборками
- •6.5. Включение в сборочные узлы твердотельных моделей без истории построения
- •6.6. Построение сборочных узлов и компонентов с параметрами посредством диалога
- •Заключение
- •Библиографический список
- •3 94026 Воронеж, Московский просп., 14
6.4. Работа со сборками
Сборные узлы и конструкции в любой системе твердотельного моделирования являются основными составляющими элементами при проектировании, которые содержат полную каркасную и модельную информацию об изделии. В системе Компас 3D сопряжения между компонентами программным способом могут быть выполнены, если будут указаны пути расположения моделей на логических разделах, или же применены к моделям, строящимися непосредственно, с записью на носитель и последующим подключением к сборке.
Рассмотренный далее пример характеризует общие принципы построения сборок посредством наложения ограничений между двумя твердотельными моделями. Модели строятся в отдельных функциях и показаны на рис. 35 и 36 соответственно.
Рис. 35. Твердотельная модель оси |
Рис. 36. Твердотельная модель платформы |
Листинг программы приведен ниже.
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();
}
} } } }
Результат работы прикладной библиотеки показан на рис. 37.
Рис. 37. Компоненты сборки с ограничениями по 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();