Ejemplo n.º 1
0
        /// <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);
                    }
                }
            }
        }
Ejemplo n.º 4
0
        /// <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);
        }