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

paintxml

 
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков
Предыдущая тема :: Следующая тема  
Автор Сообщение
sergey



Зарегистрирован: 18.09.2012
Сообщения: 14

СообщениеДобавлено: Вт 06 Ноя 2012 13:30    Заголовок сообщения: paintxml Ответить с цитатой

требуется из определенного слоя получить снимок прямоугольной области(к примеру координата верхнего угла (1,4) ширина и высота прямоугольника соответственно по 200).как это осуществить с помощью данной функции?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
APopov



Зарегистрирован: 19.06.2006
Сообщения: 347
Откуда: Самара

СообщениеДобавлено: Вт 06 Ноя 2012 14:57    Заголовок сообщения: Ответить с цитатой

доп инфо по paintXML см тут
"C:\Program Files\Integro\InGeo\IngeoIntfs.chm"

Код:
option explicit

sub SaveToFile (fn, cx, cy, scale)
  dim iImg, cont
  dim pXML
  set iImg = application.CreateObject (inocImage, null)
  with iImg
    .Width = 300
    .Height = 300
    .ResolutionX = 120
    .ResolutionY = 120
    .TransparentColor = 0
  End With
  with iImg.Surface
    .Navigator.YMirror = false
    .Navigator.XAngle = 0
    .Navigator.Navigate cx, cy, scale
  end with
  pXML = "<paint> <project oid='"+Application.ActiveProjectView.Project.ID+"'/> </paint>"
  application.activedb.paintXML iImg.Surface, pXML
  set cont = application.activedb.MapObjects.GetObject(application.Selection.IDs(0)).Shapes.item(0).Contour
  iImg.Surface.Brush.BackColor = &h00FF00
  iImg.Surface.Brush.Style = 0
  iImg.Surface.Pen.Color = &h0000FF
  iImg.Surface.Pen.WidthInMM = 0.2
  iImg.Surface.PaintContour cont
  iImg.SaveToFile fn
end sub

sub run
  SaveToFile "d:\t.bmp", 47300, 45200, 1/2000
end sub

_________________
ОАО "Самара-Информспутник",
инженер-программист Попов Артем
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
sergey



Зарегистрирован: 18.09.2012
Сообщения: 14

СообщениеДобавлено: Вт 06 Ноя 2012 17:31    Заголовок сообщения: Ответить с цитатой

Код:

IInImage image = (IInImage)ingeo.CreateObject(TIngeoObjectClass.inocImage, null);
 XmlDocument paintXmlDoc = new XmlDocument();
            paintXmlDoc.LoadXml("<paint/>");
            //XmlElement prjElem = paintXmlDoc.CreateElement("project");
            //prjElem.SetAttribute("oid", ingeo.ActiveProjectView.Project.ID);
            //paintXmlDoc.DocumentElement.AppendChild(prjElem);

            foreach (IIngeoMapView mapview in ingeo.ActiveProjectView.MapViews)
            {
                if ((mapview.Visible) && (mapview.Map.ID != "0001000003EB"))
                {
                    XmlElement mapElem = paintXmlDoc.CreateElement("map");
                    mapElem.SetAttribute("oid", mapview.Map.ID);
                    paintXmlDoc.DocumentElement.AppendChild(mapElem);
                }
            }
            XmlElement elem2;
            XmlElement elem = paintXmlDoc.CreateElement("conture");
            elem2 = paintXmlDoc.CreateElement("point");
            elem2.SetAttribute("x", "12");
            elem2.SetAttribute("y", "23");
            elem.AppendChild(elem2);

            elem2 = paintXmlDoc.CreateElement("point");
            elem2.SetAttribute("x", "120");
            elem2.SetAttribute("y", "230");
            elem.AppendChild(elem2);
            paintXmlDoc.DocumentElement.AppendChild(elem);
 ingeo.ActiveDb.PaintXml(image.Surface, paintXmlDoc.OuterXml);

            image.SaveToFile(filename);


получается сохранить картинку,но не ту что надо.что ни так?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
APopov



Зарегистрирован: 19.06.2006
Сообщения: 347
Откуда: Самара

СообщениеДобавлено: Вт 06 Ноя 2012 18:05    Заголовок сообщения: Ответить с цитатой

Ответ зависит от того, что вы пытались сохранить и что получилось при сохранении.
код вроде правильный (опять же, что конкретно вам надо не ясно, поэтому эта оценка приблизительна)
т.к. вам таки удалось сохранить изображение, то весь вопрос в том, соответствуют ли ваши желания вашему коду Smile

_________________
ОАО "Самара-Информспутник",
инженер-программист Попов Артем
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
sergey



Зарегистрирован: 18.09.2012
Сообщения: 14

СообщениеДобавлено: Вт 06 Ноя 2012 19:21    Заголовок сообщения: Ответить с цитатой

мне нужно сохранить в файл определенную прямоугольную область карты.
К пример из слоя test сохранить в файл прямоугольную картинку(верхний левый угол координата 23,23 ширина 100 высота 100) при маштабе равном 10.
Помогите
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
APopov



Зарегистрирован: 19.06.2006
Сообщения: 347
Откуда: Самара

СообщениеДобавлено: Вт 06 Ноя 2012 19:41    Заголовок сообщения: Ответить с цитатой

см код выше, в частности, это
Код:
with iImg
    .Width = 300
    .Height = 300
    .ResolutionX = 120
    .ResolutionY = 120
    .TransparentColor = 0
  End With
  with iImg.Surface
    .Navigator.YMirror = false
    .Navigator.XAngle = 0
    .Navigator.Navigate cx, cy, scale
  end with

_________________
ОАО "Самара-Информспутник",
инженер-программист Попов Артем
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
sergey



Зарегистрирован: 18.09.2012
Сообщения: 14

СообщениеДобавлено: Ср 07 Ноя 2012 19:14    Заголовок сообщения: Ответить с цитатой

более менее разобрался. подскажите как определить
.Width = ?
.Height = ?
если известны:маштаб,координаты середины!(cx, cy, scale )
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
APopov



Зарегистрирован: 19.06.2006
Сообщения: 347
Откуда: Самара

СообщениеДобавлено: Ср 07 Ноя 2012 21:18    Заголовок сообщения: Ответить с цитатой

Вот есть функция в которой увязаны 4 параметра -
dpi, RealSize_InMetr, pixelSize, scale1to:
Код:
function CalcResolutionDPI(const RealSize_InMetr :double; pixelSize, scale1to:integer):integer;
  begin
    Result := trunc( (0.0254*pixelSize*scale1to) / RealSize_InMetr );
  end;


из нее можно выразить один из этих четырёх зная три других.
здесь "scale1to" это масштаб вида "2000" (а не "0.0005" // = 1/2000 )

_________________
ОАО "Самара-Информспутник",
инженер-программист Попов Артем
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Чт 08 Ноя 2012 13:24    Заголовок сообщения: Ответить с цитатой

Посчитать область карты, попавшую в растр, можно так:
Код:
option explicit




function Get_map_size(size_in_pixels, resolution, scale)
   dim size_in_inches, size_in_meters
   size_in_inches = size_in_pixels/resolution
   size_in_meters = size_in_inches*2.54/100
   Get_map_size = size_in_meters/scale
end function




function Get_map_dx_dy( _
   width, height, resolution_x, resolution_y, _
   scale, x_angle, y_mirror, _
   out_dx, out_dy)
   
   dim swap_x_y
   swap_x_y = (x_angle <> 0) and y_mirror
   if swap_x_y then
      out_dy = Get_map_size(width, resolution_x, scale)
      out_dx = Get_map_size(height, resolution_y, scale)
   else
      out_dx = Get_map_size(width, resolution_x, scale)
      out_dy = Get_map_size(height, resolution_y, scale)
   end if
end function




function Get_map_x1_x2_y1_y2( _
   width, height, resolution_x, resolution_y, _
   cx, cy, scale, x_angle, y_mirror, _
   out_x1, out_x2, out_y1, out_y2)
   
   dim dx, dy
   Get_map_dx_dy _
      width, height, resolution_x, resolution_y, _
      scale, x_angle, y_mirror, _
      dx, dy
      
   out_x1 = cx - dx/2
   out_x2 = cx + dx/2
   out_y1 = cy - dy/2
   out_y2 = cy + dy/2
end function




const PI = 3.14

dim x1, x2, y1, y2
Get_map_x1_x2_y1_y2 _
   800, 600,  96, 96, _
   50.0, 100.0, 1/5000, PI/2, true, _
   x1, x2, y1, y2

MsgBox "x: [" & x1 & " .. " & x2 & "]" & vbNewLine & "y: [" & y1 & " .. " & y2 & "]"


' Вывод:
' x: [-346,875 .. 446,875]
' y: [-429,166666666667 .. 629,166666666667]

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Чт 08 Ноя 2012 13:54    Заголовок сообщения: Ответить с цитатой

Посчитать параметры растра для вывода заданного участка карты в заданном масштабе можно так:
Код:
option explicit




sub Get_image_params( _
   x1, x2, y1, y2, _
   scale, x_angle, y_mirror, _
   resolution_x, resolution_y, _
   out_width, out_height, out_center_x, out_center_y)
   
   dim swap_x_y, dx, dy
   
   swap_x_y = (x_angle <> 0) and y_mirror
   
   dx = x2 - x1
   dy = y2 - y1
   out_center_x = (x1 + x2)/2
   out_center_y = (y1 + y2)/2
   
   dim width_in_meters, height_in_meters
   if swap_x_y then
      width_in_meters = dy*scale
      height_in_meters = dx*scale
   else
      width_in_meters = dx*scale
      height_in_meters = dy*scale
   end if
   
   dim width_in_inches, height_in_inches
   width_in_inches = width_in_meters*100/2.54
   height_in_inches = height_in_meters*100/2.54
   
   out_width = Round(width_in_inches*resolution_x)
   out_height = Round(height_in_inches*resolution_y)
end sub




const PI = 3.14

dim width, height, center_x, center_y

Get_image_params _
   -346.875, 446.875, -429.166666666667, 629.166666666667,  _
   1/5000, PI/2, true, _
   96, 96, _
   width, height, center_x, center_y

MsgBox "size: [" & width & " x " & height & "]" & vbNewLine & "center: [" & center_x & " x " & center_y & "]"


' Вывод:
' size: [800 x 600]
' center: [50 x 100]

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
sergey



Зарегистрирован: 18.09.2012
Сообщения: 14

СообщениеДобавлено: Пн 12 Ноя 2012 11:22    Заголовок сообщения: Ответить с цитатой

Код:

while (m < maxY)
                   {
image = (IInImage)obj.ingeo.CreateObject(TIngeoObjectClass.inocImage, null);

                       image.Height = 256;
                       image.Width = 256;
                       image.Surface.Navigator.Navigate(n + shag_taila / 2, m + shag_taila / 2, current);
                       image.Surface.Navigator.FitWorldBounds(n, m, n + shag_taila, m + shag_taila, TIngeoNavigatorFitMode.infitNoScale);


               
                       obj.ingeo.ActiveDb.PaintXml(image.Surface, paintXmlDoc.OuterXml);
.........

ЭТОТ код работает.Но больно медленно.У меня вот такой вопрос,можно ли с помощью метода .PaintXml залить в image весь слой(один раз) а дальше с помощью Surface.Navigator делать навигацию и таскать информацию?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Пн 12 Ноя 2012 15:21    Заголовок сообщения: Ответить с цитатой

sergey писал(а):
Код:

while (m < maxY)
                   {
image = (IInImage)obj.ingeo.CreateObject(TIngeoObjectClass.inocImage, null);

                       image.Height = 256;
                       image.Width = 256;
                       image.Surface.Navigator.Navigate(n + shag_taila / 2, m + shag_taila / 2, current);
                       image.Surface.Navigator.FitWorldBounds(n, m, n + shag_taila, m + shag_taila, TIngeoNavigatorFitMode.infitNoScale);


               
                       obj.ingeo.ActiveDb.PaintXml(image.Surface, paintXmlDoc.OuterXml);
.........

ЭТОТ код работает.Но больно медленно.У меня вот такой вопрос,можно ли с помощью метода .PaintXml залить в image весь слой(один раз) а дальше с помощью Surface.Navigator делать навигацию и таскать информацию?


Я так понимаю, что под "весь слой" вы имеете в виду "всю территорию по километражу".

Если в 256х256, то можно, но мало пользы.

Если в 100500х100500 - не хватит памяти.

Только кусками, кратными 256х256 (кратность выяснять опытным путем). Вытаскивать можно через Image.Surface.DC через WinApi BitBlt. На VBScripte не выйдет, но в вашем примере я наблюдаю C#. Искать в гугле "bitblt c# graphics".

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
sergey



Зарегистрирован: 18.09.2012
Сообщения: 14

СообщениеДобавлено: Пн 12 Ноя 2012 17:23    Заголовок сообщения: Ответить с цитатой

Мне просто на мгновение показалось что IInImage это компонент где рисуются карты(canvas как бы).А это у вас синоним system.drawing.bimap с добавленным функционалом.Я правильно понял?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Вт 13 Ноя 2012 08:43    Заголовок сообщения: Ответить с цитатой

sergey писал(а):
Мне просто на мгновение показалось что IInImage это компонент где рисуются карты(canvas как бы).А это у вас синоним system.drawing.bimap с добавленным функционалом.Я правильно понял?

Правильно поняли.

А "компонент где рисуются карты(canvas как бы)" - это IIngeoPaintSurface.

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
sergey



Зарегистрирован: 18.09.2012
Сообщения: 14

СообщениеДобавлено: Вт 13 Ноя 2012 10:40    Заголовок сообщения: Ответить с цитатой

У меня вот какая идея,а почему бы не сделать следующим образом.


Код:

//создаем картинку размером 256 на 256,внутри которой находится IIngeoPaintSurface
 image = (IInImage)obj.ingeo.CreateObject(TIngeoObjectClass.inocImage, null);

                       image.Height = 256;
                       image.Width = 256;
тут мы в IIngeoPaintSurface перекидываем то что нужно
 obj.ingeo.ActiveDb.PaintXml(image.Surface, paintXmlDoc.OuterXml);
//тут проводим навигацию по IIngeoPaintSurface
                       image.Surface.Navigator.Navigate(n + shag_taila / 2, m + shag_taila / 2, current);
                       image.Surface.Navigator.FitWorldBounds(n, m, n + shag_taila, m + shag_taila, TIngeoNavigatorFitMode.infitNoScale);
//тут мы помещаем результат навигации(видимую область) в картинку размером 256 на 256 и сохраняем
  image.SaveToFile(path + @"\" + current_folder + @"\" + po_x.ToString() + "_" + po_y + ".jpg");                   

Но если я делаю так то он сохраняет непонятно что
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Вт 13 Ноя 2012 15:12    Заголовок сообщения: Ответить с цитатой

sergey писал(а):
У меня вот какая идея,а почему бы не сделать следующим образом.
Код:
...

Но если я делаю так то он сохраняет непонятно что


Перед каждым тайлом надо чистить сюрфейс. Иначе карта будет наслаиваться.

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
sergey



Зарегистрирован: 18.09.2012
Сообщения: 14

СообщениеДобавлено: Вт 13 Ноя 2012 15:50    Заголовок сообщения: Ответить с цитатой

Мне нужно порезать слой на маленькие картинки.
Для этого в цикле я делаю это
Код:

  image = (IInImage)obj.ingeo.CreateObject(TIngeoObjectClass.inocImage, null);
                   
                       image.Height = 256;
                       image.Width = 256;
                       image.Surface.Navigator.Navigate(n + shag_taila / 2, m + shag_taila / 2, current);
                       image.Surface.Navigator.FitWorldBounds(n, m, n + shag_taila, m + shag_taila, TIngeoNavigatorFitMode.infitNoScale);

                       obj.ingeo.ActiveDb.PaintXml(image.Surface, paintXmlDoc.OuterXml);
 image.SaveToFile(path + @"\" + current_folder + @"\" + po_x.ToString() + "_" + po_y + ".jpg");

Тоесть чтобы получить маленькую картинку я каждый раз создаю объект image и вызываю метод paintxml.эТО ОПТИМАЛЬНЫЙ вариант?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Чт 15 Ноя 2012 13:07    Заголовок сообщения: Ответить с цитатой

[quote="sergey"]Мне нужно порезать слой на маленькие картинки.
Для этого в цикле я делаю это
Код:

                       image.Surface.Navigator.FitWorldBounds(n, m, n + shag_taila, m + shag_taila, TIngeoNavigatorFitMode.infitNoScale);

Это лишнее. Достаточно Navigate.

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
sergey



Зарегистрирован: 18.09.2012
Сообщения: 14

СообщениеДобавлено: Чт 15 Ноя 2012 22:18    Заголовок сообщения: Ответить с цитатой

возможно ли установить прозрачный цвет у сохраняемой картинки?(к примеру белый цвет у полученного png будет прозрачный)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Пт 16 Ноя 2012 08:33    Заголовок сообщения: Ответить с цитатой

sergey писал(а):
возможно ли установить прозрачный цвет у сохраняемой картинки?(к примеру белый цвет у полученного png будет прозрачный)

1. Заливаете фон IInImage "экзотическим" цветом, например rgb(1, 0, 0).
2. Рисуете поверх PaintXml.
3. Формируете растр.
4. Меняете "экзотический" цвет на прозрачный (какой-нибудь тулзой или библиотекой, например imagemagik).

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

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


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