// Read all the string parameters into arrays. void ReadStringParameters(int firstStIndexBlk, out OcadParamString[] simpleStringParameters, out List<OcadParamString>[] listStringParameters) { // Allocate the arrays of objects to create. simpleStringParameters = new OcadParamString[(int) OcadStringParam.CountSingleParam]; listStringParameters = new List<OcadParamString>[(int) OcadStringParam.CountListParam]; if (firstStIndexBlk == 0) return; OcadStIndexBlocks stindexblocks = new OcadStIndexBlocks(); stindexblocks.Read(reader, firstStIndexBlk); if (stindexblocks == null) return; for (int i = 0; i < stindexblocks.indexes.Length; ++i) { OcadParamString param = new OcadParamString(); param.Read(reader, stindexblocks.indexes[i]); // Sometimes the "zoom" (12) parameter shows up as -12. Not sure why -- bug in OCAD? if (param.StType < 0) param.StType = -param.StType; OcadStringParam stringType = (OcadStringParam) param.StType; if (stringType != 0) { if (stringType < OcadStringParam.CountListParam) { if (listStringParameters[(int) stringType] == null) listStringParameters[(int) stringType] = new List<OcadParamString>(); listStringParameters[(int) stringType].Add(param); } else if (stringType < OcadStringParam.LastSingleParam) { simpleStringParameters[stringType - OcadStringParam.FirstSingleParam] = param; } } } }
// Get the template information from a string parameter into a TemplateInfo class. TemplateInfo ReadTemplateInfo(OcadParamString paramString) { string relativeFileName = paramString.firstField; string absoluteFileName; try { absoluteFileName = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(this.filename), relativeFileName)); } catch (Exception) { // An argument exception occurs in the template info has bad characters. Other weird exceptions are possible. // Just use the relative name in this case (kind of a punt, but hey...) absoluteFileName = relativeFileName; } float offsetX = GetParamFloat(paramString, 'x', 0F); float offsetY = GetParamFloat(paramString, 'y', 0F); float angle = GetParamFloat(paramString, 'a', 0F); float dpi = 25.4F / GetParamFloat(paramString, 'u', 0F); bool enabled = (GetParamInt(paramString, 's', 1) != 0); return new TemplateInfo(absoluteFileName, new PointF(offsetX, offsetY), dpi, angle, enabled); }
// Get a string parameter out of an OcadParamString. Use \0 to get the first field. // Returns defaultValue if passed null or if the parameter doesn't exist. int GetParamInt(OcadParamString paramString, char code, int defaultValue) { string s = GetParamString(paramString, code); if (s == null) return defaultValue; int i; if (int.TryParse(s, out i)) return i; else return defaultValue; }
// Get a string parameter out of an OcadParamString. Use \0 to get the first field. // Returns null if passed null or if the parameter doesn't exist. string GetParamString(OcadParamString paramString, char code) { if (paramString == null) return null; if (code == '\0') return paramString.firstField; if (paramString.codes == null) return null; for (int i = 0; i < paramString.codes.Length; ++i) { if (paramString.codes[i] == code) return paramString.values[i]; } return null; }
// Get a float parameter out of an OcadParamString. Use \0 to get the first field. // Returns defaultValue if passed null or if the parameter doesn't exist. float GetParamFloat(OcadParamString paramString, char code, float defaultValue) { string s = GetParamString(paramString, code); if (s == null) return defaultValue; float f; if (float.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out f)) return f; else return defaultValue; }
// Create the parameter string for the template. OcadParamString CreateTemplateStringParameter(TemplateInfo template) { float mmPerPixel; if (template.dpi > 0) mmPerPixel = 25.4F / template.dpi; else mmPerPixel = 0; OcadParamString paramString = new OcadParamString(); paramString.StType = (int) OcadStringParam.Template ; paramString.ObjIndex = 0; paramString.codes = new char[7]; paramString.values = new string[7]; paramString.firstField = template.absoluteFileName; paramString.codes[0] = 'r'; paramString.values[0] = template.visible ? "1" : "0"; // visible paramString.codes[1] = 's'; paramString.values[1] = template.visible ? "1" : "0"; //visible paramString.codes[2] = 'x'; paramString.values[2] = template.centerPoint.X.ToString(CultureInfo.InvariantCulture); // offset X paramString.codes[3] = 'y'; paramString.values[3] = template.centerPoint.Y.ToString(CultureInfo.InvariantCulture); ; // offset Y paramString.codes[4] = 'a'; paramString.values[4] = template.angle.ToString(CultureInfo.InvariantCulture); // angle paramString.codes[5] = 'u'; paramString.values[5] = mmPerPixel.ToString(CultureInfo.InvariantCulture); // dpi x paramString.codes[6] = 'v'; paramString.values[6] = mmPerPixel.ToString(CultureInfo.InvariantCulture); // dpi y return paramString; }
// Create the parameter string for the scale. OcadParamString CreateScaleParameter() { OcadParamString paramString = new OcadParamString(); paramString.StType = (int) OcadStringParam.ScalePar; paramString.ObjIndex = 0; paramString.codes = new char[7]; paramString.values = new string[7]; paramString.codes[0] = 'm'; paramString.values[0] = map.MapScale.ToString(CultureInfo.InvariantCulture); paramString.codes[1] = 'g'; paramString.values[1] = "10.00"; // grid scale paramString.codes[2] = 'r'; paramString.values[2] = "0"; // real world coords off paramString.codes[3] = 'x'; paramString.values[3] = "0.0"; // real world X paramString.codes[4] = 'y'; paramString.values[4] = "0.0"; // real world Y paramString.codes[5] = 'a'; paramString.values[5] = "0.0"; // real world angle paramString.codes[6] = 'd'; paramString.values[6] = "500.0"; // real world grid return paramString; }
// Create the parameter string for the print parameters. OcadParamString CreatePrintParameter() { RectangleF printArea = map.PrintArea; bool entireMap = false; if (printArea.Left == 0 && printArea.Right == 0 && printArea.Top == 0 && printArea.Bottom == 0) entireMap = true; int numCodes = entireMap ? 2 : 6; OcadParamString paramString = new OcadParamString(); paramString.StType = (int) OcadStringParam.PrintPar; paramString.ObjIndex = 0; paramString.codes = new char[numCodes]; paramString.values = new string[numCodes]; paramString.codes[0] = 'a'; paramString.values[0] = map.PrintScale.ToString(CultureInfo.InvariantCulture); paramString.codes[1] = 'r'; paramString.values[1] = entireMap ? "0" : "1"; if (!entireMap) { paramString.codes[2] = 'L'; paramString.values[2] = printArea.Left.ToString(CultureInfo.InvariantCulture); paramString.codes[3] = 'B'; paramString.values[3] = printArea.Top.ToString(CultureInfo.InvariantCulture); // note: bottom and top switched due to Y-positive coord system. paramString.codes[4] = 'R'; paramString.values[4] = printArea.Right.ToString(CultureInfo.InvariantCulture); paramString.codes[5] = 'T'; paramString.values[5] = printArea.Bottom.ToString(CultureInfo.InvariantCulture); // note: bottom and top switched due to Y-positive coord system. } return paramString; }
// Create the parameter strings for all the colors. List<OcadParamString> CreateColorStringParameters() { List<SymColor> colors = new List<SymColor>(map.AllColors); List<OcadParamString> paramStrings = new List<OcadParamString>(colors.Count); int colorCount = colors.Count; for (int i = colorCount - 1; i >= 0; --i) { // Process colors in reverse order. SymColor color = colors[i]; OcadParamString paramString = new OcadParamString(); float cyan, magenta, yellow, black; color.GetCMYK(out cyan, out magenta, out yellow, out black); paramString.StType = (int) OcadStringParam.Color; paramString.ObjIndex = 0; paramString.firstField = color.Name; paramString.codes = new char[6]; paramString.values = new string[6]; paramString.codes[0] = 'n'; paramString.values[0] = color.OcadId.ToString(); paramString.codes[1] = 'c'; paramString.values[1] = (cyan * 100F) .ToString(CultureInfo.InvariantCulture); paramString.codes[2] = 'm'; paramString.values[2] = (magenta * 100F).ToString(CultureInfo.InvariantCulture); paramString.codes[3] = 'y'; paramString.values[3] = (yellow * 100F).ToString(CultureInfo.InvariantCulture); paramString.codes[4] = 'k'; paramString.values[4] = (black * 100F).ToString(CultureInfo.InvariantCulture); paramString.codes[5] = 'o'; paramString.values[5] = "0"; paramStrings.Add(paramString); } return paramStrings; }