452 lines
16 KiB
C#
452 lines
16 KiB
C#
///
|
|
/// Copyright (c) 2016-2017 Sensus Metering Systems
|
|
///
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.Drawing.Printing;
|
|
using Config.Entities;
|
|
|
|
namespace Results.Output.Printers.Munich
|
|
{
|
|
public class MunichPrintDocument : PrintDocument
|
|
{
|
|
const string FontFamilyName = "Arial"; ///"Times New Roman";
|
|
|
|
const int SpacingOne = 18;
|
|
const int SpacingOneAndHalf = 24; /// was 27 before
|
|
const int TitleX = 240;
|
|
const int TitleY = 180; /// Depends on the size of the header
|
|
const int FirstLineNr = 14; /// Depends on the size of the header
|
|
const int Tab1 = 80; /// Positions of columns above the table
|
|
const int Tab2 = 240;
|
|
const int Tab3 = 430;
|
|
const int Tab4 = 590;
|
|
const int BorderW = 1; /// Table border line width
|
|
const int MarginTop = 7; /// Margins of the text from table lines
|
|
const int MarginLeft = 4; /// Margins of the text from table lines
|
|
|
|
///
|
|
/// Data to print
|
|
///
|
|
readonly string docVersion;
|
|
readonly Results.Entities.WaterMeter wm;
|
|
string zaehlertyp;
|
|
string pruefvorlage;
|
|
|
|
readonly IList<Results.Entities.MeterTestRslt> results;
|
|
readonly int resultsCount;
|
|
readonly bool compound; /// true when MetersKind is MetersKind.Combined
|
|
|
|
/// Top coordinate of the table
|
|
int nrPages;
|
|
int pageNr;
|
|
int firstTblTop;
|
|
int secondTblTop;
|
|
|
|
/// <summary>
|
|
/// Property variable for the Font the user wishes to use
|
|
/// </summary>
|
|
Font font;
|
|
Font boldFont;
|
|
Font fontTitle;
|
|
|
|
/// <summary>
|
|
/// Constructor
|
|
/// </summary>
|
|
/// <param name="textToPrint">Text to be printed</param>
|
|
public MunichPrintDocument(string docVersion,
|
|
Results.Entities.WaterMeter wm,
|
|
PageOrientation pageOrientation)
|
|
{
|
|
this.docVersion = docVersion;
|
|
this.wm = wm;
|
|
compound = wm.Compound();
|
|
|
|
string[] info = wm.ProductName().Split(new char[] { ';' });
|
|
if (info.Length >= 2)
|
|
{
|
|
pruefvorlage = info[0];
|
|
zaehlertyp = info[1];
|
|
}
|
|
else if (info.Length == 1)
|
|
{
|
|
pruefvorlage = info[0];
|
|
zaehlertyp = compound ? "Verbundzähler" : "Einzelzähler";
|
|
}
|
|
else
|
|
{
|
|
pruefvorlage = wm.ProcedureName();
|
|
zaehlertyp = compound ? "Verbundzähler" : "Einzelzähler";
|
|
}
|
|
|
|
results = wm.MeterTestRslts;
|
|
this.resultsCount = compound ? (results.Count / 3) : results.Count;
|
|
|
|
int resultsCount = wm.MeterTestRslts.Count;
|
|
if (compound) resultsCount /= 3;
|
|
|
|
pageNr = 1;
|
|
nrPages = (compound ? (resultsCount > 7) : (resultsCount > 9)) ? 2 : 1;
|
|
|
|
DefaultPageSettings.Landscape = (pageOrientation == PageOrientation.Landscape);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Override the default onbeginPrint method of the PrintDocument Object.
|
|
/// </summary>
|
|
/// <param name=e></param>
|
|
/// <remarks></remarks>
|
|
protected override void OnBeginPrint(System.Drawing.Printing.PrintEventArgs e)
|
|
{
|
|
base.OnBeginPrint(e);
|
|
|
|
if (font == null) { font = new Font(FontFamilyName, 10, FontStyle.Regular); }
|
|
if (boldFont == null) { boldFont = new Font(FontFamilyName, 10, FontStyle.Bold); }
|
|
if (fontTitle == null) { fontTitle = new Font(FontFamilyName, 24, FontStyle.Bold); }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Override the default OnPrintPage method of the PrintDocument.
|
|
/// </summary>
|
|
/// <param name=e></param>
|
|
/// <remarks>This provides the print logic for our document</remarks>
|
|
protected override void OnPrintPage(System.Drawing.Printing.PrintPageEventArgs e)
|
|
{
|
|
/// Run base code
|
|
base.OnPrintPage(e);
|
|
|
|
/// Draw 2550 x 3507 'headpic' scaled to A4 at 100 DPI
|
|
e.Graphics.DrawImage(Results.Properties.Resources.Headpic, new Rectangle(0, 0, 827, 1137));
|
|
|
|
/// Set print area size and margins (in dots using 80 dpi)
|
|
int printHeight = base.DefaultPageSettings.PaperSize.Height - base.DefaultPageSettings.Margins.Top - base.DefaultPageSettings.Margins.Bottom;
|
|
int printWidth = base.DefaultPageSettings.PaperSize.Width - base.DefaultPageSettings.Margins.Left - base.DefaultPageSettings.Margins.Right;
|
|
int leftMargin = base.DefaultPageSettings.Margins.Left; /// X
|
|
int topMargin = base.DefaultPageSettings.Margins.Top; /// Y
|
|
|
|
/// Check if the user selected to print in Landscape mode
|
|
/// if they did then we need to swap height/width parameters
|
|
if (base.DefaultPageSettings.Landscape)
|
|
{
|
|
int tmp = printHeight;
|
|
printHeight = printWidth;
|
|
printWidth = tmp;
|
|
}
|
|
|
|
int x = leftMargin;
|
|
int y = topMargin;
|
|
|
|
/// Use the StringFormat class for the text layout of our document
|
|
StringFormat format = new StringFormat(StringFormatFlags.LineLimit);
|
|
|
|
int lineNr = FirstLineNr;
|
|
|
|
if (pageNr == 1)
|
|
{
|
|
RectangleF printArea = new RectangleF(TitleX, TitleY, 667, 50);
|
|
e.Graphics.DrawString(wm.Batch.ProtocolTitle, this.fontTitle, Brushes.Black, printArea);
|
|
|
|
///
|
|
/// Common
|
|
///
|
|
PrintAt(e, Tab1, lineNr * SpacingOne, docVersion);
|
|
lineNr++;
|
|
PrintBoldAt(e, Tab1, lineNr * SpacingOne, "Prüfstand Nr :");
|
|
PrintBoldAt(e, Tab2, lineNr * SpacingOne, wm.BenchId().ToString());
|
|
PrintBoldAt(e, Tab3, lineNr * SpacingOne, "Datum :");
|
|
PrintBoldAt(e, Tab4, lineNr * SpacingOne, wm.Batch.EndTime.Date.ToString("d"));
|
|
lineNr++;
|
|
PrintAt(e, Tab1, lineNr * SpacingOne, "Zählertyp :");
|
|
PrintAt(e, Tab2, lineNr * SpacingOne, zaehlertyp);
|
|
PrintAt(e, Tab3, lineNr * SpacingOne, "Eichjahr :");
|
|
PrintAt(e, Tab4, lineNr * SpacingOne, wm.YearOfProduction.ToString());
|
|
lineNr++;
|
|
PrintAt(e, Tab1, lineNr * SpacingOne, "Prüfvorlage :");
|
|
PrintAt(e, Tab2, lineNr * SpacingOne, pruefvorlage);
|
|
lineNr += 2;
|
|
|
|
if (compound)
|
|
{
|
|
PrintBoldAt(e, Tab1, lineNr * SpacingOne, "Hauptzahler");
|
|
PrintBoldAt(e, Tab3, lineNr * SpacingOne, "Nebenzahler");
|
|
lineNr++;
|
|
}
|
|
|
|
PrintAt(e, Tab1, lineNr * SpacingOne, "Hersteller :");
|
|
PrintAt(e, Tab2, lineNr * SpacingOne, wm.Producer());
|
|
if (compound)
|
|
{
|
|
PrintAt(e, Tab3, lineNr * SpacingOne, "Hersteller :");
|
|
PrintAt(e, Tab4, lineNr * SpacingOne, wm.ProducerAux());
|
|
}
|
|
lineNr++;
|
|
|
|
PrintAt(e, Tab1, lineNr * SpacingOne, "Seriennummer :");
|
|
PrintAt(e, Tab2, lineNr * SpacingOne, wm.SerialNr);
|
|
if (compound)
|
|
{
|
|
PrintAt(e, Tab3, lineNr * SpacingOne, "Seriennummer :");
|
|
PrintAt(e, Tab4, lineNr * SpacingOne, wm.SerialNrAux);
|
|
}
|
|
lineNr++;
|
|
|
|
PrintAt(e, Tab1, lineNr * SpacingOne, wm.NewQnames() ? "Q3 :" : "Qn :");
|
|
PrintAt(e, Tab2, lineNr * SpacingOne, wm.Q3_Qn().ToString());
|
|
if (compound)
|
|
{
|
|
PrintAt(e, Tab3, lineNr * SpacingOne, wm.NewQnames() ? "Q3 :" : "Qn :");
|
|
PrintAt(e, Tab4, lineNr * SpacingOne, wm.Q3_Qn_Aux().ToString());
|
|
}
|
|
lineNr++;
|
|
|
|
PrintAt(e, Tab1, lineNr * SpacingOne, "Zulassungszeichen :");
|
|
PrintAt(e, Tab2, lineNr * SpacingOne, wm.ApprovalInfo());
|
|
if (compound)
|
|
{
|
|
PrintAt(e, Tab3, lineNr * SpacingOne, "Zulassungszeichen :");
|
|
PrintAt(e, Tab4, lineNr * SpacingOne, wm.ApprovalInfoAux());
|
|
}
|
|
lineNr++;
|
|
|
|
PrintAt(e, Tab1, lineNr * SpacingOne, "Metr. klasse :");
|
|
PrintAt(e, Tab2, lineNr * SpacingOne, wm.MetrologicalClass());
|
|
if (compound)
|
|
{
|
|
PrintAt(e, Tab3, lineNr * SpacingOne, "Metr. klasse :");
|
|
PrintAt(e, Tab4, lineNr * SpacingOne, wm.MetrologicalClassAux());
|
|
}
|
|
lineNr++;
|
|
|
|
PrintAt(e, Tab1, lineNr * SpacingOne, "Stand :");
|
|
PrintAt(e, Tab2, lineNr * SpacingOne, wm.EndState);
|
|
if (compound)
|
|
{
|
|
PrintAt(e, Tab3, lineNr * SpacingOne, "Stand :");
|
|
PrintAt(e, Tab4, lineNr * SpacingOne, wm.EndStateAux);
|
|
|
|
lineNr += 2;
|
|
PrintAt(e, Tab1, lineNr * SpacingOne, "Umschaltpunkte :");
|
|
lineNr++;
|
|
PrintAt(e, Tab1, lineNr * SpacingOne, "Qsteig");
|
|
PrintAt(e, Tab2, lineNr * SpacingOne, (1000.0 * wm.QRise).ToString("F1") + " l/h");
|
|
lineNr++;
|
|
PrintAt(e, Tab1, lineNr * SpacingOne, "Qfall");
|
|
PrintAt(e, Tab2, lineNr * SpacingOne, (1000.0 * wm.QFall).ToString("F1") + " l/h");
|
|
}
|
|
|
|
lineNr += 2;
|
|
firstTblTop = SpacingOne * lineNr;
|
|
|
|
///
|
|
/// Table 1
|
|
///
|
|
PrintTableOne(e, firstTblTop);
|
|
DrawTableFrame(e, resultsCount + 1, firstTblTop);
|
|
}
|
|
|
|
|
|
if (pageNr == nrPages)
|
|
{
|
|
if (pageNr == 1)
|
|
{
|
|
secondTblTop = firstTblTop + (resultsCount + 2) * SpacingOneAndHalf;
|
|
lineNr += ((resultsCount + 2) * SpacingOneAndHalf * 2) / SpacingOne;
|
|
}
|
|
else
|
|
{
|
|
lineNr -= 3;
|
|
|
|
if (compound)
|
|
{
|
|
PrintBoldAt(e, Tab1, lineNr * SpacingOne, "Hauptzahler");
|
|
PrintBoldAt(e, Tab3, lineNr * SpacingOne, "Nebenzahler");
|
|
lineNr++;
|
|
}
|
|
|
|
PrintAt(e, Tab1, lineNr * SpacingOne, "Hersteller :");
|
|
PrintAt(e, Tab2, lineNr * SpacingOne, wm.Producer());
|
|
if (compound)
|
|
{
|
|
PrintAt(e, Tab3, lineNr * SpacingOne, "Hersteller :");
|
|
PrintAt(e, Tab4, lineNr * SpacingOne, wm.ProducerAux());
|
|
}
|
|
lineNr++;
|
|
|
|
PrintAt(e, Tab1, lineNr * SpacingOne, "Seriennummer :");
|
|
PrintAt(e, Tab2, lineNr * SpacingOne, wm.SerialNr);
|
|
if (compound)
|
|
{
|
|
PrintAt(e, Tab3, lineNr * SpacingOne, "Seriennummer :");
|
|
PrintAt(e, Tab4, lineNr * SpacingOne, wm.SerialNrAux);
|
|
}
|
|
lineNr += ((resultsCount + 2) * SpacingOneAndHalf) / SpacingOne + 2;
|
|
|
|
secondTblTop = TitleY + (compound ? 5 : 4) * SpacingOne;
|
|
}
|
|
|
|
///
|
|
/// Table 2
|
|
///
|
|
PrintTableTwo(e, secondTblTop);
|
|
DrawTableFrame(e, resultsCount + 1, secondTblTop);
|
|
|
|
///
|
|
/// Footer
|
|
///
|
|
PrintAt(e, Tab1, lineNr * SpacingOne, "Temperatur");
|
|
PrintAt(e, Tab2, lineNr * SpacingOne, wm.Batch.AmbTempMean().ToString("F1") + " \x00b0C");
|
|
lineNr++;
|
|
PrintAt(e, Tab1, lineNr * SpacingOne, "Feuchtigkeit");
|
|
PrintAt(e, Tab2, lineNr * SpacingOne, wm.Batch.AmbHumiMean().ToString("F0") + " %");
|
|
lineNr++;
|
|
PrintAt(e, Tab1, lineNr * SpacingOne, "Luftdruck");
|
|
PrintAt(e, Tab2, lineNr * SpacingOne, Config.Units.ConvertTo(Config.Unit.mbar, wm.Batch.AmbPressMean()).ToString("F0") + " mbar");
|
|
|
|
lineNr++;
|
|
PrintAt(e, Tab3, lineNr * SpacingOne, wm.Batch.EndTime.Date.ToString("d"));
|
|
lineNr++;
|
|
PrintAt(e, Tab3, lineNr * SpacingOne, "Datum");
|
|
PrintAt(e, Tab4, lineNr * SpacingOne, "Unterschrift");
|
|
}
|
|
|
|
e.HasMorePages = (pageNr != nrPages);
|
|
pageNr++;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Print table texts.
|
|
/// </summary>
|
|
void PrintTableOne(System.Drawing.Printing.PrintPageEventArgs e, int tblTop)
|
|
{
|
|
PrintAt(e, GetTabItemPos(0, 0, tblTop), "Prüflauf");
|
|
PrintAt(e, GetTabItemPos(0, 1, tblTop), "Q [l/h]");
|
|
PrintAt(e, GetTabItemPos(0, 2, tblTop), "Prüf-Vol.[l]");
|
|
PrintAt(e, GetTabItemPos(0, 3, tblTop), compound ? "HZ-Vol.[l]" : "Z-Vol.[l]");
|
|
PrintAt(e, GetTabItemPos(0, 4, tblTop), compound ? "NZ-Vol.[l]" : "-");
|
|
PrintAt(e, GetTabItemPos(0, 5, tblTop), "Fehler [%]");
|
|
PrintAt(e, GetTabItemPos(0, 6, tblTop), "Ergebnis");
|
|
|
|
int rowCnt = 1;
|
|
foreach (var mtr in wm.MeterTestRslts)
|
|
{
|
|
if (!compound || mtr.CompoundMeterId == (byte)CompoundMeterId.Compound)
|
|
{
|
|
PrintAt(e, GetTabItemPos(rowCnt, 0, tblTop), mtr.Name());
|
|
PrintAt(e, GetTabItemPos(rowCnt, 1, tblTop), mtr.TestRslt.FlowMass.ToString("F1"));
|
|
PrintAt(e, GetTabItemPos(rowCnt, 2, tblTop), mtr.TestRslt.VolumeCTV.ToString("F2"));
|
|
if (compound)
|
|
{
|
|
Results.Entities.MeterTestRslt mainMtr = wm.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundMain);
|
|
Results.Entities.MeterTestRslt auxMtr = wm.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundAux);
|
|
|
|
PrintAt(e, GetTabItemPos(rowCnt, 3, tblTop), mainMtr.VolumeMeter.ToString("F2"));
|
|
PrintAt(e, GetTabItemPos(rowCnt, 4, tblTop), auxMtr.VolumeMeter.ToString("F2"));
|
|
PrintAt(e, GetTabItemPos(rowCnt, 5, tblTop), mtr.Error.ToString("F2"));
|
|
PrintAt(e, GetTabItemPos(rowCnt, 6, tblTop), mtr.Passed ? "iO" : "NiO");
|
|
}
|
|
else
|
|
{
|
|
PrintAt(e, GetTabItemPos(rowCnt, 3, tblTop), mtr.VolumeMeter.ToString("F2"));
|
|
PrintAt(e, GetTabItemPos(rowCnt, 4, tblTop), "-");
|
|
PrintAt(e, GetTabItemPos(rowCnt, 5, tblTop), mtr.Error.ToString("F2"));
|
|
PrintAt(e, GetTabItemPos(rowCnt, 6, tblTop), mtr.Passed ? "iO" : "NiO");
|
|
}
|
|
|
|
rowCnt++;
|
|
}
|
|
}
|
|
}
|
|
|
|
void PrintTableTwo(System.Drawing.Printing.PrintPageEventArgs e, int tblTop)
|
|
{
|
|
PrintAt(e, GetTabItemPos(0, 1, tblTop), "Q [l/h]");
|
|
PrintAt(e, GetTabItemPos(0, 2, tblTop), "Temperatur");
|
|
PrintAt(e, GetTabItemPos(0, 3, tblTop), "Dichte");
|
|
PrintAt(e, GetTabItemPos(0, 4, tblTop), "Prüfzeit");
|
|
PrintAt(e, GetTabItemPos(0, 5, tblTop), "Druck Eing.");
|
|
PrintAt(e, GetTabItemPos(0, 6, tblTop), "Druck Ausg.");
|
|
|
|
int rowCnt = 1;
|
|
foreach (var mtr in wm.MeterTestRslts)
|
|
{
|
|
if (!compound || mtr.CompoundMeterId == (byte)CompoundMeterId.Compound)
|
|
{
|
|
Point p = GetTabItemPos(rowCnt, 0, tblTop);
|
|
PrintAt(e, p.X, p.Y, mtr.Name());
|
|
|
|
PrintAt(e, GetTabItemPos(rowCnt, 1, tblTop), mtr.TestRslt.FlowMass.ToString("F1"));
|
|
PrintAt(e, GetTabItemPos(rowCnt, 2, tblTop), mtr.TestRslt.TempDownMean.ToString("F2"));
|
|
PrintAt(e, GetTabItemPos(rowCnt, 3, tblTop), mtr.TestRslt.DensityDiv.ToString("F2"));
|
|
PrintAt(e, GetTabItemPos(rowCnt, 4, tblTop), mtr.TestTime.ToString("F1"));
|
|
PrintAt(e, GetTabItemPos(rowCnt, 5, tblTop), Config.Units.ConvertTo(Config.Unit.bar, mtr.TestRslt.PressUpMean).ToString("F3"));
|
|
PrintAt(e, GetTabItemPos(rowCnt, 6, tblTop), Config.Units.ConvertTo(Config.Unit.bar, mtr.TestRslt.PressDownMean).ToString("F3"));
|
|
|
|
rowCnt++;
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Draw table lines.
|
|
/// </summary>
|
|
void DrawTableFrame(System.Drawing.Printing.PrintPageEventArgs e, int rowsCount, int tblTop)
|
|
{
|
|
int t = tblTop;
|
|
int m = tblTop + SpacingOneAndHalf;
|
|
int b = tblTop + rowsCount * SpacingOneAndHalf;
|
|
|
|
// Horizontal lines
|
|
e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(80, t), new Point(747, t));
|
|
e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(80, m), new Point(747, m));
|
|
e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(80, b), new Point(747, b));
|
|
|
|
// Vertical lines
|
|
e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point( 80, t), new Point( 80, b));
|
|
e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(267, t), new Point(267, b));
|
|
e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(347, t), new Point(347, b));
|
|
e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(427, t), new Point(427, b));
|
|
e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(507, t), new Point(507, b));
|
|
e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(587, t), new Point(587, b));
|
|
e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(667, t), new Point(667, b));
|
|
e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(747, t), new Point(747, b));
|
|
}
|
|
|
|
|
|
void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text)
|
|
{
|
|
PrintAt(e, p.X, p.Y, text);
|
|
}
|
|
|
|
void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text)
|
|
{
|
|
RectangleF printArea = new RectangleF(x, y, 667, SpacingOne);
|
|
e.Graphics.DrawString(text, this.font, Brushes.Black, printArea);
|
|
}
|
|
|
|
void PrintBoldAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text)
|
|
{
|
|
PrintBoldAt(e, p.X, p.Y, text);
|
|
}
|
|
|
|
void PrintBoldAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text)
|
|
{
|
|
RectangleF printArea = new RectangleF(x, y, 667, SpacingOne);
|
|
e.Graphics.DrawString(text, this.boldFont, Brushes.Black, printArea);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get text position form a number of the test and a number of the parameter.
|
|
/// </summary>
|
|
/// <param name="row"></param>
|
|
/// <param name="column">Table column (0-based)</param>
|
|
/// <returns></returns>
|
|
Point GetTabItemPos(int row, int column, int tblTop)
|
|
{
|
|
int x = MarginLeft + ((column == 0) ? 80 : 187) + column * 80; /// leftmost column is wider
|
|
int y = MarginTop + tblTop + (row * SpacingOneAndHalf) - 2;
|
|
return new Point(x, y);
|
|
}
|
|
}
|
|
}
|