На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Помогите заполнить структуру IMGVECTOREX

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Помогите заполнить структуру IMGVECTOREX
 
Третий день бьюсь с заполнением структуры IMGVECTOREX. Понял, что дело в параметрах примитива... если это IMGSQUARE т.е.  параметры имеют размер 4 байта, то все работает... а если например IMGDOT - 16 байт, то происходит какой то сдвиг и координаты (IMGVECTPOINT) записываются не правильно. Если можно ткните меня носом , что я делаю не правильно :-). Вот мой код:
Код
    buf=(char*)malloc(256);
    mImgObj=(IMGVECTOREX*)buf;
    mImgObj->PosV=0;
    mImgObj->PosH=0;
    mImgObj->Base=0;
    mImgObj->VLine1=0;
    mImgObj->VLine2=0;
    mImgObj->VSize=0;
    mImgObj->HLine1=0;
    mImgObj->HLine2=0;
    mImgObj->HSize=0;
    mImgObj->Static=0;
    mImgObj->Mirror=0;
    mImgObj->NoPress=0;
    mImgObj->Scale=0;
    mImgObj->Centre=0;
    mImgObj->Border=0;



    char* bb=(char*)malloc(256);
    memset(bb,0,256);
    IMGPOLYDESC *d1=(IMGPOLYDESC *)bb;


    IMGDOT l1;
    l1.Thick=PIX2MKM(1);
    l1.Blank=PIX2MKM(5);
    l1.Dash=PIX2MKM(5);
    l1.Color=RGB(255,255,255);


    d1->Type=0;
    d1->Image=IMG_DOT;
    memcpy((char*)&d1->Parm, &l1,sizeof(IMGDOT));
    d1->Length=sizeof(l1);
    d1->Count=3;


    int i=0;
    i=12+8*d1->Count+d1->Length;
    mImgObj->Count=1;
    mImgObj->Length=56+i-4;

    memcpy(buf+sizeof(IMGVECTOREX)-sizeof(IMGPOLYDESC),bb,i);

    IMGVECTPOINT p1;
    IMGVECTPOINT *Point;

    int delta=mImgObj->Desc.Length-4;
    p1.Hor=PIX2MKM(128);
    p1.Ver=PIX2MKM(112);
    Point = (&mImgObj->Desc.Point[0]+delta);
    memcpy(Point,&p1,sizeof(IMGVECTPOINT));

    p1.Hor=PIX2MKM(136);
    p1.Ver=PIX2MKM(143);
    Point = (&mImgObj->Desc.Point[1]+delta);
    memcpy(Point,&p1,sizeof(IMGVECTPOINT));

    p1.Hor=PIX2MKM(128);
    p1.Ver=PIX2MKM(137);
    Point = (&mImgObj->Desc.Point[2]+delta);
    memcpy(Point,&p1,sizeof(IMGVECTPOINT));
 
Поле Parm структуры IMGPOLYDESC имеет переменную длину.

Код
    // Параметры векторного знака должны быть записаны в одном буфере (добавлен запас)
    buf=(char*)malloc(2560);

    // Очистка для надежности (будут обнулены и резервные поля типа Reserve).
    // В будующем вместо поля Reserve могут появиться новые поля
    memset(buf, 0, 2560);

    mImgObj=(IMGVECTOREX*)buf;

    // Один фрагмент
    mImgObj->Count = 1;

    IMGPOLYDESC *d1=(IMGPOLYDESC *)&(mImgObj->Desc);
    d1->Type=VT_LINE;
    d1->Image=IMG_DOT;
    d1->Length=sizeof(IMGDOT);

    IMGDOT *l1 = (IMGDOT *)&(d1->Parm);
    l1->Thick=PIX2MKM(1);
    l1->Blank=PIX2MKM(5);
    l1->Dash=PIX2MKM(5);
    l1->Color=RGB(255,255,255);

    // Пропустить параметры (d1->Parm - запись переменной длины)
    long *Count = (long *)(l1 + 1);

    // d1->Count=3;
    *Count = 3;

    // Пропустить счетчик точек
    IMGVECTPOINT *Point = (IMGVECTPOINT *)(Count+1);
    Point->Hor=PIX2MKM(128);
    Point->Ver=PIX2MKM(112);
    Point++;
    Point->Hor=PIX2MKM(136);
    Point->Ver=PIX2MKM(143);
    Point++;
    Point->Hor=PIX2MKM(128);
    Point->Ver=PIX2MKM(137);
    Point++;
    mImgObj->Length=(char*)Point - buf;
Изменено: Alexander Kruzhkov - 17.06.2008 22:13:26 (Добавлена очистка для надежности)
 
Александр, большое спасибо! Код работает... буду разбираться.
 
Здравствуйте!
Необходимо создать графические объекты с записью на карту.
К сожалению ни один из вышеописанных примеров для создания своих объектов через mapAppendDraw() для структуры IMGVECTOREX успеха не принесли.
Перечитав форум так и не нашел ответа на следующие вопросы.
1. Что конкретно обозначают следующие поля структуры IMGPOLYDESC

 int  VLine2      ;             // Конец  отметки по вертикали  (VSize)
 int  VSize       ;             // Требуемый размер отметки по вертикали
 int  HLine2      ;             // Конец отметки по горизонтали  (HSize)
 int  HSize       ;             // Требуемый размер отметки по горизонтали

2.  Как все же правильно заполнить поля структуры IMGPOLYDESC
 unsigned short Length  ;       // Длина параметров (>= 4)
 unsigned int   Parm    ;        // Параметры цепочки по ее типу

Что подразумевается под полем Length, что значит длина параметров >=4.
Parm -  это все же указатель на структуру или сама структура? Разные ответы на форуме.

3. Как правильно посчитать поля Length в IMGVECTOREX и IMGPOLYDESC
4. Почему IMGVECTPOINT   Point[1] в IMGPOLYDESC. Это начало массива точек?

И было очень не плохо, если бы вы привели подробный Работающий Пример по заполнению IMGVECTOREX, например, состоящий
из IMG_LINE и IMG_SQUARE.
Работаем с ядром под AstraLinux.

P.S.
// Параметры векторного знака должны быть записаны в одном буфере (добавлен запас)     buf=(char*)malloc(2560);      // Очистка для надежности (будут обнулены и резервные поля типа Reserve).     // В будующем вместо поля Reserve могут появиться новые поля     memset(buf, 0, 2560);      mImgObj=(IMGVECTOREX*)buf;      // Один фрагмент     mImgObj->Count = 1;      IMGPOLYDESC *d1=(IMGPOLYDESC *)&(mImgObj->Desc);     d1->Type=VT_LINE;     d1->Image=IMG_DOT;     d1->Length=sizeof(IMGDOT);      IMGDOT *l1 = (IMGDOT *)&(d1->Parm);     l1->Thick=PIX2MKM(1);     l1->Blank=PIX2MKM(5);     l1->Dash=PIX2MKM(5);     l1->Color=RGB(255,255,255);      // Пропустить параметры (d1->Parm - запись переменной длины)     long *Count = (long *)(l1 + 1);      // d1->Count=3;     *Count = 3;      // Пропустить счетчик точек     IMGVECTPOINT *Point = (IMGVECTPOINT *)(Count+1);     Point->Hor=PIX2MKM(128);     Point->Ver=PIX2MKM(112);     Point++;     Point->Hor=PIX2MKM(136);     Point->Ver=PIX2MKM(143);     Point++;     Point->Hor=PIX2MKM(128);     Point->Ver=PIX2MKM(137);     Point++;     mImgObj->Length=(char*)Point - buf;


Этот код не работает.
mapAppendDraw(hObj, IMG_VECTOREX,(const char*)&mImgObj)  возвращает 0!
 
1)
VLine1, VLine2 - габаритные линии рисунка (см. редактор векторного знака).
VSize = VLine2 - VLine1;

2,3) Заполение параметров на Вашем примере:
Код
     // Параметры векторного знака должны быть записаны в одном буфере (добавлен запас)
     buf=(char*)malloc(2560);     // Очистка для надежности (будут обнулены и резервные поля типа Reserve).

     // В будующем вместо поля Reserve могут появиться новые поля
     memset(buf, 0, 2560);
     mImgObj=(IMGVECTOREX*)buf;

     // !!! Не проинициализированы 9 полей !!!
     mImgObj->PosV =
     ...
     mImgObj->HSize =

     // Один фрагмент
     mImgObj->Count = 1;
     IMGPOLYDESC *d1=(IMGPOLYDESC *)&(mImgObj->Desc);
     d1->Type=VT_LINE;
     d1->Image=IMG_DOT;

     // !!! Длина параметров до конца описания фрагмента (включая точки), см. ниже !!!
     // !!! d1->Length=sizeof(IMGDOT);

     IMGDOT *l1 = (IMGDOT *)&(d1->Parm);
     l1->Thick=PIX2MKM(1);
     l1->Blank=PIX2MKM(5);
     l1->Dash=PIX2MKM(5);
     l1->Color=RGB(255,255,255);     // Пропустить параметры (d1->Parm - запись переменной длины)

     long *Count = (long *)(l1 + 1);
     // d1->Count=3;
     *Count = 3;     // Пропустить счетчик точек
     IMGVECTPOINT *Point = (IMGVECTPOINT *)(Count+1);
     Point->Hor=PIX2MKM(128);
     Point->Ver=PIX2MKM(112);
     Point++;
     Point->Hor=PIX2MKM(136);
     Point->Ver=PIX2MKM(143);
     Point++;
     Point->Hor=PIX2MKM(128);
     Point->Ver=PIX2MKM(137);
     Point++;

     // !!! Примерно так:
     d1->Length = (char*)Point - (char*)&(d1->Parm);

     mImgObj->Length=(char*)Point - buf;

     // Этот код не работает. !!! Ошибка при передаче указателя mImgObj !!!
     // mapAppendDraw(hObj, IMG_VECTOREX,(const char*)&mImgObj)  возвращает 0!

     // !!! Примеры:
     mapAppendDraw(hObj, IMG_VECTOREX,(const char*)mImgObj);  // Может быть так
     mapAppendDraw(hObj, IMG_VECTOREX,(const char*)buf);      // или так
4) Да

P.S. Есть вариант более простого создания графических объектов:

1. Создать векторный или любой другой объект в классификаторе средствами редактора классификатора.
Программно:
2. Запросить номер функции: mapGetRscPrintObjectFunction()
3. Запросить указатель на параметры функции: mapGetRscPrintObjectParameters()
4. Записать параметры графического объекта: mapAppendDraw()
Страницы: 1
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности