コード例 #1
0
        private static Dictionary <PassiveElement[], Result> makeCalculations(
            AdvancedScheme scheme, Task task, ref int detansCount)
        {
            Dictionary <PassiveElement[], Result> elementsToResultMap = new Dictionary <PassiveElement[], Result>();

            switch (task)
            {
            case Task.Tolerances:
                elementsToResultMap = calculateTolerances((SchemeForTolerance)scheme, ref detansCount);
                break;

            case Task.Error:
                elementsToResultMap = calculateError((SchemeForError)scheme, ref detansCount);
                break;

            case Task.SingleErrors:
                elementsToResultMap = calculateSingleErrors((SchemeForError)scheme, ref detansCount);
                break;

            case Task.AllErrors:
                elementsToResultMap = calculateAllErrors((SchemeForError)scheme, ref detansCount);
                break;

            case Task.SSF:
                elementsToResultMap = calculateSSF((SchemeForSSF)scheme, ref detansCount);
                break;

            default:
                return(null);
            }
            return(elementsToResultMap);
        }
コード例 #2
0
        private void calculationsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
            detansCount = 0;
            object[]       parameters           = (object[])e.Argument;
            AdvancedScheme schemeForCalcuations = (AdvancedScheme)parameters[0];
            Task           task = (Task)parameters[1];

            e.Result = makeCalculations(schemeForCalculations, task, ref detansCount);
        }
コード例 #3
0
        public static void writeFileOut(string formule, AdvancedScheme scheme)
        {
            int           elementCount     = scheme.elementToValueDictionary.Count;
            int           fileStringsCount = elementCount + 3;
            List <string> fileStrings      = new List <string>();

            fileStrings.Add("1");
            fileStrings.Add("");
            fileStrings.Add("f=1000.000000;");
            fileStrings.Add("s=2*3.14159265358979323j*f;");
            foreach (KeyValuePair <Element, string> elementValuePair in scheme.elementToValueDictionary)
            {
                string value = elementValuePair.Value;
                fileStrings.Add(((ValueHavingElement)elementValuePair.Key).getFormattedName() + "=" + value + ";");
            }
            fileStrings.Add("");
            fileStrings.Add("detan =");
            fileStrings.Add(formule + ";");
            File.WriteAllLines(outFilePath, fileStrings.ToArray());
        }
コード例 #4
0
ファイル: DetansForm.cs プロジェクト: nice-try-bro/toleralize
        //public DetansForm()
        //{
        //    InitializeComponent();
        //}
        public DetansForm(Dictionary<string, DetansPair> elementsStringToDetanPairMap, AdvancedScheme scheme)
        {
            InitializeComponent();
            //string elementNamesPattern =
            //    "r|R|g|G|c|C|l|L|bi|Bi|bI|BI|hi|Hi|hI|HI|gu|Gu|gU|GU|ku|Ku|kU|KU";
            //Regex regex = new Regex("((\\δ\\((" + elementNamesPattern + ")\\d{1,}\\)" + "|" +
            //    "(" + elementNamesPattern + ")\\d{1,}))");
            int count = 0;
            itsElementsStringToDetanPairMap = elementsStringToDetanPairMap;
            itsSchemeForCalculaions = scheme;
            foreach (string elementsString in elementsStringToDetanPairMap.Keys)
            {
                string[] elementCombinationStrings = elementsString.Split(
                    new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
                if (elementCombinationStrings.Length == 0)
                    return;
                string selectedElementsString = elementCombinationStrings[0];
                string removedElementsString = "";
                string subtendedElementsString = "";
                if (elementCombinationStrings.Length > 1)
                    removedElementsString = elementCombinationStrings[1];
                string[] selectedElementNameStrings = selectedElementsString.Split(
                    new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                string[] removedElementNameStrings = removedElementsString.Split(
                    new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                if (removedElementNameStrings.Length == selectedElementNameStrings.Length)
                    subtendedElementsString = "-";
                else
                {
                    List<string> subtendedElementNamesList = new List<string>();
                    for (int i = 0; i < selectedElementNameStrings.Length; i++)
                    {
                        string selectedElementName = selectedElementNameStrings[i];
                        bool isRemoved = false;
                        string subtendedElementName = "";
                        if (itsSchemeForCalculaions is SchemeForTolerance ||
                            itsSchemeForCalculaions is SchemeForError)
                            subtendedElementName = "δ(" + selectedElementName + ")";
                        else
                            subtendedElementName = selectedElementName;
                        foreach (string removedElementName in removedElementNameStrings)
                        {
                            if (itsSchemeForCalculaions is SchemeForTolerance
                                || itsSchemeForCalculaions is SchemeForError)
                            {
                                if (removedElementName.Contains("(" + selectedElementName + ")"))
                                {
                                    isRemoved = true;
                                    break;
                                }
                            }
                            else
                            {
                                if (removedElementName == selectedElementName)
                                {
                                    isRemoved = true;
                                    break;
                                }
                            }

                        }
                        if (!isRemoved)
                            subtendedElementsString += subtendedElementName + ";";
                    }
                    if (subtendedElementsString.Length > 0)
                        if (subtendedElementsString[subtendedElementsString.Length - 1] == ';')
                            subtendedElementsString = subtendedElementsString.Remove(subtendedElementsString.Length - 1);
                }
                if (removedElementsString.Length == 0)
                    removedElementsString = "-";
                //string value = String.IsNullOrEmpty(elementsString) ? "-" : elementsString;
                elementsDataGridView.Rows.Add(new Object[] {
                    ++count, selectedElementsString,removedElementsString,subtendedElementsString });
            }
            //if (itsSchemeForCalculaions is SchemeForTolerance)
            //    this.Text = "Определители (расчет допуска)";
            //if (itsSchemeForCalculaions is SchemeForError)
            //    this.Text = "Определители (расчет погрешности)";
            //if (itsSchemeForCalculaions is SchemeForSSF)
            //    this.Text = "Определители (расчет дробной ССФ)";
        }
コード例 #5
0
        static Dictionary <string, DetansPair> getDetans(PassiveElement[] elements, AdvancedScheme scheme, ref int detansCount)
        {
            Dictionary <string, DetansPair> elementsToDetanPairDictionary = new Dictionary <string, DetansPair>();
            int            elementsCount = elements.Length;
            List <Element> elementsList  = new List <Element>();

            foreach (PassiveElement element in scheme.passiveElementsList)
            {
                elementsList.Add(element);
            }
            List <Element> activeElementsForZ = scheme.activeElementsListForZ;
            List <Element> activeElementsForQ = scheme.activeElementsListForQ;
            //elementsList.AddRange(scheme.nullersList);
            string selectedElementsString = Calculations.elementsToNamesString(elements);

            for (int i = 0; i <= elementsCount; i++)
            {
                int[] indexes = Calculations.makeCombination(i);
                while (true)
                {
                    List <Element> removedElements    = new List <Element>();
                    List <Element> subtendedElements  = new List <Element>();
                    List <Element> localElementsList  = new List <Element>(elementsList);
                    List <Element> associatedElements = new List <Element>();
                    for (int j = 0; j < elementsCount; j++)
                    {
                        if (Array.IndexOf(indexes, j + 1) >= 0)
                        {
                            scheme.transformElementToInfin(elements[j], localElementsList);
                            associatedElements.Add(elements[j]);
                            removedElements.Add(elements[j]);
                        }
                        else
                        {
                            scheme.transformElementToZero(elements[j], localElementsList);
                            subtendedElements.Add(elements[j]);
                        }
                    }
                    List <Element> elementsListToZ = new List <Element>(localElementsList);
                    elementsListToZ.AddRange(activeElementsForZ);
                    List <Element> elementsListToQ = new List <Element>(localElementsList);
                    elementsListToQ.AddRange(activeElementsForQ);

                    string pattern               = "";
                    string delimiter             = ";";
                    string removedElementsString = Calculations.elementsToNamesString(removedElements, pattern, delimiter);
                    string keyString             = selectedElementsString + "|" + removedElementsString;

                    string numeratorDetan;
                    string denominatorDetan;
                    if (mainForm.elementsStringToDetansMap.ContainsKey(keyString))
                    {
                        numeratorDetan   = mainForm.elementsStringToDetansMap[keyString].itsNumeratorDetan;
                        denominatorDetan = mainForm.elementsStringToDetansMap[keyString].itsDenominatorDetan;
                    }
                    else
                    {
                        numeratorDetan = Calculations.getDetan(elementsListToZ);
                        //mainForm.elementsStringToDetansMap[keyString].itsNumeratorDetan = numeratorDetan;
                        denominatorDetan = Calculations.getDetan(elementsListToQ);
                        Calculations.correctFormule(ref numeratorDetan);
                        Calculations.correctFormule(ref denominatorDetan);
                        //mainForm.elementsStringToDetansMap[keyString].itsDenominatorDetan = denominatorDetan;
                        mainForm.elementsStringToDetansMap.Add(
                            keyString, new DetansPair(numeratorDetan, denominatorDetan));
                    }

                    //string detanZ = Calculations.getDetan(elementsListToZ);
                    //Calculations.correctFormule(ref detanZ);
                    //string detanQ = Calculations.getDetan(elementsListToQ);
                    //Calculations.correctFormule(ref detanQ);
                    string elementNames = Calculations.elementsToNamesString(associatedElements);
                    elementsToDetanPairDictionary.Add(elementNames, new DetansPair(numeratorDetan, denominatorDetan));
                    detansCount += 2;
                    if (Calculations.nextCombination(indexes, elements.Length) != 0)
                    {
                        break;
                    }
                }
            }
            return(elementsToDetanPairDictionary);
        }
コード例 #6
0
ファイル: Scheme.cs プロジェクト: nice-try-bro/toleralize
        static Dictionary<string, DetansPair> getDetans(PassiveElement[] elements, AdvancedScheme scheme, ref int detansCount)
        {
            Dictionary<string, DetansPair> elementsToDetanPairDictionary = new Dictionary<string, DetansPair>();
            int elementsCount = elements.Length;
            List<Element> elementsList = new List<Element>();
            foreach (PassiveElement element in scheme.passiveElementsList)
                elementsList.Add(element);
            List<Element> activeElementsForZ = scheme.activeElementsListForZ;
            List<Element> activeElementsForQ = scheme.activeElementsListForQ;
            //elementsList.AddRange(scheme.nullersList);
            string selectedElementsString = Calculations.elementsToNamesString(elements);
            for (int i = 0; i <= elementsCount; i++)
            {
                int[] indexes = Calculations.makeCombination(i);
                while (true)
                {
                    List<Element> removedElements = new List<Element>();
                    List<Element> subtendedElements = new List<Element>();
                    List<Element> localElementsList = new List<Element>(elementsList);
                    List<Element> associatedElements = new List<Element>();
                    for (int j = 0; j < elementsCount; j++)
                    {
                        if (Array.IndexOf(indexes, j + 1) >= 0)
                        {
                            scheme.transformElementToInfin(elements[j], localElementsList);
                            associatedElements.Add(elements[j]);
                            removedElements.Add(elements[j]);
                        }
                        else
                        {
                            scheme.transformElementToZero(elements[j], localElementsList);
                            subtendedElements.Add(elements[j]);
                        }
                    }
                    List<Element> elementsListToZ = new List<Element>(localElementsList);
                    elementsListToZ.AddRange(activeElementsForZ);
                    List<Element> elementsListToQ = new List<Element>(localElementsList);
                    elementsListToQ.AddRange(activeElementsForQ);

                    string pattern = "";
                    string delimiter = ";";
                    string removedElementsString = Calculations.elementsToNamesString(removedElements, pattern, delimiter);
                    string keyString = selectedElementsString + "|" + removedElementsString;

                    string numeratorDetan;
                    string denominatorDetan;
                    if (mainForm.elementsStringToDetansMap.ContainsKey(keyString))
                    {
                        numeratorDetan = mainForm.elementsStringToDetansMap[keyString].itsNumeratorDetan;
                        denominatorDetan = mainForm.elementsStringToDetansMap[keyString].itsDenominatorDetan;
                    }
                    else
                    {
                        numeratorDetan = Calculations.getDetan(elementsListToZ);
                        //mainForm.elementsStringToDetansMap[keyString].itsNumeratorDetan = numeratorDetan;
                        denominatorDetan = Calculations.getDetan(elementsListToQ);
                        Calculations.correctFormule(ref numeratorDetan);
                        Calculations.correctFormule(ref denominatorDetan);
                        //mainForm.elementsStringToDetansMap[keyString].itsDenominatorDetan = denominatorDetan;
                        mainForm.elementsStringToDetansMap.Add(
                            keyString, new DetansPair(numeratorDetan, denominatorDetan));
                    }

                    //string detanZ = Calculations.getDetan(elementsListToZ);
                    //Calculations.correctFormule(ref detanZ);
                    //string detanQ = Calculations.getDetan(elementsListToQ);
                    //Calculations.correctFormule(ref detanQ);
                    string elementNames = Calculations.elementsToNamesString(associatedElements);
                    elementsToDetanPairDictionary.Add(elementNames, new DetansPair(numeratorDetan, denominatorDetan));
                    detansCount += 2;
                    if (Calculations.nextCombination(indexes, elements.Length) != 0)
                        break;
                }
            }
            return elementsToDetanPairDictionary;
        }
コード例 #7
0
        //static Element[] findElementsByIndexes(Element[] elements, int[] indexes)
        //{
        //    int index = 0;
        //    int indexesCount = indexes.Length;
        //    Element[] returnStrings = new Element[indexesCount];
        //    Predicate<Element> indexElementPredicate = delegate(Element element)
        //    {
        //        return Array.IndexOf(elements, element) == index;
        //    };
        //    for (int i = 0; i < indexesCount; i++)
        //    {
        //        index = indexes[i];
        //        returnStrings[i] = Array.Find<Element>(elements, indexElementPredicate);
        //    }
        //    return returnStrings;
        //}

        /* Вычисление значения формулы для схемы */
        public static string calculateFormule(string formule, AdvancedScheme scheme)
        {
            FileOperations.writeFileOut(formule, scheme);
            FileOperations.runCalcsym();
            return(FileOperations.getResultFromCLCFile());
        }
コード例 #8
0
        /* Нахождение пар определителей N и D для всех возможных сочетаний элементов */
        /* из заданного набора elements */
        /* Возвращает ассоциативный массив, где ключ - сочетание элементов, значение - пара определителей */
        //static Dictionary<string, detansPair> getDetans(
        static Dictionary <string, DetansPair> getDetans(
            PassiveElement[] elements, AdvancedScheme scheme, ref int detansCount)
        {
            Dictionary <string, DetansPair> elementsToDetanPairDictionary = new Dictionary <string, DetansPair>();
            int            elementsCount = elements.Length;
            List <Element> elementsList  = new List <Element>();

            foreach (PassiveElement element in scheme.passiveElementsList)
            {
                elementsList.Add(element);
            }
            List <Element> activeElementsForZ = scheme.activeElementsListForZ;
            List <Element> activeElementsForQ = scheme.activeElementsListForQ;

            foreach (PassiveElement element in elements)
            {
                elementsList.AddRange((element).clonnedElements);

                elementsList.Remove((element).cloneElement);
            }
            string selectedElementsString = elementsToNamesString(elements);

            //elementsList.AddRange(scheme.nullersList);
            /* Перебор длин сочетаний элементов */
            for (int i = 0; i <= elementsCount; i++)
            {
                /* Первое сочетание данной длины */
                int[] indexes = makeCombination(i);
                /* Перебор остальных сочетаний данной длины */
                while (true)
                {
                    List <Element> removedElements    = new List <Element>();
                    List <Element> subtendedElements  = new List <Element>();
                    List <Element> localElementsList  = new List <Element>(elementsList);
                    List <Element> associatedElements = new List <Element>();
                    /* Перебор элементов данного сочетания */
                    for (int j = 0; j < elementsCount; j++)
                    {
                        /* Нейтрализация или стягивание элемента */
                        if (Array.IndexOf(indexes, j + 1) >= 0)
                        {
                            scheme.transformElementToInfin((elements[j]).cloneElement, localElementsList);
                            associatedElements.Add(elements[j]);
                            removedElements.Add(elements[j]);
                        }
                        else
                        {
                            scheme.transformElementToZero((elements[j]).cloneElement, localElementsList);
                            subtendedElements.Add(elements[j]);
                        }
                    }
                    /* Далее - формирование списка элементов и рассчет определителей */
                    List <Element> elementsListToZ = new List <Element>(localElementsList);
                    elementsListToZ.AddRange(activeElementsForZ);
                    List <Element> elementsListToQ = new List <Element>(localElementsList);
                    elementsListToQ.AddRange(activeElementsForQ);

                    string pattern               = "δ(%element%)";
                    string delimiter             = ";";
                    string removedElementsString = elementsToNamesString(removedElements, pattern, delimiter);
                    string keyString             = selectedElementsString + "|" + removedElementsString;

                    string numeratorDetan;
                    string denominatorDetan;
                    if (mainForm.elementsStringToDetansMap.ContainsKey(keyString))
                    {
                        numeratorDetan   = mainForm.elementsStringToDetansMap[keyString].itsNumeratorDetan;
                        denominatorDetan = mainForm.elementsStringToDetansMap[keyString].itsDenominatorDetan;
                    }
                    else
                    {
                        numeratorDetan = getDetan(elementsListToZ);
                        //mainForm.elementsStringToDetansMap[keyString].itsNumeratorDetan = numeratorDetan;
                        denominatorDetan = getDetan(elementsListToQ);
                        correctFormule(ref numeratorDetan);
                        correctFormule(ref denominatorDetan);
                        //mainForm.elementsStringToDetansMap[keyString].itsDenominatorDetan = denominatorDetan;
                        mainForm.elementsStringToDetansMap.Add(
                            keyString, new DetansPair(numeratorDetan, denominatorDetan));
                    }
                    string elementsString = elementsToNamesString(associatedElements);
                    elementsToDetanPairDictionary.Add(elementsString, new DetansPair(numeratorDetan, denominatorDetan));
                    detansCount += 2;

                    if (nextCombination(indexes, elements.Length) != 0)
                    {
                        break;
                    }
                }
            }
            return(elementsToDetanPairDictionary);
        }
コード例 #9
0
 public static void writeFileOut(string formule, AdvancedScheme scheme)
 {
     int elementCount = scheme.elementToValueDictionary.Count;
     int fileStringsCount = elementCount + 3;
     List<string> fileStrings = new List<string>();
     fileStrings.Add("1");
     fileStrings.Add("");
     fileStrings.Add("f=1000.000000;");
     fileStrings.Add("s=2*3.14159265358979323j*f;");
     foreach (KeyValuePair<Element, string> elementValuePair in scheme.elementToValueDictionary)
     {
         string value = elementValuePair.Value;
         fileStrings.Add(((ValueHavingElement)elementValuePair.Key).getFormattedName() + "=" + value + ";");
     }
     fileStrings.Add("");
     fileStrings.Add("detan =");
     fileStrings.Add(formule + ";");
     File.WriteAllLines(outFilePath, fileStrings.ToArray());
 }
コード例 #10
0
        private void button2_Click(object sender, EventArgs e)
        {
            int selectedIndex = targetFormuleComboBox.SelectedIndex;

            if (selectedIndex < 2)
            {
                if (String.IsNullOrEmpty(errorTextBox.Text))
                {
                    errorToolTip.Show("Сначала введите значение погрешности", calculateButton, 1000);
                    return;
                }
            }
            if (selectedIndex >= 2 && selectedIndex < 8)
            {
                foreach (DataGridViewRow row in schemeDataGrid.Rows)
                {
                    if (rowToElementDictionary[row] is PassiveElement)
                    {
                        if ((bool)row.Cells[0].Value == true)
                        {
                            if (String.IsNullOrEmpty((string)row.Cells[8].Value))
                            {
                                errorToolTip.Show("Введите значение допуска для элемента " + (string)row.Cells[1].Value, calculateButton);
                                return;
                            }
                        }
                    }
                }
            }
            List <PassiveElement> selectedElements = getSelectedElements();

            if (selectedIndex < 6 || selectedIndex > 7)
            {
                if (selectedElements.Count == 0)
                {
                    errorToolTip.Show("Не выбран ни один элемент", calculateButton, 1000);
                    return;
                }
            }
            bool forNegative = (selectedIndex % 2 == 0) || selectedIndex == 8 ? false : true;

            formuleName = selectedIndex < 2 ? "Допуск" : (selectedIndex < 8 ? "Погрешность" : "ССФ");
            Task task;

            switch (selectedIndex)
            {
            case 0:
                schemeForCalculations = new SchemeForTolerance(Scheme.currentScheme,
                                                               selectedElements.ToArray(), (Convert.ToDouble(errorTextBox.Text) * 0.01).ToString(), false);
                task = Task.Tolerances;
                break;

            case 1:
                schemeForCalculations = new SchemeForTolerance(Scheme.currentScheme,
                                                               selectedElements.ToArray(), (Convert.ToDouble(errorTextBox.Text) * 0.01).ToString(), true);
                task = Task.Tolerances;
                break;

            case 2:
                schemeForCalculations = new SchemeForError(Scheme.currentScheme, selectedElements.ToArray(), getElementToToleranceAssociations(), false);
                task = Task.Error;
                break;

            case 3:
                schemeForCalculations = new SchemeForError(Scheme.currentScheme, selectedElements.ToArray(), getElementToToleranceAssociations(), true);
                task = Task.Error;
                break;

            case 4:
                schemeForCalculations = new SchemeForError(Scheme.currentScheme, selectedElements.ToArray(), getElementToToleranceAssociations(), false);
                task = Task.SingleErrors;
                break;

            case 5:
                schemeForCalculations = new SchemeForError(Scheme.currentScheme, selectedElements.ToArray(), getElementToToleranceAssociations(), true);
                task = Task.SingleErrors;
                break;

            case 6:
                schemeForCalculations = new SchemeForError(Scheme.currentScheme, selectedElements.ToArray(), getElementToToleranceAssociations(), false);
                task = Task.AllErrors;
                break;

            case 7:
                schemeForCalculations = new SchemeForError(Scheme.currentScheme, selectedElements.ToArray(), getElementToToleranceAssociations(), true);
                task = Task.AllErrors;
                break;

            case 8:
                schemeForCalculations = new SchemeForSSF(Scheme.currentScheme, selectedElements.ToArray(), 1);
                task = Task.SSF;
                break;

            default:
                schemeForCalculations = null;
                task = Task.Tolerances;
                break;
            }
            DisableControls();
            int selectedElementsCount = selectedElements.Count;

            switch (task)
            {
            case Task.Tolerances:
            case Task.SingleErrors:
                detansTargetAmount = selectedElementsCount * 4;
                break;

            case Task.Error:
            case Task.SSF:
                detansTargetAmount = (int)Math.Pow(2, selectedElementsCount + 1);
                break;

            case Task.AllErrors:
                int maxfactor = factorial(selectedElementsCount);
                detansTargetAmount = 0;
                for (int i = 1; i < selectedElementsCount; i++)
                {
                    detansTargetAmount += (int)(maxfactor / factorial(selectedElementsCount - i) * Math.Pow(2, i + 1));
                }
                break;
            }
            statusLabel.Text  = "Вычисление";
            currentPercentage = 0;
            detansCount       = 0;
            calculationsProgressBar.Visible = true;
            calculationsBackgroundWorker.RunWorkerAsync(new Object[] { schemeForCalculations, task, formuleName });
            TimerCallback callBack = this.checkDetansCount;

            timer = new System.Threading.Timer(callBack, null, 0, 10);
        }
コード例 #11
0
        //public DetansForm()
        //{
        //    InitializeComponent();
        //}

        public DetansForm(Dictionary <string, DetansPair> elementsStringToDetanPairMap, AdvancedScheme scheme)
        {
            InitializeComponent();
            //string elementNamesPattern =
            //    "r|R|g|G|c|C|l|L|bi|Bi|bI|BI|hi|Hi|hI|HI|gu|Gu|gU|GU|ku|Ku|kU|KU";
            //Regex regex = new Regex("((\\δ\\((" + elementNamesPattern + ")\\d{1,}\\)" + "|" +
            //    "(" + elementNamesPattern + ")\\d{1,}))");
            int count = 0;

            itsElementsStringToDetanPairMap = elementsStringToDetanPairMap;
            itsSchemeForCalculaions         = scheme;
            foreach (string elementsString in elementsStringToDetanPairMap.Keys)
            {
                string[] elementCombinationStrings = elementsString.Split(
                    new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
                if (elementCombinationStrings.Length == 0)
                {
                    return;
                }
                string selectedElementsString  = elementCombinationStrings[0];
                string removedElementsString   = "";
                string subtendedElementsString = "";
                if (elementCombinationStrings.Length > 1)
                {
                    removedElementsString = elementCombinationStrings[1];
                }
                string[] selectedElementNameStrings = selectedElementsString.Split(
                    new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                string[] removedElementNameStrings = removedElementsString.Split(
                    new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                if (removedElementNameStrings.Length == selectedElementNameStrings.Length)
                {
                    subtendedElementsString = "-";
                }
                else
                {
                    List <string> subtendedElementNamesList = new List <string>();
                    for (int i = 0; i < selectedElementNameStrings.Length; i++)
                    {
                        string selectedElementName  = selectedElementNameStrings[i];
                        bool   isRemoved            = false;
                        string subtendedElementName = "";
                        if (itsSchemeForCalculaions is SchemeForTolerance ||
                            itsSchemeForCalculaions is SchemeForError)
                        {
                            subtendedElementName = "δ(" + selectedElementName + ")";
                        }
                        else
                        {
                            subtendedElementName = selectedElementName;
                        }
                        foreach (string removedElementName in removedElementNameStrings)
                        {
                            if (itsSchemeForCalculaions is SchemeForTolerance ||
                                itsSchemeForCalculaions is SchemeForError)
                            {
                                if (removedElementName.Contains("(" + selectedElementName + ")"))
                                {
                                    isRemoved = true;
                                    break;
                                }
                            }
                            else
                            {
                                if (removedElementName == selectedElementName)
                                {
                                    isRemoved = true;
                                    break;
                                }
                            }
                        }
                        if (!isRemoved)
                        {
                            subtendedElementsString += subtendedElementName + ";";
                        }
                    }
                    if (subtendedElementsString.Length > 0)
                    {
                        if (subtendedElementsString[subtendedElementsString.Length - 1] == ';')
                        {
                            subtendedElementsString = subtendedElementsString.Remove(subtendedElementsString.Length - 1);
                        }
                    }
                }
                if (removedElementsString.Length == 0)
                {
                    removedElementsString = "-";
                }
                //string value = String.IsNullOrEmpty(elementsString) ? "-" : elementsString;
                elementsDataGridView.Rows.Add(new Object[] {
                    ++count, selectedElementsString, removedElementsString, subtendedElementsString
                });
            }
            //if (itsSchemeForCalculaions is SchemeForTolerance)
            //    this.Text = "Определители (расчет допуска)";
            //if (itsSchemeForCalculaions is SchemeForError)
            //    this.Text = "Определители (расчет погрешности)";
            //if (itsSchemeForCalculaions is SchemeForSSF)
            //    this.Text = "Определители (расчет дробной ССФ)";
        }
コード例 #12
0
        /* Нахождение пар определителей N и D для всех возможных сочетаний элементов */
        /* из заданного набора elements */
        /* Возвращает ассоциативный массив, где ключ - сочетание элементов, значение - пара определителей */
        //static Dictionary<string, detansPair> getDetans(
        static Dictionary<string, DetansPair> getDetans(
            PassiveElement[] elements, AdvancedScheme scheme, ref int detansCount)
        {
            Dictionary<string, DetansPair> elementsToDetanPairDictionary = new Dictionary<string, DetansPair>();
            int elementsCount = elements.Length;
            List<Element> elementsList = new List<Element>();
            foreach (PassiveElement element in scheme.passiveElementsList)
            {
                elementsList.Add(element);
            }
            List<Element> activeElementsForZ = scheme.activeElementsListForZ;
            List<Element> activeElementsForQ = scheme.activeElementsListForQ;
            foreach (PassiveElement element in elements)
            {
                elementsList.AddRange((element).clonnedElements);

                elementsList.Remove((element).cloneElement);
            }
            string selectedElementsString = elementsToNamesString(elements);
            //elementsList.AddRange(scheme.nullersList);
            /* Перебор длин сочетаний элементов */
            for (int i = 0; i <= elementsCount; i++)
            {
                /* Первое сочетание данной длины */
                int[] indexes = makeCombination(i);
                /* Перебор остальных сочетаний данной длины */
                while (true)
                {
                    List<Element> removedElements = new List<Element>();
                    List<Element> subtendedElements = new List<Element>();
                    List<Element> localElementsList = new List<Element>(elementsList);
                    List<Element> associatedElements = new List<Element>();
                    /* Перебор элементов данного сочетания */
                    for (int j = 0; j < elementsCount; j++)
                    {
                        /* Нейтрализация или стягивание элемента */
                        if (Array.IndexOf(indexes, j + 1) >= 0)
                        {
                            scheme.transformElementToInfin((elements[j]).cloneElement, localElementsList);
                            associatedElements.Add(elements[j]);
                            removedElements.Add(elements[j]);
                        }
                        else
                        {
                            scheme.transformElementToZero((elements[j]).cloneElement, localElementsList);
                            subtendedElements.Add(elements[j]);
                        }
                    }
                    /* Далее - формирование списка элементов и рассчет определителей */
                    List<Element> elementsListToZ = new List<Element>(localElementsList);
                    elementsListToZ.AddRange(activeElementsForZ);
                    List<Element> elementsListToQ = new List<Element>(localElementsList);
                    elementsListToQ.AddRange(activeElementsForQ);

                    string pattern = "δ(%element%)";
                    string delimiter = ";";
                    string removedElementsString = elementsToNamesString(removedElements, pattern, delimiter);
                    string keyString = selectedElementsString + "|" + removedElementsString;

                    string numeratorDetan;
                    string denominatorDetan;
                    if (mainForm.elementsStringToDetansMap.ContainsKey(keyString))
                    {
                        numeratorDetan = mainForm.elementsStringToDetansMap[keyString].itsNumeratorDetan;
                        denominatorDetan = mainForm.elementsStringToDetansMap[keyString].itsDenominatorDetan;
                    }
                    else
                    {
                        numeratorDetan = getDetan(elementsListToZ);
                        //mainForm.elementsStringToDetansMap[keyString].itsNumeratorDetan = numeratorDetan;
                        denominatorDetan = getDetan(elementsListToQ);
                        correctFormule(ref numeratorDetan);
                        correctFormule(ref denominatorDetan);
                        //mainForm.elementsStringToDetansMap[keyString].itsDenominatorDetan = denominatorDetan;
                        mainForm.elementsStringToDetansMap.Add(
                            keyString, new DetansPair(numeratorDetan,denominatorDetan));
                    }
                    string elementsString = elementsToNamesString(associatedElements);
                    elementsToDetanPairDictionary.Add(elementsString, new DetansPair(numeratorDetan, denominatorDetan));
                    detansCount += 2;

                    if (nextCombination(indexes, elements.Length) != 0)
                        break;
                }
            }
            return elementsToDetanPairDictionary;
        }
コード例 #13
0
 //static Element[] findElementsByIndexes(Element[] elements, int[] indexes)
 //{
 //    int index = 0;
 //    int indexesCount = indexes.Length;
 //    Element[] returnStrings = new Element[indexesCount];
 //    Predicate<Element> indexElementPredicate = delegate(Element element)
 //    {
 //        return Array.IndexOf(elements, element) == index;
 //    };
 //    for (int i = 0; i < indexesCount; i++)
 //    {
 //        index = indexes[i];
 //        returnStrings[i] = Array.Find<Element>(elements, indexElementPredicate);
 //    }
 //    return returnStrings;
 //}
 /* Вычисление значения формулы для схемы */
 public static string calculateFormule(string formule, AdvancedScheme scheme)
 {
     FileOperations.writeFileOut(formule, scheme);
     FileOperations.runCalcsym();
     return FileOperations.getResultFromCLCFile();
 }
コード例 #14
0
ファイル: MainForm.cs プロジェクト: nice-try-bro/toleralize
        private void button2_Click(object sender, EventArgs e)
        {
            int selectedIndex = targetFormuleComboBox.SelectedIndex;

            if (selectedIndex < 2)
                if (String.IsNullOrEmpty(errorTextBox.Text))
                {
                    errorToolTip.Show("Сначала введите значение погрешности", calculateButton, 1000);
                    return;
                }
            if (selectedIndex >= 2 && selectedIndex < 8)
            {
                foreach (DataGridViewRow row in schemeDataGrid.Rows)
                {
                    if (rowToElementDictionary[row] is PassiveElement)
                        if ((bool)row.Cells[0].Value == true)
                            if (String.IsNullOrEmpty((string)row.Cells[8].Value))
                            {
                                errorToolTip.Show("Введите значение допуска для элемента " + (string)row.Cells[1].Value, calculateButton);
                                return;
                            }
                }
            }
            List<PassiveElement> selectedElements = getSelectedElements();
            if (selectedIndex < 6 || selectedIndex > 7)
                if (selectedElements.Count == 0)
                {
                    errorToolTip.Show("Не выбран ни один элемент", calculateButton, 1000);
                    return;
                }
            bool forNegative = (selectedIndex % 2 == 0) || selectedIndex == 8 ? false : true;
            formuleName = selectedIndex < 2 ? "Допуск" : (selectedIndex < 8 ? "Погрешность" : "ССФ");
            Task task;
            switch (selectedIndex)
            {
                case 0:
                    schemeForCalculations = new SchemeForTolerance(Scheme.currentScheme,
                        selectedElements.ToArray(), (Convert.ToDouble(errorTextBox.Text) * 0.01).ToString(), false);
                    task = Task.Tolerances;
                    break;
                case 1:
                    schemeForCalculations = new SchemeForTolerance(Scheme.currentScheme,
                        selectedElements.ToArray(), (Convert.ToDouble(errorTextBox.Text) * 0.01).ToString(), true);
                    task = Task.Tolerances;
                    break;
                case 2:
                    schemeForCalculations = new SchemeForError(Scheme.currentScheme, selectedElements.ToArray(), getElementToToleranceAssociations(), false);
                    task = Task.Error;
                    break;
                case 3:
                    schemeForCalculations = new SchemeForError(Scheme.currentScheme, selectedElements.ToArray(), getElementToToleranceAssociations(), true);
                    task = Task.Error;
                    break;
                case 4:
                    schemeForCalculations = new SchemeForError(Scheme.currentScheme, selectedElements.ToArray(), getElementToToleranceAssociations(), false);
                    task = Task.SingleErrors;
                    break;
                case 5:
                    schemeForCalculations = new SchemeForError(Scheme.currentScheme, selectedElements.ToArray(), getElementToToleranceAssociations(), true);
                    task = Task.SingleErrors;
                    break;
                case 6:
                    schemeForCalculations = new SchemeForError(Scheme.currentScheme, selectedElements.ToArray(), getElementToToleranceAssociations(), false);
                    task = Task.AllErrors;
                    break;
                case 7:
                    schemeForCalculations = new SchemeForError(Scheme.currentScheme, selectedElements.ToArray(), getElementToToleranceAssociations(), true);
                    task = Task.AllErrors;
                    break;
                case 8:
                    schemeForCalculations = new SchemeForSSF(Scheme.currentScheme, selectedElements.ToArray(), 1);
                    task = Task.SSF;
                    break;
                default:
                    schemeForCalculations = null;
                    task = Task.Tolerances;
                    break;
            }
            DisableControls();
            int selectedElementsCount = selectedElements.Count;
            switch (task)
            {
                case Task.Tolerances:
                case Task.SingleErrors:
                    detansTargetAmount = selectedElementsCount * 4;
                    break;
                case Task.Error:
                case Task.SSF:
                    detansTargetAmount = (int)Math.Pow(2, selectedElementsCount + 1);
                    break;
                case Task.AllErrors:
                    int maxfactor = factorial(selectedElementsCount);
                    detansTargetAmount = 0;
                    for (int i = 1; i < selectedElementsCount; i++)
                    {
                        detansTargetAmount += (int)(maxfactor / factorial(selectedElementsCount - i) * Math.Pow(2, i + 1));
                    }
                    break;

            }
            statusLabel.Text = "Вычисление";
            currentPercentage = 0;
            detansCount = 0;
            calculationsProgressBar.Visible = true;
            calculationsBackgroundWorker.RunWorkerAsync(new Object[] { schemeForCalculations, task, formuleName });
            TimerCallback callBack = this.checkDetansCount;
            timer = new System.Threading.Timer(callBack, null, 0, 10);
        }
コード例 #15
0
ファイル: MainForm.cs プロジェクト: nice-try-bro/toleralize
 private static Dictionary<PassiveElement[], Result> makeCalculations(
     AdvancedScheme scheme, Task task, ref int detansCount)
 {
     Dictionary<PassiveElement[], Result> elementsToResultMap = new Dictionary<PassiveElement[], Result>();
     switch (task)
     {
         case Task.Tolerances:
             elementsToResultMap = calculateTolerances((SchemeForTolerance)scheme, ref detansCount);
             break;
         case Task.Error:
             elementsToResultMap = calculateError((SchemeForError)scheme, ref detansCount);
             break;
         case Task.SingleErrors:
             elementsToResultMap = calculateSingleErrors((SchemeForError)scheme, ref detansCount);
             break;
         case Task.AllErrors:
             elementsToResultMap = calculateAllErrors((SchemeForError)scheme, ref detansCount);
             break;
         case Task.SSF:
             elementsToResultMap = calculateSSF((SchemeForSSF)scheme, ref detansCount);
             break;
         default:
             return null;
     }
     return elementsToResultMap;
 }