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

Создание легенды для макета печати.

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



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

СообщениеДобавлено: Чт 24 Мар 2016 12:57    Заголовок сообщения: Создание легенды для макета печати. Ответить с цитатой

Добрый день.

Хочу создать легенду для вставки в макет печати. Вроде все просто: перебираю слои и делаю PaintContour(). Примерно так:


Код:

    double x1 = 0, y1 = 0, x2 = 0, y2 = 0;
    var image = IngeoApplication.CreateObject(TIngeoObjectClass.inocImage, null) as IInImage;
     image.Height = 100*5;
     image.Width = 100*5;
     image.ResolutionX = 200;
     image.ResolutionY = 200;

     image.Surface.PointDeviceToPaper(-2, -2, out x1, out y1);
     image.Surface.PointDeviceToPaper(((100+2)* 500),
                                                             ((100+2)* 500), out x2,
                                                             out y2);

      var contour =
                                IngeoApplication.CreateObject(TIngeoObjectClass.inocContour, null) as IIngeoContour;
       var contourPart = contour.Insert();
       contourPart.InsertVertex(0, x1, y1, 0);
       contourPart.InsertVertex(-1, x1, y2, 0);
       contourPart.InsertVertex(-1, x2, y2, 0);
       contourPart.InsertVertex(-1, x2, y1, 0);
       contourPart.InsertVertex(-1, x1, y1, 0);
       contourPart.Closed = true;

       image.Surface.Navigator.ZoomToFitPaperRect(x1, y1, x2, y2);

       var style = IngeoApplication.ActiveDb.StyleFromID(styleId);

        style.PaintContour(image.Surface, contour, null);
        image.SaveToFile("D:\\test.bmp");



Все отлично получаю картинку. Но это хорошо работало до тех пор пока я не встретил стиль с двумя символьными методами отображения. И у одного из методов отображения рисунок задан для масштаба 1/1000. Результат я прикрепил в аттач. Выглядит ужасно не так ли)

И тут собственно несколько вопросов.

1. Как призумиться к объекту что бы от границ объекта до границ изображения были отступы?
PointDeviceToPaper() я добавил расширение на 2 по каждой координате, но это ни на что не повлияло.

2. Как сделать что бы символьный метод рисующий в вершинах контура рисовался в нормальном масштабе? Я пробовал приближаться по другому:
Код:

        var xc = ((x1 + x2) / 2);
        var yc = ((y1 + y2) / 2);
        image.Surface.Navigator.Navigate(xc,yc,1000);


Но получал просто белое изображение.



test.jpg
 Описание:
 Размер файла:  10.6 KB
 Просмотрено:  6479 раз(а)

test.jpg


Вернуться к началу
Посмотреть профиль Отправить личное сообщение
kliver



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

СообщениеДобавлено: Чт 24 Мар 2016 14:41    Заголовок сообщения: Ответить с цитатой

Ну ладно, со вторым вопросом вроде разобрался. Нужно координаты рисуемого контура помножить на текущий масштаб карты, тогда картинка выглядит по человечески.

Но я все же не могу получить отступы от границ изображения. Сейчас пробую так:

Код:

                            double x1 = 0, y1 = 0, x2 = 0, y2 = 0;
                            double xb1 = 0, yb1 = 0, xb2 = 0, yb2 = 0;

                            image.Surface.PointDeviceToPaper(0, 0, out x1, out y1);
                            image.Surface.PointDeviceToPaper(((LegendConfiguration.Размеры.Ширина)* 1000),
                                                             ((LegendConfiguration.Размеры.Высота)* 1000), out x2,
                                                             out y2);


                            image.Surface.PointDeviceToPaper(-100, -100, out xb1, out yb1);
                            image.Surface.PointDeviceToPaper(((LegendConfiguration.Размеры.Ширина) * 1000),
                                                             ((LegendConfiguration.Размеры.Высота) * 1000), out xb2,
                                                             out yb2);

                            image.Surface.Navigator.ZoomToFitPaperRect(xb1, yb1, xb2, yb2);


Координаты без индекса использую для рисования контура, а приближаюсь уже к координатам с отступами. Но к сожалению не могу найти нужную комбинацию значений отступов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
APopov



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

СообщениеДобавлено: Ср 30 Мар 2016 17:57    Заголовок сообщения: Ответить с цитатой

вот кусок кода из нашего создателя легенд:
Код:
//calc imgDrawRect
      iImg := CreateNewImg(imgWidthInMetr, imgHeightInMetr);
      tmpSZ.cx := max(1, iImg.Width*5 div 100);//5% от ширины в пикс, но не меньше 1 пикс
      tmpSZ.cy := max(1, iImg.Height*5 div 100);//5% от высоты в пикс, но не меньше 1 пикс
      iImg.Surface.PointDeviceToWorld(tmpSZ.cx,tmpSZ.cy, imgP1.X,imgP1.Y);
      iImg.Surface.PointDeviceToWorld(iImg.Width-tmpSZ.cx,iImg.Height-tmpSZ.cy, imgP2.X,imgP2.Y);


по моему вот этот код вас "губит": image.Surface.Navigator.ZoomToFitPaperRect(xb1, yb1, xb2, yb2);
вы всегда, какой бы прямоугольник не высчитали, строго его вписываете в границы картинки

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

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


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