Максим, добрый день!
После заголовка функции F3DHEAD идет структура с параметрами функции рисования (не IMG3DNODE). Тип структуры параметров определяется по номеру функции (head->Number). В Вашем случае вызывается функция рисования знака (head->Number = 2). Параметры 3D модели знака хранятся в структуре F3DMARK, объявленной в файле m3dgdi.h. Она и следует после заголовка.
Все доступные функции рисования перечислены в виде макросов в файле m3dgdi.h.
Код |
---|
#define F3D_NULL 0 // Пустая функция - ничего не рисует
#define F3D_EMPTY 1 // Пустая функция - рисует отсутствие объекта
#define F3D_MARK 2 // Знак
#define F3D_MARKBYLINE 3 // Знак по линии
#define F3D_MARKBYPOINT 4 // Знак по точкам (F3D_MARK)
#define F3D_MARKBYSQUARE 5 // Знак по площади
#define F3D_VERTBYLINE 6 // Вертикальная плоскость по линии
#define F3D_HORIZONTBYLINE 7 // Горизонтальная плоскость по линии
#define F3D_HORIZONT 8 // Горизонтальная плоскость
... |
Пример для разбора параметров рисования 3D модели приведен ниже. В примере показано, как найти размер знака по оси X. Для определения размера по оси Z необходимо обратиться к полю SizeZ структуры F3DMARK, по оси Y - к полю Height.
Код |
---|
F3DTREE* ftree = (F3DTREE*)mapGetRsc3DParam(rsc, incode, 0);
F3DHEAD* fhead = (F3DHEAD*)((char*)ftree + sizeof(F3DTREE));
// Идем по списку функций рисования
for (int k = 0; k < ftree->Count; k++)
{
if (fhead->Number == F3D_MARK)
{
// Векторный знак
F3DMARK* mark = (F3DMARK*)(fhead + 1);
// Находим размер знака по X
double sizeMarkX = mark->SizeX.Value;
if (mark->SizeX.Type > 0)
{
sizeMarkX = mapSemanticCodeDoubleValue(hObj, mark->SizeX.Type, 1);
if (sizeMarkX < DOUBLENULL)
sizeMarkX = mark->SizeX.Value;
else
sizeMarkX = sizeMarkX * mark->SizeX.Factor + mark->SizeX.Offset;
}
}
else if (fhead->Number == F3D_MARKBYLINE)
{
// Знак по линии
F3DMARKBYLINE* mark = (F3DMARKBYLINE*)(fhead + 1);
// Обработка
}
else if (fhead->Number == F3D_MARKBYSQUARE)
{
// Знак по площади
F3DMARKBYSQUARE* mark = (F3DMARKBYSQUARE*)(fhead + 1);
// Обработка
}
// Переходим на заголовок следующей функции
fhead = (F3DHEAD*)((char*)fhead + fhead->Length);
}
|