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

5.2. Построение фигур

Для построения на плоскости фигур предлагается пример прикладной библиотеки Компас, код которой приведен ниже.

#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

{

public:

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

void paraboloid();

//Построение графических объектов

void graphline();

} *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 )

{

if ( ksGetCurrentDocument( 1 ) ) // Получить активный 2D документ

{

switch ( comm )

{

case 1 : two_d->paraboloid(); break;

case 2 : two_d->graphline(); break;

}

}

else

Message("Документ не активизирован или\nне является листом/фрагментом" );

}

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

void two_d_project::paraboloid()

{

double z,s,zc,x,y;

for (z=-5;z<4;z+=0.15)

{ s=0.707*z;

zc=pow(z,2);

Bezier( 0, 0 );

for (x=-5;x<5;x+=0.15)

{y=0.6*(zc+x*x);

double xt=0+6*(x+s);

double yt=6*(y+s);

Point (xt,yt,0);

}

// Функция EndObj возвращает указатель на созданный

// объект кривой Безье

reference rBezier1 = EndObj();}

char *string="Параболоид вида: y=0,6*(x*x+z*z)";

Text(-60,-20,0,7,0,0,string);

}// Фигуры

void two_d_project::graphline()

{

int i=72,j=0;

double px=100,py=100,angle=0;

while (i>0)

{ j++;

// Структура параметров прямоугольника

RectangleParam parRectangle;

memset( &parRectangle, 0, sizeof( parRectangle ) );

//Координаты базовой точки прямоугольника - одной из его вершин

parRectangle.x = 0;

parRectangle.y = 0;

parRectangle.ang = angle;

// Высота прямоугольника

parRectangle.height = px;

// Ширина прямоугольника

parRectangle.width = py;

// Стиль линии

parRectangle.style = 1;

// Динамический массив структур параметров скругленных (или

// усеченных) углов

parRectangle.pCorner = CreateArray( CORNER_ARR, 0 );

// Создать прямоугольник

ksRectangle( &parRectangle, 0 );

i--;

angle+=5;

}//спираль Архимеда

//r-Радиус для расчета

int r,b; double x,y,a=0;

ReadIntT( _T("Введите значение радиуса (ввод 1-20)"),

3,

1,

20,

&r);

ReadIntT( _T("Введите число итераций (ввод 1-1000)"),

1,

10,

1000,

&b);

float x0=0;

float y0=100;

Bezier( 0, 0 );

Point (x0, y0,0);

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

{

x=x0-(r*a*cos(a));

y=y0+(r*a*sin(a));

Point (x, y,0);

a+=0.1;

}

EndObj();

//Логарифмическая спираль

int n;

ReadIntT( _T("Введите количество витков(ввод 1-10)"),

4,

1,

10,

&n);

double r,a=0,arad;

while (a<360*n)

{

arad = a * PIE / 180;

r=2*exp(0.1 * arad);

Point((r*sin(arad)),(r*cos(arad)),0);

a+=0.1;

}

}

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

Рис. 27. Построение параболоида программным способом

Рис. 28. Построение логарифмической спирали

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

// Библиотека на Visual C++

#include "stdafx.h"

#include <afxdllx.h>

#include "my_first_library.h"

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

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

class triangle

{

//Координаты базового треугольника

float xA,yA,xB,yB,xC,yC;

//Координаты рассчитанного треугольника

float xxA,yyA,xxB,yyB,xxC,yyC;

//Коэффициенты смещения новой точки (точек)

float p,q;

//Маштабирование объекта

int dis;

public:

void building();

triangle()

{

dis=10;

building();

}

~triangle()

{}

};

//Метод класса по построению треугольников

void triangle::building()

{

p=0.95;

q=1-p;

xA=0.0;xB=8.0;xC=4.0;

yA=0.0;yB=0.0;yC=8.0;

//Построение 50 однотипных объектов

for(int i=0;i<50;i++)

{

//Построение отрезков

LineSeg (xA/dis,yA/dis,xB/dis,yB/dis,1);

LineSeg (xB/dis,yB/dis,xC/dis,yC/dis,1);

LineSeg (xC/dis,yC/dis,xA/dis,yA/dis,1);

//Расчет новых координатных точек

xxA=p*xA+q*xB;yyA=p*yA+q*yB;

xxB=p*xB+q*xC;yyB=p*yB+q*yC;

xxC=p*xC+q*xA;yyC=p*yC+q*yA;

xA=xxA;xB=xxB;xC=xxC;

yA=yyA;yB=yyB;yC=yyC;

}

}

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

// Специальная структура используемая в течении инициализации DLL

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

static AFX_EXTENSION_MODULE My_first_libraryDLL = { NULL, NULL };

HINSTANCE g_hInstance = NULL;

IApplicationPtr newKompasAPI( NULL );

void OnProcessDetach();

// Отключение библиотеки

// Стандартная точка входа

// Инициализация и завершение DLL

// ---

extern "C" int APIENTRY

DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)

{

g_hInstance = hInstance;

if (dwReason == DLL_PROCESS_ATTACH)

{

TRACE0("MY_FIRST_LIBRARY.AWX Initializing!\n");

AfxInitExtensionModule(My_first_libraryDLL, hInstance);

new CDynLinkLibrary(My_first_libraryDLL);

}

else if (dwReason == DLL_PROCESS_DETACH)

{

TRACE0("MY_FIRST_LIBRARY.AWX Terminating!\n");

OnProcessDetach();

AfxTermExtensionModule(My_first_libraryDLL);

}

return 1; // ok

}

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

// Получить доступ к новому API

void GetNewKompasAPI()

{

if ( !( IApplication * )newKompasAPI )

{

CString filename;

if( ::GetModuleFileName(NULL, filename.GetBuffer(255), 255) )

{

filename.ReleaseBuffer( 255 );

CString libname;

libname = LoadStr( IDR_API7 ); // kAPI7.dll

filename.Replace( filename.Right(filename.GetLength() - (filename.ReverseFind('\\') + 1)), libname );

HINSTANCE hAppAuto = LoadLibrary( filename );

// идентификатор kAPI7.dll

if( hAppAuto )

{

// Указатель на функцию возвращающую интерфейс KompasApplication

typedef LPDISPATCH ( WINAPI * FCreateKompasApplication )();

FCreateKompasApplication pCreateKompasApplication =

(FCreateKompasApplication)GetProcAddress( hAppAuto, "CreateKompasApplication" );

if ( pCreateKompasApplication )

newKompasAPI = IDispatchPtr ( pCreateKompasApplication(), false /*AddRef*/); // Получаем интерфейс Application

FreeLibrary( hAppAuto );

}

}

}

}

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

// ---

unsigned int WINAPI LIBRARYID()

{

return IDR_LIBID;

}

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

void figure();

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

void WINAPI LIBRARYENTRY( unsigned int comm )

{

//Построение функции построения объектов класса

figure();

}

// Проектирование объекта

void figure()

{

//Создание указателя на класс

triangle *pointer=new triangle();

//Вызов метода класса

pointer->building();

//Удаление указателя

delete pointer;

}

// Завершение приложения

void OnProcessDetach()

{

newKompasAPI = NULL;

}

// Загрузить строку из ресурса

// ---

CString LoadStr( int strID )

{

TCHAR temp[_MAX_PATH];

LoadString( My_first_libraryDLL.hModule, strID, temp, _MAX_PATH );

return temp;

}_MODULE My_first_libraryDLL = { NULL, NULL };

На рисунке 29 представлены результаты работы прикладной библиотеки в Компас 3D V13

Рис. 29. Построение треугольников