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); }
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); }
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()); }
//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 = "Определители (расчет дробной ССФ)"; }
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); }
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; }
//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()); }
/* Нахождение пар определителей 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); }
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()); }
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); }
//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 = "Определители (расчет дробной ССФ)"; }
/* Нахождение пар определителей 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; }
//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(); }
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); }
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; }