- •Введение
- •1. Создание проектов прикладных библиотек
- •2. Работа с графическими объектами на плоскости
- •2.1. Функции для работы с графическими документами
- •2.2. Функции построения составных объектов
- •2.3. Функции ввода параметров
- •3. Методы и их составляющие для проведения вспомогательных построений
- •3.1. Математические функции
- •3.2. Функции вычисления пересечений
- •3.3. Функции вычисления длин, расстояний, углов
- •4. Работа с базами данных
- •5. Примеры проектирования библиотек в 2d
- •5.1. Построение графиков функций
- •5.2. Построение фигур
- •5.3. Построение эскизов
- •6. Твердотельное моделирование объектов в компас 3d
- •6.1. Построение твердотельных деталей посредством операций вращения и выдавливания
- •Элементы системы координат
- •Элементы детали
- •Конструктивные элементы
- •Операции
- •6.2. Построение фасок и скруглений в твердотельных моделях прикладных библиотек
- •6.3. Построение объектов в цвете
- •6.4. Работа со сборками
- •6.5. Включение в сборочные узлы твердотельных моделей без истории построения
- •6.6. Построение сборочных узлов и компонентов с параметрами посредством диалога
- •7. Пример Разработки твердотельных моделей компонентов и Сборочного узла направляющего патрубка
- •Заключение
- •Библиографический список
- •Оглавление
- •3 94026 Воронеж, Московский просп., 14
6.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. Создание модели сборочного узла с учетом назначенных параметров для деталей в дереве построения |