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

Александр Кружков (Все сообщения пользователя)

Поиск  Пользователи  Правила  Войти
Форум » Пользователи » Александр Кружков
Выбрать дату в календареВыбрать дату в календаре

Страницы: Пред. 1 ... 5 6 7 8 9 10 11 12 13 14 15 ... 148 След.
Помогите заполнить структуру IMGVECTOREX
 
1)
VLine1, VLine2 - габаритные линии рисунка (см. редактор векторного знака).
VSize = VLine2 - VLine1;

2,3) Заполение параметров на Вашем примере:
[CODE] // Параметры векторного знака должны быть записаны в одном буфере (добавлен запас)
    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);      // или так[/CODE]4) Да

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

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

Для решения данной задачи необходимо уточнить:

Если предполагается открывать полученный файл для просмотра, то какими средствами планируется открывать полученный файл? Выбор средства просмотра влияет на выбор формата сохраняемого файла (JPG или PS). Изображение в формате JPG может иметь объем в 10-20 раз меньше объема в PS. В этом случае вместо печати с помощью виртуального принтера проще сохранить файл в JPG: Файл - Сохранить как - Файл JPG.

Если предполагается только печатать файл, то необходимо:
1. Установить драйвер устройства печати, на котором планируется выполнять печать.
2. Открыть карту в ГИС "Карта 2011".
3. Открыть диалог печати и выбрать устройство печати, на котором планируется выполнять печать, выбрать формат и ориентацию страницы.
4. Сохранить каждую страницу в отдельный файл: Печать в файл.
5. Передать файлы для печати.
6. Выполнить печать на устройстве печати с помощью команды DOS:

COPY FILENAME.PRN /b \\IVANOV\HP2100  где: IVANOV  - сетевое имя компьютера; HP2100   - сетевое имя устройства печати; /b - опция двоичного вывода (см. страницу помощи в диалоге печати).

P.S. Обычно виртуальные принтеры формируют изображение в формате PS. Данный формат поддерживают только PS-совместимые устройства печати. А также его поддерживают некоторые программы компании Adobe.
Какую длину текста возвращает mapGetTextLengthMkm ?, При переводе мкм в м длина сильно разнится от длины объекта
 
Не вижу ни скрин с изображением подписи, ни параметров описания знака (подписи). Могу предположить, что данная подпись выравнивается по базовой линии. Поэтому подпись приподнята выше и и координаты Y могут иметь отрицательные значения. С учетом небольшого расширения слева и справа координаты X тоже могут иметь отрицательные значения. Функция mapGetPaintTextBorder возвращает рамку, которая обычно мигает при выборе подписи в ГИС "Панорама".

P.S. Значения "x" и "X" для одной точки одинаковы (это одно и тоже поле), аналогично - "y" и "Y" (см. описание структуры):
Point1: x = -2  y = -10
Point2: x = 45 y = -10
Point3: x = 45 y = 3
Point4: x = -2  y = 3
Какую длину текста возвращает mapGetTextLengthMkm ?, При переводе мкм в м длина сильно разнится от длины объекта
 
mapGetTextLengthMkm возвращает сумму ширин символов.
mapLength возвращает расстояние между двумя точками метрики подписи, пересчитанные в проекцию топографической карты. Обычно 2-я точка вычислена приближенно и может немного не соответствовать реальной длине текста подписи.

Возможно более близкое значение покажет функция mapLengthInMap, которая возвращает расстояние между двумя точками метрики подписи (без пересчета).

P.S. Дополнительно есть функция mapGetPaintTextBorder, которая позволяет запросить габариты подписи с учетом всех условий отображения (масштаба: mapGetRealShowScale, mapGetScreenScaleEx, разрешения: mapGetHorizontalScreenPrecision, mapGetVerticalScreenPrecision, режима масштабирования: mapGetScaleMethod).
PanTask (версия 12): Размер кнопок
 
[QUOTE]KFF написал:
Не понимаю в чём сложность в публикации новой структуры и новой функции на форуме с учётом того, что рано или поздно она будет опубликована в SDK11[/QUOTE]
Добавление в SDK11 не планируется.
PanTask (версия 12): Размер кнопок
 
Федор, приведу текущий текст функции добавления кнопки:[CODE]// -----------------------------------------------------------------
// Добавить/вставить кнопку в панель
// -----------------------------------------------------------------
int TPanTask::InsertButton(int panelID, long int bmpFace, int command, int after,   // 25/10/13
                          int background,
                          int press, int enable,
                          WCHAR * hint, WCHAR * comment)
{
 if (panelID == 0)
   return 0;

#ifdef WIN32API
 if (HMainWindow)
   {
     HBITMAP hBitmap = 0;

     HINSTANCE hInstance = (HINSTANCE)::SendMessage(HMainWindow, AW_GETPANELINST,
                                                    (WPARAM)panelID, 0);
     if (bmpFace > 0)    // 21/11/14
       {                                 // 29/06/00
         hBitmap = ::LoadBitmap(hInstance, MAKEINTRESOURCE(bmpFace));
       }
     // Загрузка изображения иконки для кнопки в ресурсах типа RCDATA
     // с идентификатором command
     else if (bmpFace == -1)
              hBitmap = (HBITMAP)-1;

     TASKBUTTONINFO button;             // 08/06/10
     button.Command    = command;       // Идентификатор команды, уникальный в пределах данной задачи
     button.hTask      = hInstance;     // Идентификатор модуля, содержащего TPanTask или 0, если command уникален в ГИС
     button.hBitmap    = hBitmap;
     button.Sibling    = after;
     button.Background = background;
     button.State      = press;
     button.Enable     = enable;
     button.Hint[0]    = 0;
     button.Comment[0] = 0;

     if (hint)
       {
         int size = strlenun((char*)hint, sizeof(button.Hint)-2);
         if (size > 0)
           {
             memcpy(button.Hint, hint, size);
             button.Hint[size/sizeof(button.Hint[0])] = 0;
           }  
       }

     if (comment)
       {
         int size = strlenun((char*)comment, sizeof(button.Comment)-2);
         if (size > 0)
           {
             memcpy(button.Comment, comment, size);
             button.Comment[size/sizeof(button.Comment[0])] = 0;
           }  
       }

     if (Action && (Action->Ident() == command))
       {
         button.State = 1;                      
       }


     long res = ::SendMessage(HMainWindow, AW_INSERTTASKBUTTON,           // 08/06/10
                              (WPARAM)panelID, (LPARAM)&button);


     if(hBitmap) ::DeleteObject(hBitmap);

     return res;
   }
#else
   if (MessageHandler)
   {
     long res;
     HBITMAP hBitmap = bmpFace;
     BUTTONINFO buttonInfo = {command, hBitmap, 0};
     
     res = MessageHandler(0,  AW_INSERTBUTTON, (WPARAM)panelID, (LPARAM)&buttonInfo, 0);

     if (Action && (Action->Ident() == command))
       {
         if (MapWindow) MapWindow->PressButton(command);
       }

     return res;      
   }
#endif

 return 0;
}

// см. maptype.h
typedef struct TASKBUTTONINFO // Параметр LPARAM сообщения AW_INSERTTASKBUTTON     // 05/06/10
{
 HINSTANCE hTask;          // Идентификатор библиотеки задачи, которая будет выполнять команду или 0
                           // Если задан идентификатор задачи, то Command будет
                           // передаваться на обработку конкретной задаче
 long int Command;         // Идентификатор кнопки,
                           // если Command = (-1) - вставляется разделитель
 long int Sibling;         // Идентификатор кнопки в панели инструментов,
                           // после которой вставляется создаваемая кнопка.
                           // Если Sibling равен 0, то при создании кнопка вставляется в конец списка
 HBITMAP  hBitmap;         // Идентификатор картинки на кнопке или 0
 long int Background;      // Признак прорисовки фона кнопки (если не равно 0),
                           // учитывается если hBitmap не ноль
 long int State;           // Состояние кнопки (0 - отжата, 1 - нажата, -1 - не меняется)
 long int Enable;          // Доступность кнопки (0 - недоступна для нажатия, 1 - может нажиматься)

 WCHAR    Hint[256];       // Короткая подсказка к кнопке в UNICODE или 0

 WCHAR    Comment[256];    // Длинная подсказка к кнопке в UNICODE или 0
}
 TASKBUTTONINFO;


[/CODE]// Ключевой момент (иначе масштабирования кнопок не будет)
button.hBitmap = -1;
[CODE] // Добавить/вставить кнопку в панель
 // panelID  - идентификатор панели
 // bmpFace  - идентификатор изображения кнопки в ресурсах
 //            (размер кнопки соответствует размеру загружаемого изображения),
 //            если bmpFace = (-1) - загружается изображение кнопки формата PNG   // 21/11/14
 //            (тип ресурса: RCDATA, идентификатор ресурса: command)
 //            Размер кнопки устанавливается оболочкой, в зависимости от выбранного режима
 // command  - идентификатор кнопки, если 0 - разделитель
 // after    - идентификатор существуищей кнопки, после которой
 //            вставляется кнопка, если 0 - в конец панели
 // background - признак отрисовки фона
 // press      - состояние (отжата\нажата - 0\1)
 // enable     - доступность (0\1)
 // hint       - короткий комментарий кнопки
 // comment    - длинный комментарий
 int InsertButton(int panelID, long int bmpFace, int command, int after = 0,   // 25/10/13
                  int background = 0,                                     // 08/06/10
                  int press = 0, int enable = 1,
                  WCHAR * hint = 0, WCHAR * comment = 0);

// Ключевой момент (иначе масштабирования кнопок не будет)
bmpFace = -1;
[/CODE]
Изменено: Александр Кружков - 13.01.2017 11:28:10 (добавлена структура TASKBUTTONINFO)
PanTask (версия 12): Размер кнопок
 
Масштабирование иконок реализовано только для Си (на pantask). Для паскаля требуется доработка. По окончанию доработки сообщим.
PanTask (версия 12): Размер кнопок
 
Для обеспечения изменения размера кнопок на панели инструментов ГИС Панорама 12 по пункту меню Параметры->Размер кнопок->75-200% необходимо:
1. Каждой картинке режима назначить цифровой идентификатор.
2. В проект задачи (cbproj-файл) добавить картинки (64x64) PNG-файлы (имена картинок должны совпадать цифровыми идентификаторами).
3. Добавление кнопок на панель выполнять функцией InsertButton из pantask.

Выполнены ли эти пункты?


PANTASK.H
[CODE]// Добавить/вставить кнопку в панель
// panelID - идентификатор панели
// bmpFace - идентификатор изображения кнопки в ресурсах
// (размер кнопки соответствует размеру загружаемого изображения),
// если bmpFace = (-1) - загружается изображение кнопки формата PNG // 21/11/14
// (тип ресурса: RCDATA, идентификатор ресурса: command)
// Размер кнопки устанавливается оболочкой, в зависимости от выбранного режима
// command - идентификатор кнопки, если 0 - разделитель
// after - идентификатор существуищей кнопки, после которой
// вставляется кнопка, если 0 - в конец панели
// background - признак отрисовки фона
// press - состояние (отжата\нажата - 0\1)
// enable - доступность (0\1)
// hint - короткий комментарий кнопки
// comment - длинный комментарий
int InsertButton(int panelID, long int bmpFace, int command, int after = 0, int background = 0, int press = 0, int enable = 1, WCHAR * hint = 0, WCHAR * comment = 0);[/CODE]Пример вызова функции:

InsertButton(EditPanelId,-1, SCOUT_PARM),

где SCOUT_PARM - идентификатор кнопки и он же идентификатор ресурса (RCDATA) формата PNG.

Если SCOUT_PARM = 11111, то файл должен называться "11111.png".


P.S. В диалогах используется шрифт Tahoma. Если в ОС Windows установлен средний шрифт, то в шрифт диалоге должен иметь высоту = -16, если стандартный (мелкий) - высота = -13.
ГИС Оператор для силовых структур, вопрос по зарамочному оформлению
 
Спасибо за предложение!
Добавлено в план по доработке ГИС Панорама 12 и ГИС Оператор 12.
Поворот объекта, Как повернуть объект?
 
Проверил создание объекта и редактирование на карте Подольска.

1. При создании нового объекта с указанием метрики типа IDDOUBLE2 и последующем редактировании метрика сохраняются с точностью до 0.000001 м
2. При редактировании существующего объекта карты и изменении координаты на 0.000001 м - изменения не сохраняются. Вероятно метрика объектов карты имеет пониженную точность (например: IDLONG2 или IDFLOAT2).

Выполнил сортировку карты (в ГИС) с максимальной точностью (мкм) - теперь при изменении координат на 0.000001 м изменения сохраняются.

P.S. см. mapapi.h[CODE] // Запросить формат хранения метрики (IDSHORT2,...,IDDOUBLE3)
//  При ошибке возвращает ноль, иначе - тип формата хранения метрики

_MAPIMP long int _MAPAPI mapGetObjectKind(HOBJ info);[/CODE]// Установить максимальную точность хранения координат объекта
mapSetObjectKind(info, IDDOUBLE2);

// Выполнить поворот объекта
// ...
Страницы: Пред. 1 ... 5 6 7 8 9 10 11 12 13 14 15 ... 148 След.



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

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