/// <summary> /// Вставляет данные о сопротивлении в таблицу. /// </summary> /// <param name="circuit">Эл. цепь для рассчета.</param> /// <param name="freq">Массив частот.</param> private void FillCircuitTable(CircuitBase circuit, double[] freq) { for (int elementIndex = -1; elementIndex < circuit.Count; elementIndex++) { var circuitRow = new DataGridViewRow(); circuitRow.CreateCells(circuitGridView); var cells = new object[freq.Length + 2]; if (elementIndex == -1) { cells[0] = circuit.Name; cells[1] = ""; for (var i = 0; i < freq.Length; i++) { cells[i + 2] = circuit.CalculateZ(freq[i]); } circuitRow.DefaultCellStyle.BackColor = Color.Lavender; } else { cells[0] = ""; cells[1] = circuit[elementIndex].Name; for (var i = 0; i < freq.Length; i++) { cells[i + 2] = circuit[elementIndex].CalculateZ(freq[i]); } circuitRow.DefaultCellStyle.BackColor = Color.White; } circuitRow.SetValues(cells); circuitGridView.Rows.Add(circuitRow); } }
/// <summary> /// Заполняет список элементами. /// </summary> /// <param name="circuit"></param> private void FillList(CircuitBase circuit) { listBox.Items.Clear(); foreach (IComponent e in circuit) { listBox.Items.Add(e.Name); } }
public void ShowZ(CircuitBase circuit, double[] freq) { circuitGridView.Rows.Clear(); circuitGridView.Columns.Clear(); BuildStandartRows(); BuildFreqRows(freq); FillCircuitTable(circuit, freq); }
/// <summary> /// Создает новый экземпляр формы. /// </summary> /// <param name="circuit">Эл. цепь для просмотра.</param> public CircuitGraphicView(CircuitBase circuit) { InitializeComponent(); Image image = circuit.GetImage(); picture.Width = image.Width; picture.Height = image.Height; picture.Image = image; }
/// <summary> /// Метод позволяющий отрисовать(вернуть битмап) эл. цепь. /// </summary> /// <param name="circuitBase">Электическая цепь.</param> /// <returns>Рисунок эл. цепи.</returns> public static Bitmap GetImage(this CircuitBase circuitBase) { if (circuitBase is SerialCircuit serial) { return(GetCircuitImage(serial)); } if (circuitBase is ParallelCircuit parallel) { return(GetCircuitImage(parallel)); } return(new Bitmap(0, 0)); }
/// <summary> /// Вычисляет размер рисунка эл. цепи. /// </summary> /// <param name="circuitBase">Эл. цепь.</param> /// <returns>Размер рисунка эл. цепи.</returns> private static Size GetSize(CircuitBase circuitBase) { if (circuitBase is SerialCircuit serialCircuit) { return(GetSize(serialCircuit)); } else if (circuitBase is ParallelCircuit parallelCircuit) { return(GetSize(parallelCircuit)); } return(new Size(1, 1)); }
/// <summary> /// Смена выбранной цепи в комбобоксе /// </summary> private void SelectingCircuitComboBox_SelectedIndexChanged(object sender, EventArgs e) { if (SelectingCircuitComboBox.SelectedIndex != 6) { _currentCircuit = TestCircuitsGenerator.GenerateCircuit(SelectingCircuitComboBox .SelectedIndex + 1); DrawCircuit(); FillTreeView(); } else { circuitDrawLayoutPanel.BackgroundImage = null; } }
/// <summary> /// Рекурсивная проверка на то можно ли нарисовать цепь /// </summary> /// <param name="circuit"></param> /// <returns></returns> private bool IsDrawable(CircuitBase circuit) { if (circuit.Elements == null) { MessageBox.Show("Ошибка отрисовки! Соединение с id " + _currentCircuit.Id + " должно хранить в себе минимум два элемента"); return(false); } if (circuit.Elements.Count >= 2) { foreach (var element in circuit.Elements) { if (element is CircuitBase circuitBase) { return(IsDrawable(circuitBase)); } } } return(true); }
/// <summary> /// Функция для обхода и добавления в TreeView подцепей /// </summary> /// <param name="newLevel">уровень добавляемой подцепи</param> /// <param name="subcircuit">подцепь</param> private void FillSubcircuitInTreeView(TreeNodeCollection newLevel, CircuitBase subcircuit) { //Если соединение пустое, просто добавить его if (subcircuit.Elements == null) { switch (subcircuit) { case ParallelCircuit paralelCircuit: newLevel[newLevel.Count - 1].Nodes .Add("[Паралл] (id " + paralelCircuit.Id + ')'); break; case SerialCircuit serialCircuit: newLevel[newLevel.Count - 1].Nodes .Add("[Послед] (id " + serialCircuit.Id + ')'); break; } } //Добавление вместе с элементами else { foreach (var circuitElement in subcircuit.Elements) { //Добавление подцепи в дерево if (circuitElement is CircuitBase circuit) { //Если соединение пустое, просто добавить его if (circuit.Elements == null || circuit.Elements.Count == 0) { switch (circuit) { case ParallelCircuit paralelCircuit: newLevel[newLevel.Count - 1].Nodes .Add("[Паралл] (id " + paralelCircuit.Id + ')'); break; case SerialCircuit serialCircuit: newLevel[newLevel.Count - 1].Nodes .Add("[Послед] (id " + serialCircuit.Id + ')'); break; } } else { switch (circuit) { case ParallelCircuit paralelCircuit: newLevel[newLevel.Count - 1].Nodes .Add("[Паралл] (id " + paralelCircuit.Id + ')'); break; case SerialCircuit serialCircuit: newLevel[newLevel.Count - 1].Nodes .Add("[Послед] (id " + serialCircuit.Id + ')'); break; } FillSubcircuitInTreeView(newLevel[newLevel.Count - 1].Nodes, circuit); } } //Добавление элемента в дерево else { switch (circuitElement) { case Resistor element: newLevel[newLevel.Count - 1].Nodes .Add("[R] [" + element.Value + "] (" + element.Name + ')'); break; case Inductor element: newLevel[newLevel.Count - 1].Nodes .Add("[I] [" + element.Value + "] (" + element.Name + ')'); break; case Capacitor element: newLevel[newLevel.Count - 1].Nodes .Add("[C] [" + element.Value + "] (" + element.Name + ')'); break; } } } } }