Added header information to xml for image link Replace bname with xlink:href for image references Added RNOWidthAdj flag for Braidwood
		
			
				
	
	
		
			810 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			810 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.IO;
 | 
						|
using System.Xml;
 | 
						|
using System.Text;
 | 
						|
using System.Drawing;
 | 
						|
using System.Windows.Forms;
 | 
						|
 | 
						|
namespace fmtxml
 | 
						|
{
 | 
						|
	/// <summary>
 | 
						|
	/// Convert genmac xml files to svg. svg (Scalar Vector Graphics
 | 
						|
	/// in XML format), so that genmac can be used in the 32-bit proms
 | 
						|
	/// system. The generated files will be used by developers and
 | 
						|
	/// customer service persons to do macros.
 | 
						|
	/// </summary>
 | 
						|
	public class GenXmlToSvg
 | 
						|
	{
 | 
						|
		private string genName;
 | 
						|
		private XmlDocument xmlDoc;
 | 
						|
		private XmlDocument xmlOutDoc;
 | 
						|
		private XmlElement topOutElement;
 | 
						|
		private int Convertn = 300, I = 300, C = 118, D = 1, N = 0;
 | 
						|
		private float Wid = 3;
 | 
						|
		private int RTFFontSize = 20;
 | 
						|
		private int RTFFontFamily = 3;
 | 
						|
		private string [] FontChoice = 
 | 
						|
		{
 | 
						|
			"Times New Roman",
 | 
						|
			"VESymb XXXXXX",
 | 
						|
			"VolianDraw XXXXXX",
 | 
						|
			"Prestige Elite Tall",
 | 
						|
			"Courier New",
 | 
						|
			"Arial",
 | 
						|
			"Letter Gothic",
 | 
						|
			"Times New Roman",
 | 
						|
			"Letter Gothic Tall",
 | 
						|
			"Letter Gothic Tall",
 | 
						|
			"Gothic Ultra",
 | 
						|
			"VolianScript"
 | 
						|
		};
 | 
						|
 | 
						|
		private string [] OldName = 
 | 
						|
		{
 | 
						|
			"BOX1",
 | 
						|
			"BOX2",
 | 
						|
			"BOX3",
 | 
						|
			"BOX4",
 | 
						|
			"BOX5",
 | 
						|
			"HDR1",
 | 
						|
			"HDR2",
 | 
						|
			"HDR3",
 | 
						|
			"HDR4",
 | 
						|
			"HDR5",
 | 
						|
			"BOLDX",
 | 
						|
			"CNUM",
 | 
						|
			"CHKBOX",
 | 
						|
			"CHKBOX2",
 | 
						|
			"CHKBOX3",
 | 
						|
			"CHKBOX4",
 | 
						|
			"CHKBOX5",
 | 
						|
			"CHKBOX6",
 | 
						|
			"CHKBOX7",
 | 
						|
			"CHKBOX8",
 | 
						|
			"CHKBOX9",
 | 
						|
			"CHKBOX10",
 | 
						|
			"CHKBOX11",
 | 
						|
			"CHKBOX12",
 | 
						|
			"CHKBOX13",
 | 
						|
			"CHKBOX14",
 | 
						|
			"CHKBOX15",
 | 
						|
			"CHKBOX16",
 | 
						|
			"CHKBOX17",
 | 
						|
			"PLNTPLMAC",
 | 
						|
			"PLNTPLMAC2",
 | 
						|
			"GRAPHMAC0",
 | 
						|
			"GRAPHMAC1",
 | 
						|
			"RIGHTCHECKOFF",
 | 
						|
			"HPGLCOMMAND0",
 | 
						|
			"HPGLCOMMAND1",
 | 
						|
			"HPGLCOMMAND2",
 | 
						|
			"HPGLCOMMAND3",
 | 
						|
			"HPGLCOMMAND4",
 | 
						|
			"HPGLCOMMAND5",
 | 
						|
			"HPGLCOMMAND6",
 | 
						|
			"HPGLCOMMAND7",
 | 
						|
			"HPGLCOMMAND8",
 | 
						|
			"HPGLCOMMAND9",
 | 
						|
			"LTCO",
 | 
						|
			"SECDBLBXVERT",
 | 
						|
			"BOX6",
 | 
						|
			"BOX7",
 | 
						|
			"BOX8",
 | 
						|
			"ACAS_CHECKBOX",
 | 
						|
			"ACAS_CHECKLINE",
 | 
						|
		};
 | 
						|
 | 
						|
		private string [] NewName = 
 | 
						|
		{
 | 
						|
			"B1",
 | 
						|
			"B2",
 | 
						|
			"B3",
 | 
						|
			"B4",
 | 
						|
			"B5",
 | 
						|
			"H1",
 | 
						|
			"H2",
 | 
						|
			"H3",
 | 
						|
			"H4",
 | 
						|
			"H5",
 | 
						|
			"m33",
 | 
						|
			"C0",
 | 
						|
			"C1",
 | 
						|
			"C2",
 | 
						|
			"C3",
 | 
						|
			"C4",
 | 
						|
			"C5",
 | 
						|
			"C6",
 | 
						|
			"C7",
 | 
						|
			"C8",
 | 
						|
			"C9",
 | 
						|
			"C10",
 | 
						|
			"C11",
 | 
						|
			"C12",
 | 
						|
			"C13",
 | 
						|
			"C14",
 | 
						|
			"C15",
 | 
						|
			"C16",
 | 
						|
			"C17",
 | 
						|
			"m18",
 | 
						|
			"m19",
 | 
						|
			"m20",
 | 
						|
			"m21",
 | 
						|
			"C22",
 | 
						|
			"m23",
 | 
						|
			"m24",
 | 
						|
			"m25",
 | 
						|
			"m26",
 | 
						|
			"m27",
 | 
						|
			"m28",
 | 
						|
			"m29",
 | 
						|
			"m30",
 | 
						|
			"m31",
 | 
						|
			"m32",
 | 
						|
			"m20",
 | 
						|
			"m34",
 | 
						|
			"B6",
 | 
						|
			"B7",
 | 
						|
			"B8",
 | 
						|
			"m35",
 | 
						|
			"m36",
 | 
						|
		};
 | 
						|
 | 
						|
		private int RTFBUI = 0;
 | 
						|
		private int Sp = -1;
 | 
						|
		private float cx = 0;
 | 
						|
		private float cy = 0;
 | 
						|
		private int fidx=0;
 | 
						|
		private int [] fontfam;
 | 
						|
		private int [] fontsiz;
 | 
						|
		private float [] PPx;
 | 
						|
		private float [] PPy;
 | 
						|
		
 | 
						|
		// the following define RTFBUI values
 | 
						|
		private static int BOLD = 0x01;
 | 
						|
		private static int UNDERLINE = 0x02;
 | 
						|
		private static int ITALICS = 0x04;
 | 
						|
 | 
						|
		private string MyResultPath;
 | 
						|
 | 
						|
		/* 
 | 
						|
		 *  The following svg group must be added for WCN2 for its box on the cover page:
 | 
						|
		 * 
 | 
						|
		 <g id="B9">
 | 
						|
			<rect x="4" y="-3" width="352.5" height="120" fill="none" stroke="black" stroke-width="1.2" /> 
 | 
						|
			<line x1="4" y1="21" x2="355.5" y2="21" stroke-width="1.2" />
 | 
						|
			<line x1="4" y1="45" x2="355.5" y2="45" stroke-width="1.2" />
 | 
						|
			<line x1="4" y1="69" x2="355.5" y2="69" stroke-width="1.2" />
 | 
						|
			<line x1="4" y1="93" x2="355.5" y2="93" stroke-width="1.2" />
 | 
						|
			<line x1="263" y1="-3" x2="263" y2="118" stroke-width="1.2" />
 | 
						|
		</g>
 | 
						|
		 */
 | 
						|
		public GenXmlToSvg(string nm, string resPath)
 | 
						|
		{
 | 
						|
			MyResultPath = resPath;
 | 
						|
			genName = nm;
 | 
						|
			try
 | 
						|
			{
 | 
						|
				fontfam = new int[20];
 | 
						|
				fontsiz = new int[20];
 | 
						|
				PPx = new float[12];
 | 
						|
				PPy = new float[12];
 | 
						|
				ReadXml();
 | 
						|
				ConvertGenXmlToDIXml();
 | 
						|
				WriteXml();
 | 
						|
			}
 | 
						|
			catch (Exception ex)
 | 
						|
			{
 | 
						|
				Console.WriteLine("Genmac.xml name = " + nm + ". Error is " +  ex.Message);
 | 
						|
			}	
 | 
						|
		}
 | 
						|
 | 
						|
		private float CPoint(float x)
 | 
						|
		{
 | 
						|
			if (Convertn == C)
 | 
						|
			{
 | 
						|
				// convert from x (in centimeters) to inches & then to points
 | 
						|
				return (float) (.3937 * x * 72);
 | 
						|
			}	// convert from x (in inches) to points
 | 
						|
			else if (Convertn == I)
 | 
						|
				return (float)(x * 72);
 | 
						|
			else if (Convertn == N)
 | 
						|
				return (float)x;
 | 
						|
			else  // convert from x (in dots) to twips & then points
 | 
						|
				return (float)(((4.8 * x + 0.5)/1440f)*72);
 | 
						|
		}
 | 
						|
 | 
						|
		private void WriteXml()
 | 
						|
		{
 | 
						|
			string path = MyResultPath + @"\genmacall\" + genName.Substring(0, genName.LastIndexOf(".")) + ".svg";
 | 
						|
			XmlTextWriter writer = new XmlTextWriter(path,System.Text.Encoding.Unicode);
 | 
						|
			writer.Formatting=System.Xml.Formatting.Indented;
 | 
						|
			xmlOutDoc.Save(writer);
 | 
						|
		}
 | 
						|
 | 
						|
		private void ReadXml()
 | 
						|
		{
 | 
						|
			string fnm = MyResultPath + @"\genmacall\convert\" + genName;
 | 
						|
			xmlDoc = new XmlDocument();
 | 
						|
			XmlTextReader reader = new XmlTextReader(fnm);
 | 
						|
			xmlDoc.Load(reader);
 | 
						|
			reader.Close();
 | 
						|
		}
 | 
						|
		private void ConvertGenXmlToDIXml()
 | 
						|
		{
 | 
						|
			// first create the document for the svg version of the macro files
 | 
						|
			// and add the top svg element.
 | 
						|
			xmlOutDoc = new XmlDocument();
 | 
						|
			topOutElement = xmlOutDoc.CreateElement("svg");
 | 
						|
			topOutElement.SetAttribute("width","8in");
 | 
						|
			topOutElement.SetAttribute("height","10in");
 | 
						|
			topOutElement.SetAttribute("viewBox","0 0 576 720");
 | 
						|
			//			topOutNode.Attributes.Append(attr);
 | 
						|
			//			topOutNode.Attributes.Append<svg width="8in" height="10in" viewBox="0 0 576 720"
 | 
						|
			//			xmlns="http://www.w3.org/2000/svg" version="1.1">
 | 
						|
			xmlOutDoc.AppendChild(topOutElement);
 | 
						|
			
 | 
						|
			// Next add the description node, which is the name of the plant format.
 | 
						|
			XmlElement descNode = xmlOutDoc.CreateElement("desc");
 | 
						|
			descNode.InnerText = genName.Substring(0,genName.LastIndexOf("."));
 | 
						|
			topOutElement.AppendChild(descNode);
 | 
						|
			XmlElement top = (XmlElement) xmlDoc.FirstChild;
 | 
						|
			XmlNode sv = top.SelectSingleNode("STATICVOID");
 | 
						|
			XmlNodeList xmlNds = top.SelectNodes("MACRO");
 | 
						|
			
 | 
						|
			// Now for each macro, create a svg group with the name given to
 | 
						|
			// it. Later we may change this to map to what was created in 16-bit
 | 
						|
			// proms (for example BOX1 -> B1)
 | 
						|
			bool hasC0 = false;
 | 
						|
			foreach (XmlNode nd in xmlNds)
 | 
						|
			{
 | 
						|
				XmlNode name = nd.SelectSingleNode("NAME");
 | 
						|
				XmlElement elm = (XmlElement) name;
 | 
						|
				XmlElement grp = xmlOutDoc.CreateElement("g");
 | 
						|
				string cname = GetName(name.InnerText);
 | 
						|
				if (cname == "CNUM") hasC0 = true;
 | 
						|
				grp.SetAttribute("id",cname);
 | 
						|
				topOutElement.AppendChild(grp);
 | 
						|
				XmlNode definition = nd.SelectSingleNode("DEFINITION");
 | 
						|
				try
 | 
						|
				{
 | 
						|
					string str = ProcessMacroDefinition(grp,definition,sv);
 | 
						|
				}
 | 
						|
				catch (Exception e)
 | 
						|
				{
 | 
						|
					MessageBox.Show("Error processing macro definition for " + this.genName, e.Message);
 | 
						|
				}
 | 
						|
			}
 | 
						|
			// if the C0 (circle string) macro didn't exist, add a default. This is done so special code
 | 
						|
			// does not have to be written to do the circle string in edit/print.
 | 
						|
			/* Add the C0 macro if not there!
 | 
						|
			<g id="C0">
 | 
						|
				<ellipse cx="-76" cy="-306" rx="504" ry="504" fill="none" stroke="black" stroke-width="39" />
 | 
						|
			</g>
 | 
						|
			 */
 | 
						|
			if (!hasC0)
 | 
						|
			{
 | 
						|
				int savconvertn = Convertn;
 | 
						|
				Convertn = 0;		// don't convert size
 | 
						|
				XmlElement grp = xmlOutDoc.CreateElement("g");
 | 
						|
				grp.SetAttribute("id", "C0");
 | 
						|
				topOutElement.AppendChild(grp);
 | 
						|
				// these numbers were gotten from hlp backup circle.  They may need adjusted
 | 
						|
				// as genmacs are used!
 | 
						|
				cx = -76;
 | 
						|
				cy = -306;
 | 
						|
				grp.AppendChild(Ellipse(430,450));
 | 
						|
				Convertn = savconvertn;
 | 
						|
			}
 | 
						|
 | 
						|
			xmlNds = top.SelectNodes("USERDEF");
 | 
						|
 | 
						|
			// Now for each user defined macro, create a svg group with the
 | 
						|
			// name given to it.
 | 
						|
			foreach (XmlNode nd in xmlNds)
 | 
						|
			{
 | 
						|
				XmlNode name = nd.SelectSingleNode("NAME");
 | 
						|
				XmlElement elm = (XmlElement) name;
 | 
						|
				XmlElement grp = xmlOutDoc.CreateElement("g");
 | 
						|
				string tmpdebug = name.InnerText.Trim("\n".ToCharArray());
 | 
						|
				grp.SetAttribute("id",tmpdebug);
 | 
						|
				topOutElement.AppendChild(grp);
 | 
						|
				XmlNode definition = nd.SelectSingleNode("DEFINITION");
 | 
						|
				try
 | 
						|
				{
 | 
						|
					string str = ProcessMacroDefinition(grp,definition,sv);
 | 
						|
				}
 | 
						|
				catch (Exception e)
 | 
						|
				{
 | 
						|
					MessageBox.Show("Error processing macro definition for " + this.genName, e.Message);
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
		}
 | 
						|
		
 | 
						|
		// convert the macro names as was done in 16-bit code?
 | 
						|
		string GetName(string oname)
 | 
						|
		{
 | 
						|
			for (int i=0; i<51 ; i++)
 | 
						|
			{
 | 
						|
				if (oname == OldName[i]) return NewName[i];
 | 
						|
			}
 | 
						|
			return "NONAME";
 | 
						|
		}
 | 
						|
 | 
						|
		private void PushFont()
 | 
						|
		{
 | 
						|
			if( fidx < 19 ) 
 | 
						|
			{
 | 
						|
				fontfam[fidx] = RTFFontFamily;
 | 
						|
				fontsiz[fidx] = RTFFontSize;
 | 
						|
				fidx++;
 | 
						|
			}
 | 
						|
			return;
 | 
						|
		}
 | 
						|
		private void PopFont()
 | 
						|
		{
 | 
						|
			if( fidx > 0 ) 
 | 
						|
			{
 | 
						|
				fidx--;
 | 
						|
				RTFFontFamily = fontfam[fidx];
 | 
						|
				RTFFontSize = fontsiz[fidx];
 | 
						|
			}
 | 
						|
			return;
 | 
						|
		}
 | 
						|
		private void PushPos()
 | 
						|
		{
 | 
						|
			if (Sp < 11) 
 | 
						|
			{ 
 | 
						|
				Sp++; 
 | 
						|
				PPx[Sp] = cx; 
 | 
						|
				PPy[Sp] = cy; 
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private void PopPos()
 | 
						|
		{
 | 
						|
			if (Sp > -1)
 | 
						|
			{
 | 
						|
				cx = PPx[Sp];
 | 
						|
				cy = PPy[Sp];
 | 
						|
				Sp--;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private XmlElement RTFAdjust(float x, float y)
 | 
						|
		{
 | 
						|
			// This was used for RTF export only.
 | 
						|
			return null;
 | 
						|
		}
 | 
						|
		private XmlElement GDIAdjust(float x, float y)
 | 
						|
		{
 | 
						|
			// can't quite figure out what this is doing 
 | 
						|
			// KBR TODO: gdiadjust
 | 
						|
			return null;
 | 
						|
		}
 | 
						|
 | 
						|
		private float GetOneFloat(string cmd)
 | 
						|
		{
 | 
						|
			int indxlp = cmd.IndexOf("(");
 | 
						|
			int indxrp = cmd.IndexOf(")");
 | 
						|
			string tmp = cmd.Substring(indxlp+1,indxrp-indxlp-1);
 | 
						|
			return (float) Convert.ToDouble(tmp);
 | 
						|
		}
 | 
						|
 | 
						|
		private void GetTwoFloats(string cmd, ref float x, ref float y)
 | 
						|
		{
 | 
						|
			int indxlp = cmd.IndexOf("(");
 | 
						|
			int indxcm = cmd.IndexOf(",");
 | 
						|
			int indxrp = cmd.IndexOfAny("),".ToCharArray(),indxcm+1);
 | 
						|
			x = (float) Convert.ToDouble(cmd.Substring(indxlp+1,indxcm-indxlp-1));
 | 
						|
			y = (float) Convert.ToDouble(cmd.Substring(indxcm+1,indxrp-indxcm-1));
 | 
						|
		}
 | 
						|
 | 
						|
		private XmlElement DefineMacro(string str)
 | 
						|
		{
 | 
						|
			byte x = Convert.ToByte(173);
 | 
						|
			cx=cy=0;
 | 
						|
			return null;
 | 
						|
		}
 | 
						|
		private XmlElement HorizontalLine(float X)
 | 
						|
		{
 | 
						|
			XmlElement box = this.xmlOutDoc.CreateElement("line");
 | 
						|
			box.SetAttribute("x1",cx.ToString());
 | 
						|
			box.SetAttribute("y1",cy.ToString());
 | 
						|
			box.SetAttribute("x2",(cx+CPoint(X)).ToString());
 | 
						|
			box.SetAttribute("y2",cy.ToString());
 | 
						|
			box.SetAttribute("stroke-width",Wid.ToString());
 | 
						|
			return box;
 | 
						|
		}
 | 
						|
 | 
						|
		private XmlElement VerticalLine(float Y)
 | 
						|
		{
 | 
						|
			XmlElement box = this.xmlOutDoc.CreateElement("line");
 | 
						|
			box.SetAttribute("x1",cx.ToString());
 | 
						|
			box.SetAttribute("y1",cy.ToString());
 | 
						|
			box.SetAttribute("x2",cx.ToString());
 | 
						|
			box.SetAttribute("y2",(cy+CPoint(Y)).ToString());
 | 
						|
			box.SetAttribute("stroke-width",Wid.ToString());
 | 
						|
			return box;
 | 
						|
		}
 | 
						|
 | 
						|
		private XmlElement DiagLine(float X, float Y)
 | 
						|
		{
 | 
						|
			XmlElement box = this.xmlOutDoc.CreateElement("line");
 | 
						|
			box.SetAttribute("x1",cx.ToString());
 | 
						|
			box.SetAttribute("y1",cy.ToString());
 | 
						|
			box.SetAttribute("x2",(cx+CPoint(X)).ToString());
 | 
						|
			box.SetAttribute("y2",(cy+CPoint(Y)).ToString());
 | 
						|
			box.SetAttribute("stroke-width",Wid.ToString());
 | 
						|
			return box;
 | 
						|
		}
 | 
						|
 | 
						|
		private XmlElement Box(float X, float Y)
 | 
						|
		{
 | 
						|
			XmlElement box = this.xmlOutDoc.CreateElement("rect");
 | 
						|
			box.SetAttribute("x",cx.ToString());
 | 
						|
			box.SetAttribute("y",cy.ToString());
 | 
						|
			box.SetAttribute("width",CPoint(X).ToString());
 | 
						|
			box.SetAttribute("height",CPoint(Y).ToString());
 | 
						|
			box.SetAttribute("fill","none");
 | 
						|
			box.SetAttribute("stroke","black");
 | 
						|
			box.SetAttribute("stroke-width",Wid.ToString());
 | 
						|
			return box;
 | 
						|
		}
 | 
						|
		
 | 
						|
		private XmlElement Ellipse(float X, float Y)
 | 
						|
		{
 | 
						|
			XmlElement ellipse = this.xmlOutDoc.CreateElement("ellipse");
 | 
						|
			ellipse.SetAttribute("cx",cx.ToString());
 | 
						|
			ellipse.SetAttribute("cy",cy.ToString());
 | 
						|
			ellipse.SetAttribute("rx",(CPoint(X)).ToString());
 | 
						|
			ellipse.SetAttribute("ry",(CPoint(Y)).ToString());
 | 
						|
			ellipse.SetAttribute("fill","none");
 | 
						|
			ellipse.SetAttribute("stroke","black");
 | 
						|
			ellipse.SetAttribute("stroke-width",Wid.ToString());
 | 
						|
			return ellipse;
 | 
						|
		}
 | 
						|
 | 
						|
		private XmlElement Text(float X, float Y, string str)
 | 
						|
		{
 | 
						|
			//text-decoration="underline"
 | 
						|
			//font-weight="bold"
 | 
						|
			//font-style="italic"
 | 
						|
			XmlElement text = this.xmlOutDoc.CreateElement("text");
 | 
						|
			text.SetAttribute("x",(cx+CPoint(X)).ToString());
 | 
						|
			text.SetAttribute("y",(cy+CPoint(Y)).ToString());
 | 
						|
			text.SetAttribute("font-family",FontChoice[RTFFontFamily]);
 | 
						|
			text.SetAttribute("font-size",(RTFFontSize/2).ToString());
 | 
						|
			if ((RTFBUI&BOLD)==1) text.SetAttribute("font-weight","bold");
 | 
						|
			if ((RTFBUI&UNDERLINE)==1) text.SetAttribute("text-decoration", "underline");
 | 
						|
			if ((RTFBUI&ITALICS)==1) text.SetAttribute("font-style","italic");
 | 
						|
			text.InnerText = str;
 | 
						|
			return text;
 | 
						|
		}
 | 
						|
 | 
						|
		private XmlElement[] RTFBox3(float x, float y)
 | 
						|
		{
 | 
						|
			XmlElement[] elearr = new XmlElement[3];
 | 
						|
			PushPos();
 | 
						|
			elearr[0] = VerticalLine(y);
 | 
						|
			cy += CPoint(y);
 | 
						|
			elearr[1] = HorizontalLine(x);
 | 
						|
			cx += CPoint(x);
 | 
						|
			float ftmp = (float) (y*-1.0);
 | 
						|
			cy += CPoint(ftmp);
 | 
						|
			elearr[2] = VerticalLine(y);
 | 
						|
			PopPos();
 | 
						|
			return elearr;
 | 
						|
		}
 | 
						|
 | 
						|
		private XmlElement BitMap(float X, float Y, string str)
 | 
						|
		{
 | 
						|
			XmlElement bmap = xmlOutDoc.CreateElement("image");
 | 
						|
			bmap.SetAttribute("x",(cx+CPoint(X)).ToString());
 | 
						|
			bmap.SetAttribute("y",(cy+CPoint(Y)).ToString());
 | 
						|
			Bitmap bmp= new Bitmap(str);
 | 
						|
			bmap.SetAttribute("width",bmp.Width.ToString()+"px");
 | 
						|
			bmap.SetAttribute("height",bmp.Height.ToString()+"px");
 | 
						|
			bmap.SetAttribute("xlink:href", str);
 | 
						|
			//bmap.SetAttribute("href", str);
 | 
						|
			return bmap;
 | 
						|
		}
 | 
						|
 | 
						|
		private void GetFont(string fontexp)
 | 
						|
		{
 | 
						|
			if (fontexp==null||fontexp=="") 
 | 
						|
			{
 | 
						|
				RTFFontFamily = 3;	
 | 
						|
				RTFFontSize = 20;
 | 
						|
			} 
 | 
						|
			else if (fontexp.IndexOf("PICA")>-1)
 | 
						|
			{
 | 
						|
				RTFFontFamily = 4;
 | 
						|
				RTFFontSize = 24;
 | 
						|
			} 
 | 
						|
			else if (fontexp.IndexOf("EXPANDED")>-1)
 | 
						|
			{
 | 
						|
				RTFFontSize = 24;
 | 
						|
			} 
 | 
						|
			else if(fontexp.IndexOf("SANSERIF")>-1) 
 | 
						|
			{
 | 
						|
				RTFFontFamily = 6;
 | 
						|
				RTFFontSize = 20;
 | 
						|
			} 
 | 
						|
			else if (fontexp.IndexOf("PROPT12")>-1) 
 | 
						|
			{
 | 
						|
				RTFFontFamily = 5;
 | 
						|
				RTFFontSize = 22;
 | 
						|
			} 
 | 
						|
			else if (fontexp.IndexOf("COMPRESSED")>-1) 
 | 
						|
			{
 | 
						|
				RTFFontFamily = 6;
 | 
						|
				RTFFontSize = 14;
 | 
						|
			}		
 | 
						|
			if (fontexp.IndexOf("BOLD")>-1)     RTFBUI |= BOLD; else RTFBUI &= 0xFFFE;
 | 
						|
			if (fontexp.IndexOf("UNDERLINE")>-1) RTFBUI |= UNDERLINE; else RTFBUI &= 0xFFFD;
 | 
						|
			if (fontexp.IndexOf("ITALICS")>-1)   RTFBUI |= ITALICS; else RTFBUI &= 0xFFFB;
 | 
						|
		}
 | 
						|
 | 
						|
		private string ProcessMacroDefinition(XmlElement grp, XmlNode idef, XmlNode functions)
 | 
						|
		{
 | 
						|
			XmlElement elm = (XmlElement) idef;
 | 
						|
			string def = elm.InnerText;
 | 
						|
			StringBuilder str_result = new StringBuilder();
 | 
						|
			
 | 
						|
			fidx=0;
 | 
						|
			cx = 0;
 | 
						|
			cy = 0;
 | 
						|
			Wid = 3;
 | 
						|
			RTFFontSize = 20;
 | 
						|
			RTFFontFamily = 3;
 | 
						|
			Sp = -1;
 | 
						|
			
 | 
						|
			// for each element, process the token for the element and add it to the
 | 
						|
			// xml tree (ProcessToken does both).
 | 
						|
			int lindx = 0;
 | 
						|
			int indx = def.IndexOf(";");
 | 
						|
			while (indx>-1)
 | 
						|
			{
 | 
						|
				ProcessToken(grp, def, lindx, indx, functions);
 | 
						|
				lindx = indx+1;
 | 
						|
				indx = def.IndexOf(";",lindx);
 | 
						|
			}
 | 
						|
			return str_result.ToString();
 | 
						|
		}
 | 
						|
 | 
						|
		private void ProcessToken(XmlElement grp, string def, int lindx, int indx, XmlNode functions)
 | 
						|
		{
 | 
						|
			
 | 
						|
			float x=0,y=0;
 | 
						|
			XmlElement retval = null;
 | 
						|
			//get the token, i.e. from last index to this one.
 | 
						|
			string token = def.Substring(lindx,indx-lindx).Trim();
 | 
						|
			if (token==null||token=="")return;
 | 
						|
			string cmd = token;   // cmd has the command without parens/values
 | 
						|
			if (token.IndexOf("(")>-1) cmd = token.Substring(0,token.IndexOf("("));
 | 
						|
			if (token.IndexOf("RTFFontSize")>-1)cmd = "RTFFontSize";
 | 
						|
			if (token.IndexOf("RTFFontFamily")>-1)cmd = "RTFFontFamily";
 | 
						|
			if (token.IndexOf("RTFBUI")>-1) cmd = "RTFBUI";
 | 
						|
			if (token.IndexOf("DEFMAC")>-1) cmd = "DEFMAC";
 | 
						|
			if (token.IndexOf("HLINE")>-1) cmd = "HLINE";
 | 
						|
			if (token.IndexOf("TEXT")>-1) cmd = "TEXT";
 | 
						|
			if (token.IndexOf("BITMAP")>-1) cmd = "BITMAP";
 | 
						|
			if (cmd==null)return;
 | 
						|
			try 
 | 
						|
			{
 | 
						|
				switch (cmd)
 | 
						|
				{
 | 
						|
					case "DEFMAC":		// command is DEFMAC(xyz)
 | 
						|
						MessageBox.Show("DEFMAC found, format = " + genName + " not converted - do manually");
 | 
						|
						int indxl = token.IndexOf("(");
 | 
						|
						int indxr = token.IndexOf(")");
 | 
						|
						string strx = token.Substring(indxl+1,indxr-indxl-1).Trim();
 | 
						|
						retval = DefineMacro(strx);
 | 
						|
						break;
 | 
						|
					case "PUSHF":
 | 
						|
						PushFont();
 | 
						|
						break;
 | 
						|
					case "POPF":
 | 
						|
						PopFont();
 | 
						|
						break;
 | 
						|
					case "PUSHP":
 | 
						|
						PushPos();
 | 
						|
						break;
 | 
						|
					case "POPP":
 | 
						|
						PopPos();
 | 
						|
						break;
 | 
						|
					case "UNIT":
 | 
						|
						if (token.IndexOf("C")>-1)Convertn = C;
 | 
						|
						else if (token.IndexOf("I",4)>-1)Convertn = I;
 | 
						|
						else if (token.IndexOf("D")>-1)Convertn = D;
 | 
						|
						break;
 | 
						|
					case "RTFADJ":	// command is RTFADJ(x,y)
 | 
						|
						GetTwoFloats(token, ref x, ref y);
 | 
						|
						retval = RTFAdjust(x, y);
 | 
						|
						break;
 | 
						|
					case "GDIADJ":	// command is GDIADJ(x,y)
 | 
						|
						GetTwoFloats(token, ref x, ref y);
 | 
						|
						retval = GDIAdjust(x, y);
 | 
						|
						break;
 | 
						|
					case "FONT":	//comand is FONT(FONTSTR)
 | 
						|
						GetFont(token);
 | 
						|
						break;
 | 
						|
					case "RTFFontSize":   // command is RTFFontSize = x
 | 
						|
						int indxe = token.IndexOf("=");
 | 
						|
						string numstr = token.Substring(indxe+1,token.Length-indxe-1).Trim();
 | 
						|
						if (numstr.IndexOf("*")>-1)
 | 
						|
						{
 | 
						|
							int i1 = Convert.ToInt32(numstr.Substring(0,numstr.IndexOf("*")));
 | 
						|
							int i2 = Convert.ToInt32(numstr.Substring(numstr.IndexOf("*")+1,numstr.Length-numstr.IndexOf("*")-1));
 | 
						|
							RTFFontSize = i1*i2;
 | 
						|
						}
 | 
						|
						else
 | 
						|
							RTFFontSize = Convert.ToInt32(numstr);
 | 
						|
						break;
 | 
						|
					case "RTFBUI":
 | 
						|
						// command either sets it '=' or ORs it '|= ', look for these.
 | 
						|
						int ieq = token.IndexOf("=");
 | 
						|
						string val = token.Substring(ieq+1,token.Length-ieq-1).Trim();
 | 
						|
						int amt=0;
 | 
						|
						if (token.IndexOf("0x")<0)
 | 
						|
							amt = Convert.ToInt32(val);
 | 
						|
						else
 | 
						|
							amt = Convert.ToInt32(val,16);
 | 
						|
						int operor = token.IndexOf("|=");
 | 
						|
						int operand = token.IndexOf("&=");
 | 
						|
						if (operor<0 && operand<0)
 | 
						|
							RTFBUI = amt;
 | 
						|
						else if (operor>0)
 | 
						|
							RTFBUI |= amt;
 | 
						|
						else
 | 
						|
							RTFBUI &= amt;
 | 
						|
						break;
 | 
						|
					case "RTFFontFamily":   // command is RTFFontFamily = x
 | 
						|
						indxe = token.IndexOf("=");
 | 
						|
						numstr = token.Substring(indxe+1,token.Length-indxe-1).Trim();
 | 
						|
						RTFFontFamily = Convert.ToInt32(numstr);
 | 
						|
						break;
 | 
						|
					case "LNWID":	// command is LNWID(w)
 | 
						|
						float w = GetOneFloat(token);
 | 
						|
						Wid = CPoint(w);
 | 
						|
						break;
 | 
						|
					case "MOVA":	// command is MOVA(x, y)
 | 
						|
						GetTwoFloats(token,ref x, ref y);
 | 
						|
						cx = CPoint(x);
 | 
						|
						cy = CPoint(y);
 | 
						|
						break;
 | 
						|
					case "MOVR":	// command is MOVR(x, y)
 | 
						|
						GetTwoFloats(token,ref x, ref y);
 | 
						|
						cx += CPoint(x);
 | 
						|
						cy += CPoint(y);
 | 
						|
						break;
 | 
						|
					case "HLINE":	// command is HLINE(x)
 | 
						|
						x = GetOneFloat(token);
 | 
						|
						grp.AppendChild(HorizontalLine(x));
 | 
						|
						break;
 | 
						|
					case "VLINE":	// command is VLINE(y)
 | 
						|
						y = GetOneFloat(token);
 | 
						|
						grp.AppendChild(VerticalLine(y));
 | 
						|
						break;
 | 
						|
					case "DLINE":	// command is DLINE(x, y)
 | 
						|
						GetTwoFloats(token, ref x, ref y);
 | 
						|
						grp.AppendChild(DiagLine(x, y));
 | 
						|
						break;
 | 
						|
					case "BOX":		// command is BOX(x, y)
 | 
						|
						GetTwoFloats(token,ref x, ref y);
 | 
						|
						grp.AppendChild(Box(x,y));
 | 
						|
						break;
 | 
						|
					case "BOX3SIDES":  // command is BOX3SIDES(X,Y)
 | 
						|
						GetTwoFloats(token, ref x, ref y);
 | 
						|
						XmlElement [] bxsd = new XmlElement[3];
 | 
						|
						bxsd = RTFBox3(x, y);
 | 
						|
						for (int ib = 0;ib < 3; ib++) grp.AppendChild(bxsd[ib]);
 | 
						|
						break;
 | 
						|
					case "DBOX":		// * DBOX(X,Y,A) DoubleBox((double)X,(double)Y,(double)A);
 | 
						|
						MessageBox.Show("Not supported - ANO only");
 | 
						|
						break;
 | 
						|
					case "CIRCLE":		// command is CIRCLE(X,Y) 
 | 
						|
						GetTwoFloats(token, ref x, ref y);
 | 
						|
						grp.AppendChild(Ellipse(x,y));
 | 
						|
						break;
 | 
						|
					case "TEXT":	// command is TEXT(x, y, str)
 | 
						|
						GetTwoFloats(token,ref x, ref y);
 | 
						|
						int indxrp = token.IndexOf(",");
 | 
						|
						indxrp = token.IndexOf(",",indxrp+1);
 | 
						|
						// this found the last argument, i.e. text - now find the "
 | 
						|
						indxrp = token.IndexOf("\"",indxrp+1);
 | 
						|
						string str = token.Substring(indxrp+1,token.LastIndexOf("\"")-indxrp-1);
 | 
						|
						// only trim if has characters?
 | 
						|
//						if (str!=null)str = str.Trim();
 | 
						|
						if (str!=null && str!="") grp.AppendChild(Text(x, y, str));
 | 
						|
						break;
 | 
						|
					case "BITMAP":
 | 
						|
						int ibm = token.IndexOf("BITMAP");
 | 
						|
						int ibmq = token.IndexOf("\"",ibm);
 | 
						|
						string thestr = token.Substring(ibm,ibmq-ibm);
 | 
						|
						string [] bmap = thestr.Split(" ".ToCharArray(),4);
 | 
						|
						x=(float)Convert.ToDouble(bmap[1]);
 | 
						|
						y=(float)Convert.ToDouble(bmap[2]);
 | 
						|
						thestr=bmap[3];
 | 
						|
						if (thestr.IndexOf("~FORMAT\\")>-1) thestr=thestr.Replace("~FORMAT","E:\\VE-PROMS\\FORMAT");
 | 
						|
						grp.AppendChild(BitMap(x,y,thestr));
 | 
						|
						break;
 | 
						|
					case "ABSOLUTE":	// no-op ?
 | 
						|
						break;
 | 
						|
					default:		// function calls
 | 
						|
						// see if in the STATICVOID list. The name is the function name
 | 
						|
						// without () or parameters...
 | 
						|
 | 
						|
						XmlNode parent = functions.ParentNode;
 | 
						|
						XmlNode foundsv = parent.SelectSingleNode("STATICVOID[NAME = \""+cmd+"\"]");
 | 
						|
						if (foundsv==null)
 | 
						|
							Console.WriteLine("Name " + genName + " failed. The token is not in list, token = " +token);
 | 
						|
						else
 | 
						|
						{
 | 
						|
							XmlNode param = foundsv.SelectSingleNode("PARAMETERS");
 | 
						|
							XmlNode deffn = foundsv.SelectSingleNode("DEFINITION");
 | 
						|
							// get the argument value to pass in.
 | 
						|
							int ilp = token.IndexOf("(");
 | 
						|
							int irp = token.IndexOf(")");
 | 
						|
							string aval=null;
 | 
						|
							if (ilp>0&&irp>0) aval = token.Substring(ilp+1,irp-ilp-1);
 | 
						|
							ProcessFunctions(grp, param.InnerText,functions, aval, deffn.InnerText);
 | 
						|
						}
 | 
						|
						break;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			catch (Exception e)
 | 
						|
			{
 | 
						|
				Console.WriteLine("Name = " + genName + ". Error in token: " + token, e.Message);
 | 
						|
				retval = null;
 | 
						|
			}
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		private void ProcessFunctions(XmlElement grp, string param, XmlNode functions, string val, string fntext)
 | 
						|
		{
 | 
						|
			// Each function contains a series of commands that must be processed for the
 | 
						|
			// function. Results are added to the group element for this group (macro).
 | 
						|
 | 
						|
			string repstr=null;
 | 
						|
			// if there is a parameter, get the substitution string...
 | 
						|
			if (param.IndexOf("none")==-1) 
 | 
						|
			{
 | 
						|
				int chrindx = param.IndexOf("char *");
 | 
						|
				int end = -1;
 | 
						|
				if (chrindx>-1)
 | 
						|
				{
 | 
						|
					end = param.IndexOf("\"",chrindx);
 | 
						|
					repstr = param.Substring(chrindx+6,end-chrindx-6);
 | 
						|
				}
 | 
						|
				else
 | 
						|
				{
 | 
						|
					chrindx = param.IndexOf("int ");
 | 
						|
					if (chrindx>-1)
 | 
						|
					{
 | 
						|
						end = param.IndexOf("\"",chrindx);
 | 
						|
						repstr = param.Substring(chrindx+4,end-chrindx-4);
 | 
						|
					}
 | 
						|
				}
 | 
						|
				
 | 
						|
			}
 | 
						|
 | 
						|
			// find the function commands and include them here.
 | 
						|
			
 | 
						|
			string funstr = fntext;
 | 
						|
			if (repstr!=null)funstr = funstr.Replace(repstr,val);
 | 
						|
			// for each element, process commands.
 | 
						|
			int lindx = 0;
 | 
						|
			int indx = funstr.IndexOf(";");
 | 
						|
			while (indx>-1)
 | 
						|
			{
 | 
						|
				
 | 
						|
				ProcessToken(grp, funstr, lindx, indx, functions);
 | 
						|
				lindx = indx+1;
 | 
						|
				indx = funstr.IndexOf(";",lindx);
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |