- •Гоувпо «Воронежский государственный технический университет» м.И. Чижов а.Н. Юров
- •Введение
- •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.3. Построение эскизов
Для построения эскизов с указанием размерных линий, допусков, отображением знаков шероховатости, отклонений и т. д. необходимо подробно ознакомиться с документацией и примерами, так как проектирование элементов чертежей и эскизов программным путем является достаточно трудоемким процессом. Листинг прикладной библиотеки, выполняющей построение эскиза, приведен ниже.
#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
LinearSize(double px1,double py1, double px2, double py2,int style,
int type,int set,double posx,double posy); //Прототип
функции, позволяющей задать шероховатость
поверхностей void
DrawRough(double an,double xpos,double ypos,TCHAR ch[]); public: //Построение
эскиза void
outline(); }*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->outline(); break;
} }
else Message(
"Документ не активизирован или\nне
является листом/фрагментом" ); } //Построение
эскиза шпильки void
two_d_project::outline() { Mtr(
0, 0, 0, 1 ); // Матрица преобразования
координат ( 30 по оси OX,
20 по оси OY,
маштаб 1:2 ) //Построение
контура втулки LineSeg
(0.0,1.6,1.6,0.0,1); LineSeg
(1.6,0,35,0.0,1); LineSeg
(35.0,0,35.0,7,1); LineSeg
(1.6,7.0,35,7.0,1); LineSeg
(1.6,7.0,0.0,5.4,1); LineSeg
(0.0,1.6,0.0,5.4,1); //
Штриховка квадрата Hatch(
0,
//
Стиль штриховки ( 0 - металл, 1 - неметалл,
2 - дерево, 3 –
//
камень естественный, 4 - керамика, 5 -
бетон, 6 - стекло, 7 –
//
жидкость, 8 - естественный грунт, 9 -
насыпной грунт, 10 – //
камень искусственный, 11 - железобетон,
12 - напряженный
//
железобетон, 13 - дерево в продольном
сечении, 14 - песок ) 45,
// Угол штриховки 2,
// Шаг штриховки 0,
//
Ширина полосы штриховки ( 0 - штриховать
всю область ) 0,
0 ); // Базовая точка
//Контур
для штриховки LineSeg
(0.0,1.6,1.6,0.0,1); LineSeg
(1.6,0,35,0.0,1); LineSeg
(35.0,0,35.0,7,1); LineSeg
(1.6,7.0,35,7.0,1); LineSeg
(1.6,7.0,0.0,5.4,1); LineSeg
(0.0,1.6,0.0,5.4,1); reference
rHatch = EndObj();
DeleteMtr();
//Вызов
Функций по нанесению линейных размеров two_d->LinearSize(0,1.6,35,1.6,0,1,0,0,-30); two_d->LinearSize(33.4,0,33.4,7,1,2,1,20,0);
two_d->LinearSize(0,1.6,1.6,0,0,2,0,0,-10); //Вызов
Функций по указанию заданной шероховатости
поверхности two_d->DrawRough(90,17.5,7,_T("3.2")); two_d->DrawRough(180,0,-27,_T("3.2")); two_d->DrawRough(0,35,-20,_T("3.2")); }
//Функция
по нанесению линейных размеров void
two_d_project::LinearSize(double px1,double py1, double px2, double
py2,int style, int type,int set,double posx,double posy) { //
Структура параметров линейного размера LDimParam
parLDim;
memset(
&parLDim,
0, sizeof(
parLDim
) ); //
Параметры изображения размера //
Положение текста ( 0 - автоматическое
размещение текста, //
> 0 - на указанное расстояние в направлении
от первой точки //ко второй, //
< 0 - на указанное расстояние в направлении
от второй точки к //первой ) parLDim.dPar.textPos
= 0;
//
Параметр отрисовки текста ( 0 - в центре,
1 - textPos
//относительно 1 точки, //
2 - textPos
относительно 2 точки, 3 - общая размерная
линия ) parLDim.dPar.textBase
= 0;
//
Признак отрисовки первой выносной
линии ( 0 - включена, 1 –
//
выключена ) parLDim.dPar.pl1
= 0;
//
Признак отрисовки второй выносной
линии ( 0 - включена, 1 -
//
выключена
) parLDim.dPar.pl2
= 0;
//
Тип стрелки у первой выносной линии (
0 - стрелки нет, 1 –
//
внутри,
2 - снаружи, 3 - засечка, 4 - точка ) parLDim.dPar.pt1
= type;
//
Тип стрелки у второй выносной линии (
0 - стрелки нет, 1 –
//
внутри,
2 - снаружи, 3 - засечка, 4 - точка ) parLDim.dPar.pt2
= type;
//
Наличие выносной полки ( 0 - нет выносной
полки, -1 - полка
//
направлена влево, //
1 - полка направлена вправо, 2 - полка
направлена вверх, 3 –
//
полка направлена вниз ) parLDim.dPar.shelfDir
= 0;
//
Угол наклона ножки выносной полки parLDim.dPar.ang
= 0;
//
Длина ножки выносной полки parLDim.dPar.length
= 0;
//
Параметры размерной надписи //
Cтиль
текста размера, ( 0 - стиль по умолчанию
) parLDim.tPar.style
= 0;
//
Номер условного значка перед номиналом
( 0 - нет значка, 1 –
//
диаметр, 2 - квадрат, //
3 - радиус, > 3 - номер значка из шрифта
Symbol
type
A
) parLDim.tPar.sign
= style;
//
Признаки размерной надписи ( набор
битовых полей, 0 - ручное
//
задание
)
//
Должны быть строки PREFIX,
номинал ставится auto
( ставить не
//
нужно ), TOLERANCE,
отклонения //
ставятся auto
( ставить не нужно ), UNIT,
SUFFIX
( 4 строки ) parLDim.tPar.bitFlag
= _AUTONOMINAL ; //parLDim.tPar.bitFlag
= _AUTONOMINAL|_UNIT;
parLDim.tPar.pText
= CreateArray( CHAR_STR_ARR, 0 );
//
Динамический массив строк //
Привязка линейного размера //
Признак ориентации размерной линии (
0 - горизонтально, 1 –
//
вертикально, //
2 - параллельно отрезку, соединяющему
точки привязки, 3 – по //
dx,
dy, //
4 - параллельно отрезку с выносными
линиями по dx,
dy. parLDim.sPar.ps
= set;
//
Координаты первой точки привязки parLDim.sPar.x1
= px1;
parLDim.sPar.y1
= py1;
//
Координаты второй точки привязки parLDim.sPar.x2
= px2;
parLDim.sPar.y2
= py2; //
Вектор, определяющий положение размерной
линии
parLDim.sPar.dy
= posy;
parLDim.sPar.dx
= posx; //
Признак, указывающий, от какой точки
откладывать dx,
dy //
( 1 - от первой точки, 2 - от второй точки
)
parLDim.sPar.basePoint
= 1;
//
Создание линейного размера
reference
rLinDimension = LinDimension( &parLDim ); GetObjParam(
rLinDimension,
// Указатель на граф. объект
&parLDim,
// Указатель на структуру параметров sizeof(
parLDim
), // Размер структуры параметров ALLPARAM
); // Тип считывания параметров
}//Функция
по указанию заданной шероховатости
поверхности void
two_d_project::DrawRough(double an,double xpos,double ypos,TCHAR
ch[]) {//
Структура параметров обозначения
шероховатости с полкой RoughParam
parRougham;
memset(
&parRougham, 0, sizeof( parRougham ) ); //
Параметры выносной полки //
Направление полки параллельно оси X
( 0 - нет выносной полки, //
-1 - полка направлена влево, 1 - полка
направлена вправо, //
2 - полка направлена вверх, 3 - полка
направлена вниз )
parRougham.shPar.psh
= 0; //
Угол наклона размерной линии parRougham.shPar.ang
= 130; //
Длина ножки
parRougham.shPar.length
= 20;
//
Параметры знака шероховатости //
Тип шероховатости ( 0 - вид обработки не
устанавливается,
//
1 - обработка удалением слоя материала, //
2 - обработка без удаления слоя материала
) parRougham.rPar.type
= 0; //
1 - шероховатость по контуру
parRougham.rPar.around
= 0; //
Координаты точки привязкиопараметры
первого отрезка parRougham.rPar.x
= xpos;
parRougham.rPar.y
= ypos;
//
Угол наклона оси значка шероховатости
с осью X parRougham.rPar.ang
= an; //
Количество строк в тексте над знаком
( параметры шер-ти по
//
ГОСТ
2789-73 )
parRougham.rPar.cText0
= 0; //
Количество строк в тексте над полкой
( вид обработки и
//
дополнительные
указания )
parRougham.rPar.cText1
= 1; //
Количество строк в тексте под полкой
( базовая длина по ГОСТ
//
2789-73
)
parRougham.rPar.cText2
= 0; //
Количество строк в тексте под полкой
( условное обозначение
//
направления
неровностей )
//
( не более одной строки )
parRougham.rPar.cText3
= 0;
//
Режим, когда тексты задаются массивом
модельных строк текста //
Стиль текста ( 0 - то стиль умолчательный,
//
INDICATIN_TEXT_LINE_ARR - массив TEXT_LINE_ARR ) parRougham.rPar.style
= INDICATIN_TEXT_LINE_ARR;
//
Структура параметров строки текста
TextLineParam
parTextLine;
//
Номер стиля строки текста parTextLine.style
= 0; //
Массив неопределенной длины компонент
строки текста parTextLine.pTextItem
= CreateArray( TEXT_ITEM_ARR, 0 );
//
Структура параметров шрифта компоненты
строки текста TextItemFontT
parItemFont;
memset(
&parItemFont, 0, sizeof( parItemFont ) ); //
Структура параметров компоненты строки
текста
TextItemParamT
parTextItem;
//
SPECIAL_SYMBOL, FONT_SYMBOL, FRACTION_TYPE, SUM_TYPE или 0 parTextItem.tip
= 0;
//
Параметры шрифта компоненты строки
текста parTextItem.font
= parItemFont; //
Номер спецсимвола, символа из произвольного
фонта или тип
//
отрисовки дроби или выражения типа
суммы или 0 parTextItem.iSNumb
= 0;
//
Массив неопределенной длины строк
текста шероховатости //
Различают 4 разных текста для шероховатости
( строки лежат в
//
следующей
последовательности )
//
1. текст над знаком ( параметры шер-ти
по ГОСТ 2789-73 ) //
2. текст над полкой ( вид обр-ки и доп,
указания )
//
3. текст под полкой ( базовая длина по
ГОСТ 2789-73 )
//
4. текст под полкой ( усл.обозн.направления
неровностей ) //
Если cText0
= 0 или cText1
= 0 или cText2
= 0 или cText3
= 0,
//
то соответствующий текст в обозначении
шероховатости
//
отсутствует parRougham.rPar.pText
= CreateArray( TEXT_LINE_ARR, 0 );
//
Режим, когда тексты задаются массивом
строк символов //
Стиль текста ( 0 - то стиль умолчательный,
INDICATIN_TEXT_LINE_ARR
- массив TEXT_LINE_ARR
)
parRougham.rPar.style
= 0; //
Массив неопределенной длины строк
текста шероховатости //
Различают 4 разных текста для шероховатости
( строки лежат в
//
следующей
последовательности )
//
1. текст над знаком ( параметры шер-ти
по ГОСТ 2789-73 ) //
2. текст над полкой ( вид обр-ки и доп,
указания )
//
3. текст под полкой ( базовая длина по
ГОСТ 2789-73 )
//
4. текст под полкой ( усл.обозн.направления
неровностей ) //
Если cText0
= 0 или cText1
= 0 или cText2
= 0 или cText3
= 0,
//
то соответствующий текст в обозначении
шероховатости
//
отсутствует parRougham.rPar.pText
= CreateArray( CHAR_STR_ARR_T, 0 );
//
Заполнение массива строк текста
шероховатости AddArrayItem(
parRougham.rPar.pText, -1, ch, 4 ); //
Создание шероховатости reference
rRough = Rough( &parRougham ); //
Режим, когда тексты задаются массивом
строк символов
//
Удалить динамический массив строк
текста
DeleteArray(
parRougham.rPar.pText
);
}
Результаты работы прикладной библиотеки представлен на рис. 26.
Рис. 26. Построение эскиза шпильки |