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

Не работает выравнивание русского текста

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1 2 3 След.
RSS
Не работает выравнивание русского текста
 
Я использую mapPutTextUnicode() для задания русских надписей. При этом некорректно происходит выравнивание, если в mapPutTextHorizontalAlign() параметр FA_CENTER или FA_RIGHT (особенно смещается FA_RIGHT).
Код
    HMAP hMap = ui.DMapView1->GetMapHandle();
    mapSetSiteTransparent(hMap, hMap, 60);
    HSITE hSite = mapCreateAndAppendTempSite(hMap, 0);

    HOBJ hObj1 = mapCreateSiteObject(hMap, hSite, IDDOUBLE2, 0);
    mapRegisterObject(hObj1, 71132230, LOCAL_POINT); // пальма
    mapAppendPointPlane(hObj1, 6162000, 7420000); // в той же точке что и текст для наглядности
    mapAppendSemantic(hObj1, 31001, "500", 20); // масштаб
    mapAppendSemantic(hObj1, 31002, "5646065", 20); // цвет
    mapCommitObject(hObj1);

    HOBJ hObj = mapCreateSiteObject(hMap, hSite, IDDOUBLE2, 0);
    mapSetObjectPress(hObj, 1);
    mapRegisterDrawObject(hObj, 0, LOCAL_TITLE);

    IMGTEXT textParm;
    memset(&textParm, 0, sizeof(IMGTEXT));
    textParm.Color = RGB(0, 0, 0);
    textParm.BkgndColor = IMGC_TRANSPARENT;
    textParm.ShadowColor = RGB(255, 255, 255);
    textParm.Height = 4000;
    textParm.Weight = FW_NORMAL;
    textParm.Outline = 0;
    textParm.Interval = 255;
    textParm.Align = FA_MIDDLE;
    textParm.Service = 0;
    textParm.Wide = UNIW_NORMAL;
    textParm.Horizontal = 1;
    textParm.Italic = 0;
    textParm.Underline = 0;
    textParm.StrikeOut = 0;
    textParm.Type = 0;
    textParm.CharSet = RUSSIAN_CHARSET;
    textParm.Flag = 0;
    mapAppendDraw(hObj, IMG_TEXT, reinterpret_cast<const char *>(&textParm));

    QTextCodec::setCodecForTr(QTextCodec::codecForName("KOI8-R"));
    QString text = tr("русскийтекст");
    mapPutTextUnicode(hObj, reinterpret_cast<const WCHAR *>(text.constData()), 0);
    mapPutTextVerticalAlign(hObj, FA_MIDDLE, 0);
    mapPutTextHorizontalAlign(hObj, FA_CENTER, 0);

    mapAppendPointPlane(hObj, 6162000, 7420000);

    mapCommitObject(hObj);
Надпись ведет себя по-разному, если в ней есть пробел, английский символ или цифра в зависимости от их положения (в начале, середине или в конце надписи). Например:
   " русскийтекст";
   "русский текст"
   "русскийтекст";
   "Rusрусский";
   "руссRusкий";
   "русскийRus";
   "123456русскийтекст";
   "русский123текст"
   "русскийтекст123"
Полностью английские надписи выравниваются нормально.
Пишу на astra linux 1.5.
 
А если еще включить фон textParm.BkgndColor = (0, 0, 255); то можно увидеть много интересного.
 
Здравствуйте!
Проблему повторили - проявляется при отображении в экранном виде: будет исправлена в следующей версии ГИС Конструктор. Спасибо!
 
Здравствуйте. Использую ГИС Конструктор.

// Версия библиотеки MapAccess
#define MAPACCESSVERSION  20130912

// Версия интерфейса MAPAPI и ядра библиотеки
#define MAPAPIVERSION  0x111015

На данной версии текст выравнивается только по левой стороне независимо от выставляемых флагов. Можно ли это как-то обойти, не обновляясь до более новой версии?

В то же время выравнивание работает нормально под Windows в GIS ToolKit следующей версии:

// Версия библиотеки MapAccess
#define MAPACCESSVERSION  20160907


// Версия интерфейса MAPAPI и ядра библиотеки
#define MAPAPIVERSION  0x0111305
Изменено: Сергей - 18.10.2019 11:37:33 (Добавление информации по версии для Windows)
 
Помимо того, что он не выравнивается, он еще и не растягивается(сжимается) между указанными точками метрики.

Надеюсь, что ответ все-таки будет на данный вопрос.
 
Здравствуйте!      

Для диагностики был подготовлен пример, который создает на карте Ногинска точеный объект и объект с типом подпись. Для объекта с типом подпись устанавливается выравнивание и признак растягивания по метрике. Результат выводится в файл .png. В полученном изображении подписи отображаются корректно. Пожалуйста, если требуется, модифицируйте данный пример для демонстрации некорректного поведения.
Код
#include <QImage>
#include <QTextCodec>

#include "mapapi.h"
#include "maptype.h"
#include "mapsyst.h"

void PaintMapToFile(HMAP hMap, int width, int height, DOUBLEPOINT point, char * fileName)
{
  mapPlaneToPicture(hMap, &point.x, &point.y);
  int left = point.x - width/2;
  int top  = point.y - height/2;

  int  mapdepth = 32;
  long alignwidth = width * (mapdepth / 8);
  long size   = alignwidth*height;
  char * bits = ::AllocateTheMemory(size);
  if(!bits)
    return;
  memset(bits, 0x0, size);

  XIMAGEDESC Ximagedesc;
  Ximagedesc.Point     = bits;                       // Адрес начала области пикселов
  Ximagedesc.Width     = width;                      // Ширина строки в пикселах
  Ximagedesc.Height    = height;                     // Число строк
  Ximagedesc.Depth     = mapdepth;                   // Размер элемента в битах (8,15,16,24,32)
  Ximagedesc.CellSize  = mapdepth / 8;               // Размер элемента(пиксела) в байтах
  Ximagedesc.RowSize   = width * Ximagedesc.CellSize;// Ширина строки в байтах

  RECT RectDraw;
  RectDraw.left = left;
  RectDraw.top  = top;
  RectDraw.right  = left + width;
  RectDraw.bottom = top + height;

  mapPaintToXImage(hMap, &Ximagedesc, 0, 0, &RectDraw);

  QImage image((uchar *)bits, width, height, QImage::Format_RGB32);
  image.save(fileName);
  FreeTheMemory(bits);
}

void CreateSiteObject(HMAP hMap, HSITE hSite, IMGTEXT imgText, long horizontalAlign, DOUBLEPOINT point)
{
  HOBJ hObj1 = mapCreateSiteObject(hMap, hSite, IDDOUBLE2, 0);
  mapRegisterObject(hObj1, 31133000, LOCAL_POINT);
  mapAppendPointPlane(hObj1, point.x, point.y);
  mapAppendSemantic(hObj1, 31001, "500", 20);
  mapAppendSemantic(hObj1, 31002, "5646065", 20);
  mapCommitObject(hObj1);

  HOBJ hObj = mapCreateSiteObject(hMap, hSite, IDDOUBLE2, 0);
  mapSetObjectPress(hObj, 1);
  mapRegisterDrawObject(hObj, 0, LOCAL_TITLE);
  mapAppendDraw(hObj, IMG_TEXT, reinterpret_cast<const char *>(&imgText));

  mapPutText(hObj, "Пример текста", 0);
  mapPutTextVerticalAlign(hObj, FA_MIDDLE, 0);
  mapPutTextHorizontalAlign(hObj, horizontalAlign, 0);

  int textSize = 500;
  mapAppendPointPlane(hObj, point.x, point.y);
  mapAppendPointPlane(hObj, point.x, point.y + textSize);

  mapCommitObject(hObj);
}

int main(int argc, char *argv[])
{
  HMAP hMap = mapOpenData("/tmp/Noginsk/Noginsk.sit");
  HSITE hSite = mapCreateAndAppendTempSite(hMap, 0);

  IMGTEXT imgText;
  memset(&imgText, 0, sizeof(IMGTEXT));
  imgText.Color = RGB(0, 0, 0);
  imgText.BkgndColor = IMGC_TRANSPARENT;
  imgText.ShadowColor = RGB(255, 255, 255);
  imgText.Height = 4000;
  imgText.Weight = FW_NORMAL;
  imgText.Outline = 0;
  imgText.Align = FA_MIDDLE;
  imgText.Service = 0;
  imgText.Wide = UNIW_NORMAL;
  imgText.Horizontal = 1;
  imgText.Italic = 0;
  imgText.Underline = 0;
  imgText.StrikeOut = 0;
  imgText.Type = 0;
  imgText.CharSet = RUSSIAN_CHARSET;
  imgText.Flag = IMGTEXT_SCALE;

  DOUBLEPOINT point;
  point.x = 6169000;
  point.y = 7450000;
  int objectSpacing = 6000;

  CreateSiteObject(hMap, hSite, imgText, FA_LEFT, point);
  point.y += objectSpacing;
  CreateSiteObject(hMap, hSite, imgText, FA_CENTER, point);
  point.y += objectSpacing;
  CreateSiteObject(hMap, hSite, imgText, FA_RIGHT, point);

  DOUBLEPOINT drawPoint = point;
  drawPoint.y -= objectSpacing;
  PaintMapToFile(hMap, 800, 600, drawPoint, "/tmp/alignexample.png");

  return 0;
}
 
Цитата
Константин Ганюшин написал:
Пожалуйста, если требуется, модифицируйте данный пример для демонстрации некорректного поведения.
Здравствуйте, спасибо за ответ. Сделал следующие поправки, чтобы воспроизвести мою проблему.

1. Заменил путь(скорее не принципиальная правка)
Код
HMAP hMap = mapOpenData("/tmp/Noginsk/Noginsk.sit");
на
Код
HMAP hMap = mapOpenData("/usr/Operator11/Data/Noginsk/Noginsk.sit"/*"/tmp/Noginsk/Noginsk.sit"*/);
2. Сделал вывод текста в виде юникода путем замены строчки:
Код
mapPutText(hObj, "Пример текста", 0);
на
Код
  WCHAR buf[1024];
  Unicode8ToUnicode("Пример текста", buf, sizeof(buf));

  mapPutTextUn(hObj, buf, 0);

Получил следующую картинку, в которой выравнивание текста не работает:



Вот какие-то иероглифы под текстом явно выравниваются, но не текст.

Спасибо.
 
Цитата
Сергей написал:
Вот какие-то иероглифы под текстом явно выравниваются, но не текст.
Судя по всему какие-то иероглифы - это то, что выводится функцией mapPutText(из исходного примера) и что-то в памяти не чистится, несмотря на то, что удалял физически файл после перезапуска приложения.
Изменено: Сергей - 28.10.2019 13:23:01 (Уточнение)
 
Дополнительно ко всему все эти тестовые подписи нанеслись на основную карту, а не на временную, создаваемую функцией mapCreateAndAppendTempSite.
 
Где-то я уже это видел =)
Страницы: 1 2 3 След.
Читают тему (гостей: 1)



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

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