예제 #1
0
        private static string TranslateMacroReferences(string input, MacroValues macros)
        {
            if (input == null)
            {
                return(null);
            }
            string result = input;

            for (int startingOffset = 0; ;)
            {
                int openBraceOffset = result.IndexOf('{', startingOffset);
                if (openBraceOffset < 0)
                {
                    break;
                }
                int closeBraceOffset = result.IndexOf('}', openBraceOffset + 1);
                if (closeBraceOffset > 0)
                {
                    string macroName = result.Substring(openBraceOffset + 1, closeBraceOffset - openBraceOffset - 1);
                    string macroValue;
                    if (!macros.TryGetValue(macroName, out macroValue))
                    {
                        macroValue = "";
                    }
                    result         = result.Substring(0, openBraceOffset) + macroValue + result.Substring(closeBraceOffset + 1);
                    startingOffset = openBraceOffset;
                }
                else
                {
                    startingOffset++;
                }
            }
            return(result);
        }
예제 #2
0
        public void Print(PrintPageEventArgs e)
        {
            string dataPath = _DataPaths[_SignIndex];

            _SignIndex++;
            try
            {
                string      dataFile   = Path.GetFileName(dataPath);
                string      dataFolder = Path.GetDirectoryName(dataPath);
                MacroValues macros     = new MacroValues();
                SingleSign.AddStandardMacroValues(macros);
                AddUserMacros(macros);
                XmlDocument dataDoc = SingleSign.CreateEmptySignDataDoc();
                dataDoc.Load(Path.Combine(dataFolder, dataFile));
                SingleSign.AddDataFileMacros(macros, dataFolder, dataDoc);
                string     templateFile   = Path.GetFileName(_TemplatePath);
                string     templateFolder = Path.GetDirectoryName(_TemplatePath);
                SingleSign singleSign     = new SingleSign();
                singleSign.Print(templateFile, templateFolder, macros, dataFolder, e);
            }
            catch (Exception ex)
            {
                throw new Exception("Error in sign data file " + dataPath, ex);
            }
            e.HasMorePages = (_SignIndex < _SignCount);
        }
예제 #3
0
 private void docSign_PrintPage(object sender, PrintPageEventArgs e)
 {
     try
     {
         string           dataFolder     = _PlantFolder;
         string           templateFile   = Path.GetFileName(_TemplatePath);
         string           templateFolder = Path.GetDirectoryName(_TemplatePath);
         MacroDefinitions macroDefs      = new MacroDefinitions();
         SingleSign.LoadMacroDefinitions(templateFile, templateFolder, macroDefs);
         MacroValues macros = new MacroValues();
         SingleSign.AddStandardMacroValues(macros);
         foreach (MacroDefinition macroDef in macroDefs)
         {
             macros[macroDef.Name] = macroDef.Value;
         }
         XmlDocument dataDoc = SingleSign.CreateEmptySignDataDoc();
         dataDoc.LoadXml(txtPlantFileContents.Text);
         SingleSign.AddDataFileMacros(macros, dataFolder, dataDoc);
         SingleSign singleSign = new SingleSign();
         singleSign.Print(templateFile, templateFolder, macros, dataFolder, e);
         e.HasMorePages = false;
     }
     catch (Exception ex)
     {
         SingleSign.ShowException(ex);
     }
 }
예제 #4
0
 public static void AddStandardMacroValues(MacroValues macros)
 {
     macros["inch"]              = "\"";
     macros["cent"]              = "\xA2";
     macros["squarebullet"]      = "\x25A0";
     macros["largesquarebullet"] = "\x25A0";
     macros["smallsquarebullet"] = "\x25AA";
     macros["roundbullet"]       = "\x25CF";
 }
예제 #5
0
        private static bool TryGetAttrib(XmlElement cmdElm, string attrName, MacroValues macros, out string value)
        {
            string rawValue = cmdElm.GetAttribute(attrName);

            if (string.IsNullOrEmpty(rawValue))
            {
                value = rawValue;
                return(false);
            }
            value = TranslateMacroReferences(rawValue, macros);
            return(true);
        }
예제 #6
0
        private void SetTextPos(XmlElement cmdElm, MacroValues macros)
        {
            PointF textPos;

            if (TryGetPosition(cmdElm, macros, out textPos))
            {
                SetTextPos(textPos);
            }
            else
            {
                throw CreateTemplateException(cmdElm, "Position attributes are required");
            }
        }
예제 #7
0
        private static bool TryGetAttrib(XmlElement cmdElm, string attrName, MacroValues macros, out float floatValue)
        {
            string stringValue;

            if (!TryGetAttrib(cmdElm, attrName, macros, out stringValue))
            {
                floatValue = 0.0f;
                return(false);
            }
            if (!float.TryParse(stringValue, out floatValue))
            {
                throw CreateTemplateAttributeException(cmdElm, attrName, "Not a valid decimal number");
            }
            return(true);
        }
예제 #8
0
        private void PrintText(XmlElement cmdElm, MacroValues macros)
        {
            PointF textPos;

            if (TryGetPosition(cmdElm, macros, out textPos))
            {
                SetTextPos(textPos);
            }
            string toPrint = GetRequiredStringAttrib(cmdElm, "value", macros);

            toPrint = TranslateMacroReferences(toPrint, macros);
            toPrint = NormalizeText(toPrint);
            if (!string.IsNullOrEmpty(toPrint))
            {
                string prefix;
                if (TryGetAttrib(cmdElm, "prefix", macros, out prefix))
                {
                    prefix = TranslateMacroReferences(prefix, macros);
                }
                else
                {
                    prefix = null;
                }
                float spaceAfter;
                if (!TryGetAttrib(cmdElm, "spaceafter", macros, out spaceAfter))
                {
                    spaceAfter = _SpaceAfter;
                }
                float width;
                if (!TryGetAttrib(cmdElm, "width", macros, out width))
                {
                    width = _ColumnWidth;
                }
                if (width > 0.0f)
                {
                    string discard;
                    bool   center = TryGetAttrib(cmdElm, "center", macros, out discard);
                    PrintString(toPrint, prefix, width, center, spaceAfter);
                }
                else
                {
                    PrintString(toPrint, prefix, spaceAfter);
                }
            }
        }
예제 #9
0
        private void PrintLine(XmlElement cmdElm, MacroValues macros)
        {
            PointF pos1;
            PointF pos2;

            if (!TryGetPosition(cmdElm, "x1", "y1", macros, out pos1))
            {
                throw CreateTemplateException(cmdElm, "Missing (x1,y1) line endpoint");
            }
            if (!TryGetPosition(cmdElm, "x2", "y2", macros, out pos2))
            {
                throw CreateTemplateException(cmdElm, "Missing (x2,y2) line endpoint");
            }
            float width = GetRequiredFloatAttrib(cmdElm, "width", macros);
            Pen   pen   = new Pen(_Brush, width);

            _Graphics.DrawLine(pen, pos1, pos2);
        }
예제 #10
0
 public static void AddDataFileMacros(MacroValues macros, string dataFolder, XmlDocument dataDoc)
 {
     foreach (XmlNode incNode in dataDoc.DocumentElement.SelectNodes("include"))
     {
         XmlElement  incElm          = (XmlElement)incNode;
         string      includeFileName = incElm.InnerText;
         XmlDocument includeDoc      = SingleSign.CreateEmptySignDataDoc();
         includeDoc.Load(Path.Combine(dataFolder, includeFileName));
         AddDataFileMacros(macros, dataFolder, includeDoc);
     }
     foreach (XmlNode dataNode in dataDoc.DocumentElement.SelectNodes("data"))
     {
         XmlElement dataElm = (XmlElement)dataNode;
         string     id      = dataElm.GetAttribute("id");
         if (id == null)
         {
             throw new MissingFieldException("Missing [id] in data file");
         }
         macros[id] = dataElm.InnerText;
     }
 }
예제 #11
0
        private void PrintImage(XmlElement cmdElm, MacroValues macros, string dataFolder)
        {
            PointF     imagePos;
            RectangleF imageRect;
            float      imageWidth;
            float      imageHeight;

            if (!TryGetPosition(cmdElm, macros, out imagePos))
            {
                throw CreateTemplateException(cmdElm, "Image position is required");
            }
            if (!TryGetAttrib(cmdElm, "width", macros, out imageWidth))
            {
                throw CreateTemplateException(cmdElm, "Image width is required");
            }
            if (!TryGetAttrib(cmdElm, "height", macros, out imageHeight))
            {
                imageHeight = 0.0f;
            }
            string fileName = GetRequiredStringAttrib(cmdElm, "file", macros);

            fileName = TranslateMacroReferences(fileName, macros);
            string imagePath = Path.Combine(dataFolder, fileName);

            using (Image image = Image.FromFile(imagePath))
            {
                float aspectRatio = (float)image.Height / (float)image.Width;
                if (imageHeight > 0.0f)
                {
                    float scaledWidth = imageHeight / aspectRatio;
                    imageRect = new RectangleF(imagePos.X + (imageWidth - scaledWidth) / 2.0f, imagePos.Y, scaledWidth, imageHeight);
                }
                else
                {
                    imageRect = new RectangleF(imagePos, new SizeF(imageWidth, imageWidth * aspectRatio));
                }
                _Graphics.DrawImage(image, imageRect);
            }
        }
예제 #12
0
        private void PrintOneTemplate(string templateFile, string templateFolder, MacroValues macros, string dataFolder)
        {
            string      templatePath = Path.Combine(templateFolder, templateFile);
            XmlDocument templateDoc  = new XmlDocument();

            templateDoc.Load(templatePath);
            foreach (XmlNode templateNode in templateDoc.DocumentElement.ChildNodes)
            {
                XmlElement cmdElm = templateNode as XmlElement;
                if (cmdElm != null)
                {
                    string cmdName = cmdElm.Name.ToLowerInvariant();
                    switch (cmdName)
                    {
                    case "font":
                        _FontSize = GetRequiredFloatAttrib(cmdElm, "size", macros);
                        _FontName = GetRequiredStringAttrib(cmdElm, "name", macros);
                        CreateFont();
                        break;

                    case "text":
                        PrintText(cmdElm, macros);
                        break;

                    case "image":
                        PrintImage(cmdElm, macros, dataFolder);
                        break;

                    case "line":
                        PrintLine(cmdElm, macros);
                        break;

                    case "style":
                        string styleName = GetRequiredStringAttrib(cmdElm, "name", macros);
                        CreateFontStyle(cmdElm, styleName);
                        CreateFont();
                        break;

                    case "color":
                        string color = GetRequiredStringAttrib(cmdElm, "name", macros);
                        CreateBrush(cmdElm, color);
                        CreateFont();
                        break;

                    case "columnwidth":
                        ColumnWidth(cmdElm, macros);
                        break;

                    case "spaceafter":
                        SpaceAfter(cmdElm, macros);
                        break;

                    case "movedown":
                        MoveDown(cmdElm, macros);
                        break;

                    case "moveright":
                        MoveRight(cmdElm, macros);
                        break;

                    case "textpos":
                        SetTextPos(cmdElm, macros);
                        break;

                    case "macrodef":
                        // Handled by LoadMacroDefinitions().
                        break;

                    case "include":
                        string includePath = TranslateMacroReferences(cmdElm.InnerText, macros);
                        if (string.IsNullOrEmpty(includePath))
                        {
                            throw CreateTemplateException(cmdElm, "Missing include file name");
                        }
                        PrintOneTemplate(Path.GetFileName(includePath), templateFolder, macros, dataFolder);
                        break;

                    default:
                        throw new ArgumentException("Unrecognized command in sign template: <" + cmdName + ">");
                    }
                }
            }
        }
예제 #13
0
        private static bool TryGetPosition(XmlElement cmdElm, string xAttr, string yAttr, MacroValues macros, out PointF position)
        {
            float x;
            float y;
            bool  hasX;
            bool  hasY;

            hasX = TryGetAttrib(cmdElm, xAttr, macros, out x);
            hasY = TryGetAttrib(cmdElm, yAttr, macros, out y);
            if (hasX != hasY)
            {
                throw CreateTemplateException(cmdElm, "\"" + xAttr + "\" and \"" + yAttr +
                                              "\" attributes must either both must be specified or neither");
            }
            if (hasX & hasY)
            {
                position = new PointF(x, y);
                return(true);
            }
            else
            {
                position = new PointF();
                return(false);
            }
        }
예제 #14
0
 private static bool TryGetPosition(XmlElement cmdElm, MacroValues macros, out PointF position)
 {
     return(TryGetPosition(cmdElm, "x", "y", macros, out position));
 }
예제 #15
0
        private static string GetRequiredStringAttrib(XmlElement cmdElm, string attrName, MacroValues macros)
        {
            string result;

            if (!TryGetAttrib(cmdElm, attrName, macros, out result))
            {
                throw CreateTemplateAttributeException(cmdElm, attrName, "Missing attribute");
            }
            return(TranslateMacroReferences(result, macros));
        }
예제 #16
0
        private static float GetRequiredFloatAttrib(XmlElement cmdElm, string attrName, MacroValues macros)
        {
            float result;

            if (!TryGetAttrib(cmdElm, attrName, macros, out result))
            {
                throw CreateTemplateAttributeException(cmdElm, attrName, "Missing attribute");
            }
            return(result);
        }
예제 #17
0
 public void Print(string templateFile, string templateFolder, MacroValues macros, string dataFolder, PrintPageEventArgs e)
 {
     Init(e);
     PrintOneTemplate(templateFile, templateFolder, macros, dataFolder);
 }
예제 #18
0
 private void MoveRight(XmlElement cmdElm, MacroValues macros)
 {
     _TextPos.X += GetRequiredFloatAttrib(cmdElm, "size", macros);
 }
예제 #19
0
 private void SpaceAfter(XmlElement cmdElm, MacroValues macros)
 {
     _SpaceAfter = GetRequiredFloatAttrib(cmdElm, "size", macros);
 }
예제 #20
0
 private void ColumnWidth(XmlElement cmdElm, MacroValues macros)
 {
     _ColumnWidth = GetRequiredFloatAttrib(cmdElm, "size", macros);
 }