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

7. Пример Разработки твердотельных моделей компонентов и Сборочного узла направляющего патрубка

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

Рис. 45. Элемент проектирования “насадка”

Рис. 46. Элемент проектирования “штуцер”

Рис. 47. Элемент проектирования “трубка”

Задачу проектирования целесообразнее провести с помощью специальных средств разработки. Например, с применением средств MFC-библиотеки на языке C++, разработанной Microsoft и призванной облегчить разработку GUI-приложений для Microsoft Windows путем использования значительного набора библиотечных классов. Проектирование начнем с создания интерфейса и объявления переменных для передачи в объект построения.

Для задания параметров детали типа “насадка” спроектируем диалог посредством визуальных средсв построения интегрированной среды. В диалоговое окно добавим элементы управления, которые позволяют менять значения (с присвоением идентификаторов IDC_SLIDER1 и IDC_SLIDER2), поля отображения меняющихся значений (присвоены идентификаторы IDC_EDIT1 и IDC_EDIT2) и кнопку (button), подтверждающую ввод параметров, требуемых для построения. Кроме того, в диалог внесены разного рода информационные строки и сообщения для однозначной интерпретации процесса проектирования (поля, содержащие строки IDC_STATIC, IDB_BITMAP1 и т.д.). Общий вид диалога построения детали показан на рисунке 48.

Рис. 48. Проектирование интерфейса задания параметров модели “насадка”

В процессе построения диалога визуальными средствами в ресурсном файле проекта (имя_ресурсного_файла.rc) добавится следующий фрагмент текста, который можно впоследствии отредактировать.

IDD_DIALOG2 DIALOGEX 0, 0, 306, 170

STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION

CAPTION "Определение параметров детали (насадка)"

FONT 8, "MS Sans Serif"

BEGIN

DEFPUSHBUTTON "Построить",IDOK,107,149,88,14

GROUPBOX "Размерные характеристики",IDC_STATIC,7,7,292,133

LTEXT "Внутренний диаметр, мм:",IDC_STATIC,37,29,88,14

LTEXT "Высота детали, мм:",IDC_STATIC,37,90,68,8

EDITTEXT IDC_EDIT1,140,26,40,14,ES_CENTER | ES_AUTOHSCROLL |

WS_DISABLED

EDITTEXT IDC_EDIT2,140,86,40,14,ES_CENTER | ES_AUTOHSCROLL |

WS_DISABLED

GROUPBOX "Вид модели",IDC_STATIC,200,14,91,118

CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH |

TBS_NOTICKS | WS_TABSTOP,20,56,173,15

CONTROL "Slider2",IDC_SLIDER2,"msctls_trackbar32",TBS_BOTH |

TBS_NOTICKS | WS_TABSTOP,20,109,173,15

CONTROL 7016,IDC_STATIC,"Static",SS_BITMAP | SS_SUNKEN |

WS_BORDER,205,23,80,105,WS_EX_DLGMODALFRAME |

WS_EX_CLIENTEDGE

END

Подготовим класс, который отвечает за диалог и интерфейс в целом, предусматривает обмен параметрами и вклчает программную реализацию элементов управления данными. Медоды и элементы класса для модели “насадка” показаны на рисунке 49.

Рис. 49. Программная реализация диалогового класса “насадка”

Как видно из предложенной реализации, в классе my_dialog() определен ряд методов (функций) и объявлено несколько переменных. Класс my_dialog() наследует свойства типовых диалоговых окон под Windows, поэтому ссылки на ряд органов управления выполнены в виде указателей.

Описание методов, которые вошли в состав класса:

void my_dialog2::DoDataExchange(CDataExchange* pDX)-метод реализует обмен данными в диалоговом окне, позволяет выполнить ассоциативную связь между переменной и ее визуальной составляющей. Для связи переменной и составляющей используются полученные ссылочные идентификаторы. Пример взаимосвязи приводится в следующем фрагменте:

DDX_Text(pDX, IDC_EDIT1, ed1);

DDX_Text(pDX, IDC_EDIT2, ed2);

DDX_Control(pDX, IDC_SLIDER1, mSlider1);

DDX_Control(pDX, IDC_SLIDER2, mSlider2);

my_dialog2::my_dialog2(CWnd* pParent /*=NULL*/): CDialog(my_dialog2::IDD, pParent) –представляет собой конструктор для класса my_dialog(). В конструкторе реализована часть, связанная с присвоением переменным начальных значений.

void my_dialog2::OnCustomdrawSlider1(NMHDR* pNMHDR, LRESULT* pResult) –позволяет реагировать на события, связанные со перемещением бегунка (Slider).

void my_dialog2::OnCustomdrawSlider2(NMHDR* pNMHDR, LRESULT* pResult)–функция производит действия, аналогчные предыдущей.

BOOL my_dialog2::OnInitDialog()-данный метод позволяет выполнить ряд процессов или задач до момента создания диалогового окна, тем самым частично повторив действия функции-конструктора.

void my_dialog2::OnOK()-данная функция является реакцией на действия, когда пользователем выбрана кнопка подтверждения (ОК). В диалоге указанная кнопка переименована и называется “Построить”. Внутри метода дополнительных действий не производится.

Все методы, приведенные в классе, кроме конструктора, зацищены (protected:) и могут быть вызваны только из унаследованных классов в дальнейшем. Кроме того класс содержит ряд переменных, значение которых будет передано основному модулю прикладной библиотеки после того, как диалоговое окно будет закрыто пользователем. Листинг класса диалогового окна для модели “насадка” и метода реализации данного класса приведены ниже.

#if!defined(AFX_MY_DIALOG2_H__26B2A380_F40A_4710_AD2F_C1C706817754__INCLUDED_)

#define AFX_MY_DIALOG2_H__26B2A380_F40A_4710_AD2F_C1C706817754__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

// my_dialog2.h : header file

#include "resource.h"

//Для слайдера

#include "afxcmn.h"

// my_dialog2 dialog

class my_dialog2 : public CDialog

{

// Construction

public:

my_dialog2(CWnd* pParent = NULL); // standard constructor

// Dialog Data

//{{AFX_DATA(my_dialog2)

enum { IDD = IDD_DIALOG2 };

CSliderCtrl mSlider1;

CSliderCtrl mSlider2;

int ed1;

int ed2;

int pos1;

CEdit *edit1;

CEdit *edit2;

//}}AFX_DATA

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(my_dialog2)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

// Generated message map functions

//{{AFX_MSG(my_dialog2)

virtual void OnOK();

virtual BOOL OnInitDialog();

afx_msg void OnCustomdrawSlider1(NMHDR* pNMHDR, LRESULT* pResult);

afx_msg void OnCustomdrawSlider2(NMHDR* pNMHDR, LRESULT* pResult);

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

#include "stdafx.h"

#include "my_dialog2.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

//Значение значение внутреннего диаметра

#define min1 30

#define max1 80

//Значение длины

#define min2 300

#define max2 500

// my_dialog2 dialog

my_dialog2::my_dialog2(CWnd* pParent /*=NULL*/)

: CDialog(my_dialog2::IDD, pParent)

{ ed1 = 0;}

void my_dialog2::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

DDX_Text(pDX, IDC_EDIT1, ed1);

DDX_Text(pDX, IDC_EDIT2, ed2);

DDX_Control(pDX, IDC_SLIDER1, mSlider1);

DDX_Control(pDX, IDC_SLIDER2, mSlider2);

}

BEGIN_MESSAGE_MAP(my_dialog2, CDialog)

ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER1, OnCustomdrawSlider1)

ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER2, OnCustomdrawSlider2)

END_MESSAGE_MAP()

void my_dialog2::OnOK()

{CDialog::OnOK();

}

BOOL my_dialog2::OnInitDialog()

{CDialog::OnInitDialog();

//Определеяем максимум и минимум бегунка №1 и устанавливаем эти значения

mSlider1.SetRangeMin(min1,TRUE);

mSlider1.SetRangeMax(max1,TRUE);

mSlider1.SetRange(min1, max1, TRUE);

//Определеяем максимум и минимум бегунка №2 и устанавливаем эти значения

mSlider2.SetRangeMin(min2,TRUE);

mSlider2.SetRangeMax(max2,TRUE);

mSlider2.SetRange(min2, max2, TRUE);

return TRUE;

}

void my_dialog2::OnCustomdrawSlider1(NMHDR* pNMHDR, LRESULT* pResult)

{

int i=mSlider1.GetPos(); // получить позицию

ed1=i;

edit1=(CEdit*)GetDlgItem(IDC_EDIT1);

UpdateData(FALSE);

*pResult = 0;

}

void my_dialog2::OnCustomdrawSlider2(NMHDR* pNMHDR, LRESULT* pResult)

{

int i=mSlider2.GetPos(); // получить позицию

ed2=i;

edit2=(CEdit*)GetDlgItem(IDC_EDIT2);

UpdateData(FALSE);

*pResult = 0;

}

На рисунке 50 показан диалоговый интерфейс для построения твердотельной модели. При этом пользователю предлагается изменить имеющиеся параметры в заданном диапазоне значений.

Рис. 50. Определение параметров для построения твердотельной модели “насадки”

После создания диалогового интерфейса и определения ряда параметров необходимо подготовить в функции void WINAPI LIBRARYENTRY(UINT comm) вызов метода программного построения требуемой детали. В следующем фрагменте проиллюстрировано, как подготовить вызов диалогового окна, передать заданные параметры глобальным переменным, вызвать функцию построения насадки, а результат построения записать в файл под заданным именем в указанную директорию (сохраненный файл "Насадка.m3d" является документом КОМПАС 3D, относящимся к моделям).

//Для задания параметров насадки

//Внутренний диаметр

int diam3;

//Высота модели

int hi1;

//Номер исполнения

int pos1;

void Adjutage (IPartPtr& part);

void WINAPI LIBRARYENTRY( UINT comm )

{

switch ( comm )

{

case 1 : {

EnableTaskAccess( 0 ); // Закрыть доступ к компасу

my_dialog2 dlg2; // создаем объект класса диалогового окна

if (dlg2.DoModal()==IDOK)

{

diam3=dlg2.ed1;

hi1=dlg2.ed2;

pos1=dlg2.pos1;

}

EnableTaskAccess( 1 ); // Открыть доступ к компасу

IDocument3DPtr Doc3d1( ksGet3dDocument(), false );

Doc3d1->Create( false, true );

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

Adjutage (part);

//Имя модели

part->SetName(_T("Насадка.m3d"));

part->SetStandardComponent( true );

Doc3d1->SetFileName( _T( "d:\\насадка.m3d" ) );

Doc3d1->UpdateDocumentParam();

Doc3d1->Save();

//Doc3d1->Close();

break; //прекратить построение модели

}

}

Из приведенного листинга видно, что определены три глобальные переменные, отвечающие за высоту модели, внутренний диаметр (значения берутся из диалогового интерфейса) и номер исполнения. Исполнение для данной модели единственное, поэтому параметр является зарезервированным. В функции void Adjutage (IPartPtr& part); производятся необходимые геометрические построения. Выбор того или иного построения определен в разделе условноного оператора switch()-при указазанном значении 1 прозводится отображения диалогового окна проектирования насадки, а доступ к системе проектирования блокируется с помощью функции EnableTaskAccess(0). Для доступа к КОМПАСУ требуется вызвать функцию повторно с параметром 1- EnableTaskAccess(1). Работа с функциями системы возможна после того, как будет объявлен указатель на объект после вызова следующей функции IDocument3DPtr Doc3d1( ksGet3dDocument(), false ). Через объявленный указатель имеется возможность вызвать соответствующую функцию для создания детали и передать два параметра: первый- видимости объекта в процессе построения, а второй-типа объекта (сборка или деталь). В рассматриваемом случае значения следующие: Doc3d1->Create( false, true ). Компонент строится в прикладной библиотеке как стандартный, поэтому дерево построения отдельных элементов создано не будет. Задается указанная опция с помощью функции part->SetStandardComponent( true ). Прежде чем использовать указатель на объект рабочей детали, его необходимо объявить. Объявление имеет следующий вид IPartPtr part( Doc3d1->GetPart( pNew_Part ), false ). Обновление параметров активного в данный момент документа, его сохранения и закрытия производится следующими методами: Doc3d1->UpdateDocumentParam(); Doc3d1->Save(); //Doc3d1->Close(). Последний метод закомментирован ввиду того, что результат рекомендуется отобразить на экране. В процессе проектирования сборок компоненты построенных деталей перед добавлением в конструкцию требуется выгружать.

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

// Построение насадки

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

entitySketch->SetHidden(false);

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

if ( sketchDefinition->BeginEdit() )

{

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

LineSeg(-0.7*diam3,-0.2*diam3,0.7*diam3,-0.2*diam3,1);

LineSeg(-0.7*diam3,0.2*diam3,0.7*diam3,0.2*diam3,1);

LineSeg(-0.7*diam3,-0.2*diam3,-0.7*diam3,0.2*diam3,1);

LineSeg(0.7*diam3,-0.2*diam3,0.7*diam3,0.2*diam3,1);

//}

//Используем в случае, когда в меню присутствует элемент "исполнение"

//else {Circle( 0, 0, diam3+5, 1 );

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

sketchDefinition->EndEdit();

} } }

// Создадим смещенную плоскость ( для создания на ней эскиза )

IEntityPtr entityPlaneOffset2( part->NewEntity( o3d_planeOffset ), false );

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

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

if ( (bool)entityPlaneOffset2 && (bool)entitySketch2 )

{

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

// Интерфейс свойств смещенной плоскости

IPlaneOffsetDefinitionPtr planeOffsetDefinition2( IUnknownPtr( entityPlaneOffset2->GetDefinition(), false ) );

if ( planeOffsetDefinition2 )

{

// Установка параметров смещенной плоскости

// Расстояние от базовой плоскости

planeOffsetDefinition2->SetOffset(hi1*0.4 );

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

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

planeOffsetDefinition2->SetPlane( basePlane );

// Установим плоскость XOY базовой для плоскости

// Имя для смещенной плоскости

entityPlaneOffset2->SetName( _bstr_t( _T("Вспомогательная плоскость №1") ) );

entityPlaneOffset2->SetHidden( true ); // Скрыть смещенную плоскость

// Создаем смещенную плоскость

entityPlaneOffset2->Create();

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

// Интерфейс свойств эскиза

ISketchDefinitionPtr sketchDefinition2( IUnknownPtr( entitySketch2->GetDefinition(), false ) );

if ( sketchDefinition2 )

{

// Установка параметров эскиза

sketchDefinition2->SetPlane( entityPlaneOffset2 ); // Установим смещенную плоскость базовой для эскиза

// Подготовим эскиз

entitySketch2->Create();

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

if ( sketchDefinition2->BeginEdit() )

{

// Введем новый эскиз - эллипс

EllipseParam par;

par.xc = 0;

par.yc = 0;

par.a = 0.8*diam3;

par.b = 0.4*diam3;

par.ang = 0;

par.style = 1;

reference p = ksEllipse(&par);

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

sketchDefinition2->EndEdit();

}

}

}

}

// Создаем смещенную плоскость ( для создания на ней эскиза )

IEntityPtr entityPlaneOffset3( part->NewEntity( o3d_planeOffset ), false );

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

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

if ( (bool)entityPlaneOffset3 && (bool)entitySketch3 )

{

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

// Интерфейс свойств смещенной плоскости

IPlaneOffsetDefinitionPtr planeOffsetDefinition3( IUnknownPtr( entityPlaneOffset3->GetDefinition(), false ) );

if ( planeOffsetDefinition3 )

{

// Установка параметров смещенной плоскости

// planeOffsetDefinition3->SetOffset( ((hi1/2)/2)*2 ); // Расстояние от базовой плоскости

planeOffsetDefinition3->SetOffset(hi1*0.6);

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

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

// Устанавливаем плоскость XOY базовой для плоскости

planeOffsetDefinition3->SetPlane( basePlane );

// Имя для смещенной плоскости

entityPlaneOffset3->SetName( _bstr_t(_T("Вспомогательная плоскость №2")));

// Скрываем смещенную плоскость

entityPlaneOffset3->SetHidden( true );

// Создаем смещенную плоскость

entityPlaneOffset3->Create();

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

// Интерфейс свойств эскиза

ISketchDefinitionPtr sketchDefinition3( IUnknownPtr( entitySketch3->GetDefinition(), false ) );

if ( sketchDefinition3 )

{

// Установка параметров эскиза

sketchDefinition3->SetPlane( entityPlaneOffset3 );

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

entitySketch3->Create();

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

if ( sketchDefinition3->BeginEdit() )

{

// Введем новый эскиз - окружность

Circle(0, 0, diam3, 1);

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

sketchDefinition3->EndEdit();

}

}

}

}

// Создаем базовую операцию по сечениям

IEntityPtr entityBaseLoft( part->NewEntity( o3d_baseLoft ), false);

if ( entityBaseLoft )

{

IBaseLoftDefinitionPtr baseLoftDefinition( IUnknownPtr( entityBaseLoft->GetDefinition(), false) );

if ( baseLoftDefinition )

{

IEntityCollectionPtr entityCollection( baseLoftDefinition->Sketchs(), false );

if ( entityCollection )

{

entityCollection->Add( entitySketch );

entityCollection->Add( entitySketch2 );

entityCollection->Add( entitySketch3 );

}

baseLoftDefinition->SetThinParam(true,0,5,0);

//entityBaseLoft->SetName( _bstr_t(_T("Переход")) );

// Имя для операции по сечениям

// Изменяем параметры цвета и визуальных свойств объекта

entityBaseLoft->SetAdvancedColor( RGB (51,51,102), // Цвет

0.8, // Общий свет

0.8, // Диффузия

0.8, // Зеркальность

0.8, // Блеск

1, // Прозрачность

0.8 ); // Излучение

// Выполняем операцию построения по сечениям

entityBaseLoft->Create();

//MessageT( _T("Базовая операция по сечениям") );

}

}

// Приклеиваем выдавливанием объект

IEntityPtr entityBossExtrusion( part->NewEntity( o3d_bossExtrusion ), false );

if ( entityBossExtrusion )

{

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

// Интерфейс параметров приклеенного элемента выдавливания

IBossExtrusionDefinitionPtr bossExtrusionDefinition( IUnknownPtr( entityBossExtrusion->GetDefinition(), false ) );

if ( bossExtrusionDefinition )

{IExtrusionParamPtr extrusionParam( bossExtrusionDefinition->ExtrusionParam(), false ); // Интерфейс структуры параметров выдавливания

IThinParamPtr thinParam( bossExtrusionDefinition->ThinParam(), false ); // Интерфейс структуры параметров тонкой стенки

if ( (bool)extrusionParam && (bool)thinParam )

{

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

bossExtrusionDefinition->SetSketch( entitySketch3 );

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

extrusionParam->SetDirection( dtNormal );

// Направление выдавливания ( dtNormal - прямое

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

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

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

extrusionParam->SetTypeNormal( etBlind );

// Тип выдавливания ( etBlind - строго на глубину,

// etThroughAll - через всю деталь, etUpToVertexTo - на расстояние до вершины,

// etUpToVertexFrom - на расстояние за вершину, etUpToSurfaceTo - на расстояние

// до поверхности, etUpToSurfaceFrom - на расстояние за поверхность,

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

extrusionParam->SetDepthNormal( hi1*0.4 );

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

bossExtrusionDefinition->SetThinParam(true,0,5,0);

entityBossExtrusion->SetAdvancedColor( RGB (255,102,51), // Цвет

0.8, // Общий свет

0.8, // Диффузия

0.8, // Зеркальность

0.8, // Блеск

1, // Прозрачность

0.8 ); // Излучение

entityBossExtrusion->Create(); // Приклеим выдавливанием

}

}

}

// Создаем смещенную плоскость ( для создания на ней эскиза )

IEntityPtr entityPlaneOffset4( part->NewEntity( o3d_planeOffset ), false );

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

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

if ( (bool)entityPlaneOffset4 && (bool)entitySketch4 )

{

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

// Интерфейс свойств смещенной плоскости

IPlaneOffsetDefinitionPtr planeOffsetDefinition4( IUnknownPtr( entityPlaneOffset4->GetDefinition(), false ) );

if (planeOffsetDefinition4 )

{

// Установка параметров смещенной плоскости

planeOffsetDefinition4->SetOffset(hi1);

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

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

planeOffsetDefinition4->SetPlane( basePlane );

entityPlaneOffset4->SetName( _bstr_t(_T("Вспомогательная плоскость №3"))); // Имя для смещенной плоскости

// Скрываем смещенную плоскость

entityPlaneOffset4->SetHidden(true );

// Создаем смещенную плоскость

entityPlaneOffset4->Create();

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

// Интерфейс свойств эскиза

ISketchDefinitionPtr sketchDefinition4( IUnknownPtr( entitySketch4->GetDefinition(), false ) );

if ( sketchDefinition4 )

{

// Установка параметров эскиза

sketchDefinition4->SetPlane( entityPlaneOffset4 );

// Устанавливаем смещенную плоскость базовой для эскиза

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

entitySketch4->Create();

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

if ( sketchDefinition4->BeginEdit() )

{

// Введем новый эскиз - окружность

Circle(0, 0, diam3+2, 1); Circle(0, 0, diam3, 1);

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

sketchDefinition4->EndEdit();

}

}

}

}

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

IEntityPtr entityCutExtrusion( part->NewEntity( o3d_cutExtrusion ), false );

if (entityCutExtrusion )

{

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

// Интерфейс параметров вырезанного элемента выдавливания

ICutExtrusionDefinitionPtr cutExtrusionDefinition( IUnknownPtr( entityCutExtrusion->GetDefinition(), false ) );

if ( cutExtrusionDefinition )

{

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

IEntityPtr entityCutExtrusion( part->NewEntity( o3d_cutExtrusion ), false );

if (entityCutExtrusion )

{

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

// Интерфейс параметров вырезанного элемента выдавливания

ICutExtrusionDefinitionPtr cutExtrusionDefinition( IUnknownPtr( entityCutExtrusion->GetDefinition(), false ) );

if (cutExtrusionDefinition )

{

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

cutExtrusionDefinition->SetDirectionType( dtNormal );

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

cutExtrusionDefinition->SetSideParam( true,etBlind, 0.3*hi1,0,false);

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

cutExtrusionDefinition->SetThinParam(

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

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

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

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

cutExtrusionDefinition->SetSketch( entitySketch4 );

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

entityCutExtrusion->SetAdvancedColor( RGB (0,204,0), // Цвет

0.8, // Общий свет

0.8, // Диффузия

0.8, // Зеркальность

0.8, // Блеск

1, // Прозрачность

0.8 ); // Излучение

// Вырез выдавливанием

entityCutExtrusion->Create();

}

}

}

Выполнение функции приведет к построению модели, которая приведена на рисунке 51. Для того, чтобы проследить последовательность выполнения операций в дереве моделей, в библиотеке был отключен метод построения обекта как стандартный компонент.

Рис. 51. Программная реализация построения модели ”насадка”

Код, выполняющий аналогичные операции, выполненный на языке Object Pascal в среде Borland Delphi 7.0 представлен далее.

procedure PartPaint(var d:real; h:real);

var

iKompasObject: KompasObject;

iDocument3D: ksDocument3D;

doc: ksDocument2D;

iPart:ksPart;

PlaneXOY: ksEntity;

iSketchEntity: ksEntity;

iSketchDef: ksSketchDefinition;

iSketch2Entity: ksEntity;

iSketch2Def: ksSketchDefinition;

iSketch3Entity: ksEntity;

iSketch3Def: ksSketchDefinition;

iSketch4Entity: ksEntity;

iSketch4Def: ksSketchDefinition;

iOffsetPlaneEntity: ksEntity;

iOffsetPlaneDef : ksPlaneOffsetDefinition;

iBossLoftEntity: ksEntity;

iBossLoftDef : ksBossLoftDefinition;

iBossExtrusion:ksEntity;

iBossExtrusionDef : ksBossExtrusionDefinition;

iCutExtrusion:ksEntity;

iCutExtrusionDef : ksCutExtrusionDefinition;

Collect : ksEntityCollection;

par:ksEllipseParam;

ColorParam:ksColorParam;

Begin

iKompasObject := KompasObject(CreateKompasObject);

if iKompasObject <> nil then

begin

iDocument3D := ksDocument3D(iKompasObject.Document3D);

if idocument3d.Create(false,true) then

begin

if (iDocument3D <> nil) then

begin

// получаем указатель на интерфейс детали

iPart := ksPart(iDocument3D.GetPart(pNew_Part));

if (iPart <> nil) then

begin

// интерфейс плоскости

PlaneXOY := ksEntity(iPart.GetDefaultEntity(o3d_planeXOY));

// интерфейс эскиза (эскиз 1)

iSketchEntity := ksEntity(iPart.NewEntity(o3d_sketch));

if (iSketchEntity <> nil) then

begin

// интерфейс параметров эскиза

iSketchDef := ksSketchDefinition(iSketchEntity.GetDefinition);

if (iSketchDef <> nil) then

begin

if (PlaneXOY <> nil) then

begin

// устанавливаем плоскость,

// на которой создается эскиз

iSketchDef.SetPlane(PlaneXOY);

iSketchEntity.Create;

// doc - указатель на интерфейс ksDocument2D

doc := ksDocument2D(iSketchDef.BeginEdit);

if (doc <> nil) then

begin

// вычерчиваем изображение эскиза

// с помощью методов интерфейса ksDocument2D

doc.ksLineSeg(-0.7*d,-0.2*d,0.7*d,-0.2*d,1);

doc.ksLineSeg(-0.7*d,0.2*d,0.7*d,0.2*d,1);

doc.ksLineSeg(-0.7*d,-0.2*d,-0.7*d,0.2*d,1);

doc.ksLineSeg(0.7*d,-0.2*d,0.7*d,0.2*d,1);

end;

// завершение редактирования эскиза

iSketchDef.EndEdit;

end;

end;

end;

// интерфейс смещенной плоскости

iOffsetPlaneEntity := ksEntity(iPart.NewEntity(o3d_planeOffset));

if (iOffsetPlaneEntity <> nil) then

begin

// интерфейс параметров смещенной плоскости

iOffsetPlaneDef :=

ksPlaneOffsetDefinition(iOffsetPlaneEntity.GetDefinition);

if (iOffsetPlaneDef <> nil) then

begin

// величина, базовая плоскость и другие параметры смещения

iOffsetPlaneDef.Offset :=0.4*h;

iOffsetPlaneDef.SetPlane(PlaneXOY);

iOffsetPlaneDef.direction := true;

// делаем плоскость скрытой

iOffsetPlaneEntity.Hidden := false;

// создаем вспомогательную плоскость

iOffsetPlaneEntity.Create;

end;

end;

// интерфейс эскиза (эскиз 2)

iSketch2Entity := ksEntity(iPart.NewEntity(o3d_sketch));

if (iSketch2Entity <> nil) then

begin

// интерфейс параметров эскиза

iSketch2Def := ksSketchDefinition(iSketch2Entity.GetDefinition);

if (iSketch2Def <> nil) then

begin

if (iOffsetPlaneEntity <> nil) then

begin

// устанавливаем плоскость,

// на которой создается эскиз

iSketch2Def.SetPlane(iOffsetPlaneEntity);

iSketch2Entity.Create;

// doc - указатель на интерфейс ksDocument2D

doc := ksDocument2D(iSketch2Def.BeginEdit);

if (doc <> nil) then

begin

// вычерчиваем изображение эскиза

// с помощью методов интерфейса ksDocument2D

par:=ksEllipseParam(iKompasObject.GetParamStruct(22));

par.Init;

par.xc:=0;

par.yc:=0;

par.A:=0.8*d;

par.B:=0.4*d;

par.style:=1;

doc.ksEllipse(par);

end;

// завершение редактирования эскиза

iSketch2Def.EndEdit;

end;

end;

end;

// интерфейс смещенной плоскости 2

iOffsetPlaneEntity := ksEntity(iPart.NewEntity(o3d_planeOffset));

if (iOffsetPlaneEntity <> nil) then

begin

// интерфейс параметров смещенной плоскости

iOffsetPlaneDef :=

ksPlaneOffsetDefinition(iOffsetPlaneEntity.GetDefinition);

if (iOffsetPlaneDef <> nil) then

begin

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

iOffsetPlaneDef.Offset :=0.6*h;

iOffsetPlaneDef.SetPlane(PlaneXOY);

iOffsetPlaneDef.direction := true;

// делаем плоскость скрытой

iOffsetPlaneEntity.Hidden := false;

// создаем вспомогательную плоскость

iOffsetPlaneEntity.Create;

end;

end;

// интерфейс эскиза (эскиз 3)

iSketch3Entity := ksEntity(iPart.NewEntity(o3d_sketch));

if (iSketch3Entity <> nil) then

begin

// интерфейс параметров эскиза

iSketch3Def := ksSketchDefinition(iSketch3Entity.GetDefinition);

if (iSketch3Def <> nil) then

begin

if (iOffsetPlaneEntity <> nil) then

begin

// устанавливаем плоскость,

// на которой создается эскиз

iSketch3Def.SetPlane(iOffsetPlaneEntity);

iSketch3Entity.Create;

// doc - указатель на интерфейс ksDocument2D

doc := ksDocument2D(iSketch3Def.BeginEdit);

if (doc <> nil) then

begin

// вычерчиваем изображение эскиза

// с помощью методов интерфейса ksDocument2D

doc.ksCircle(0, 0, d, 1);

end;

// завершение редактирования эскиза

iSketch3Def.EndEdit;

end;

end;

end;

iSketch3Entity.Create;

// doc - указатель на интерфейс ksDocument2D

doc := ksDocument2D(iSketch3Def.BeginEdit);

if (doc <> nil) then

begin

// вычерчиваем изображение эскиза

// с помощью методов интерфейса ksDocument2D

doc.ksCircle(0, 0, d, 1);

end;

// завершение редактирования эскиза

iSketch3Def.EndEdit;

end;

end;

end;

// интерфейс операции по сечениям

iBossLoftEntity := ksEntity(iPart.NewEntity(o3d_bossLoft));

if (iBossLoftEntity <> nil) then

begin

// интерфейс параметров операции по сечениям

iBossLoftDef := ksBossLoftDefinition(iBossLoftEntity.GetDefinition);

if (iBossLoftDef <> nil) then

begin

// интерфейс массива ksEntityCollection

// коллекции эскизов для операции по сечениям

Collect := ksEntityCollection(iBossLoftDef.Sketchs);

// добавляем эскизы в колекцию

Collect.Add(iSketchEntity);

Collect.Add(iSketch2Entity);

Collect.Add(iSketch3Entity);

//создаем тонкую стенку

iBossLoftDef.SetThinParam(true,0,5,0);

// создаем операцию по сечениям

iBossLoftEntity.Create;

end;

end;

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

iBossExtrusion := ksEntity(iPart.NewEntity(o3d_bossExtrusion));

if (iBossExtrusion <> nil) then

begin

// интерфейс параметров dвыдавливание

iBossExtrusionDef :=

ksBossExtrusionDefinition(iBossExtrusion.GetDefinition);

if (iBossExtrusionDef <> nil) then

begin

// настройка параметров

iBossExtrusionDef.SetSketch(iSketch3Entity);

// направление

iBossExtrusionDef.directionType := dtNormal;

// величина выдавливания

iBossExtrusionDef.SetSideParam

(true, etBlind, 0.4*h, 0, false);

iBossExtrusionDef.SetThinParam(true,0,5,0);

// создаем тело

iBossExtrusion.Create;

end;

end;

// интерфейс смещенной плоскости 3

iOffsetPlaneEntity := ksEntity(iPart.NewEntity(o3d_planeOffset));

if (iOffsetPlaneEntity <> nil) then

begin

// интерфейс параметров смещенной плоскости

iOffsetPlaneDef :=

ksPlaneOffsetDefinition(iOffsetPlaneEntity.GetDefinition);

if (iOffsetPlaneDef <> nil) then

begin

// величина, базовая плоскость и другие параметры смещения

iOffsetPlaneDef.Offset :=h;

iOffsetPlaneDef.SetPlane(PlaneXOY);

iOffsetPlaneDef.direction := true;

// делаем плоскость скрытой

iOffsetPlaneEntity.Hidden := false;

// создаем вспомогательную плоскость

iOffsetPlaneEntity.Create;

end;

end;

// интерфейс смещенной плоскости 3

iOffsetPlaneEntity := ksEntity(iPart.NewEntity(o3d_planeOffset));

if (iOffsetPlaneEntity <> nil) then

begin

// интерфейс параметров смещенной плоскости

iOffsetPlaneDef :=

ksPlaneOffsetDefinition(iOffsetPlaneEntity.GetDefinition);

if (iOffsetPlaneDef <> nil) then

begin

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

iOffsetPlaneDef.Offset :=h;

iOffsetPlaneDef.SetPlane(PlaneXOY);

iOffsetPlaneDef.direction := true;

// делаем плоскость скрытой

iOffsetPlaneEntity.Hidden := false;

// создаем вспомогательную плоскость

iOffsetPlaneEntity.Create;

end;

end;

// интерфейс эскиза (эскиз 4)

iSketch4Entity := ksEntity(iPart.NewEntity(o3d_sketch));

if (iSketch4Entity <> nil) then

begin

// интерфейс параметров эскиза

iSketch4Def := ksSketchDefinition(iSketch4Entity.GetDefinition);

if (iSketch4Def <> nil) then

begin

if (iOffsetPlaneEntity <> nil) then

begin

// устанавливаем плоскость,

// на которой создается эскиз

iSketch4Def.SetPlane(iOffsetPlaneEntity);

iSketch4Entity.Create;

// doc - указатель на интерфейс ksDocument2D

doc := ksDocument2D(iSketch4Def.BeginEdit);

if (doc <> nil) then

begin

// вычерчиваем изображение эскиза

// с помощью методов интерфейса ksDocument2D

doc.ksCircle(0, 0, d+2, 1);

doc.ksCircle(0, 0, d, 1);

end;

// завершение редактирования эскиза

iSketch4Def.EndEdit;

end;

end;

end;

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

iCutExtrusion := ksEntity(iPart.NewEntity(o3d_cutExtrusion));

if (iCutExtrusion <> nil) then

begin

// интерфейс параметров dвыдавливание

iCutExtrusionDef :=

ksCutExtrusionDefinition(iCutExtrusion.GetDefinition);

if (iCutExtrusionDef <> nil) then

begin

// интерфейс параметров dвыдавливание

iCutExtrusionDef :=

ksCutExtrusionDefinition(iCutExtrusion.GetDefinition);

if (iCutExtrusionDef <> nil) then

begin

// настройка параметров

iCutExtrusionDef.SetSketch(iSketch4Entity);

// направление

iCutExtrusionDef.directionType := dtNormal;

// величина выдавливания

iCutExtrusionDef.SetSideParam

(true, etBlind, 0.3*h, 0, false);

// создаем вырез

iCutExtrusion.Create;

end;

end;

//установим собственный цвет для детали

iPart.useColor:=0;

//создаем переменную параметров цвета детали

ColorParam:=ksColorParam(iPart.ColorParam);

//задаем цет

ColorParam.color:=$1845;

//зеркальность детали

ColorParam.specularity:=1000;

//блеск детали

ColorParam.shininess:=1000;

//излучение детали

ColorParam.emission:=1000;

//задаем параметры цвета детали

iPart.SetAdvancedColor(ColorParam.color,ColorParam.ambient,

СolorParam.diffuse,ColorParam.specularity,

ColorParam.shininess,

ColorParam.transparency,ColorParam.emission);

//обновляем деталь

iPart.Update;

//сохранение файла

If iDocument3D.IsDetail then

begin

iDocument3D.fileName:='c:\nasadka.m3d';

iDocument3D.UpdateDocumentParam;

iDocument3D.Save;

end;

//от детали и выше

end;

end;

end;

end;

end;

Следующая программная модель (штуцер) строится аналогичным образом: проектирование интерфейса, взаимосвязь интефейса и основново модуля прикладной библиотеки, передача параметров из диалогового окна в функцию построения и вызов метода геометрического проектирования модели изделия. На рисунке 52 показана разработка диалогового окна в среде Visual Studio.

Рис. 52. Проектирование диалогового окна под модель типа ”штуцер”

Фрагмент ресурсного файла представлен следующим листингом:

IDD_DIALOG3 DIALOGEX 0, 0, 258, 161

STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION

CAPTION "Определение параметров детали (штуцер)"

FONT 8, "MS Sans Serif"

BEGIN

DEFPUSHBUTTON "Построить",IDOK,89,140,75,14

GROUPBOX "Размерные характеристики",IDC_STATIC,7,7,244,130

EDITTEXT IDC_EDIT1,126,50,40,14,ES_CENTER | ES_AUTOHSCROLL |

WS_DISABLED

CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH |

TBS_NOTICKS | WS_TABSTOP,14,95,162,15

LTEXT "Внутренний диаметр, мм",IDC_STATIC,29,53,86,8

GROUPBOX "Вид модели",IDC_STATIC,176,16,69,116

CONTROL 7018,IDC_STATIC,"Static",SS_BITMAP,179,24,62,105,

WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE |

WS_EX_STATICEDGE

END

Из приведенного диалогового окна видно, что лишь один параметр будет являться управляющим. Управляющий класс для “штуцера” выглядит также как и для модели “насадки”, поэтому далее приводится лишь фрагмент кода для указанного класса без отображения методов реализации.

#if !defined(AFX_MY_DIALOG3_H__2A6E7C4F_49DD_4A3E_B6D5_5B84DF2B965D__INCLUDED_)

#define AFX_MY_DIALOG3_H__2A6E7C4F_49DD_4A3E_B6D5_5B84DF2B965D__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

// my_dialog3.h : header file

//

#include "resource.h"

//Для слайдера

#include "afxcmn.h"

// my_dialog3 dialog

class my_dialog3 : public CDialog

{

// Construction

public:

my_dialog3(CWnd* pParent = NULL); // standard constructor

// Dialog Data

//{{AFX_DATA(my_dialog3)

enum { IDD = IDD_DIALOG3 };

CSliderCtrl mSlider1;

int ed1;

CEdit *edit1;

//}}AFX_DATA

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(my_dialog3)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

protected:

// Generated message map functions

//{{AFX_MSG(my_dialog3)

virtual void OnOK();

virtual BOOL OnInitDialog();

afx_msg void OnCustomdrawSlider1(NMHDR* pNMHDR, LRESULT* pResult);

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_MY_DIALOG3_H__2A6E7C4F_49DD_4A3E_B6D5_5B84DF2B965D__INCLUDED_)

В классе, кроме перечисленных методов, которые рассматривались в предыдущей модели, объявлены три переменные: одна отвечает за положение слайдера, вторая хранит целочисленное значение параметра, который будет передан в функцию построения модели, и третья относится к переменной поля для отображения значения в окне с идентификатором IDC_EDIT1. На рисунке 53 показана реализация диалога с определением внутреннего диаметра штуцера.

Рис. 53. Диалоговое окно для определения параметра модели “штуцера”

Фрагмент кода для штуцера в прикладной библиотеке, где производится вызов диалогового окна, передача параметров в функцию проектирования, создание модели и записи результатов, выглядит следующим образом:

//Для задания параметров штуцера

//Внутренний диаметр

int diam4;

void Onpaths (IPartPtr& part);

switch ( comm )

{

case 2 :

EnableTaskAccess( 0 ); // Закрыть доступ к компасу

my_dialog3 dlg3; // создаем объект класса дилогового окна

if (dlg3.DoModal()==IDOK) diam4=dlg3.ed1;

EnableTaskAccess( 1 ); // Открыть доступ к компасу

IDocument3DPtr Doc3d1( ksGet3dDocument(), false );

Doc3d1->Create( false, true );

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

Onpaths (part);

//Имя модели

part->SetName(_T("Штуцер.m3d"));

part->SetStandardComponent( true );

Doc3d1->SetFileName( _T( "d:\\штуцер.m3d" ) );

Doc3d1->UpdateDocumentParam();

Doc3d1->Save();

//Doc3d1->Close();

break;

}

Метод геометрического построения штуцера подробно прокомментирован в приведенном далее листинге.

// Построение модели по траектории

void Onpaths (IPartPtr & part )

{

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

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

if ( entitySketch1 )

{

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

// Интерфейс свойств эскиза

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

if ( sketchDefinition )

{ // Получим интерфейсы на плоскости

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

// Установка параметров эскиза

sketchDefinition->SetPlane( PlaneXOY ); // Установим плоскость XOY базовой для эскиза

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

entitySketch1->Create();

entitySketch1->SetHidden(false);

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

if ( sketchDefinition->BeginEdit() )

{

//////////////////////////////////

// подготавливаем изображение эскиза

Circle(0,0,diam4,1);

//////////////////////////////////////

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

sketchDefinition->EndEdit();

}

}

}

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

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

if ( entitySketch2 )

{

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

// Интерфейс свойств эскиза

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

if ( sketchDefinition )

{

// Получаем интерфейсы на плоскости

IEntityPtr PlaneXOZ( part->GetDefaultEntity( o3d_planeXOZ ), false );

sketchDefinition->SetPlane( PlaneXOZ ); // Установим плоскость XOZ базовой для эскиза

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

entitySketch2->Create();

entitySketch2->SetHidden(false);

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

if ( sketchDefinition->BeginEdit() )

{

//////////////////////////////////

// строим изображение эскиза

LineSeg(0,0,0,-200,1);

ArcBy3Points(0,-200,-7,-237,-30,-271,1);

LineSeg(-30,-271,-136,-377,1);

//////////////////////////////////////

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

sketchDefinition->EndEdit();

}

}

}

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

IEntityPtr Evolution (part->NewEntity( o3d_bossEvolution ),false);

if (Evolution)

{

IBossEvolutionDefinitionPtr EvolutionDef( IUnknownPtr(Evolution->GetDefinition(),false));

if (EvolutionDef)

{

// устанавливаем эскиз

EvolutionDef->SetSketch(entitySketch1);

// способ выдавливания

//Тип движения сечения по траектории.

//Значения свойства:

//0- образующая переносится параллельно самой себе,

//1- образующая при переносе сохраняет исходный угол с направляющей,

//2- плоскость образующей выставляется и сохраняется ортогональной направляющей.

EvolutionDef->SetSketchShiftType (2);

//тонкая стенка

EvolutionDef->SetThinParam(true,0,5,0);

// указатель на колекцию объектов - кривых

// для кинематического выдавливания

// добавляем объекты - трехмерные кривые или эскизы, содержащие кривую

IEntityCollectionPtr entityCollection (IUnknownPtr(EvolutionDef->PathPartArray(),false));

entityCollection->Add ( entitySketch2 );

Evolution->SetAdvancedColor( RGB (204,153,102), // Цвет

0.2, // Общий свет

0.8, // Диффузия

0.8, // Зеркальность

0.8, // Блеск

1, // Прозрачность

0.8 ); // Излучение

// создаем операцию...

Evolution->Create();

}

}

//Создаем плоскость под углом

IEntityPtr entityAnglePlane(part->NewEntity( o3d_planeAngle),false);

if (entityAnglePlane)

{

// интерфейс свойств плоскости под углом к другой плоскости

IPlaneAngleDefinitionPtr planeAngleDef ( IUnknownPtr(entityAnglePlane->GetDefinition(),false));

if (planeAngleDef)

{

planeAngleDef->SetAngle (135); // угол наклона к базовой плоскости

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

IEntityPtr axisOY( part->GetDefaultEntity( o3d_axisOY ), false );

planeAngleDef->SetPlane(PlaneXOY); // базовая плоскость

planeAngleDef->SetAxis( axisOY ); // базовая ось

entityAnglePlane->Create(); // создать плоскость под углом

}

}

// Создадим смещенную плоскость ( для создания на ней эскиза )

IEntityPtr entityPlaneOffset( part->NewEntity( o3d_planeOffset ), false );

if(entityPlaneOffset)

{

// Интерфейс свойств смещенной плоскости

IPlaneOffsetDefinitionPtr planeOffsetDef( IUnknownPtr( entityPlaneOffset->GetDefinition(), false ) );

if ( planeOffsetDef )

{

// Установка параметров смещенной плоскости

planeOffsetDef->SetOffset(362.745779);

planeOffsetDef->SetPlane( entityAnglePlane );

planeOffsetDef->SetDirection( false ); // Направление смещения от базовой плоскости ( TRUE - прямое направление, FALSE - обратное направление )

entityPlaneOffset->SetName( _bstr_t( _T("Вспомогательная плоскость №1") ) ); // Имя для смещенной плоскости

entityPlaneOffset->SetHidden( true ); // Скрыть смещенную плоскость

// Создать смещенную плоскость

entityPlaneOffset->Create();

}

}

// Создаем новый эскиз (эскиз 3)

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

if (entitySketch3)

{

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

if (sketchDefinition)

{

// указываем плоскость,

// на которой строится эскиз

sketchDefinition->SetPlane(entityPlaneOffset);

entitySketch3->Create();

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

if ( sketchDefinition->BeginEdit() )

{

// Введем новый эскиз

Circle(-170.415,0,diam4+1,1);

Circle(-170.415,0,diam4+8,1);

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

sketchDefinition->EndEdit();

}

}

}

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

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

if ( entityExtrusion )

{

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

if ( ExtrusionDef )

{

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

ExtrusionDef->SetDirectionType( dtNormal );

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

ExtrusionDef->SetSideParam( true, etBlind,100, 5, false );

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

ExtrusionDef->SetThinParam( false, 0, 0, 0 ); // тонкая стенка отсутствует

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

ExtrusionDef->SetSketch( entitySketch3 );

entityExtrusion->SetAdvancedColor( RGB (204,153,51), // Цвет

0.2, // Общий свет

0.8, // Диффузия

0.8, // Зеркальность

0.8, // Блеск

1, // Прозрачность

0.8 ); // Излучение

// создать операцию

entityExtrusion->Create();

}

}

// Создаем эскиз (эскиз 4)

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

if (entitySketch4)

{

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

if (sketchDefinition)

{

// устанавливаем плоскость,

// на которой создается эскиз

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

sketchDefinition->SetPlane(PlaneXOY);

entitySketch4->Create();

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

if ( sketchDefinition->BeginEdit() )

{

// Проектируем новый эскиз из примитивов

Circle(0, 0, diam4, 1);

Circle(0, 0, diam4+2, 1);

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

sketchDefinition->EndEdit();

}

}

}

// Производим вырез выдавливанием

IEntityPtr CutExtrusion1( part->NewEntity( o3d_cutExtrusion ), false );

if ( CutExtrusion1 )

{

// Интерфейс параметров вырезанного элемента выдавливания

ICutExtrusionDefinitionPtr cutExtrusionDefinition( IUnknownPtr( CutExtrusion1->GetDefinition(), false ) );

if ( cutExtrusionDefinition )

{

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

cutExtrusionDefinition->SetDirectionType( dtReverse );

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

cutExtrusionDefinition->SetSideParam( false,etBlind,120,0,false );

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

cutExtrusionDefinition->SetSketch( entitySketch4 ); // Эскиз операции выдавливания

CutExtrusion1->SetAdvancedColor( RGB (204,102,0), // Цвет

0.2, // Общий свет

0.8, // Диффузия

0.8, // Зеркальность

0.8, // Блеск

1, // Прозрачность

0.8 ); // Излучение

CutExtrusion1->Create();

}

}

// Создаем эскиз (эскиз 5)

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

if (entitySketch5)

{

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

if (sketchDefinition)

{

// устанавливаем плоскость,

// на которой создается эскиз

sketchDefinition->SetPlane(entityPlaneOffset);

entitySketch5->Create();

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

if ( sketchDefinition->BeginEdit() )

{

// Введем новый эскиз

Circle(-170.415, 0, diam4, 1);

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

sketchDefinition->EndEdit();

}

}

}

// Производим вырез выдавливанием

IEntityPtr CutExtrusion2( part->NewEntity( o3d_cutExtrusion ), false );

if ( CutExtrusion2 )

{

// Интерфейс параметров вырезанного элемента выдавливания

ICutExtrusionDefinitionPtr cutExtrusionDefinition( IUnknownPtr( CutExtrusion2->GetDefinition(), false ) );

if ( cutExtrusionDefinition )

{

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

cutExtrusionDefinition->SetDirectionType( dtReverse );

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

cutExtrusionDefinition->SetSideParam( false,etBlind,120,0,false );

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

cutExtrusionDefinition->SetSketch( entitySketch5 ); // Эскиз операции выдавливания

CutExtrusion2->SetAdvancedColor( RGB (204,102,51), // Цвет

0.2, // Общий свет

0.8, // Диффузия

0.8, // Зеркальность

0.8, // Блеск

1, // Прозрачность

0.8 ); // Излучение

// Производим вырез выдавливанием

CutExtrusion2->Create();

}

}

}

Выполнение функции приведет к построению модели, которая приведена на рисунке 54. Для того, чтобы проследить последовательность выполнения операций в дереве моделей, в библиотеке был отключен метод построения обекта как стандартный компонент.

Рис. 54. Программная реализация построения модели ”штуцер”

Код, выполняющий аналогичные операции, выполненный на языке Object Pascal в среде Borland Delphi 7.0 представлен далее.

procedure PartPaint (var d:real);

var

iKompasObject: KompasObject;

iDocument3D: ksDocument3D;

doc: ksDocument2D;

iPart:ksPart;

PlaneXOY: ksEntity;

PlaneXOZ: ksEntity;

iSketchEntity: ksEntity;

iSketchDef: ksSketchDefinition;

iSketch1Entity: ksEntity;

iSketch1Def: ksSketchDefinition;

iSketch2Entity: ksEntity;

iSketch2Def: ksSketchDefinition;

Evolution: ksEntity;

iBossEvolutionDef: ksBossEvolutionDefinition;

Collect: ksEntityCollection;

iOffsetPlaneEntity: ksEntity;

iOffsetPlaneDef : ksPlaneOffsetDefinition;

iBaseExtrusionEntity: ksEntity;

iBaseExtrusionDef: ksBaseExtrusionDefinition;

entityAnglePlane : ksEntity;

planeAngleDef : ksPlaneAngleDefinition;

axisOY: ksEntity;

iSketch4Entity: ksEntity;

iSketch4Def: ksSketchDefinition;

iCutExtrusion:ksEntity;

iCutExtrusionDef : ksCutExtrusionDefinition;

iSketch5Entity: ksEntity;

iSketch5Def: ksSketchDefinition;

iCutExtrusion1:ksEntity;

iCutExtrusionDef1 : ksCutExtrusionDefinition;

ColorParam : ksColorParam;

Begin

iKompasObject := KompasObject(CreateKompasObject);

if iKompasObject <> nil then

begin

iDocument3D := ksDocument3D(iKompasObject.Document3D);

if idocument3d.Create(false,true) then

begin

if (iDocument3D <> nil) then

begin

// получаем указатель на интерфейс детали

iPart := ksPart(iDocument3D.GetPart(pNew_Part));

if (iPart <> nil) then

begin

// интерфейс плоскости

PlaneXOY := ksEntity(iPart.GetDefaultEntity(o3d_planeXOY));

PlaneXOZ := ksEntity(iPart.GetDefaultEntity(o3d_planeXOZ));

axisOY := ksEntity(iPart.GetDefaultEntity(o3d_axisOY));

// интерфейс эскиза (эскиз 1)

iSketchEntity := ksEntity(iPart.NewEntity(o3d_sketch));

if (iSketchEntity <> nil) then

begin

// интерфейс параметров эскиза

iSketchDef := ksSketchDefinition(iSketchEntity.GetDefinition);

if (iSketchDef <> nil) then

begin

if (PlaneXOY <> nil) then

begin

// устанавливаем плоскость,

// на которой создается эскиз

iSketchDef.SetPlane(PlaneXOY);

iSketchEntity.Create;

// doc - указатель на интерфейс ksDocument2D

doc := ksDocument2D(iSketchDef.BeginEdit);

if (doc <> nil) then

begin

// вычерчиваем изображение эскиза

// с помощью методов интерфейса ksDocument2D

doc.ksCircle(0,0,d,1);

end;

// завершение редактирования эскиза

iSketchDef.EndEdit;

end;

end;

end;

// интерфейс эскиза (эскиз 2)

iSketch1Entity := ksEntity(iPart.NewEntity(o3d_sketch));

if (iSketch1Entity <> nil) then

begin

// интерфейс параметров эскиза

iSketch1Def := ksSketchDefinition(iSketch1Entity.GetDefinition);

if (iSketch1Def <> nil) then

begin

if (PlaneXOZ <> nil) then

begin

// устанавливаем плоскость,

// на которой создается эскиз

iSketch1Def.SetPlane(PlaneXOZ);

iSketch1Entity.Create;

// doc - указатель на интерфейс ksDocument2D

doc := ksDocument2D(iSketch1Def.BeginEdit);

if (doc <> nil) then

begin

// вычерчиваем изображение эскиза

// с помощью методов интерфейса ksDocument2D

doc.ksLineSeg(0,0,0,-200,1);

doc.ksArcBy3Points(0,-200,-7,-237,-30,-271,1);

doc.ksLineSeg(-30,-271,-136,-377,1);

end;

// завершение редактирования эскиза

iSketch1Def.EndEdit;

end;

end;

end;

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

Evolution := ksEntity(iPart.NewEntity( o3d_bossEvolution ));

if Evolution <> nil then

begin

// получаем definition интерфейса

iBossEvolutionDef := ksBossEvolutionDefinition(Evolution.GetDefinition);

if iBossEvolutionDef <> nil then

begin

// устанавливаем эскиз

iBossEvolutionDef.SetSketch(iSketchEntity);

// способ выдавливания

iBossEvolutionDef.sketchShiftType := 2;

//тонкая стенка

iBossEvolutionDef.SetThinParam(true,0,5,0);

// указатель на колекцию объектов - кривых

// для кинематического выдавливания

Collect := ksEntityCollection(iBossEvolutionDef.PathPartArray);

// добавляем объекты - трехмерные кривые

// или эскизы, содержащие кривую

Collect.Add(iSketch1Entity);

// создаем операцию...

Evolution.Create;

end;

end;

//создаем поскость под углом

entityAnglePlane := ksEntity( ipart.NewEntity(o3d_planeAngle) );

if ( entityAnglePlane <> nil ) then

begin

// интерфейс свойств плоскости под углом к другой плоскости

planeAngleDef := ksPlaneAngleDefinition( entityAnglePlane.GetDefinition );

if ( planeAngleDef <> nil ) then

begin

planeAngleDef.Angle := 135;

// угол наклона к базовой плоскости

planeAngleDef.SetPlane(PlaneXOY);

// базовая плоскость

planeAngleDef.SetAxis( axisOY );

// базовая ось

entityAnglePlane.Create;

// создать плоскость под углом

end;

end;

// интерфейс смещенной плоскости

iOffsetPlaneEntity := ksEntity(iPart.NewEntity(o3d_planeOffset));

if (iOffsetPlaneEntity <> nil) then

begin

// величина, базовая плоскость и другие параметры смещения

iOffsetPlaneDef.Offset :=362.745779;

iOffsetPlaneDef.SetPlane(entityAnglePlane);

iOffsetPlaneDef.direction := false;

// делаем плоскость скрытой

iOffsetPlaneEntity.Hidden := false;

// создаем вспомогательную плоскость

iOffsetPlaneEntity.Create;

end;

end;

// интерфейс эскиза (эскиз 3)

iSketch2Entity := ksEntity(iPart.NewEntity(o3d_sketch));

if (iSketch2Entity <> nil) then

begin

// интерфейс параметров эскиза

iSketch2Def := ksSketchDefinition(iSketch2Entity.GetDefinition);

if (iSketch2Def <> nil) then

begin

if (iOffsetPlaneEntity <> nil) then

begin

// устанавливаем плоскость,

// на которой создается эскиз

iSketch2Def.SetPlane(iOffsetPlaneEntity);

iSketch2Entity.Create;

// doc - указатель на интерфейс ksDocument2D

doc := ksDocument2D(iSketch2Def.BeginEdit);

if (doc <> nil) then

begin

// вычерчиваем изображение эскиза

// с помощью методов интерфейса ksDocument2D

doc.ksCircle(-170.415,0,d+1,1);

doc.ksCircle(-170.415,0,D+8,1);

end;

// завершение редактирования эскиза

iSketch2Def.EndEdit;

end;

end;

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

iBaseExtrusionEntity :=

ksEntity(iPart.NewEntity( o3d_baseExtrusion ));

if iBaseExtrusionEntity <> nil then

begin

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

iBaseExtrusionDef := ksBaseExtrusionDefinition

(iBaseExtrusionEntity.GetDefinition);

if iBaseExtrusionDef <> nil then

begin

iBaseExtrusionDef.DirectionType := dtNormal;

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

iBaseExtrusionDef.SetSideParam( true{прямое направление}, etBlind{строго на глубину}, 100, 5, false );

iBaseExtrusionDef.SetThinParam( false, 0, 0, 0 );

// тонкая стенка отсутствует

iBaseExtrusionDef.SetSketch( iSketch2Entity );

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

iBaseExtrusionEntity.Create; // создать операцию

end; end;

// интерфейс эскиза (эскиз 4)

iSketch4Entity := ksEntity(iPart.NewEntity(o3d_sketch));

if (iSketch4Entity <> nil) then

begin

// интерфейс параметров эскиза

iSketch4Def := ksSketchDefinition(iSketch4Entity.GetDefinition);

if (iSketch4Def <> nil) then

begin

if (PlaneXOY <> nil) then

begin

// устанавливаем плоскость,

// на которой создается эскиз

iSketch4Def.SetPlane(PlaneXOY);

iSketch4Entity.Create;

// doc - указатель на интерфейс ksDocument2D

doc := ksDocument2D(iSketch4Def.BeginEdit);

if (doc <> nil) then

begin

// вычерчиваем изображение эскиза

// с помощью методов интерфейса ksDocument2D

doc.ksCircle(0, 0, d, 1);

doc.ksCircle(0, 0, d+2, 1);

end;

// завершение редактирования эскиза

iSketch4Def.EndEdit;

end;

end;

end;

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

iCutExtrusion := ksEntity(iPart.NewEntity(o3d_cutExtrusion));

if (iCutExtrusion <> nil) then

begin

// интерфейс параметров dвыдавливание

iCutExtrusionDef :=

ksCutExtrusionDefinition(iCutExtrusion.GetDefinition);

if (iCutExtrusionDef <> nil) then

begin

// настройка параметров

iCutExtrusionDef.SetSketch(iSketch4Entity);

// направление

iCutExtrusionDef.directionType := dtReverse;

// величина выдавливания

iCutExtrusionDef.SetSideParam

(false, etBlind, 120, 0, false);

// создаем вырез

iCutExtrusion.Create;

end;

end;

// интерфейс эскиза (эскиз 5)

iSketch5Entity := ksEntity(iPart.NewEntity(o3d_sketch));

if (iSketch5Entity <> nil) then

begin

// интерфейс параметров эскиза

iSketch5Def := ksSketchDefinition(iSketch5Entity.GetDefinition);

if (iSketch5Def <> nil) then

begin

if (iOffsetPlaneEntity <> nil) then

begin

// устанавливаем плоскость,

// на которой создается эскиз

iSketch5Def.SetPlane(iOffsetPlaneEntity);

iSketch5Entity.Create;

// doc - указатель на интерфейс ksDocument2D

doc := ksDocument2D(iSketch5Def.BeginEdit);

if (doc <> nil) then

begin

// вычерчиваем изображение эскиза

// с помощью методов интерфейса ksDocument2D

doc.ksCircle(-170.415, 0, d, 1);

end;

// завершение редактирования эскиза

iSketch5Def.EndEdit;

end;

end;

end;

end;

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

iCutExtrusion1 := ksEntity(iPart.NewEntity(o3d_cutExtrusion));

if (iCutExtrusion1 <> nil) then

begin

// интерфейс параметров dвыдавливание

iCutExtrusionDef1 :=

ksCutExtrusionDefinition(iCutExtrusion1.GetDefinition);

if (iCutExtrusionDef1 <> nil) then

begin

// настройка параметров

iCutExtrusionDef1.SetSketch(iSketch5Entity);

// направление

iCutExtrusionDef1.directionType := dtReverse;

// величина выдавливания

iCutExtrusionDef1.SetSideParam

(false, etBlind, 120, 0, false);

// создаем вырез

iCutExtrusion1.Create;

end;

end;

//установим собственный цвет для детали

iPart.useColor:=0;

//создаем переменную параметров цвета детали

ColorParam:=ksColorParam(iPart.ColorParam);

//задаем цет

ColorParam.color:=$00788845;

//задаем параметры цвета детали

iPart.SetAdvancedColor(ColorParam.color,ColorParam.ambient,

ColorParam.diffuse,ColorParam.specularity,ColorParam.shininess,

ColorParam.transparency,ColorParam.emission);

//обновляем деталь

iPart.Update;

//сохранение файла

If iDocument3D.IsDetail then

begin

iDocument3D.fileName:='c:\shtuc.m3d';

iDocument3D.UpdateDocumentParam;

iDocument3D.Save;

end;

//от детали и выше

end;

end;

end;

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

var

d:real;

begin

d:=TrackBar1.Position-2;

PartPaint(d);

end;

procedure TForm1.TrackBar1Change(Sender: TObject);

begin

Edit1.Text:=IntToStr(TrackBar1.Position);

end;

end.

IDD_DIALOG4 DIALOGEX 0, 0, 374, 198

STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION

CAPTION "Определение параметров детали (Трубка гофрированная)"

FONT 8, "MS Sans Serif"

BEGIN

DEFPUSHBUTTON "Построить",IDOK,155,176,65,14

GROUPBOX "Размерные характеристики",IDC_STATIC,7,7,360,166

GROUPBOX "Вид модели",IDC_STATIC,284,15,77,153

CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH |

TBS_NOTICKS | WS_TABSTOP,13,46,266,15

CONTROL "Slider2",IDC_SLIDER2,"msctls_trackbar32",TBS_BOTH |

TBS_NOTICKS | WS_TABSTOP,13,92,266,15

CONTROL "Slider3",IDC_SLIDER3,"msctls_trackbar32",TBS_BOTH |

TBS_NOTICKS | WS_TABSTOP,13,138,266,15

LTEXT "Диаметр наружной гладкой части трубки, мм",IDC_STATIC,

36,28,156,8

LTEXT "Длина гладкой части трубки (на одну сторону), мм",

IDC_STATIC,36,75,172,8

LTEXT "Число сегментов гофрированной трубки, шт",IDC_STATIC,36, 122,152,8

EDITTEXT IDC_EDIT1,211,24,40,14,ES_CENTER | ES_AUTOHSCROLL |

WS_DISABLED

EDITTEXT IDC_EDIT2,211,72,40,14,ES_CENTER | ES_AUTOHSCROLL |

WS_DISABLED

EDITTEXT IDC_EDIT3,211,117,40,14,ES_CENTER | ES_AUTOHSCROLL |

WS_DISABLED

CONTROL 7021,IDC_STATIC,"Static",SS_BITMAP,288,22,68,142,

WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE |

WS_EX_STATICEDGE

END

Проектирование гофрированной трубки не отличается от рассмотренных ранее моделях: интерфейсная часть преставлена диалоговым окном, реализована классом, похожим на предыдущие классы проектирования моделей штуцера и насадки. Фрагмент ресурсного файла представлен на листинге:

IDD_DIALOG4 DIALOGEX 0, 0, 374, 198

STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION

CAPTION "Определение параметров детали (Трубка гофрированная)"

FONT 8, "MS Sans Serif"

BEGIN

DEFPUSHBUTTON "Построить",IDOK,155,176,65,14

GROUPBOX "Размерные характеристики",IDC_STATIC,7,7,360,166

GROUPBOX "Вид модели",IDC_STATIC,284,15,77,153

CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH |

TBS_NOTICKS | WS_TABSTOP,13,46,266,15

CONTROL "Slider2",IDC_SLIDER2,"msctls_trackbar32",TBS_BOTH |

TBS_NOTICKS | WS_TABSTOP,13,92,266,15

CONTROL "Slider3",IDC_SLIDER3,"msctls_trackbar32",TBS_BOTH |

TBS_NOTICKS | WS_TABSTOP,13,138,266,15

LTEXT "Диаметр наружной гладкой части трубки, мм",IDC_STATIC,

36,28,156,8

LTEXT "Длина гладкой части трубки (на одну сторону), мм",

IDC_STATIC,36,75,172,8

LTEXT "Число сегментов гофрированной трубки, шт",IDC_STATIC,36,

122,152,8

EDITTEXT IDC_EDIT1,211,24,40,14,ES_CENTER | ES_AUTOHSCROLL |

WS_DISABLED

EDITTEXT IDC_EDIT2,211,72,40,14,ES_CENTER | ES_AUTOHSCROLL |

WS_DISABLED

EDITTEXT IDC_EDIT3,211,117,40,14,ES_CENTER | ES_AUTOHSCROLL |

WS_DISABLED

CONTROL 7021,IDC_STATIC,"Static",SS_BITMAP,288,22,68,142,

WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE |

WS_EX_STATICEDGE

END

В спроектированном интерфейсе предусмотрено три управляющих параметра, которые будут востребованы в функции геометрического моделирования объекта: диаметр наружной части, не содержащий гофры, длина части трубки, не содержащей гофры и число сегментов, представляющих собой некоторый рельеф волновой поверхности. На рисунке 55 показан диалог и изменяемыми параметрами, выполняемый в среде Компаc3D V12.

Рис. 55. Диалоговое окно для определения параметра модели “трубки гофрированной”

Фрагмент кода для трубки в прикладной библиотеке, где производится вызов диалогового окна, передача параметров в функцию проектирования, создание модели и записи результатов, выглядит следующим образом:

//Для задания параметров трубки гофрированной

//Внутренний диаметр

int diam5;

//Длина модели

int hi2;

//Число узлов

int pos2;

void Rotate (IPartPtr& part);

switch ( comm )

{

case 3:

{

EnableTaskAccess( 0 ); // Закрыть доступ к компасу

my_dialog4 dlg4; // создаем объект класса диалогового окна

if (dlg4.DoModal()==IDOK)

{ diam5=dlg4.ed1;

hi2=dlg4.ed2;

pos2=dlg4.ed3;

}

EnableTaskAccess( 1 ); // Открыть доступ к компасу

IDocument3DPtr Doc3d1( ksGet3dDocument(), false );

Doc3d1->Create( false, true );

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

Rotate (part);

//Имя модели

part->SetName(_T("Трубка.m3d"));

part->SetStandardComponent( true );

Doc3d1->SetFileName( _T( "d:\\трубка.m3d" ) );

Doc3d1->UpdateDocumentParam();

Doc3d1->Save();

//Doc3d1->Close();

break; //прекратить построение модели

}

}

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

void Rotate( IPartPtr & part )

{

//промежуточные переменные для построения эскиза: длины (l), диаметра (d) и кол-ва секций (k)

int k=pos2;

int l=hi2;

int d=diam5;

double n;

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

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

if ( entitySketch )

{

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

// Интерфейс свойств эскиза

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

if ( sketchDefinition )

{

// Получаем интерфейс плоскости

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

// Установка параметров эскиза

sketchDefinition->SetPlane( basePlane ); // Установим плоскость базовой для эскиза

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

entitySketch->Create();

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

if ( sketchDefinition->BeginEdit() )

{

// строим изображение эскиза

for (int i=1;i<=k;i++)

{

n=i*-6.5-l;

ArcByPoint(d,2.5+n,2.5,d,0+n,d,5+n,1,1);

ArcByPoint(d-3,2.5+n,2.5,d-3,0+n,d-3,5+n,1,1);

LineSeg(d,n+5,d,n+6.5,1);

LineSeg(d-3,n+5,d-3,n+6.5,1);

}

LineSeg(d-3,n,d-3,n-l,1);

LineSeg(d-3,0,d-3,-l,1);

LineSeg(d-3,n-l,d,n-l,1);

LineSeg(d,n-l,d,n,1);

LineSeg(d-3,0,d,0,1);

LineSeg(d,0,d,-l,1);

LineSeg(0,0,0,100,3);

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

sketchDefinition->EndEdit();

}

// Операции вращения

IEntityPtr entityRotate( part->NewEntity( o3d_baseRotated ), false );

if ( entityRotate )

{

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

IBaseRotatedDefinitionPtr baseRotatedDefinition( IUnknownPtr( entityRotate->GetDefinition(), false/*AddRef*/ ) );

if ( baseRotatedDefinition )

{

baseRotatedDefinition->SetToroidShapeType( false );

//baseRotatedDefinition->SetDirectionType( dtBoth );

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

baseRotatedDefinition->SetThinParam(false, dtNormal, 1, 1);

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

baseRotatedDefinition->SetSideParam(true, 360);

baseRotatedDefinition->SetSketch( entitySketch );

// Создать операцию

entityRotate->SetAdvancedColor( RGB (102,102,51), // Цвет

0.2, // Общий свет

0.8, // Диффузия

0.8, // Зеркальность

0.8, // Блеск

1, // Прозрачность

0.8 ); // Излучение

entityRotate->Create();

}

}

}

}

//интерфейс фаски №1

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

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

if ((bool)entityCollection1 &&

entityCollection1->SelectByPoint( d, 0, -1*(n-l) ) &&

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

entityCollection1->GetCount() )

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

{

//Фаска

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

if ( entityChamfer )

{

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

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

if ( chamferDefinition )

{

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

chamferDefinition->SetTangent( false );

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

chamferDefinition->SetChamferParam( false,

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

2,

// Размер первого катета фаски

2 );

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

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

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

if ( arrayChamferDefinition )

{

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

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

{

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

arrayChamferDefinition->Add( ePtr );

}

entityChamfer->SetAdvancedColor( RGB (255,102,51), // Цвет

0.2, // Общий свет

0.8, // Диффузия

0.8, // Зеркальность

0.8, // Блеск

1, // Прозрачность

0.8 ); // Излучение

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

entityChamfer->Create();

}

}

}

}

//интерфейс фаски №2

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

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

if ( (bool)entityCollection2 &&

entityCollection2->SelectByPoint( d, 0, 0 ) &&

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

entityCollection2->GetCount() )

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

{

// Фаска

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

if ( entityChamfer )

{

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

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

if ( chamferDefinition )

{

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

chamferDefinition->SetTangent( false );

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

chamferDefinition->SetChamferParam( false,

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

2,

// Размер первого катета фаски

2);

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

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->SetAdvancedColor( RGB (255,102,51), // Цвет

0.2, // Общий свет

0.8, // Диффузия

0.8, // Зеркальность

0.8, // Блеск

1, // Прозрачность

0.8 ); // Излучение

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

entityChamfer->Create();

}

}

}

}

}

Соответствующий код на Object Pascal представлен в следующем листинге:

procedure PartPaint(var d:real {диаметр внешний}; l:real {длина гладкой части}; k:integer {количество звеньев гофры});

var

iKompasObject: KompasObject;

iDocument3D: ksDocument3D;

doc: ksDocument2D;

iPart:ksPart;

PlaneXOZ: ksEntity;

iSketchEntity: ksEntity;

iSketchDef: ksSketchDefinition;

i:integer;

n:real;

iBaseRotatedEntity: ksEntity;

iBaseRotatedDef : ksBaseRotatedDefinition;

iEntityCollection : ksEntityCollection;

iChamferEntity : ksEntity;

iEntityArray : ksEntityCollection;

iChamferDef : ksChamferDefinition;

Begin

iKompasObject := KompasObject(CreateKompasObject);

if iKompasObject <> nil then

begin

iDocument3D := ksDocument3D(iKompasObject.Document3D);

if idocument3d.Create(false,true) then

begin

if (iDocument3D <> nil) then

begin

// получаем указатель на интерфейс детали

iPart := ksPart(iDocument3D.GetPart(pNew_Part));

if (iPart <> nil) then

begin

// интерфейс плоскости

PlaneXOZ := ksEntity(iPart.GetDefaultEntity(o3d_planeXOZ));

// интерфейс эскиза (эскиз 1)

iSketchEntity := ksEntity(iPart.NewEntity(o3d_sketch));

if (iSketchEntity <> nil) then

begin

// интерфейс параметров эскиза

iSketchDef := ksSketchDefinition(iSketchEntity.GetDefinition);

if (iSketchDef <> nil) then

begin

if (PlaneXOZ <> nil) then

begin

// устанавливаем плоскость,

// на которой создается эскиз

iSketchDef.SetPlane(PlaneXOZ);

iSketchEntity.Create;

// doc - указатель на интерфейс ksDocument2D

doc := ksDocument2D(iSketchDef.BeginEdit);

if (doc <> nil) then

begin

// вычерчиваем изображение эскиза

// с помощью методов интерфейса ksDocument2D

for i:=1 to k do

begin

n:=i*-6.5-l;

doc.ksArcByPoint(d,2.5+n,2.5,d,0+n,d,5+n,1,1);

doc.ksArcByPoint(d-3,2.5+n,2.5,d-3,0+n,d-3,5+n,1,1);

doc.ksLineSeg(d,n+5,d,n+6.5,1);

doc.ksLineSeg(d-3,n+5,d-3,n+6.5,1);

end;

doc.ksLineSeg(d-3,n,d-3,n-l,1);

doc.ksLineSeg(d-3,0,d-3,-l,1);

doc.ksLineSeg(d-3,n-l,d,n-l,1);

doc.ksLineSeg(d,n-l,d,n,1);

doc.ksLineSeg(d-3,0,d,0,1);

doc.ksLineSeg(d,0,d,-l,1);

doc.ksLineSeg(0,0,0,100,3);

end;

// завершение редактирования эскиза

iSketchDef.EndEdit;

end;

end;

end;

// интерфейс базовой операции вращения

iBaseRotatedEntity := ksEntity(iPart.NewEntity(o3d_baseRotated));

if (iBaseRotatedEntity <> nil) then

begin

// интерфейс параметров вращения

iBaseRotatedDef :=

ksBaseRotatedDefinition(iBaseRotatedEntity.GetDefinition);

if (iBaseRotatedDef <> nil) then

begin

// настройка параметров вращения

iBaseRotatedDef.SetThinParam(false, dtNormal, 1, 1);

iBaseRotatedDef.SetSideParam(true, 360);

iBaseRotatedDef.toroidShapeType := false;

iBaseRotatedDef.SetSketch(iSketchEntity);

// создаем операцию вращения

iBaseRotatedEntity.Create;

end;

end;

//интерфейс фаски

iEntityCollection:=

ksEntityCollection(iPart.EntityCollection( o3d_edge ));

if (iEntityCollection <> nil) and

(iEntityCollection.SelectByPoint(d, 0, -1*(n-l))) and

(iEntityCollection.GetCount > 0 ) then

begin

iChamferEntity := ksEntity(iPart.NewEntity( o3d_chamfer ));

if iChamferEntity <> nil then

begin

iChamferDef := ksChamferDefinition(iChamferEntity.GetDefinition);

if iChamferDef <> nil then

begin

iChamferDef.Tangent := false;

iChamferDef.SetChamferParam( false, 2, 2);

iEntityArray:= ksEntityCollection( iChamferDef.Array_ ); // динамический массив объектов

if iEntityArray <> nil then

begin

iEntityArray.Add( iEntityCollection.GetByIndex(0) );

iChamferEntity.Create;

end;

end;

end;

end;

//интерфейс фаски 2

iEntityCollection:=

ksEntityCollection(iPart.EntityCollection( o3d_edge ));

if (iEntityCollection <> nil) and

(iEntityCollection.SelectByPoint(d, 0, 0)) and

(iEntityCollection.GetCount > 0 ) then

begin

iChamferEntity := ksEntity(iPart.NewEntity( o3d_chamfer ));

if iChamferEntity <> nil then

begin

iChamferDef := ksChamferDefinition(iChamferEntity.GetDefinition);

if iChamferDef <> nil then

begin

iChamferDef.Tangent := false;

iChamferDef.SetChamferParam( false, 2, 2);

iEntityArray:= ksEntityCollection( iChamferDef.Array_ ); // динамический массив объектов

if iEntityArray <> nil then

begin

iEntityArray.Add( iEntityCollection.GetByIndex(0) );

iChamferEntity.Create;

end;

end;

end;

end;

//сохранение файла

If iDocument3D.IsDetail then

begin

iDocument3D.fileName:='c:\gofr.m3d';

iDocument3D.UpdateDocumentParam;

iDocument3D.Save;

end;

//от детали и выше

end;

end;

end;

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

var

d:real {диаметр внешний}; l:real {длина гладкой части}; k:integer {количество звеньев гофры};

begin

d:=TrackBar1.Position;

l:=TrackBar2.Position;;

k:=TrackBar3.Position;

PartPaint(d,l,k);

end;

procedure TForm1.TrackBar1Change(Sender: TObject);

begin

Edit1.Text:=IntToStr(TrackBar1.Position);

end;

procedure TForm1.TrackBar2Change(Sender: TObject);

begin

Edit2.Text:=IntToStr(TrackBar2.Position);

end;

procedure TForm1.TrackBar3Change(Sender: TObject);

begin

Edit3.Text:=IntToStr(TrackBar3.Position);

end;

end.

Выполнение функции приведет к построению модели, которая приведена на рисунке 56. Для того, чтобы проследить последовательность выполнения операций в дереве моделей, в библиотеке был отключен метод построения обекта как стандартный компонент.

Рис. 56. Программная реализация построения модели ”трубка гофрированная”

Сборочный узел содержит вышеперечисленные модели с управляемыми параметрами. Для получения требуемой реализации функции по построению геометрии рассмотренных моделей имеют входящие параметры, а интерфейсная часть для сборки имеет дополнительный элемент выбора, который отвечает за тип исполнения компонентов, реализованный посредствов выпадающего списка (имеет идентификатор IDC_COMBO1).

Фрагмент реализации рассматриваемого интерфейса содержится в ресурсном файле и выглядит следующим образом:

IDD_DIALOG5 DIALOGEX 0, 0, 293, 178

STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION

CAPTION "Сборочная модель"

FONT 8, "MS Sans Serif"

BEGIN

DEFPUSHBUTTON "Построить",IDOK,98,157,92,14

GROUPBOX "Размерные характеристики",IDC_STATIC,7,7,279,145

LTEXT "Диаметр трубопровода, мм",IDC_STATIC,20,37,95,8

EDITTEXT IDC_EDIT1,133,35,40,14,ES_CENTER | ES_AUTOHSCROLL |

WS_DISABLED

CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH |

TBS_NOTICKS | WS_TABSTOP,15,64,185,15

GROUPBOX "Вид модели",IDC_STATIC,202,14,80,128

LTEXT "Исполнение трубопровода",IDC_STATIC,20,93,91,8

COMBOBOX IDC_COMBO1,21,115,122,53,CBS_DROPDOWN | CBS_SORT |

WS_VSCROLL | WS_TABSTOP

CONTROL 7024,IDC_STATIC,"Static",SS_BITMAP,205,26,71,111,

WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE |

WS_EX_STATICEDGE

END

Диалоговое окно по управлению сборкой в системе Компас 3D представлено на рисунке 57.

Рис. 57. Диалог построения сборочного узла

Класс, содержащий компоненты интерфейса, представлен на листинге

#include "stdafx.h"

#include "my_dialog5.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

//Значение значение внутреннего диаметра

#define min1 30

#define max1 80

// my_dialog5 dialog

my_dialog5::my_dialog5(CWnd* pParent /*=NULL*/)

: CDialog(my_dialog5::IDD, pParent)

{}

void my_dialog5::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(my_dialog5)

DDX_Control(pDX, IDC_COMBO1, m_Variable);

DDX_Control(pDX, IDC_SLIDER1, mSlider1);

DDX_Text(pDX, IDC_EDIT1, ed1);

}

BEGIN_MESSAGE_MAP(my_dialog5, CDialog)

ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER1, OnCustomdrawSlider1)

END_MESSAGE_MAP()

// my_dialog5 message handlers

BOOL my_dialog5::OnInitDialog()

{

CDialog::OnInitDialog();

//Определеяем максимум и минимум бегунка №1 и устанавливаем значения

mSlider1.SetRangeMin(min1,TRUE);

mSlider1.SetRangeMax(max1,TRUE);

mSlider1.SetRange(min1, max1, TRUE);

//Построить в заданной конфигурации

m_Variable.AddString(_T("Исполнение №1"));

m_Variable.AddString(_T("Исполнение №2"));

m_Variable.AddString(_T("Исполнение №3"));

m_Variable.SetCurSel(0);

m_Variable.SetFocus();

return TRUE;

}

void my_dialog5::OnCustomdrawSlider1(NMHDR* pNMHDR, LRESULT* pResult)

{

BYTE i=mSlider1.GetPos(); // получить позицию

ed1=i;

edit1=(CEdit*)GetDlgItem(IDC_EDIT1);

UpdateData(FALSE);

*pResult = 0;

}

void my_dialog5::OnOK()

{

pos1=m_Variable.GetCurSel();

CDialog::OnOK();

}

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

#include "stdafx.h"

#include <afxdllx.h>

#include "resource.h"

#include "afxwin.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

//Глобальные переменные

double diam1;

double diam2;

int position;

//Для задания параметров насадки

//Внутренний диаметр

int diam3;

//Высота модели

int hi1;

//Номер исполнения

int pos1;

////////////////////////////////////////////////////////////

//Для задания параметров штуцера

//Внутренний диаметр

int diam4;

////////////////////////////////////////////////////////////

//Для задания параметров трубки гофрированной

//Внутренний диаметр

int diam5;

//Длина модели

int hi2;

//Число узлов

int pos2;

//Параметры для сборки

int diam_all;

int ispolnenie;

int k; //количество звеньев гофры

int l1; //расстояние между 1 и 2 дет.

int l2; //расстояние между 2 и 3 дет.

int d; //диаметр трубопровода в сборке

int d1; //диаметр насадки и штуцера

int h1; //высота насадки

int lg; //длина гладкой части гофры

double n;

// Описания используемых функций

void Part1Paint (int &d, int &h1);

void Part2Paint (int &d, int &lg,int &k);

void Part3Paint(int &d);

void Create3D (int &l1,int &l2);

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

void WINAPI LIBRARYENTRY( UINT comm )

{switch ( comm )

{

case 1 : {

EnableTaskAccess( 0 ); // Закрыть доступ к компасу

my_dialog5 dlg5; // создаем объект класса диалогового окна

if (dlg5.DoModal()==IDOK)

{ diam_all=dlg5.ed1;

ispolnenie=dlg5.pos1;

}

EnableTaskAccess( 1 ); // Открыть доступ к компасу

switch (ispolnenie)

{

case 0 :

{

lg=130;

k=50;

h1=300;

l1=210;

l2=675;

break;

}

case 1 :

{

lg=130;

k=70;

h1=335;

l1=260;

l2=840;

break;

}

case 2 :

{

lg=150;

k=100;

h1=360;

l1=252;

l2=1082;

break;

}

}

Part1Paint (diam_all,h1);

Part2Paint (diam_all, lg, k);

Part3Paint (diam_all);

Create3D (l1,l2);

break; //прекратить построение модели

}

}

}

//Функция построения сборочного узла

void Create3D (int &l1,int &l2)

{

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

IDocument3DPtr doc_assembly(ksGet3dDocument(), false);

doc_assembly->Create(false, false);

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

if ( doc_assembly)

{

// Имя файла Документа

doc_assembly->SetFileName(_T( "D:\\Sborka.a3d" ) );

// Обновить параметры Документа

doc_assembly->UpdateDocumentParam();

// Для каждой детали подготовим свой интерфейс

IPartPtr part1( doc_assembly->GetPart( pNew_Part ), false );

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

IPartPtr part3( doc_assembly->GetPart( pNew_Part ), false );

//вставляем насадку

//связываем добавляемую из файла деталь с файлом-источником

doc_assembly->SetPartFromFile(_T("D:\\nasadka.m3d"), part1, false);

//вводим переменную первой детали, задаем ее нулевым номером

part1->GetPart(0);

//запустить режим редактирования на месте для первой детали

part1->BeginEdit();

IPlacementPtr plac (part1->GetPlacement(), false );

//указываем координаты размещения насадки в сборке

plac->SetOrigin(0, 0, 0 );

//изменяем местоположение компонента, заданное предыдущей строкой

part1->UpdatePlacement();

//обновляем свойства компонента

part1->Update();

//заканчиваем редактирование на месте

part1->EndEdit(false);

//фиксируем положение компонента

part1->SetFixedComponent(true);

//добавляем гофрированную трубку

doc_assembly->SetPartFromFile(_T("D:\\gofr.m3d"), part2, false);

//вводим переменную первой детали, задаем ее нулевым номером

part2->GetPart(1);

//запустить режим редактирования на месте для первой детали

part2->BeginEdit();

IPlacementPtr plac2 (part2->GetPlacement(), false );

//указываем координаты размещения насадки в сборке

plac2->SetOrigin(0, 0, l1 );

//изменяем местоположение компонента, заданное предыдущей строкой

part2->UpdatePlacement();

//обновляем свойства компонента

part2->Update();

//заканчиваем редактирование на месте

part2->EndEdit(false);

//фиксируем положение компонента

part2->SetFixedComponent(true);

//добавляем штуцер

doc_assembly->SetPartFromFile(_T("D:\\shtuc.m3d"), part3, false);

//вводим переменную первой детали, задаем ее нулевым номером

part3->GetPart(2);

//запустить режим редактирования на месте для первой детали

part3->BeginEdit();

IPlacementPtr plac3 (part3->GetPlacement(), false );

//указываем координаты размещения насадки в сборке

plac3->SetOrigin(0, 0, l2 );

//изменяем местоположение компонента, заданное предыдущей строкой

part3->UpdatePlacement();

//обновляем свойства компонента

part3->Update();

//заканчиваем редактирование на месте

part3->EndEdit(false);

//фиксируем положение компонента

part3->SetFixedComponent(true);

//перестраиваем сборку

doc_assembly->RebuildDocument();

//сохранение полученной трехмерной модели

// Имя файла Документа

doc_assembly->SetFileName(_T( "d:\\Sborka.a3d" ) );

doc_assembly->UpdateDocumentParam();

doc_assembly->Save();

}

}

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

В последующем листинге приведен код создания аналогичной сборки в среде Borland Delphi.

//процедура создания 3Д сборки

procedure CreateA3D (var l1,l2:real);

var

iKompasObject: KompasObject;

iDocument3D: ksDocument3D;

iPart1 : ksPart;

iPart2 : ksPart;

iPart3 : ksPart;

iPart4 : ksPart;

iPart5 : ksPart;

plac : ksPlacement;

plac2 : ksPlacement;

plac3 : ksPlacement;

plac4 : ksPlacement;

plac5 : ksPlacement;

ColorParam:ksColorParam;

ColorParam2:ksColorParam;

begin

iKompasObject := KompasObject(CreateKompasObject);

if iKompasObject <> nil then

begin

iDocument3D := ksDocument3D(iKompasObject.Document3D);

if idocument3d.Create(false,false) then

begin

if (iDocument3D <> nil) then

begin

iDocument3D.fileName := 'Sborka.a3d';

// Имя файла Документа

iDocument3D.UpdateDocumentParam();

// Обновить параметры Документа

// для каждой детали подготовим свой интерфейс

iPart1 := ksPart(iDocument3D.GetPart(pNew_Part));

iPart2 := ksPart(iDocument3D.GetPart(pNew_Part));

iPart3 := ksPart(iDocument3D.GetPart(pNew_Part));

//вставляем насадку

//связываем добавляемую из файла деталь с файлом-источником

iDocument3D.SetPartFromFile('c:\nasadka.m3d',ipart1,false);

//вводим переменную первой детали, задаем ее нулевым номером

iPart1 := ksPart( iDocument3D.GetPart(0) );

//запустить режим редактирования на месте для первой детали

iPart1.BeginEdit;

//задаем переменную кординирования детали

plac := ksPlacement(ipart1.GetPlacement);

//указываем координаты размещения насадки в сборке

plac.SetOrigin(0, 0, 0 );

//изменяем местоположение компонента, заданное предыдущей строкой

iPart1.UpdatePlacement;

//обновляем свойства компонента

iPart1.Update;

//заканчиваем редактирование на месте

iPart1.EndEdit(False);

//фиксируем положение компонента

iPart1.fixedComponent:=true;

//добавляем гофрированную трубку

iDocument3D.SetPartFromFile('c:\gofr.m3d',ipart2,false);

iPart2 := ksPart( iDocument3D.GetPart(1) );

iPart2.BeginEdit;

plac2 := ksPlacement(ipart2.GetPlacement);

plac2.SetOrigin(0, 0, l1);

iPart2.UpdatePlacement;

iPart2.Update;

iPart2.EndEdit(False);

iPart2.fixedComponent:=true;

//задаем цвет вставляемой детали

iPart2:=ksPart(iDocument3D.GetPart(1));

iPart2.useColor:=0;

ColorParam2:=ksColorParam(iPart2.ColorParam);

ColorParam2.color:=$003521671;

iPart2.SetAdvancedColor(ColorParam2.color,ColorParam2.ambient,

ColorParam2.diffuse,ColorParam2.specularity,ColorParam2.shininess,

ColorParam2.transparency,ColorParam2.emission);

iPart2.Update;

//добавляем штуцер

iDocument3D.SetPartFromFile('c:\shtuc.m3d',ipart3,false);

iPart3 := ksPart( iDocument3D.GetPart(2) );

iPart3.BeginEdit;

plac3 := ksPlacement(ipart3.GetPlacement);

plac3.SetOrigin(0, 0, l2);

iPart3.UpdatePlacement;

iPart3.Update;

iPart3.EndEdit(False);

iPart3.fixedComponent:=true;

//перестраиваем сборку

IDocument3D.RebuildDocument;

//сохранение полученной трехмерной модели

iDocument3D.fileName:='c:\sborka.a3d';

iDocument3D.UpdateDocumentParam;

iDocument3D.Save;

end;

end;

end;

end;

Рис. 58. Сборочный узел, выполненный средствами Компас API