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

6.5. Включение в сборочные узлы твердотельных моделей без истории построения

Значительный интерес представляют модели, в которых не показана структура построения отдельных компонентов, другими словами, нет возможности отредактировать или изменить значения элементов в дереве построения твердотельной модели.

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

//Создание детали №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"));

// Устанавливаем атрибут,отвечающий за стандартное изделие

part->SetStandardComponent( true );

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

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"));

// Устанавливаем атрибут,отвечающий за стандартное изделие

//part2->SetStandardComponent( true );

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

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

На рисунке 42 выполнено построение сборочного узла с имеющемся компонентом “без истории”. В дереве построения сборки видно,что элементу «Ось» присвоен статус стандартного изделия.

Рис. 42. Сборочные узлы c компонентами без истории

6.6. Построение сборочных узлов и компонентов с параметрами посредством диалога

Управление параметрами сборки, а также конфигурирование и указание ряда значений элементов, которые войдут в основу проектируемых деталей и узлов, дает возможность подготовить прикладные библиотеки, имеющие коммерческую ценность, и выполнить работу на профессиональном уровне. Однако разработка таких проектов трудоемка, так как требуются знания в области применения визуальных компонентов MFC (Microsoft Foundation Classes), компонентной модели работы с объектами- СОМ, API 2D и 3D прикладных библиотек компании АСКОН, понимание систем Win32 с концепцией проектирования динамических библиотек и многое другое.

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

//Файл my_dialog.cpp

#include "stdafx.h"

#include "my_dialog.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

// my_dialog dialog

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

: CDialog(my_dialog::IDD, pParent)

{

//{{AFX_DATA_INIT(my_dialog)

}

void my_dialog::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(my_dialog)

DDX_Text(pDX, IDC_EDIT1, m_diam_1);

DDX_Text(pDX, IDC_EDIT3, m_diam_2);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(my_dialog, CDialog)

//{{AFX_MSG_MAP(my_dialog)

ON_BN_CLICKED(IDC_BUTTON1, OnButton1)

ON_BN_CLICKED(IDC_RADIO1, OnRadio1)

ON_BN_CLICKED(IDC_RADIO2, OnRadio2)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

// my_dialog message handlers

//Инициализация диалога по расчету траекторий

BOOL my_dialog::OnInitDialog()

{//Начальные параметры

m_diam_1=5.0;

m_diam_2 = 10.0;

return TRUE;

}

void my_dialog::OnButton1()

{

UpdateData(TRUE);

ci=(CEdit*)GetDlgItem(IDC_EDIT1);

ci->SetReadOnly(FALSE);

ci=(CEdit*)GetDlgItem(IDC_EDIT3);

ci->SetReadOnly(FALSE);

m_ok=(CButton*)GetDlgItem(IDOK);

if ((m_diam_1>=5) &&(m_diam_1<=15)&&(m_diam_2>=5) &&(m_diam_2<=15))

{ m_ok->ShowWindow(TRUE);

UpdateData(FALSE);

}

else

{

m_ok->ShowWindow(FALSE);

UpdateData(FALSE);

::MessageBox(NULL,_T("Повторите ввод данных"),

_T("Предупреждение"),MB_ICONSTOP);

}

}

void my_dialog::OnRadio1()

{

CStatic *stat;

stat=(CStatic*)GetDlgItem(IDC_STATIC2);

stat->ShowWindow(FALSE);

stat=(CStatic*)GetDlgItem(IDC_STATIC1);

stat->ShowWindow(TRUE);

//Количество отверстий в исполнении №1

count=5;

}

void my_dialog::OnRadio2()

{

CStatic *stat;

stat=(CStatic*)GetDlgItem(IDC_STATIC1);

stat->ShowWindow(FALSE);

stat=(CStatic*)GetDlgItem(IDC_STATIC2);

stat->ShowWindow(TRUE);

//Количество отверстий в исполнении №2

count=4;

}

//Файл my_dialog.h : header file

#if !defined(AFX_MY_DIALOG_H__7ABAD451_47B4_44DD_95E5_A23BFB2FFA5B__INCLUDED_)

#define AFX_MY_DIALOG_H__7ABAD451_47B4_44DD_95E5_A23BFB2FFA5B__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include "resource.h"

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

// my_dialog dialog

class my_dialog : public CDialog

{

int a;

// Construction

public:

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

// Dialog Data

//{{AFX_DATA(my_dialog)

enum { IDD = IDD_DIALOG1 };

CButton *m_ok;

CEdit* ci;

double m_diam_1;

double m_diam_2;

int count;

//}}AFX_DATA

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(my_dialog)

public:

virtual BOOL OnInitDialog();

protected:

virtual void DoDataExchange(CDataExchange* pDX);

// DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

// Generated message map functions

//{{AFX_MSG(my_dialog)

afx_msg void OnButton1();

afx_msg void OnRadio1();

afx_msg void OnRadio2();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

//{{AFX_INSERT_LOCATION}}

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

#endif // !defined(AFX_MY_DIALOG_H__7ABAD451_47B4_44DD_95E5_A23BFB2FFA5B__INCLUDED_)

//Файл с ресурсами прикладной библиотеки resource.h

#define IDS_3DDOCERROR 1000

#define IDR_LIBID 3101

#define IDD_DIALOG1 7001

#define IDC_EDIT1 7007

#define IDC_EDIT2 7008

#define IDC_BUTTON1 7008

#define IDC_RADIO1 7009

#define IDC_RADIO2 7010

#define IDC_EDIT3 7011

#define IDB_BITMAP3 7012

#define IDC_STATIC1 7012

#define IDB_BITMAP4 7013

#define IDC_STATIC2 7013

// Next default values for new objects

#ifdef APSTUDIO_INVOKED

#ifndef APSTUDIO_READONLY_SYMBOLS

#define _APS_NEXT_RESOURCE_VALUE 7014

#define _APS_NEXT_COMMAND_VALUE 32771

#define _APS_NEXT_CONTROL_VALUE 7014

#define _APS_NEXT_SYMED_VALUE 7000

#endif

#endif

//Основной файл main.cpp

#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;

static AFX_EXTENSION_MODULE StepDLL = { NULL, NULL };

extern "C" int APIENTRY

DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved )

{

UNREFERENCED_PARAMETER( lpReserved );

if ( dwReason == DLL_PROCESS_ATTACH )

{

TRACE0( "DLL Initializing!" );

if ( !AfxInitExtensionModule( StepDLL, hInstance ) )

return 0;

new CDynLinkLibrary( StepDLL );

}

else if ( dwReason == DLL_PROCESS_DETACH )

{

TRACE0( "DLL Terminating!" );

AfxTermExtensionModule( StepDLL );

}

return 1;

}

//----------------------------------------------------------------

// Задать идентификатор ресурсов

// Ресурсы ( имя библиотеки, состав меню, слайд ) находятся в <res\step3d1.rc2> , идентификаторы в <step3d1.rh>

unsigned int WINAPI LIBRARYID()

{

return IDR_LIBID;

}

// Описания используемых функций

void Plate (IPartPtr& part);

void Staple (IPartPtr& part2);

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

void WINAPI LIBRARYENTRY( UINT comm )

{

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

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

if (dlg.DoModal()==IDOK )

{

diam1=dlg.m_diam_1;

diam2=dlg.m_diam_2;

position=(6-dlg.count);

}

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

IDocument3DPtr Doc3d( ksGet3dDocument(), false );

Doc3d->Create( false, true );

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

Plate (part);

part->SetName(_T("Пластина.m3d"));

part->SetStandardComponent( true );

Doc3d->SetFileName( _T( "D:\\Пластина.m3d" ) );

Doc3d->UpdateDocumentParam();

Doc3d->Save();

Doc3d->Close();

IDocument3DPtr Doc3d2( ksGet3dDocument(), false );

Doc3d2->Create( false, true );

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

Staple (part2);

Doc3d2->SetFileName( _T( "D:\\Скоба.m3d" ) );

part2->SetStandardComponent( true );

Doc3d2->UpdateDocumentParam();

Doc3d2->Save();

Doc3d2->Close();

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

IDocument3DPtr my_doc (ksGet3dDocument(), false);

my_doc->Create(false, false);

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

my_doc->SetFileName(_T( "D:\\Крепеж.a3d" ) );

my_doc->SetActive();

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

partPin1->SetName(_T("Пластина"));

my_doc->SetPartFromFile(_T("D:\\Пластина.m3d"), partPin1, false);

my_doc->SetActive();

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

partPin2->SetName(_T("Скоба"));

my_doc->SetPartFromFile(_T("D:\\Скоба.m3d"), partPin2, false);

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

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

my_doc->AddMateConstraint(mc_Distance,entity1,entity2, 1,1,10);

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

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

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

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

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

my_doc->AddMateConstraint(mc_Distance,entity5,entity6, -1,1,-100);

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

my_doc->UpdateDocumentParam();

my_doc->Save();

}

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

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

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

entitySketch->Create();

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

if ( sketchDefinition->BeginEdit() )

{

reference p;

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

Contour(1);

LineSeg(0,50,0,10,1);

LineSeg(0,10,10,0,1);

LineSeg(10,0,110,0,1);

LineSeg(110,0,120,10,1);

LineSeg(120,10,120,50,1);

LineSeg(120,50,0,50,1);

p = EndObj();

Circle(45,35,diam2/2,1);

Circle(75,35,diam2/2,1);

Circle(10,25,diam2/2,1);

Circle(110,25,diam2/2,1);

if (position==1)Circle(60,10,diam2/2,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,

10,

0,

false );

extrusionDefinition->SetSketch( entitySketch );

entityExtrusion->Create();

}}}}}

//Аналогично происходит построение твердотельной модели скобы

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

entitySketch->Create();

if ( sketchDefinition->BeginEdit() )

{

reference p;

Contour(1);

LineSeg( 0, 150, 15, 150, 1 );

LineSeg( 15, 150, 15, 15, 1 );

LineSeg( 15, 15, 65, 15, 1 );

LineSeg( 65, 15, 65, 150, 1 );

LineSeg( 65, 150, 80, 150, 1 );

LineSeg( 80, 150, 80, 5, 1 );

LineSeg( 80, 5, 75, 0, 1 );

LineSeg( 75, 0, 5, 0, 1 );

LineSeg( 5, 0, 0, 5, 1 );

LineSeg( 0, 5, 0, 150, 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,

30,

0,

false );

extrusionDefinition->SetSketch( entitySketch );

entityExtrusion->Create();

}

}

}

}

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

if ( entitySketch2 )

{

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

if ( sketchDefinition2 )

{

IEntityPtr basePlane2( part->GetDefaultEntity( o3d_planeYOZ), false );

sketchDefinition2->SetPlane( basePlane2 );

entitySketch2->Create();

if ( sketchDefinition2->BeginEdit() )

{

Circle(-15,-135,diam1/2,1);

sketchDefinition2->EndEdit();

}

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

if ( entityCutExtrusion )

{

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

if ( cutExtrusionDefinition )

{

cutExtrusionDefinition->SetDirectionType( dtNormal );

cutExtrusionDefinition->SetSideParam( true,

etThroughAll,

0,

0,

false );

cutExtrusionDefinition->SetThinParam( false,

0,

0,

0 );

cutExtrusionDefinition->SetSketch( entitySketch2 );

entityCutExtrusion->Create();

}}}}

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

if ( entitySketch3 )

{

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

if ( sketchDefinition3 )

{

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

sketchDefinition3->SetPlane( basePlane3 );

entitySketch3->Create();

if ( sketchDefinition3->BeginEdit() )

{

Circle(55,-15,diam2/2,1);

Circle(25,-15,diam2/2,1);

sketchDefinition3->EndEdit();

}

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

if ( entityCutExtrusion )

{

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

if ( cutExtrusionDefinition )

{

cutExtrusionDefinition->SetDirectionType( dtReverse );

cutExtrusionDefinition->SetSideParam( false,

etThroughAll,

0,

0,

false );

cutExtrusionDefinition->SetThinParam( false,

0,

0,

0);

cutExtrusionDefinition->SetSketch( entitySketch3 );

entityCutExtrusion->Create();

}}}}}

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

Рис. 43. Диалог для переопределения ряда значений

Рис. 44. Создание модели сборочного узла с учетом назначенных параметров для деталей в дереве построения