public DataTable PlusMinusMultiplyDivide(DataTable dataIn, double dat, DataProcessMethod oper) { switch (oper) { case DataProcessMethod.Plus: //加 foreach (DataRow dr in dataIn.Rows) { dr[1] = Math.Round(double.Parse(dr[1].ToString()) + dat, 2); } break; case DataProcessMethod.Minus: //减 foreach (DataRow dr in dataIn.Rows) { dr[1] = Math.Round(double.Parse(dr[1].ToString()) - dat, 2); } break; case DataProcessMethod.Multiply: //乘 foreach (DataRow dr in dataIn.Rows) { dr[1] = Math.Round(double.Parse(dr[1].ToString()) * dat, 2); } break; case DataProcessMethod.Divide: //除 if (dat == 0) { break; } foreach (DataRow dr in dataIn.Rows) { dr[1] = Math.Round(double.Parse(dr[1].ToString()) / dat, 2); } break; default: break; } return(dataIn); }
private void btnOK_Click(object sender, EventArgs e) { if (this.radioGroup.SelectedIndex == -1 || this.textValue.Text == "") { return; } try { progreeValue = double.Parse(this.textValue.Text); } catch { progreeValue = double.NaN; XtraMessageBox.Show("不是有效的数字", "错误"); this.textValue.Focus(); return; } switch (this.radioGroup.Properties.Items[this.radioGroup.SelectedIndex].ToString()) { case "+": this.dpm = DataProcessMethod.Plus; break; case "-": this.dpm = DataProcessMethod.Minus; break; case "×": this.dpm = DataProcessMethod.Multiply; break; case "÷": this.dpm = DataProcessMethod.Divide; break; } this.DialogResult = DialogResult.OK; this.Close(); }
/// <summary> ///为未初始化消突跳或台阶做预处理 /// </summary> /// <param name="dataIn"></param> /// <param name="datasel"></param> /// <param name="oper"></param> /// <param name="Num_Sample">采样数</param> /// <returns></returns> public RemoveTipBean RemoveStepJumpTip(DataTable dataIn, DataTable datasel, DataProcessMethod oper, int Num_Sample, Left_Right LRB) { RemoveTipBean rt = new RemoveTipBean(); // Num_Sample = 5; try { DateTime startSel = DateTime.Parse(datasel.Rows[0][0].ToString()); DateTime endSel = DateTime.Parse(datasel.Rows[datasel.Rows.Count - 1][0].ToString()); double val_left = double.Parse(datasel.Rows[0][1].ToString()); double val_right = double.Parse(datasel.Rows[datasel.Rows.Count - 1][1].ToString()); int tatal = dataIn.Rows.Count; int select = datasel.Rows.Count; //选择数据总数 /*获取相邻观测值差的绝对值最大的两个值对应的序列号*/ int index_stepL = 0, index_stepR = 0; for (int i = 0; i < select - 1; i++) { double biggest = 0; double step = System.Math.Abs(double.Parse(datasel.Rows[i][1].ToString()) - double.Parse(datasel.Rows[i + 1][1].ToString())); if (step > biggest) { index_stepL = i; index_stepR = i + 1; biggest = step; } } int index = 0; foreach (DataRow dr in dataIn.Rows) { if (DateTime.Parse(dr[0].ToString()).CompareTo(startSel) == 0) { index_left = index; } if (DateTime.Parse(dr[0].ToString()).CompareTo(endSel) == 0) { index_right = index; break; } index++; } //消台阶或消突跳 switch (oper) { case DataProcessMethod.RemoveJump: //消突跳 { foreach (DataRow dr in dataIn.Rows) { DateTime t = DateTime.Parse(dr[0].ToString()); if (t.CompareTo(startSel) < 0) { n_left++; } if ((t.CompareTo(endSel) > 0) && (n_right < Num_Sample)) { n_right++; ave_right += double.Parse(dr[1].ToString()); } } ave_left = double.Parse(dataIn.Rows[n_left][1].ToString()); double cal = 0; int n_cal = 0; int Sample = Num_Sample; if (n_left > 0) { for (int i = n_left - 1; i >= 0; i--) { if (Sample == 0) { break; } cal += double.Parse(dataIn.Rows[i][1].ToString()); n_cal++; Sample--; } } if (n_cal > 0) { ave_left = cal / n_cal; } ave_right = ave_right / n_right; //移动台阶左侧(偏移%f) double left_ave = ave_left; //移动台阶右侧(偏移%f) double right_ave = ave_right; //偏移量选择 double var = 0; switch (LRB) { case Left_Right.left: var = ave_left - val_left; break; case Left_Right.right: var = ave_right - val_right; break; case Left_Right.both: var = (ave_left + ave_right) / 2 - (val_left + val_right) / 2; break; default: break; } m_offset = var; //实例化提示信息 rt.LeftAve = "左侧采样平均值(" + Convert.ToString(ave_left) + ")"; rt.RightAve = "右侧采样平均值(" + Convert.ToString(ave_right) + ")"; rt.BothAve = "两侧采样平均值(" + Convert.ToString((ave_left + ave_right) / 2) + ")"; rt.TargetNum = "待处理目标数量:" + Convert.ToString(select) + ")"; rt.Offset = m_offset; //偏移量 rt.Tip = "[突跳消除@" + DateTime.Now.ToShortDateString() + "]\r\n偏移值:" + Math.Round(m_offset, 2).ToString() + "\r\n偏移区间:" + startSel.ToShortDateString() + "-" + endSel.ToShortDateString(); TipLeftIndex = n_left; TipRightIndex = n_left + datasel.Rows.Count - 1; Tipstr = rt.Tip; } break; case DataProcessMethod.RemoveStep: DateTime dateL = DateTime.Parse(datasel.Rows[index_stepL][0].ToString()); DateTime dateR = DateTime.Parse(datasel.Rows[index_stepR][0].ToString()); //计算消除左台阶起算索引 nLeftStep = index_stepL + index_left; //左 nRightStep = nLeftStep + 1; //消除右侧台阶起算索引 //计算左侧平均偏移量 int nL = 0; double totalright = 0; foreach (DataRow dr in dataIn.Rows) { if (DateTime.Parse(dr[0].ToString()).CompareTo(dateR) >= 0 && nL < Num_Sample) { nL++; totalright += double.Parse(dr[1].ToString()); } } ave_left = totalright / nL; //计算右侧平均偏移量 int nR = 0; double totalleft = 0; int RSample = Num_Sample; for (int i = nLeftStep; i >= 0; i--) { if (RSample == 0) { break; } totalleft += double.Parse(dataIn.Rows[i][1].ToString()); nR++; RSample--; } ave_right = totalleft / nR; //偏移量 m_offset = (LRB == Left_Right.left) ? (ave_left - ave_right) : (ave_right - ave_left); //实例化提示语句 rt.LeftAve = "消除左侧(平均值" + Convert.ToString(ave_left) + ")"; rt.RightAve = "消除右侧(平均值" + Convert.ToString(ave_right) + ")"; rt.Totalright = dataIn.Rows.Count - (index_stepL + index_left + 1 + 1); rt.Totaleft = index_stepL + index_left; rt.Offset = m_offset; rt.Tip = "[台阶消除@" + DateTime.Now.ToShortDateString() + "]\r\n偏移值:" + Math.Round(m_offset, 2).ToString(); TipLeftIndex = nLeftStep; TipRightIndex = nLeftStep + datasel.Rows.Count - 1; Tipstr = rt.Tip; break; default: break; } } catch (Exception ex) { rt = null; throw new Exception(ex.Message); } return(rt); }
/// <summary> /// 根据用户选择进行数据处理(消突跳点或消台阶) /// 调用此功能前必须先调用此函数: /// RemoveStepJumpTip(DataTable dataIn, DataTable datasel, DataProcessMethod oper) /// </summary> /// <param name="dataIn"></param> /// <param name="datasel"></param> /// <param name="oper"></param> /// <param name="select"></param> /// <returns></returns> public DataTable RemoveStepJump(DataTable dataIn, DataTable datasel, DataProcessMethod oper, Left_Right select, bool AddNote, out DataTable Points) { DataView dataView = dataIn.DefaultView; dataView.Sort = "obvdate asc"; dataIn = dataView.ToTable(); DataView dataViewselec = datasel.DefaultView; dataViewselec.Sort = "obvdate asc"; datasel = dataViewselec.ToTable(); Points = dataIn.Clone(); switch (oper) { case DataProcessMethod.RemoveStep: //消台阶 if (select == Left_Right.left) //消左边台阶 { //for (int i = dataIn.Rows.Count - 1; i > nLeftStep; i--) //{ // double d = double.Parse(dataIn.Rows[i][1].ToString()); // d = d + m_offset; // dataIn.Rows[i][1] = Math.Round(d, 2); //} for (int i = 0; i < nLeftStep; i++) { double d = double.Parse(dataIn.Rows[i][1].ToString()); d = d + m_offset; dataIn.Rows[i][1] = Math.Round(d, 2); } } else if (select == Left_Right.right) //消右边台阶 { for (int i = nRightStep; i < dataIn.Rows.Count; i++) { double d = double.Parse(dataIn.Rows[i][1].ToString()); d = d + m_offset; dataIn.Rows[i][1] = Math.Round(d, 2); } } for (int i = index_left; i <= index_right; i++) { DataRow dr = Points.NewRow(); dr[0] = dataIn.Rows[i][0]; dr[1] = dataIn.Rows[i][1]; Points.Rows.Add(dr); } break; case DataProcessMethod.RemoveJump: //消突跳 for (int i = index_left; i <= index_right; i++) { double d = double.Parse(dataIn.Rows[i][1].ToString()); d = d + m_offset; dataIn.Rows[i][1] = Math.Round(d, 2); DataRow dr = Points.NewRow(); dr[0] = dataIn.Rows[i][0]; dr[1] = Math.Round(d, 2); Points.Rows.Add(dr); } break; default: break; } if (AddNote) { if (select == Left_Right.left || select == Left_Right.both) { dataIn.Rows[TipLeftIndex][2] = Tipstr + "\r\n" + dataIn.Rows[TipLeftIndex][2].ToString(); } else if (select == Left_Right.right) { dataIn.Rows[TipRightIndex][2] = Tipstr + "\r\n" + dataIn.Rows[TipRightIndex][2].ToString(); } } DataView dvover = dataIn.DefaultView; dvover.Sort = "obvdate asc"; dataIn = dvover.ToTable(); return(dataIn); }