/// <summary> /// 해당 수식변수를 이용해 계산하고 값 저장. /// </summary> /// <param name="edata"></param> private void Calculate(ref EquationVariable edata) { m_Term.Parse(edata.Equation); m_Term.SetVar(edata.Name, m_Term.Value); //SetVarAllEquainfo(edata.Name, m_Term.Value); double value = m_Term.Value; edata.Value = value; }
/// <summary> /// 변수 추가 버튼 클릭 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { Form_AddVariable addvarform = new Form_AddVariable(m_Dictionary_EquationInformation, m_selectedEquation); // 다이얼로그에서 설정된 값을 토대로 변수 생성. if (addvarform.ShowDialog( ) == DialogResult.OK) { // 폼에서 출력 변수를 선택 했다. if (addvarform.IsEquationVariable) { // 출력변수 만들고 등록. EquationVariable vdata = MakeNewEquationVar(addvarform.VariableName, addvarform.Equation); vdata.Equation = addvarform.Equation; vdata.IsHiddenVariable = addvarform.IsHiddenValue; listBox2.Items.Add(vdata.Name); m_Dictionary_VariableData.Add(vdata.Name, vdata); } // 입력 변수를 선택했다. else { VariableData vdata = MakeNewVar(addvarform.VariableName); vdata.IsCorrespond = addvarform.isCorrespond; // 출력변수 대입인지 체크. if (vdata.IsCorrespond) { vdata.CorrespontVarName = addvarform.CorrespondVarPath; } // Option 체크 설정. vdata.m_checkOption = addvarform.Option; if (addvarform.Option == VariableData.CheckOption.None) { } else if (addvarform.Option == VariableData.CheckOption.MinMax) { vdata.OptionMinValue = addvarform.CheckMinValue; vdata.OptionMaxValue = addvarform.CheckMaxValue; } else { vdata.CustomOptionString = addvarform.CustomOptionString; } listBox1.Items.Add(vdata.Name); m_Dictionary_VariableData.Add(vdata.Name, vdata); } } }
/// <summary> /// listbox더블클릭시엔 해당 변수에 맞게 addvariable 창을 띄워줌 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void listBox2_DoubleClick(object sender, EventArgs e) { if (listBox2.SelectedItem != null) { string selectedItem = listBox2.SelectedItem.ToString(); var selectedVariable = m_Dictionary_VariableData[selectedItem]; Form_AddVariable addvarform = new Form_AddVariable(selectedVariable, m_Dictionary_EquationInformation, m_selectedEquation); if (addvarform.ShowDialog() == DialogResult.OK) { EquationVariable newVariable = new EquationVariable(addvarform.VariableName); newVariable.Equation = addvarform.Equation; newVariable.IsHiddenVariable = addvarform.IsHiddenValue; try { m_Dictionary_VariableData.Remove(selectedItem); m_Dictionary_VariableData.Add(newVariable.Name, newVariable); int index = listBox2.SelectedIndex; listBox2.Items.Remove(listBox2.SelectedItem); listBox2.Items.Insert(index, newVariable.Name); } catch (System.Exception ex) { newVariable.Name = listBox2.SelectedItem.ToString(); m_Dictionary_VariableData.Add(listBox2.SelectedItem.ToString(), newVariable); MessageBox.Show(ex.Message); } } } }
/// <summary> /// 버튼 눌렀을때 계산하는 부분 /// 재귀호출로 계산을 처리해줘야 하는 부분이 있으나 예) 3*c = d; a+b = c, 면 c값을 계산을 해줘야 하기때문에 재귀 호출할 필요가 있음. /// 그냥 함수 자체를 두번 호출하는걸로 처리 /// 마지막 불 변수는 로그값을 한번만 띄우기 위해 처리한것임. /// </summary> /// <param name="selectedEquation"></param> /// <param name="test"></param> private void DoCalculate(string selectedEquation, bool test = true) { try { SetVar(); } catch (Exception ex) { MessageBox.Show(ex.Message); return; } var EquationInfomation = m_Dictionary_EquationInfo[selectedEquation]; if (EquationInfomation == null) { return; } var VariableDatas = EquationInfomation.m_Dictionary_Equation.Values; bool isErrorOccured = false; try { StringBuilder inputvalue_sb = new StringBuilder(); // 입력값 로그 출력용 StringBuilder equation_sb = new StringBuilder(); // 식 로그 출력용 StringBuilder result_sb = new StringBuilder(); // 결과값 로그 출력용 inputvalue_sb.Append("입력값 : "); // 계산전 값 Validation. // 어긋나면 계산안하고 종료. foreach (VariableData vdata in VariableDatas) { if (vdata is EquationVariable) { continue; } switch (vdata.m_checkOption) { case VariableData.CheckOption.None: break; case VariableData.CheckOption.MinMax: if (!CheckMinMax(vdata)) { throw new Exception(vdata.Name + "의 값은 " + vdata.OptionMinValue.ToString() + "이상 " + vdata.OptionMaxValue.ToString() + "이하여야 합니다."); } break; case VariableData.CheckOption.Custom: if (!CheckCustom(vdata)) { throw new Exception(vdata.Name + "의 식 조건이 일치 하지 않습니다. 입력변수 조건을 다시 한번 확인해 주십시오"); } break; default: break; } inputvalue_sb.Append(" [" + vdata.Name + "] = " + vdata.Value.ToString()); } if (test == false) { sendtoLog(inputvalue_sb.ToString() + "\n", Form_Log_Window.LogOption.Normal); } foreach (VariableData vdata in VariableDatas) { if (vdata is EquationVariable) { EquationVariable edata = (EquationVariable)vdata; try { Calculate(ref edata); SetTextBoxResult(edata.Name, edata.Value); if (test == false) { equation_sb.AppendLine("[" + edata.Name + "]" + " 공식 : " + edata.Equation); result_sb.AppendLine("[" + edata.Name + "]" + " 결과 : " + m_Term.Value.ToString("R")); } } catch (ParseException e) { if (test == false) { SetErrorForLabel(e.Message, edata, e.ParsedString); isErrorOccured = true; } } } } if (isErrorOccured) { MessageBox.Show("수식에 문제가 있습니다. 붉은색 항목에 커서를 올리면 문제 발생 원인을 확인 할 수 있습니다"); foreach (Control ctrl in panel1.Controls) { if (ctrl.BackColor == Color.LightGoldenrodYellow) { ctrl.Text = ""; } } } else { if (test == false) { sendtoLog(equation_sb.ToString() + "\n", Form_Log_Window.LogOption.Equation); sendtoLog(result_sb.ToString() + "\n\n\n", Form_Log_Window.LogOption.Result); } } } catch (Exception e) { if (test == true) { MessageBox.Show(e.Message); } } }
private EquationVariable MakeNewEquationVar(string name, string equation) { EquationVariable edata = new EquationVariable(name, equation); return(edata); }