 |
www.integro.ru ЦСИ ИНТЕГРО
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Kolya
Зарегистрирован: 19.02.2013 Сообщения: 1 Откуда: Екатеринбург
|
Добавлено: Вт 19 Фев 2013 10:13 Заголовок сообщения: Вопросы: Surface.DeviceType для принтера актуален? Масштаб inptSymbol - графический смысл? |
|
|
Приветствую уважаемых разработчиков Ingeo.
У меня в разработке плагин, функционал - показ иконок на карте и работа с их данными из БД другой системы, хранение примитивного представления по этим объектам в БД Ingeo. Пользуюсь своим слоем с паинтером типа inptSymbol, рисующим объекты в виде Rect. Это для всех пользователей. Для своих - поверх Rect рисую иконки, сложно зависящие от типа и статуса объекта. Иконки имеют прозрачные границы, поэтому для корректного отображения с возможностью масштабирования превращаю их в 32-битные БМП с альфа-каналом и вывожу через AlphaDraw на Surface.DC.
О том что это немного не по стандарту и возможны проблемы несовместимости с GDI+ и принтером знаю, но вопрос немного в другом.
1. Для отрисовки собственной графики использую событие IIngeoDbPaintSink.PaintComplete. Столкнулся с тем что при выводе на принтер (или же в растр), в параметре aSurface свойство DeviceType (тип устройства вывода) всегда установлено в indtScreen. Я ожидал по логике вещей что свойство будет принимать значения indtPrinter или indtRaster. Не могли бы вы прояснить сей вопрос?
Дело в том что на экран вывожу растр фиксированной величины 1в1, а при выводе на "огромную канву" (в случае принтера) мне требуется масштабирование графиков, чтобы иконка не деградировала в точку. Я конечно могу опосредованно сориентироваться по размерам Девайса, но хотелось бы по человечески, иметь представление куда рисую.
2. Не могли бы вы пояснить, или же ткнуть носом где почитать. Я так понимаю что при выводе масштабируемой картинки в Ingeo, используется такой алгоритм расчетов.
Координаты_Map * ScaleFactor = Координаты_Paper. (бумажные)
Далее, Координаты_Paper * Неизвестный_K = Координаты_Device (устройство).
Где Неизвестный_K - некий коэффициент, постоянный и свой для каждого типа DC (экран, растр, принтер).
А вот с фигурой паинтера типа inptSymbol не совсем понятно. Я использую паинтер следующей конфигурации, который рисует на экране объекты Rect, не зависящие от ScaleFactor (тое немасштабируемые).
painter.PaintMethod := inppmSingle
local Picture := painter.Picture
Picture.X1 :=0
Picture.Y1 := 0
Picture.X2 :=1
Picture.Y2 := 1
local Figures := Picture.Figures
local Fig := Figures.Add(inftRect)
local R := 1/400 // меньше - меньше
Fig.Left := -1 * R)
Fig.Bottom, -1 * R)
Fig.Height := 2 * R
Fig.Width := 2 * R
Fig.Visible := True
Этот паинтер рисует квадратики так, как мне надо, но хотел бы лучше разбираться в том как связан размер фигуры с тем что выводится на экране.
Не могли бы вы пояснить связь "размера рисунка" Figure.X1,Y1,X2,Y2 c "размером фигуры" Fig.Bottom..Fig.Width и математику расчета итогового изображения для такого паинтера на Device. Хотелось бы не подбором коэффициентов заниматься а понимать что я делаю)).
Еще забавный феномен отметил - квадратики на широкоформатном мониторе превращаются в прямоугольнички))
С уважением, Николай. |
|
Вернуться к началу |
|
 |
Михаил Власов

Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
|
Добавлено: Вт 19 Фев 2013 14:00 Заголовок сообщения: |
|
|
Kolya писал(а): | Столкнулся с тем что при выводе на принтер (или же в растр), в параметре aSurface свойство DeviceType (тип устройства вывода) всегда установлено в indtScreen. Я ожидал по логике вещей что свойство будет принимать значения indtPrinter или indtRaster. Не могли бы вы прояснить сей вопрос?
Дело в том что на экран вывожу растр фиксированной величины 1в1, а при выводе на "огромную канву" (в случае принтера) мне требуется масштабирование графиков, чтобы иконка не деградировала в точку. Я конечно могу опосредованно сориентироваться по размерам Девайса, но хотелось бы по человечески, иметь представление куда рисую. |
Для определения коэффициента масштабирования рисунка лучше использовать метод IIngeoPaintSurface.SizePaperToDevice.
Например, вызов SizePaperToDevice(0.01) вернет количество точек устройства вывода в одном сантиметре.
Kolya писал(а): |
2. Не могли бы вы пояснить, или же ткнуть носом где почитать. Я так понимаю что при выводе масштабируемой картинки в Ingeo, используется такой алгоритм расчетов.
Координаты_Map * ScaleFactor = Координаты_Paper. (бумажные)
Далее, Координаты_Paper * Неизвестный_K = Координаты_Device (устройство).
Где Неизвестный_K - некий коэффициент, постоянный и свой для каждого типа DC (экран, растр, принтер).
А вот с фигурой паинтера типа inptSymbol не совсем понятно. Я использую паинтер следующей конфигурации, который рисует на экране объекты Rect, не зависящие от ScaleFactor (тое немасштабируемые).
painter.PaintMethod := inppmSingle
local Picture := painter.Picture
Picture.X1 :=0
Picture.Y1 := 0
Picture.X2 :=1
Picture.Y2 := 1
local Figures := Picture.Figures
local Fig := Figures.Add(inftRect)
local R := 1/400 // меньше - меньше
Fig.Left := -1 * R)
Fig.Bottom, -1 * R)
Fig.Height := 2 * R
Fig.Width := 2 * R
Fig.Visible := True
Этот паинтер рисует квадратики так, как мне надо, но хотел бы лучше разбираться в том как связан размер фигуры с тем что выводится на экране.
Не могли бы вы пояснить связь "размера рисунка" Figure.X1,Y1,X2,Y2 c "размером фигуры" Fig.Bottom..Fig.Width и математику расчета итогового изображения для такого паинтера на Device. Хотелось бы не подбором коэффициентов заниматься а понимать что я делаю)). |
Есть:
1. Координаты рисунка IIngeoPicture.X1,X2,Y1,Y2 и координаты элементов рисунка.
2. Масштаб, для которого задан рисунок pzs = IIngeoSymbolPainter.PictureZoomScale.
3. Текущий масштаб отображения zs = IIngeoPaintSurface.Projection.ZoomScale.
4. Точка вставки рисунка в координатной системе территории карты wp.
Надо:
Пересчитать координаты элемента рисунка в координаты устройства.
Алгоритм:
1. Вычисляем точку вставки рисунка в "бумажных" кординатах pp = IIngeoPaintSurface.Projection.ProjectPoint(wp).
2. Вычисляем коэффициент пересчета координат рисунка в "бумажные" pps:
if pzs > 0 then begin
pps := zs/pzs
end
else begin
pps := 1;
end;
3. Координаты рисунка умножаем на pps и смещаем на pp.
4. При необходимости пересчитываем "бумажные" координаты в координаты устройства при помощи IIngeoPaintSurface.PointPaperToDevice
Kolya писал(а): | Еще забавный феномен отметил - квадратики на широкоформатном мониторе превращаются в прямоугольнички)) |
Если пикселы квадратные и драйвер устройства возвращает правильную информацию о DPI, то такого не должно быть. _________________ С уважением, Михаил Власов. |
|
Вернуться к началу |
|
 |
andreichernov
Зарегистрирован: 14.02.2005 Сообщения: 209 Откуда: Самара
|
Добавлено: Вт 19 Фев 2013 14:05 Заголовок сообщения: |
|
|
Цитата: |
Kolya писал(а):
Еще забавный феномен отметил - квадратики на широкоформатном мониторе превращаются в прямоугольнички))
Если пикселы квадратные и драйвер устройства возвращает правильную информацию о DPI, то такого не должно быть. |
Это часто происходит при подключении через удаленный рабочий стол или при использовании внешних панелей.
Меню Сервис..Параметры..Разное..Размеры монитора в мм укажите истинные значения. |
|
Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять приложения в этом форуме Вы можете скачивать файлы в этом форуме
|
|