- •Введение
- •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.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. Построение треугольников |