воскресенье, 23 ноября 2014 г.

Копирование элементов макета печати ИнГео.

Работа с макетом печати не очень хорошо освещена в документации к ИнГео, что странно, потому как по крайней мере мне показалась реализация макета печати не очень нативной. И это даже на пользовательском уровне, например работа с таблицами вообще аттас.
Ну да ладно, все это преодолимо. Более интересная задача с которой пришлось столкнутся - это создание макета программно.

Но прежде скажу некоторые детали. В макет печати можно включить несколько видов объектов:

  • Карта
  • Прямоугольник
  • Эллипс
  • Линия
  • Рисунок
  • Текст
  • Таблица

Вот например макет состоящий из участка карты и таблицы:


Теперь займемся клонированием объектов макета. Начнем с простого - с Рисунка. Нужно взять копируемый объект из макета и затем создать новый, пустой рисунок:

    var sourceImage = (IInPicturePictureFigure)MyLayoutWindow.Figures.Find("imageName");
    var targetImage = MyLayoutWindow.Figures.Add(TInPictureFigureType.inftPicture) as IInPicturePictureFigure;
    СкопироватьРисунок(targetImage , sourceImage );
А вот и сам метод для копирования:
     //Рисунок
     public static IInPicturePictureFigure СкопироватьРисунок(IInPicturePictureFigure target, IInPicturePictureFigure source)
     {
        target.Width = source.Width;
        target.Height = source.Height;

        target.Picture = source.Picture;
        target.Stretch = source.Stretch;
        target.HorAlign = source.HorAlign;
        target.VerAlign = source.VerAlign;
        target.TransparentBack = source.TransparentBack;

        target.Pen.Mode = source.Pen.Mode;
        target.Pen.Style = source.Pen.Style;
        target.Pen.WidthInMM = source.Pen.WidthInMM;
        target.Pen.Color = source.Pen.Color;

        target.Brush.HatchColor = source.Brush.HatchColor;
        target.Brush.BackColor = source.Brush.BackColor;
        target.Brush.Transparency = source.Brush.Transparency;
        target.Brush.Style = source.Brush.Style;

        return target;
      }

Как видите метод копирует свойства объекта из существующего в новый. Уже после такого копирования можно установить положение объекта на карте пользуясь свойствами Bottom и Left.
Для остальных объектов макета печати используются аналогичные методы поэтому приведу еще один пример для Прямоугольника:

      //Прямоугольник
      public static IInPictureRectFigure СкопироватьПрямоугольник(IInPictureRectFigure target, IInPictureRectFigure source)
      {
          target.Width = source.Width;
          target.Height = source.Height;

          target.Pen.Mode = source.Pen.Mode;
          target.Pen.Style = source.Pen.Style;
          target.Pen.WidthInMM = source.Pen.WidthInMM;
          target.Pen.Color = source.Pen.Color;

          target.Brush.HatchColor = source.Brush.HatchColor;
          target.Brush.BackColor = source.Brush.BackColor;
          target.Brush.Transparency = source.Brush.Transparency;
          target.Brush.Style = source.Brush.Style;

          return target;
      }

Немного по другому обстоит дело с Таблицей. Дело в том, что у этого объекта есть два набора параметров: дефолтные - находятся в левой панели, и специальные - находится в контекстном меню в Редакторе таблицы.
Дефолтные настройки позволяют настроить таблицу в целом, а так же сделать стиль по умолчанию, который будет применяться ко всем строкам/столбцам/ячейкам. Поэтому если нужно создать таблицу с неизвестного в заранее размера, то стиль нужно задавать именно в левой панели.
Но у шапки таблицы, стиль обычно отличен от стиля остальных ячеек, например первая строка может быть написана болдом или иметь цветовую заливку. Тут в дело вступает Редактор таблицы, он позволяет настроить каждую отдельную строку, колонку или ячейку по своему. Кроме того стандартный текст, для той же шапки таблицы, то же указывается в Редакторе.

Получается чтобы полностью скопировать стиль таблицы нужно копировать два набора параметров.
        //Таблица
        public static IInPictureGridFigure СкопироватьТаблицу(IInPictureGridFigure target, IInPictureGridFigure source)
        {
            target.ColCount = source.ColCount;
            target.RowCount = source.RowCount;
            target.Width = source.Width;
            target.Height = source.Height;


            var targetGridFormat = target.GridFormat;
            var sourceGridFormat = source.GridFormat;

            if (sourceGridFormat.ContainsKinds(TInGridFormatKind.ingfLeftPen))
            {
                targetGridFormat = СкопироватьЭлементPen(TInGridFormatKind.ingfLeftPen, targetGridFormat, sourceGridFormat);
            }

            if (sourceGridFormat.ContainsKinds(TInGridFormatKind.ingfRightPen))
            {
                targetGridFormat = СкопироватьЭлементPen(TInGridFormatKind.ingfRightPen, targetGridFormat, sourceGridFormat);
            }

            if (sourceGridFormat.ContainsKinds(TInGridFormatKind.ingfTopPen))
            {
                targetGridFormat = СкопироватьЭлементPen(TInGridFormatKind.ingfTopPen, targetGridFormat, sourceGridFormat);
            }

            if (sourceGridFormat.ContainsKinds(TInGridFormatKind.ingfBottomPen))
            {
                targetGridFormat = СкопироватьЭлементPen(TInGridFormatKind.ingfBottomPen, targetGridFormat, sourceGridFormat);
            }
            targetGridFormat.Update();

            for (int i = 0; i < source.ColCount; i++)
            {
                var targetColumnFormat = target.GetFormat(i, -1);
                var sourceColumnFormat = source.GetFormat(i, -1);

                var defaultSourceColumnFormat = source.ColFormat;
                var defaultTargetColumnFormat = target.ColFormat;

                if (sourceColumnFormat.ContainsKinds(TInGridFormatKind.ingfColWidth))
                {
                    targetColumnFormat = СкопироватьЭлементSize(TInGridFormatKind.ingfColWidth, targetColumnFormat, sourceColumnFormat);
                }
                else
                {
                    defaultTargetColumnFormat = СкопироватьЭлементSize(TInGridFormatKind.ingfColWidth, defaultTargetColumnFormat, defaultSourceColumnFormat);
                }

                if (sourceColumnFormat.ContainsKinds(TInGridFormatKind.ingfFont))
                {
                    targetColumnFormat = СкопироватьЭлементFont(TInGridFormatKind.ingfFont, targetColumnFormat, sourceColumnFormat);
                }

                if (sourceColumnFormat.ContainsKinds(TInGridFormatKind.ingfTextFormat))
                {
                    targetColumnFormat = СкопироватьЭлементTextFormat(TInGridFormatKind.ingfFont, targetColumnFormat, sourceColumnFormat);
                }

                if (sourceColumnFormat.ContainsKinds(TInGridFormatKind.ingfLeftPen))
                {
                    targetColumnFormat = СкопироватьЭлементPen(TInGridFormatKind.ingfLeftPen, targetColumnFormat, sourceColumnFormat);
                }
                else
                {
                    defaultTargetColumnFormat = СкопироватьЭлементPen(TInGridFormatKind.ingfLeftPen, defaultTargetColumnFormat, defaultSourceColumnFormat);
                }

                if (sourceColumnFormat.ContainsKinds(TInGridFormatKind.ingfRightPen))
                {
                    targetColumnFormat = СкопироватьЭлементPen(TInGridFormatKind.ingfRightPen, targetColumnFormat, sourceColumnFormat);
                }
                else
                {
                    defaultTargetColumnFormat = СкопироватьЭлементPen(TInGridFormatKind.ingfRightPen, defaultTargetColumnFormat, defaultSourceColumnFormat);
                }

                if (sourceColumnFormat.ContainsKinds(TInGridFormatKind.ingfTopPen))
                {
                    targetColumnFormat = СкопироватьЭлементPen(TInGridFormatKind.ingfTopPen, targetColumnFormat, sourceColumnFormat);
                }
                else
                {
                    defaultTargetColumnFormat = СкопироватьЭлементPen(TInGridFormatKind.ingfTopPen, defaultTargetColumnFormat, defaultSourceColumnFormat);
                }

                if (sourceColumnFormat.ContainsKinds(TInGridFormatKind.ingfBottomPen))
                {
                    targetColumnFormat = СкопироватьЭлементPen(TInGridFormatKind.ingfBottomPen, targetColumnFormat, sourceColumnFormat);
                }
                else
                {
                    defaultTargetColumnFormat = СкопироватьЭлементPen(TInGridFormatKind.ingfBottomPen, defaultTargetColumnFormat, defaultSourceColumnFormat);
                }

                defaultTargetColumnFormat.Update();
                targetColumnFormat.Update();
            }

            for (int i = 0; i < source.RowCount; i++)
            {
                var targetRowFormat = target.GetFormat(-1, i);
                var sourceRowFormat = source.GetFormat(-1, i);

                var defaultSourceRowFormat = source.RowFormat;
                var defaultTargetRowFormat = target.RowFormat;

                if (sourceRowFormat.ContainsKinds(TInGridFormatKind.ingfRowHeight))
                {
                    targetRowFormat = СкопироватьЭлементSize(TInGridFormatKind.ingfColWidth, targetRowFormat, sourceRowFormat);
                }
                else
                {
                    defaultTargetRowFormat = СкопироватьЭлементSize(TInGridFormatKind.ingfColWidth, defaultTargetRowFormat, defaultSourceRowFormat);
                }


                if (sourceRowFormat.ContainsKinds(TInGridFormatKind.ingfFont))
                {
                    targetRowFormat = СкопироватьЭлементFont(TInGridFormatKind.ingfFont, targetRowFormat, sourceRowFormat);
                }

                if (sourceRowFormat.ContainsKinds(TInGridFormatKind.ingfTextFormat))
                {
                    targetRowFormat = СкопироватьЭлементTextFormat(TInGridFormatKind.ingfFont, targetRowFormat, sourceRowFormat);
                }

                if (sourceRowFormat.ContainsKinds(TInGridFormatKind.ingfLeftPen))
                {
                    targetRowFormat = СкопироватьЭлементPen(TInGridFormatKind.ingfLeftPen, targetRowFormat, sourceRowFormat);
                }
                else
                {
                    defaultTargetRowFormat = СкопироватьЭлементPen(TInGridFormatKind.ingfLeftPen, defaultTargetRowFormat, defaultSourceRowFormat);
                }

                if (sourceRowFormat.ContainsKinds(TInGridFormatKind.ingfRightPen))
                {
                    targetRowFormat = СкопироватьЭлементPen(TInGridFormatKind.ingfRightPen, targetRowFormat, sourceRowFormat);
                }
                else
                {
                    defaultTargetRowFormat = СкопироватьЭлементPen(TInGridFormatKind.ingfRightPen, defaultTargetRowFormat, defaultSourceRowFormat);
                }

                if (sourceRowFormat.ContainsKinds(TInGridFormatKind.ingfTopPen))
                {
                    targetRowFormat = СкопироватьЭлементPen(TInGridFormatKind.ingfTopPen, targetRowFormat, sourceRowFormat);
                }
                else
                {
                    defaultTargetRowFormat = СкопироватьЭлементPen(TInGridFormatKind.ingfTopPen, defaultTargetRowFormat, defaultSourceRowFormat);
                }

                if (sourceRowFormat.ContainsKinds(TInGridFormatKind.ingfBottomPen))
                {
                    targetRowFormat = СкопироватьЭлементPen(TInGridFormatKind.ingfBottomPen, targetRowFormat, sourceRowFormat);
                }
                else
                {
                    defaultTargetRowFormat = СкопироватьЭлементPen(TInGridFormatKind.ingfBottomPen, defaultTargetRowFormat, defaultSourceRowFormat);
                }

                targetRowFormat.Update();
                defaultTargetRowFormat.Update();
            }

            for (int i = 0; i < source.ColCount; i++)
            {
                for (int j = 0; j < source.RowCount; j++)
                {
                    var targetCellFormat = target.GetFormat(i, j);
                    var sourceCellFormat = source.GetFormat(i, j);

                    var defaultSourceCellFormat = source.CellFormat;
                    var defaultTargetCellFormat = target.CellFormat;

                    if (sourceCellFormat.ContainsKinds(TInGridFormatKind.ingfFont))
                    {
                        targetCellFormat = СкопироватьЭлементFont(TInGridFormatKind.ingfFont, targetCellFormat, sourceCellFormat);
                    }
                    else
                    {
                        defaultTargetCellFormat = СкопироватьЭлементFont(TInGridFormatKind.ingfFont, defaultTargetCellFormat, defaultSourceCellFormat);
                    }

                    if (sourceCellFormat.ContainsKinds(TInGridFormatKind.ingfTextFormat))
                    {
                        targetCellFormat = СкопироватьЭлементTextFormat(TInGridFormatKind.ingfFont, targetCellFormat, sourceCellFormat);
                    }
                    else
                    {
                        defaultTargetCellFormat = СкопироватьЭлементTextFormat(TInGridFormatKind.ingfFont, defaultTargetCellFormat, defaultSourceCellFormat);
                    }

                    if (sourceCellFormat.ContainsKinds(TInGridFormatKind.ingfBrush))
                    {
                        targetCellFormat = СкопироватьЭлементBrush(TInGridFormatKind.ingfFont, targetCellFormat, sourceCellFormat);
                    }
                    else
                    {
                        defaultTargetCellFormat = СкопироватьЭлементBrush(TInGridFormatKind.ingfFont, defaultTargetCellFormat, defaultSourceCellFormat);
                    }

                    if (sourceCellFormat.ContainsKinds(TInGridFormatKind.ingfLeftIndent))
                    {
                        targetCellFormat = СкопироватьЭлементSize(TInGridFormatKind.ingfColWidth, targetCellFormat, sourceCellFormat);
                    }
                    else
                    {
                        defaultTargetCellFormat = СкопироватьЭлементSize(TInGridFormatKind.ingfColWidth, defaultTargetCellFormat, defaultSourceCellFormat);
                    }

                    targetCellFormat.Update();
                    defaultTargetCellFormat.Update();
                }
            }

            for (int i = 0; i < source.ColCount; i++)
            {
                for (int j = 0; j < source.RowCount; j++)
                {
                    target.Text[i, j] = source.Text[i, j];
                }
            }

            return target;
        }

Метод состоит из трех циклов по строкам (RowCount), столбцам (ColCount), и ячейкам. Для каждого элемента определяется есть ли у него специальный формат с помощью ContainsKinds(). Если специальный формат есть, то в новую таблицу копируется он, если нет то копируется дефолтный формат. Для удобства методы копирования отдельных элементов формата вынесены в отдельные методы:

        private static IInGridFormat СкопироватьЭлементPen(TInGridFormatKind inGridFormatKind, IInGridFormat target, IInGridFormat source)
        {
            target.Pen[inGridFormatKind].Style = source.Pen[inGridFormatKind].Style;
            target.Pen[inGridFormatKind].Color = source.Pen[inGridFormatKind].Color;
            target.Pen[inGridFormatKind].Mode = source.Pen[inGridFormatKind].Mode;
            target.Pen[inGridFormatKind].WidthInMM = source.Pen[inGridFormatKind].WidthInMM;

            return target;
        }

        private static IInGridFormat СкопироватьЭлементFont(TInGridFormatKind inGridFormatKind, IInGridFormat target, IInGridFormat source)
        {
            target.Font[inGridFormatKind].Size = source.Font[inGridFormatKind].Size;
            target.Font[inGridFormatKind].Style = source.Font[inGridFormatKind].Style;

            return target;
        }

        private static IInGridFormat СкопироватьЭлементBrush(TInGridFormatKind inGridFormatKind, IInGridFormat target, IInGridFormat source)
        {
            target.Brush[TInGridFormatKind.ingfBrush].BackColor = source.Brush[TInGridFormatKind.ingfBrush].BackColor;
            target.Brush[TInGridFormatKind.ingfBrush].HatchColor = source.Brush[TInGridFormatKind.ingfBrush].HatchColor;
            target.Brush[TInGridFormatKind.ingfBrush].Transparency = source.Brush[TInGridFormatKind.ingfBrush].Transparency;

            return target;
        }

        private static IInGridFormat СкопироватьЭлементSize(TInGridFormatKind inGridFormatKind, IInGridFormat target,
                                                      IInGridFormat source)
        {
            target.Size[inGridFormatKind] = source.Size[inGridFormatKind];

            return target;
        }

        private static IInGridFormat СкопироватьЭлементTextFormat(TInGridFormatKind inGridFormatKind, IInGridFormat target,
                                              IInGridFormat source)
        {
            target.TextFormat[inGridFormatKind] = source.TextFormat[inGridFormatKind];

            return target;
        }

В заключение скажу, что методы копирования не являются полными, я копировал только те элементы формата, которые использовались в моем макете печати.


Комментариев нет:

Отправить комментарий