- •Гоувпо «Воронежский государственный технический университет» м.И. Чижов а.Н. Юров
- •Введение
- •1. Создание проектов прикладных библиотек
- •2. Работа с двумерными графическими документами
- •2.1. Функции для работы с графическими документами
- •2.2. Функции построения составных объектов
- •2.3. Функции ввода параметров
- •3. Элементы и функции для проведения вспомогательных построений
- •3.1. Математические функции
- •3.2. Функции вычисления пересечений
- •3.3. Функции вычисления длин, расстояний, углов
- •4. Работа с базами данных
- •5. Примеры проектирования библиотек в 2d
- •5.1. Построение графиков функций
- •5.2. Построение фигур
- •5.3. Построение эскизов
- •6. Работа с твердотельными моделями и объектами
- •6.1. Построение твердотельных деталей посредством операций вращения и выдавливания
- •6.2. Построение фасок и скруглений в твердотельных моделях прикладных библиотек
- •6.3. Построение объектов в цвете
- •6.4. Работа со сборками
- •6.5. Включение в сборочные узлы твердотельных моделей без истории построения
- •6.6. Построение сборочных узлов и компонентов с параметрами посредством диалога
- •Заключение
- •Библиографический список
- •3 94026 Воронеж, Московский просп., 14
5. Примеры проектирования библиотек в 2d
Рассмотрим варианты и способы применения вышеперечисленных методов для решения практических задач при проектировании библиотек в 2D. Под поставленные задачи предложен механизм решения, который состоит из одной или несколько функций. Для управления объектами введено понятие класса, что позволяет разграничить уровень доступа к данным и упростить проектирование прикладной библиотеки. Текст библиотеки содержит комментарии, позволяющие проследить и понять работу некоторых сервисных команд и инструкций, а также изучить особенности построения синтаксических возможностей языка С++.
5.1. Построение графиков функций
Для построения на плоскости графика заданной функции в изометрии предлагается пример прикладной библиотеки Компас, код которой приведен ниже.
#include
"stdafx.h" #include
<afxdllx.h>
#include
"resource.h"
#include
"math.h" #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» показан на рис. 23.
Рис. 23. Построение графика функции |