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