/// <summary> /// Start scan /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnStart_Click(object sender, EventArgs e) { this.m_scannedPages = new OmrPageOutputCollection(); foreach (var itm in this.m_uiResults) { itm.Value.Dispose(); itm.Key.Tag = null; } this.m_uiResults = new Dictionary <ListViewItem, Image>(); lsvView.Items.Clear(); if (cboScanners.SelectedItem == null) { MessageBox.Show("Please select a valid scanner"); } else { stsMain.Visible = true; this.stsMain.Style = ProgressBarStyle.Marquee; lblStatus.Text = "Acquiring Images..."; groupBox1.Enabled = false; this.m_scanEngine.ScanAsync(cboScanners.SelectedItem as ScannerInfo); lblStatus.Text = "Waiting for processing to complete..."; } }
/// <summary> /// Transform /// </summary> public byte[] Transform(Template.OmrTemplate template, OmrPageOutputCollection pages) { using (MemoryStream ms = new MemoryStream()) { new XmlSerializer(typeof(OmrPageOutputCollection)).Serialize(ms, pages); ms.Flush(); return(ms.ToArray()); } }
/// <summary> /// Save output to XML file /// </summary> private void saveSelectedOutputToolStripMenuItem_Click(object sender, EventArgs e) { if (lsvImages.SelectedItems.Count == 0) { return; } // Filters StringBuilder filters = new StringBuilder(); foreach (var tx in this.m_transforms) { filters.AppendFormat("{0} (*.{1})|*.{1}|", tx.Name, tx.Extension); } filters.Remove(filters.Length - 1, 1); var saveDialog = new SaveFileDialog() { Title = "Save Output", Filter = filters.ToString(), AddExtension = true }; if (saveDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { try { var transformer = this.m_transforms.Find(o => saveDialog.FileName.EndsWith(o.Extension)); using (FileStream fs = File.Create(saveDialog.FileName)) { OmrPageOutputCollection pages = new OmrPageOutputCollection(); foreach (ListViewItem sel in lsvImages.SelectedItems) { pages.Pages.Add(sel.Tag as OmrPageOutput); } byte[] data = transformer.Transform(this.m_currentTemplate, pages); fs.Write(data, 0, data.Length); } } catch (Exception ex) { MessageBox.Show(ex.Message, "Error Saving"); } } }
/// <summary> /// Transform the output /// </summary> public byte[] Transform(OmrTemplate template, OmrPageOutputCollection pages) { // CSV output is formatted as follows: // BARCODE0 BARCODE1 BARCODEN BUBBLEQ1 BUBBLEQ2 BUBBLEQ3 // PAGE1 ROW1 // PAGE1 ROW2 // PAGE1 ROWN // PAGE2 ROW1 // PAGE2 ROW2 // PAGE2 ROWN // PAGEN using (var ms = new MemoryStream()) { using (var sw = new StreamWriter(ms)) { // Get the headings var barcodeGroup = template.FlatFields.OfType <OmrBarcodeField>().GroupBy(o => o.AnswerRowGroup).FirstOrDefault(); var nBarcodesPerRow = 0; if (barcodeGroup != null) { nBarcodesPerRow = barcodeGroup.Count(); } var questionsPerRow = template.FlatFields.OfType <OmrBubbleField>().Select(o => o.Question).Distinct().ToArray(); // Output header row sw.Write("PAGE,ROW"); for (var i = 0; i < nBarcodesPerRow; i++) { sw.Write(",BARCODE{0}", i); } foreach (var q in questionsPerRow) { sw.Write(",{0}", q); } sw.WriteLine(); foreach (var pg in pages.Pages) { foreach (var rw in pg.Details.OfType <OmrRowData>()) { sw.Write("{0},{1}", pg.Id, rw.Id); var barcodes = rw.Details.OfType <OmrBarcodeData>().ToArray(); // Barcode for (var i = 0; i < nBarcodesPerRow; i++) { if (barcodes.Length > i) { sw.Write(",\"{0}\"", barcodes[i].BarcodeData); } else { sw.Write(","); } } // Questions foreach (var q in questionsPerRow) { var answerBubble = rw.Details.OfType <OmrBubbleData>().Where(o => o.Key == q).ToArray(); var aggregate = rw.Details.OfType <OmrAggregateDataOutput>().Where(o => o.Id == q).ToArray(); var nonGroupedAnswer = pg.Details.OfType <OmrBubbleData>().Where(o => o.Key == q).ToArray(); if (aggregate.Length > 0) { sw.Write(",{0}", MakeString(aggregate)); } else if (answerBubble.Length > 0) { sw.Write(",{0}", MakeString(answerBubble)); } else if (nonGroupedAnswer.Length > 0) { sw.Write(",{0}", MakeString(nonGroupedAnswer)); } else { sw.Write(","); } } sw.WriteLine(); } } sw.Flush(); return(ms.ToArray()); } } // Get the header }
private static void Main(string[] args) { try { Console.WriteLine("Optical Mark Engine Console Utility"); Console.WriteLine("Version {0}, {1}", Assembly.GetEntryAssembly().GetName().Version, Assembly.GetEntryAssembly() .GetCustomAttributes(typeof(AssemblyCopyrightAttribute)) .Select(o => o as AssemblyCopyrightAttribute) .First() .Copyright); // Parse parameters var parser = new ParameterParser <ConsoleParameters>(); var parameters = parser.Parse(args); // Show help? var showHelp = string.IsNullOrEmpty(parameters.OutputFile) || string.IsNullOrEmpty(parameters.Template) || (parameters.SourceFiles == null) || parameters.Help; if (showHelp) { parser.WriteHelp(Console.Out); } else if (!File.Exists(parameters.Template)) { throw new ArgumentException(string.Format("{0} not found", parameters.Template)); } else if ((parameters.OutputFormat.ToLower() != "csv") && (parameters.OutputFormat.ToLower() != "xml")) { throw new ArgumentException("Output format must be XML or CSV!"); } // Load the files foreach (var ptrn in parameters.SourceFiles) { string directory = Path.GetDirectoryName(ptrn) ?? ".", pattern = Path.GetFileName(ptrn); // Get files var outputCollection = new OmrPageOutputCollection(); var engine = new Engine(); var tsu = new TemplateScriptUtil(); var template = OmrTemplate.Load(parameters.Template); // Process files foreach (var fileName in Directory.GetFiles(directory, pattern)) { Console.Write("Processing {0}...", Path.GetFileName(fileName)); using (var sci = new ScannedImage(fileName)) { sci.Analyze(); if (sci.TemplateName != template.Id) { Console.WriteLine("Wrong template!"); continue; } var output = engine.ApplyTemplate(template, sci); var validate = output.Validate(template); if (parameters.Validate && !validate.IsValid) { Console.WriteLine("Invalid"); foreach (var iss in validate.Issues) { Console.WriteLine("\t{0}", iss); } } else { try { if (parameters.Run) { tsu.Run(template, output); } outputCollection.Pages.Add(output); Console.WriteLine("Success"); } catch (Exception e) { Console.WriteLine("Error\r\n\t{0}", e.Message); } } } } // Save the output? switch (parameters.OutputFormat) { case "csv": { var outputBytes = new CsvOutputTransform().Transform(template, outputCollection); using (var fs = File.Create(parameters.OutputFile)) { fs.Write(outputBytes, 0, outputBytes.Length); } break; } default: { var outputBytes = new RawOutputTransform().Transform(template, outputCollection); using (var fs = File.Create(parameters.OutputFile)) { fs.Write(outputBytes, 0, outputBytes.Length); } } break; } } #if DEBUG Console.ReadKey(); #endif Environment.Exit(0); } catch (Exception e) { Trace.TraceError(e.ToString()); Console.WriteLine("Error: {0}", e.Message); Environment.Exit(-1); } }