protected override void CalcData() { NeedDraw = false; if (Option?.Series == null || Option.Series.Count == 0) { return; } DrawOrigin = new Point(Option.Grid.Left, Height - Option.Grid.Bottom); DrawSize = new Size(Width - Option.Grid.Left - Option.Grid.Right, Height - Option.Grid.Top - Option.Grid.Bottom); if (DrawSize.Width <= 0 || DrawSize.Height <= 0) { return; } CalcAxises(); foreach (var series in Option.Series.Values) { series.ClearPoints(); float[] x = XScale.CalcXPixels(series.XData.ToArray(), DrawOrigin.X, DrawSize.Width); float[] y = YScale.CalcYPixels(series.YData.ToArray(), DrawOrigin.Y, DrawSize.Height); series.AddPoints(x, y); } NeedDraw = true; }
public override double Get(double x, double y, double z, double w, double u, double v) => Source.Get( x * XScale.Get(x, y, z, w, u, v), y * YScale.Get(x, y, z, w, u, v), z * ZScale.Get(x, y, z, w, u, v), w * WScale.Get(x, y, z, w, u, v), u * UScale.Get(x, y, z, w, u, v), v * VScale.Get(x, y, z, w, u, v));
public void WriteTo(TextWriter writer) { V1.WriteTo(writer); writer.Write(" "); V2.WriteTo(writer); writer.Write(" "); V3.WriteTo(writer); writer.Write(" "); writer.Write(TextureName); writer.Write(" "); writer.Write(XOffset); writer.Write(" "); writer.Write(YOffset); writer.Write(" "); writer.Write(Rotation); writer.Write(" "); writer.Write(XScale.ToString("F6")); writer.Write(" "); writer.Write(YScale.ToString("F6")); writer.Write(" "); writer.Write(Flag1); writer.Write(" "); writer.Write(Flag2); writer.Write(" "); writer.Write(Flag3); writer.WriteLine(); }
/// <summary> /// 속성들을 Xml Attribute로 생성합니다. /// </summary> /// <param name="writer">Attribute를 쓸 Writer</param> public override void GenerateXmlAttributes(System.Xml.XmlWriter writer) { base.GenerateXmlAttributes(writer); writer.WriteAttributeString("type", Type.ToString()); if (X.HasValue) { writer.WriteAttributeString("x", X.ToString()); } if (Y.HasValue) { writer.WriteAttributeString("y", Y.ToString()); } if (Color.IsNotWhiteSpace()) { writer.WriteAttributeString("Color", Color); } if (Alpha.HasValue) { writer.WriteAttributeString("Alpha", Alpha.ToString()); } if (Thickness.HasValue) { writer.WriteAttributeString("Thickness", Thickness.ToString()); } if (XScale.HasValue) { writer.WriteAttributeString("XScale", XScale.ToString()); } if (YScale.HasValue) { writer.WriteAttributeString("YScale", YScale.ToString()); } if (Radius.HasValue) { writer.WriteAttributeString("Radius", Radius.ToString()); } if (YRadius.HasValue) { writer.WriteAttributeString("YRadius", YRadius.ToString()); } if (InnerRadius.HasValue) { writer.WriteAttributeString("InnerRadius", InnerRadius.ToString()); } if (ToX.HasValue) { writer.WriteAttributeString("ToX", ToX.ToString()); } if (ToY.HasValue) { writer.WriteAttributeString("ToY", ToY.ToString()); } }
protected override string DefaultCommand() { if (Variables == null) { return(""); } Mtb.Column[] vars = (Mtb.Column[])Variables; Mtb.Column[] gps = null; if (GroupingVariables != null) { gps = (Mtb.Column[])GroupingVariables; } StringBuilder cmnd = new StringBuilder(); // local macro 內容 if (gps != null) { cmnd.AppendFormat("Boxplot ({0})*{1};\r\n", string.Join(" &\r\n", vars.Select(x => x.SynthesizedName).ToArray()), gps[0].SynthesizedName); if (gps.Length >= 2) { cmnd.AppendFormat(" Group {0};\r\n", string.Join(" &\r\n", gps.Select((x, i) => new { colId = x.SynthesizedName, index = i }). Where(x => x.index > 0).Select(x => x.colId).ToArray())); } } else { cmnd.AppendFormat("Boxplot {0};\r\n", string.Join(" &\r\n", vars.Select(x => x.SynthesizedName).ToArray())); } cmnd.Append(GetOptionCommand()); cmnd.Append(YScale.GetCommand()); cmnd.Append(XScale.GetCommand()); cmnd.Append(Mean.GetCommand()); cmnd.Append(CMean.GetCommand()); cmnd.Append(RBox.GetCommand()); cmnd.Append(IQRBox.GetCommand()); cmnd.Append(Whisker.GetCommand()); cmnd.Append(Outlier.GetCommand()); cmnd.Append(Individual.GetCommand()); cmnd.Append(MeanDatlab.GetCommand()); cmnd.Append(IndivDatlab.GetCommand()); cmnd.Append(Panel.GetCommand()); cmnd.Append(GetAnnotationCommand()); cmnd.Append(GetRegionCommand()); return(cmnd.ToString() + "."); }
private void OsciVertScale_SelectedIndexChanged(object sender, EventArgs e) { if (channels < 1) { return; } YScale ts = (YScale)OsciVertScale.SelectedIndex; if (ts != yScale[selectedChannel]) { yScale[selectedChannel] = ts; lines[selectedChannel].yScale = getYScale(selectedChannel); UpdateChannelScales(); oscilloscopeScreen.Invalidate(); } }
private string getYScaleString(YScale ys) { switch (ys) { case YScale.Div10: return("10/Div"); case YScale.Div5: return("5/Div"); case YScale.Div2: return("2/Div"); case YScale.Div1: return("1/Div"); case YScale.Div500m: return("0.5/Div"); case YScale.Div200m: return("0.2/Div"); case YScale.Div100m: return("0.1/Div"); case YScale.Div50m: return("50m/Div"); case YScale.Div20m: return("20m/Div"); case YScale.Div10m: return("10m/Div"); case YScale.Div5m: return("5m/Div"); case YScale.Div2m: return("2m/Div"); case YScale.Div1m: return("1m/Div"); case YScale.Div500u: return("0.5m/Div"); case YScale.Div200u: return("0.2m/Div"); case YScale.Div100u: return("0.1m/Div"); } return("undefined"); }
/// <summary> /// 속성 중 Attribute Node로 표현해야 한다. /// </summary> /// <param name="writer"></param> public override void GenerateXmlAttributes(System.Xml.XmlWriter writer) { base.GenerateXmlAttributes(writer); if (Id.IsNotWhiteSpace()) { writer.WriteAttributeString("Id", Id); } if (X.HasValue) { writer.WriteAttributeString("x", X.ToString()); } if (Y.HasValue) { writer.WriteAttributeString("y", Y.ToString()); } if (Alpha.HasValue) { writer.WriteAttributeString("Alpha", Alpha.ToString()); } if (XScale.HasValue) { writer.WriteAttributeString("XScale", XScale.ToString()); } if (YScale.HasValue) { writer.WriteAttributeString("YScale", YScale.ToString()); } if (OrigW.HasValue) { writer.WriteAttributeString("origW", OrigW.ToString()); } if (OrigH.HasValue) { writer.WriteAttributeString("origH", OrigH.ToString()); } if (AutoScale.HasValue) { writer.WriteAttributeString("AutoScale", AutoScale.GetHashCode().ToString()); } if (ConstrainedScale.HasValue) { writer.WriteAttributeString("ConstrainedScale", ConstrainedScale.GetHashCode().ToString()); } if (ScaleImages.HasValue) { writer.WriteAttributeString("ScaleImages", ScaleImages.GetHashCode().ToString()); } if (ScaleText.HasValue) { writer.WriteAttributeString("ScaleText", ScaleText.GetHashCode().ToString()); } if (GrpXShift.HasValue) { writer.WriteAttributeString("GrpXShift", GrpXShift.ToString()); } if (GrpYShift.HasValue) { writer.WriteAttributeString("GrpXShift", GrpXShift.ToString()); } if (ShowBelow.HasValue) { writer.WriteAttributeString("ShowBelow", ShowBelow.GetHashCode().ToString()); } if (Visible.HasValue) { writer.WriteAttributeString("Visible", Visible.GetHashCode().ToString()); } if (ToolText.IsNotWhiteSpace()) { writer.WriteAttributeString("ToolText", ToolText); } if (_link != null) { _link.GenerateXmlAttributes(writer); } }
/// <summary> /// 預設指令碼 /// </summary> /// <returns></returns> protected override string DefaultCommand() { if (YVariables == null) { throw new Exception("建立 Plot 指令時,未給定 YVariables"); } if (XVariables == null) { throw new Exception("建立 Plot 指令時,未給定 XVariables"); } Mtb.Column[] yvars = (Mtb.Column[])YVariables; Mtb.Column[] xvars = (Mtb.Column[])XVariables; Mtb.Column[] gps = null; if (GroupingVariables != null) { gps = (Mtb.Column[])GroupingVariables; } StringBuilder cmnd = new StringBuilder(); if (GraphType == MultipleGraphType.Regular) { if (yvars.Length != xvars.Length) { throw new ArgumentException("GraphType=Regular 時,X 變數和 Y 變數的數量不同"); } cmnd.AppendLine("Plot &"); for (int i = 0; i < yvars.Length; i++) { cmnd.AppendFormat("{0}*{1} &\r\n", yvars[i].SynthesizedName, xvars[i].SynthesizedName); } cmnd.AppendLine(";"); } else { cmnd.AppendFormat("Plot ({0})*({1});\r\n", string.Join(" &\r\n", yvars.Select(x => x.SynthesizedName).ToArray()), string.Join(" &\r\n", xvars.Select(x => x.SynthesizedName).ToArray())); if (GraphType == MultipleGraphType.Overlay) { cmnd.AppendLine(" Over;"); } } if (gps != null) { string[] gp = gps.Select(x => x.SynthesizedName).ToArray(); Symbol.GroupingBy = gp.Clone(); Connectline.GroupingBy = gp.Clone(); Projection.GroupingBy = gp.Clone(); } cmnd.AppendFormat(""); cmnd.Append(GetOptionCommand()); cmnd.Append(YScale.GetCommand()); cmnd.Append(XScale.GetCommand()); cmnd.Append(Symbol.GetCommand()); cmnd.Append(Connectline.GetCommand()); cmnd.Append(Projection.GetCommand()); cmnd.Append(Panel.GetCommand()); cmnd.Append(GetAnnotationCommand()); cmnd.Append(GetRegionCommand()); return(cmnd.ToString() + "."); }
// Prepares the SDF file header section. Respective properties must be set in advance. // Constitutes "Record 1" according to ISO 25178-71 private void PrepareHeaderSection() { // for single profiles YScale must be 0 if (NumberOfProfiles == 1) { YScale = 0; } if (double.IsNaN(XScale)) { return; } if (double.IsNaN(YScale)) { return; } if (double.IsNaN(ZScale)) { return; } if (!Relaxed) { // the SDF definition suffers from the historical restriction of 65535 points per profile // there is no error message up to now, it is just not possible to create data. if (NumberOfPointsPerProfile > ushort.MaxValue) { return; } if (NumberOfProfiles > ushort.MaxValue) { return; } } // instantiate the StringBuilder for the header section headerSectionSb = new StringBuilder(); if (ForceIsoFormat) { headerSectionSb.AppendLine("aISO-1.0"); } else { headerSectionSb.AppendLine("aBCR-1.0"); } headerSectionSb.AppendLine($"ManufacID = {TruncateManufacID(ManufacurerId)}"); // just to make sure no "=" is added headerSectionSb.AppendLine($"CreateDate = {CreationDate.ToString("ddMMyyyyHHmm")}"); headerSectionSb.AppendLine($"ModDate = {ModificationDate.ToString("ddMMyyyyHHmm")}"); headerSectionSb.AppendLine($"NumPoints = {NumberOfPointsPerProfile}"); headerSectionSb.AppendLine($"NumProfiles = {NumberOfProfiles}"); headerSectionSb.AppendLine($"Xscale = {XScale.ToString("G17")}"); headerSectionSb.AppendLine($"Yscale = {YScale.ToString("G17")}"); headerSectionSb.AppendLine($"Zscale = {ZScale.ToString("G17")}"); headerSectionSb.AppendLine("Zresolution = -1"); // clause 5.2.8, do not modify! headerSectionSb.AppendLine("Compression = 0"); // clause 5.2.9, do not modify! switch (zDataType) { case ZDataType.Double: headerSectionSb.AppendLine("DataType = 7"); break; case ZDataType.Int32: headerSectionSb.AppendLine("DataType = 6"); break; case ZDataType.Int16: headerSectionSb.AppendLine("DataType = 5"); break; default: headerSectionSb.AppendLine("DataType = ?"); // this should not happen! break; } headerSectionSb.AppendLine("CheckType = 0"); // clause 5.2.11, do not modify! headerSectionSb.AppendLine("*"); }
private string DefaultCommand2() { if (Variables == null) { throw new Exception("建立 Bar chart 指令時,未給定 Variables"); } Mtb.Column[] vars = (Mtb.Column[])Variables; Mtb.Column[] gps = null; if (GroupingVariables != null) { gps = (Mtb.Column[])GroupingVariables; } switch (BarsRepresent)// 以一次畫一張圖為目的,過濾掉不合法的輸入數量 { case ChartRepresent.COUNT_OF_UNIQUE_VALUES: case ChartRepresent.A_FUNCTION_OF_A_VARIABLE: case ChartRepresent.ONE_WAY_TABLE: if (vars.Length > 1) { throw new ArgumentException( string.Format("BarsRepresent={0}時,不支援同時繪製多變數", BarsRepresent.ToString())); } break; } switch (BarsRepresent)// 判斷群組數是否合法 { case ChartRepresent.ONE_WAY_TABLE: case ChartRepresent.TWO_WAY_TABLE: if (gps == null) { throw new Exception("(Bar chart)使用 Summaried Data,至少給定一個分群欄位"); } break; } StringBuilder cmnd = new StringBuilder(); // local macro 內容 cmnd.AppendLine("macro"); cmnd.AppendLine("chart y.1-y.n;"); cmnd.AppendLine("group x.1-x.m;"); cmnd.AppendLine("pane p.1-p.k;"); //如果使用者有指定 panel cmnd.AppendLine("datlab dlab."); //如果使用者有自己指定 column for datlab cmnd.AppendLine("mcolumn y.1-y.n"); cmnd.AppendLine("mcolumn x.1-x.m"); cmnd.AppendLine("mcolumn p.1-p.k"); cmnd.AppendLine("mcolumn yy ylab stkdlab dlab xx.1-xx.m"); cmnd.AppendLine("mconstant nn"); //準備使用於圖中的額外資料 Datlab tmpDatlab = (Datlab)DataLabel.Clone(); if (StackType == ChartStackType.Stack && DataLabel.Visible && AdjDatlabAtStackBar) { #region 建立 Adjust stack bar chart 要的 datlab switch (BarsRepresent) { case ChartRepresent.COUNT_OF_UNIQUE_VALUES: cmnd.AppendLine("count y.1 nn"); cmnd.AppendLine("set yy"); cmnd.AppendLine("(1)nn"); cmnd.AppendLine("end"); cmnd.AppendLine("stat yy;"); cmnd.AppendLine("by y.1 x.1-x.m;"); cmnd.AppendLine("sums stkdlab."); break; case ChartRepresent.A_FUNCTION_OF_A_VARIABLE: cmnd.AppendLine("stat y.1;"); cmnd.AppendLine("by x.1-x.m;"); cmnd.AppendFormat("{0} stkdlab.\r\n", FuncType.ToString().ToLower() == "sum" ? "sums" : FuncType.ToString().ToLower()); break; case ChartRepresent.ONE_WAY_TABLE: cmnd.AppendLine("copy y.1 stkdlab"); break; case ChartRepresent.TWO_WAY_TABLE: cmnd.AppendLine("stack y.1-y.n yy."); cmnd.AppendLine("count y.1 nn"); cmnd.AppendLine("tset ylab"); cmnd.AppendFormat("1({0})nn\r\n", string.Join(" &\r\n", vars.Select(x => "\"" + x.Name + "\"").ToArray())); cmnd.AppendLine("end"); List <string[]> gpData = new List <string[]>(); for (int i = 0; i < gps.Length; i++) { Mtb.Column col = gps[i]; string[] data; switch (col.DataType) { case MtbDataTypes.DataUnassigned: throw new ArgumentNullException("輸入的欄位沒有資料"); default: case MtbDataTypes.DateTime: case MtbDataTypes.Numeric: data = ((double[])col.GetData()).Select(x => x.ToString()).ToArray(); break; case MtbDataTypes.Text: data = col.GetData(); break; } cmnd.AppendFormat("tset xx.{0}\r\n", i + 1); cmnd.AppendFormat("{1}({0})1\r\n", string.Join(" &\r\n", data.Select(x => "\"" + x + "\"").ToArray()), vars.Length); cmnd.AppendLine("end"); cmnd.AppendLine("vorder ylab xx.1-xx.m;"); cmnd.AppendLine("work."); cmnd.AppendLine("stat yy;"); cmnd.AppendLine("by ylab xx.1-xx.m;"); cmnd.AppendLine("sums stkdlab."); } break; default: break; } cmnd.AppendLine("text stkdlab stkdlab"); #endregion tmpDatlab.LabelColumn = "stkdlab"; tmpDatlab.Placement = new double[] { 0, -1 }; } else { if (DataLabel.LabelColumn != null) { tmpDatlab.LabelColumn = "dlab"; } } switch (BarsRepresent) { case ChartRepresent.COUNT_OF_UNIQUE_VALUES: cmnd.AppendLine("Chart y.1-y.n;"); if (gps != null) { cmnd.AppendLine("Group x.1-x.n;"); } break; case ChartRepresent.A_FUNCTION_OF_A_VARIABLE: cmnd.AppendFormat("Chart {0}(y.1-y.n) &\r\n", FuncType.ToString()); if (gps != null) { cmnd.AppendLine("*x.1;"); if (gps.Length >= 2) { cmnd.AppendLine(" Group x.2-x.m;"); } } else { cmnd.AppendLine(";"); } break; case ChartRepresent.ONE_WAY_TABLE: case ChartRepresent.TWO_WAY_TABLE: cmnd.AppendLine("Chart (y.1-y.n)*x.1;"); cmnd.AppendLine("Summarized;"); if (BarsRepresent == ChartRepresent.TWO_WAY_TABLE) { cmnd.AppendLine("Overlay;"); if (TableArrangement == ChartTableArrangementType.RowsOuterMost) { cmnd.AppendLine(" VLast;"); } else { cmnd.AppendLine(" VFirst;"); } } if (gps.Length >= 2) { cmnd.AppendLine(" Group x.2-x.m;"); } break; } if (Transponse) { cmnd.AppendLine("trans;"); } if (StackType == ChartStackType.Stack) { cmnd.AppendLine("stack;"); } cmnd.Append(GetOptionCommand()); cmnd.Append(YScale.GetCommand()); cmnd.Append(XScale.GetCommand()); cmnd.Append(tmpDatlab.GetCommand()); /* * 對每一個 DataView 建立 Command * 這些處理是為了將 GroupingBy 屬性由原欄位換成 macro coded name */ Component.DataView.DataView tmpDataview; string[] xStr = gps.Select((x, i) => "x." + (i + 1)).ToArray(); foreach (Component.DataView.DataView dview in new Component.DataView.DataView[] { Bar, Symbol, Connectline }) { tmpDataview = (Component.DataView.DataView)dview.Clone(); if (dview.GroupingBy != null) { string[] g = MtbTools.ConvertToMacroCodedName( (string[])tmpDataview.GroupingBy, gps, xStr, _ws); } //if (dview is Component.DataView.Bar) //{ // if(Bar.AssignAttributeByVariables) //} cmnd.Append(tmpDataview.GetCommand()); } Component.MultiGraph.MPanel tmpPane = (Component.MultiGraph.MPanel)Panel.Clone(); if (Panel.PaneledBy != null) { tmpPane.PaneledBy = "p.1-p.k"; } cmnd.Append(tmpPane.GetCommand()); cmnd.Append(Legend.GetCommand()); if (NoMissing) { cmnd.AppendLine("nomiss;"); } if (NoEmpty) { cmnd.AppendLine("noem;"); } cmnd.Append(GetAnnotationCommand()); cmnd.Append(GetRegionCommand()); cmnd.AppendLine("."); cmnd.AppendLine("endmacro"); return(cmnd.ToString()); }
protected override string DefaultCommand() { if (Variables == null) { throw new Exception("建立 Bar chart 指令時,未給定 Variables"); } Mtb.Column[] vars = (Mtb.Column[])Variables; Mtb.Column[] gps = null; if (GroupingVariables != null) { gps = (Mtb.Column[])GroupingVariables; } if ((BarsRepresent == ChartRepresent.ONE_WAY_TABLE || BarsRepresent == ChartRepresent.TWO_WAY_TABLE) & (gps == null)) { throw new Exception("(Bar chart)使用 Summaried Data,至少給定一個分群欄位"); } StringBuilder cmnd = new StringBuilder(); // local macro 內容 /***************** * 一些注意事項: Chart 可以有多個 Variable 輸入,分成兩類 * 1. F(C...C)*Cg 這是各別F(C)以 Cg 做分群,不需搭配 Summarized * 2. Summarized data,使用 (C...C)*Cg 搭配 Summarized 子命令, * 如果是 Two-way table 則須再加上 VFirst 或 VLast 等指令 * */ switch (BarsRepresent) { case ChartRepresent.COUNT_OF_UNIQUE_VALUES: cmnd.AppendFormat("Chart {0};\r\n", string.Join(" &\r\n", vars.Select(x => x.SynthesizedName).ToArray())); if (gps != null) { cmnd.AppendFormat(" Group {0};\r\n", string.Join(" &\r\n", string.Join(" &\r\n", gps.Select(x => x.SynthesizedName).ToArray()))); } break; case ChartRepresent.A_FUNCTION_OF_A_VARIABLE: cmnd.AppendFormat("Chart {0}({1}) &\r\n", FuncType.ToString(), string.Join(" &\r\n", vars.Select(x => x.SynthesizedName).ToArray())); if (gps != null) { cmnd.AppendFormat("*{0};\r\n", gps[0].SynthesizedName); if (gps.Length >= 2) { cmnd.AppendFormat(" Group {0};\r\n", string.Join(" &\r\n", gps.Select((x, i) => new { colId = x.SynthesizedName, index = i }). Where(x => x.index > 0).Select(x => x.colId).ToArray())); } } else { cmnd.AppendLine(";"); } break; case ChartRepresent.ONE_WAY_TABLE: case ChartRepresent.TWO_WAY_TABLE: cmnd.AppendFormat("Chart ({0})*{1};\r\n", string.Join(" &\r\n", vars.Select(x => x.SynthesizedName).ToArray()), gps[0].SynthesizedName); cmnd.AppendLine("Summarized;"); if (BarsRepresent == ChartRepresent.TWO_WAY_TABLE) { cmnd.AppendLine("Overlay;"); if (TableArrangement == ChartTableArrangementType.RowsOuterMost) { cmnd.AppendLine(" VLast;"); } else { cmnd.AppendLine(" VFirst;"); } } if (gps.Length >= 2) { cmnd.AppendFormat(" Group {0};\r\n", string.Join(" &\r\n", gps.Select((x, i) => new { colId = x.SynthesizedName, index = i }). Where(x => x.index > 0).Select(x => x.colId).ToArray())); } break; } cmnd.Append(GetOptionCommand()); cmnd.Append(YScale.GetCommand()); cmnd.Append(XScale.GetCommand()); // if (StackType == ChartStackType.Stack && DataLabel.Visible && AdjDatlabAtStackBar) { } cmnd.Append(DataLabel.GetCommand()); cmnd.Append(Bar.GetCommand()); cmnd.Append(Symbol.GetCommand()); cmnd.Append(Connectline.GetCommand()); cmnd.Append(Panel.GetCommand()); cmnd.Append(Legend.GetCommand()); cmnd.Append(GetAnnotationCommand()); cmnd.Append(GetRegionCommand()); return(cmnd.ToString() + "."); }
public override double Get(double x, double y, double z, double w) => Source.Get( x * XScale.Get(x, y, z, w), y * YScale.Get(x, y, z, w), z * ZScale.Get(x, y, z, w), w * WScale.Get(x, y, z, w));
public override double Get(double x, double y, double z) => Source.Get( x * XScale.Get(x, y, z), y * YScale.Get(x, y, z), z * ZScale.Get(x, y, z));
public override double Get(double x, double y) => Source.Get( x * XScale.Get(x, y), y * YScale.Get(x, y));