- •Введение
- •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
5. Примеры проектирования библиотек в 2d
Рассмотрим варианты и способы применения вышеперечисленных методов для решения практических задач при проектировании библиотек геометрического вывода на плоскости. Под поставленные задачи рассмотрен механизм решения, который состоит из одной или несколько функций. Для управления объектами введено понятие класса, что позволяет разграничить уровень доступа к данным и упростить проектирование прикладной библиотеки. Текст библиотеки содержит комментарии, позволяющие проследить и понять работу некоторых сервисных команд и инструкций, а также изучить особенности построения синтаксических возможностей языка С++. Для ряда расчетов потребуется подключение заголовка математической библиотеки <cmath>, а также стандартной библиотеки <cstdlib>. Некоторые константы определены отдельно в директивах предпроцессора, как например
#define PIE 3.1415926535
Проекты подготовлены на базе шаблона из первой главы, что делает их открытими для изменений подобного рода. Примеры были протестированы в системах Kompas 3D v10-13, однако в ряде случаев требуется пересборка проекта прикладной библиотеки, если разработка ведется в разных версиях Microsoft Studio (6, 2003, 2005,2010).
5.1. Построение графиков функций
Для построения на плоскости графика заданной функции в изометрии предлагается пример прикладной библиотеки Компас, код которой будет представлен далее. Технически построить функцию в изометрии несложно, для этого достаточно получить новые точки пересчета системы координат.
#include
"stdafx.h" #include
<afxdllx.h>
#include
"resource.h"
#include
<сmath> #include
<libtool.h> #include
<ldefin2d.h>
#ifdef
_DEBUG #define
new DEBUG_NEW #undef
THIS_FILE static
char THIS_FILE[] = __FILE__; #endif #define
PIE 3.1415926535
class
two_d_project { //Функция
вывода
изображения
на
экран void
DrawSetPoint(double y,double z) { Point
(90+0.707*z,65+y+0.707*z,0); }; //Функция
для вывода текста void
DrawSetText(char *buf) { Text(0,-20,0,7,0,0,buf);
}; public: //Построение
графиков функций на плоскости в изометрии void
graphfunc(); }
*two_d;
//
Специальная структура используемая в
течении инициализации DLL static
AFX_EXTENSION_MODULE StepDLL = { NULL, NULL };
//
Стандартная точка входа //
Инициализация и завершение DLL 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; }
//
Задать
идентификатор
ресурсов unsigned
int WINAPI LIBRARYID() { return
IDR_LIBID; } //
Получить идентификаторы инструментальных
и компактных панелей int
WINAPI LibToolBarId( int barType, //
Тип запрашиваемой панелей ( 0 - компактная
панель, 1 - //простая инструментальная
панель )
int
index ) // Индекс
панели { if
( !barType ) return
!index ? COMPACT_BAR1 : -1; else
return -1;
} //
Головная
функция
библиотеки void
WINAPI LIBRARYENTRY( unsigned int comm ) { //
Получить активный 2D документ if
( ksGetCurrentDocument( 1 ) )
{ switch
( comm ) { case
1 : two_d->graphfunc(); break;
} } else Message(
"Документ не активизирован или\n не
является листом/фрагментом" ); }//Построение
графиков функций в аксонометрии void
two_d_project::graphfunc() { int
change; //Выбор режима отображения графика ReadIntT(
_T("Отобразить график:(ввод 1-5)"),
2,
1,
5,
&change
) ; //Построение
координатных осей LineSeg
(90,65,6,120,2); PointArraw(6,120,147,2); LineSeg
(90,65,90,165,2); PointArraw(90,165,90,2); LineSeg
(90,65,175,150,2); PointArraw(175,150,45,2); LineSeg
(44,19,90,65,2); //Расчетные
коэффициенты double
s=PIE/100; double
f,z,y; switch
( change ) {//Построение
графика функции sin case
1 :
{
for (f=-2*PIE;f<3*PIE;f+=s)
{
z=10*f;
y=45*sin
(f);
two_d->DrawSetPoint(y,z);
} char
*string="График в аксонометрии функции
вида: y=sin(f)";
two_d->DrawSetText
(string);
break;
} //Построение
графика функции cos
case
2 :
{
for (f=-2*PIE;f<3*PIE;f+=s)
{ z=10*f; y=45*cos
(f);
two_d->DrawSetPoint(y,z);
} char
*string="График в аксонометрии функции
вида: y=cos(f)";
two_d->DrawSetText
(string);
break;
} //Построение
графика показательной функции case
3 :
{
for (f=0;f<70;f+=0.1)
{ z=f; y=sqrt((f))*5;
two_d->DrawSetPoint(y,z);
} char
*string="График в аксонометрии показательной
функции вида: y=SQRT(f)";
two_d->DrawSetText
(string);
break;
} //Построение
графика затухающей функции case
4: { for
(f=0;f<100;f+=0.05)
{ z=f; y=70*(exp(-f*0.07))*sin(PIE*f*(10.0/3.0)/30.0);
two_d->DrawSetPoint(y,z);
} char
*string="График
затухающей
функции
вида:
y=A(exp(-f*B))*sin(PIE*f*(C)/D);";
two_d->DrawSetText (string); break; } //Петля case
5: { double
delta=1,base=45;
for(f=-3*PIE;f<3*PIE;f+=s)
{
z=base*f;
base=base+delta*f;
y=base*cos (f);
two_d->DrawSetPoint(y/100,z/100);
}
char *string="Петля:
y=base*cos (f); base=base+delta*f";
two_d->DrawSetText (string);
break; } } }
Результат работы прикладной библиотеки при выборе значения «4» показан на рисунке 26.
Рис. 26. Построение графика функции согласно заданным параметрам |