  | 
				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, то такого не должно быть. | 	  
 
 
Это часто происходит при подключении через удаленный рабочий стол или при использовании внешних панелей.
 
 
Меню Сервис..Параметры..Разное..Размеры монитора в мм укажите истинные значения. | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять приложения в этом форуме Вы можете скачивать файлы в этом форуме
  | 
   
 
		 |