Список форумов www.integro.ru www.integro.ru
ЦСИ ИНТЕГРО
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Вопросы: Surface.DeviceType для принтера актуален? Масштаб inptSymbol - графический смысл?

 
Начать новую тему   Ответить на тему    Список форумов 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, то такого не должно быть.


Это часто происходит при подключении через удаленный рабочий стол или при использовании внешних панелей.

Меню Сервис..Параметры..Разное..Размеры монитора в мм укажите истинные значения.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков Часовой пояс: GMT + 5
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять приложения в этом форуме
Вы можете скачивать файлы в этом форуме


© phpBB Group
Русская поддержка phpBB