Работа с макетом печати не очень хорошо освещена в документации к ИнГео, что странно, потому как по крайней мере мне показалась реализация макета печати не очень нативной. И это даже на пользовательском уровне, например работа с таблицами вообще аттас.
Ну да ладно, все это преодолимо. Более интересная задача с которой пришлось столкнутся - это создание макета программно.
Но прежде скажу некоторые детали. В макет печати можно включить несколько видов объектов:
- Карта
- Прямоугольник
- Эллипс
- Линия
- Рисунок
- Текст
- Таблица
Вот например макет состоящий из участка карты и таблицы:
Теперь займемся клонированием объектов макета. Начнем с простого - с Рисунка. Нужно взять копируемый объект из макета и затем создать новый, пустой рисунок:
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; }
В заключение скажу, что методы копирования не являются полными, я копировал только те элементы формата, которые использовались в моем макете печати.