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

[MAPAPI] Отрисовка значка с прозрачным фоном из классификатора

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: Пред. 1 2
RSS
[MAPAPI] Отрисовка значка с прозрачным фоном из классификатора
 
Здравствуйте. Подскажите еще пожалуйста, как получить значок из библиотеки .iml?
 
Чуть-чуть по-другому, из-за того, что на вид знака влияет установленная семантика, надо создавать временную карту, на ней создавать объект и задавать семантики и отображать карту или по HSelect один объект.
 
Цитата
Vladimir Letov написал:
Чуть-чуть по-другому, из-за того, что на вид знака влияет установленная семантика, надо создавать временную карту, на ней создавать объект и задавать семантики и отображать карту или по HSelect один объект.
А можно привести пример или написать, какие функции MAPAPI для этого использовать, но для отрисовки не использовать hdc?
 
обычное рисование карты без HDC - mapPaintToXImage
 
Цитата
Vladimir Letov написал:
обычное рисование карты без HDC - mapPaintToXImage
Как рисовать карту - я знаю. Мне интересно, как отрисовать иконку из .iml.
 
Чтобы нарисовать иконку из графического файла не обязательно применять IML.
Такие знаки поддерживаются в классификаторе RSC. Редактировать классификатор лучше в MS Windows. Отображение выполняется на различных платформах.
Перечень видов графических функций описан в mapgdi.h.
Их можно вызывать из тела функции IML. Для отрисовки графического файла есть функция IMG_GRAPHICMARK, для отображения знака в памяти программы - IMG_PICTURE.

Исходные тексты всех библиотек IML размещены в разделе Скачать в архиве sdk12.zip -
http://gisinfo.ru/download?id=229

Тексты являются общими для всех платформ.
Параметр "hdc" приходит из библиотеки ядра и обрабатывается функцией ядра. Это абстрактный идентификатор устройства вывода,
имеющий разный физический смысл на разных платформах.

Пример функции, которая по ломаной линии рисует дугу (как бы сглаживает):
Код
// --------------------------------------------------------
// Дуга по ломаной линии (параллели, меридианы и пр.)  
// --------------------------------------------------------
int _fastcall PolyArc(const POLYDATAEX* pdata, const IMGDRAW* draw,
                      const IMGCONTEXT * context, int test,
                      FRAME * border)
{
 const char * lineparm;
 int          linefunc;
 DRAWPOINT    points[200];
 int    number;
 int          ret = 0;

 POLYDATAEX   data;

 if (pdata == 0) return 0;

 // Тип функции
 linefunc = imlDrawType(draw, 1);

 // Параметры функции
 lineparm = imlDrawParm(draw, 1);

 // Настраиваем адреса исходной метрики
 DRAWPOINT * pointin = (DRAWPOINT *)(pdata->Points);
 int *  counts  = pdata->PolyCounts;
 int count           = pdata->Count;

 // Настраиваем адреса выходной метрики
 data.Points     = points;
 data.PolyCounts = &number;
 data.Count      = 1;

 while(count-- > 0)
  {
    int polycount = *counts;  // Установим число точек в ломанной

    counts++;                 // Переходим к следуюшей ломаной

    if ((polycount < 1) || (polycount > 200000))
      return ret;      // Ошибка в данных

    if (polycount < 3)
      {
         // Рисуем отрезок
         data.Points     = pointin;
         number          = polycount;

         ret |= imgPrepareImage(&data, linefunc, lineparm, context, test, border);

         if ((ret != 0) && (test == PREPARE_TEST))
           return 1;

         data.Points     = points;

         pointin += polycount;
         continue;
      }

    while(polycount-- > 2)
    {
      DOUBLEPOINT   p1;
      DOUBLEPOINT   p2;
      DOUBLEPOINT   p3;
      DOUBLEPOINT   pc;
      double        radius;

      // Найти центр окружности по трем точкам
      p1.X = pointin->x;
      p1.Y = pointin->y;
      p2.X = (pointin+1)->x;
      p2.Y = (pointin+1)->y;
      p3.X = (pointin+2)->x;
      p3.Y = (pointin+2)->y;

      radius = imlCircleCenter(&p1, &p2, &p3, &pc);

      if (radius > 0)
        {
          DRAWPOINT * pb = pointin;
          DRAWPOINT * pe = pointin+1;
          DRAWPOINT   pv;
          if (polycount <= 2)
            pe = pointin+2;

          double dx     = pe->x - pb->x;
          double dy     = pe->y - pb->y;
          double length = sqrt(dx * dx + dy * dy) * 15;
          if (length < radius)
            {
              radius = 0;
            }
          else
            {
              pv.x = pc.X;
              pv.y = pc.Y;

              // Определим направление окружности
              if (imlPointSideNearLine(&p2, &p1, &p3) == imlLEFT)
                {
                  // Развернем окружность, она обычно идет по часовой
                  DRAWPOINT * pt = pb;
                  pb = pe;
                  pe = pt;
                }

              // Строим по первым двум точкам дугу
              if (imlBuildArc(pb, &pv, pe, radius, &data) == 0)
                radius = 0;
            }
        }

      if (radius <= 0)
        {
          points[0].X = pointin->x;
          points[0].Y = pointin->y;
          points[1].X = (pointin+1)->x;
          points[1].Y = (pointin+1)->y;

          // Соединяем точки прямой линией
          if (polycount == 2)
            {
              number = 3;
              points[2].X = (pointin+2)->x;
              points[2].Y = (pointin+2)->y;
            }
          else
              number = 2;
        }

      ret |= imgPrepareImage(&data, linefunc, lineparm, context, test, border);

      if ((ret != 0) && (test == PREPARE_TEST))
        return 1;

      // Перейти к следующей паре точек
      if (polycount <= 2)
        {
          pointin += 3;
          break;
        }
      else
        {
          pointin++;
        }
    }
  }

 return ret;
}
 
Для просто объектов на пользовательском слое можно добавить семантику "Вес цвета объекта в процентах" со значением 100 - и получим объект с прозрачным фоном вместо условного белого.

На версии 12.5.0 это работает (фон прозрачный), на версии 12.3.1 (и, возможно, более ранних) -  фон остаётся белым, и становится более прозрачным в зависимости от значения семантики.

И надеюсь что так оно и останется (как в 12.5.0).

P.S. для некоторых объектов цвет фона становился прозрачным не при значении 100, а при значении 95, к примеру.
Изменено: Владимир Егоров - 26.04.2019 17:25:06
Страницы: Пред. 1 2
Читают тему (гостей: 1)



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

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