/// <summary> /// Вычисляет размер рисунка эл. цепи с последовательным соединением. /// </summary> /// <param name="circuitBase">Эл. цепь с последовательным соединением.</param> /// <returns>Размер рисунка эл.цепи.</returns> private static Size GetSize(SerialCircuit circuitBase) { var size = circuitBase.Count > 0 ? new Size(0, 0) : new Size(_emptyImageSize.Width, _emptyImageSize.Height); foreach (IComponent component in circuitBase) { if (component is IElement element) { size.Height = size.Height < GetSize(element).Height ? GetSize(element).Height : size.Height; size.Width = size.Width + GetSize(element).Width; } else if (component is SerialCircuit sc) { var scSize = GetSize(sc); size.Height = size.Height < scSize.Height ? scSize.Height : size.Height; size.Width = size.Width + scSize.Width; } else if (component is ParallelCircuit pc) { var pcSize = GetSize(pc); size.Height = size.Height < pcSize.Height ? pcSize.Height : size.Height; size.Width = size.Width + pcSize.Width; } } return(size); }
/// <summary> /// Метод, для вычисления высоты между уровнями в параллельной цепи. /// </summary> /// <param name="circuit">Входная схема цепи</param> /// <returns></returns> private int CalculateParallelCircuitHeight(ParallelCircuit circuit) { int count = 1; for (int i = 0; i < circuit.Circuit.Count; i++) { if (circuit.Circuit[i] is SerialCircuit) { SerialCircuit serial = circuit.Circuit[i] as SerialCircuit; for (int j = 0; j < serial.Circuit.Count; j++) { if (serial.Circuit[j] is ParallelCircuit) { count += CalculateParallelCircuitHeight(serial.Circuit[j] as ParallelCircuit); } } if (count > 4) { return(count * 2); } if (count <= 4 && count > 2) { return(count); } } } return(30); }
/// <summary> /// Метод, для отрисовки последовательной цепи. /// </summary> /// <param name="circuit">Входная схема цепи</param> /// <param name="bmp">Рисунок</param> /// <param name="x">Входное значение координаты по оси Ох</param> /// <param name="y">Входное значение координаты по оси Оу</param> /// <param name="length">Необязательный параметр длинны, при вхождении цепи в параллельную схему</param> /// <returns></returns> private Bitmap DrawSerialCircuit(SerialCircuit circuit, Bitmap bmp, int x, int y, int length = 0) { int startX = x; foreach (IComponent component in circuit.Circuit) { if (component is Resistor) { bmp = DrawResistor(bmp, x, y); x += 80; } else if (component is Inductor) { bmp = DrawInductor(bmp, x, y); x += 80; } else if (component is Capacitor) { bmp = DrawCapacitor(bmp, x, y); x += 80; } else { bmp = DrawParallelCircuit(component as ParallelCircuit, bmp, x, y); x += CalculateParallelCircuitLength(component as ParallelCircuit); } } if (x < startX + length) { Graphics graph = Graphics.FromImage(bmp); graph.DrawLine(_pen, x, y, startX + length - 30, y); } return(bmp); }
/// <summary> /// Тестовая схема №5. /// </summary> /// <returns></returns private IComponent _circuit5() { var R1 = new Resistor("R1", 100); var R2 = new Resistor("R2", 100); var C1 = new Capacitor("C1", 0.005); var C2 = new Capacitor("C2", 0.005); var C3 = new Capacitor("C3", 0.005); var L1 = new Inductor("L1", 0.5); var L2 = new Inductor("L2", 0.5); var circuit1 = new SerialCircuit("circuit1"); var circuit2 = new ParallelCircuit("circuit2"); var circuit3 = new SerialCircuit("circuit3"); var circuit4 = new SerialCircuit("circuit4"); var circuit5 = new ParallelCircuit("circuit5"); circuit5.Circuit.Add(C3); circuit5.Circuit.Add(R1); circuit4.Circuit.Add(R2); circuit4.Circuit.Add(L2); circuit3.Circuit.Add(L1); circuit3.Circuit.Add(circuit5); circuit2.Circuit.Add(C2); circuit2.Circuit.Add(circuit3); circuit2.Circuit.Add(circuit4); circuit1.Circuit.Add(C1); circuit1.Circuit.Add(circuit2); return(circuit1); }
/// <summary> /// Тестовая схема №2. /// </summary> /// <returns></returns private IComponent _circuit2() { var R1 = new Resistor("R1", 100); var C1 = new Capacitor("C1", 0.005); var L1 = new Inductor("L1", 0.5); var circuit1 = new SerialCircuit("circuit1"); var circuit2 = new ParallelCircuit("circuit2"); circuit2.Circuit.Add(R1); circuit2.Circuit.Add(C1); circuit1.Circuit.Add(circuit2); circuit1.Circuit.Add(L1); return(circuit1); }
/// <summary> /// Метод, для вычисления длины последовательной цепи в схеме. /// </summary> /// <param name="circuit">Входная схема цепи</param> /// <returns></returns> private int CalculateSerialCircuitLength(SerialCircuit circuit) { int length = 0; for (int i = 0; i < circuit.Circuit.Count; i++) { if (circuit.Circuit[i] is IElement) { length += 80; } else if (circuit.Circuit[i] is ParallelCircuit) { length += CalculateParallelCircuitLength(circuit.Circuit[i] as ParallelCircuit); } } return(length); }
/// <summary> /// Тестовая схема №6. /// </summary> /// <returns></returns> private IComponent _circuit6() { var R1 = new Resistor("R1", 100); var circuit1 = new ParallelCircuit("circuit1"); var circuit2 = new SerialCircuit("circuit2"); var circuit3 = new SerialCircuit("circuit3"); var circuit4 = new ParallelCircuit("circuit4"); var circuit5 = new ParallelCircuit("circuit5"); var circuit6 = new SerialCircuit("circuit6"); var circuit7 = new ParallelCircuit("circuit7"); var circuit8 = new ParallelCircuit("circuit8"); var circuit9 = new SerialCircuit("circuit9"); circuit7.Circuit.Add(R1); circuit7.Circuit.Add(R1); circuit6.Circuit.Add(R1); circuit6.Circuit.Add(circuit7); circuit5.Circuit.Add(R1); circuit5.Circuit.Add(circuit6); circuit8.Circuit.Add(circuit6); circuit8.Circuit.Add(R1); circuit4.Circuit.Add(R1); circuit4.Circuit.Add(R1); circuit3.Circuit.Add(R1); circuit3.Circuit.Add(circuit4); circuit3.Circuit.Add(R1); circuit2.Circuit.Add(R1); circuit2.Circuit.Add(circuit5); circuit9.Circuit.Add(R1); circuit9.Circuit.Add(circuit8); circuit1.Circuit.Add(circuit2); circuit1.Circuit.Add(circuit9); return(circuit1); }
/// <summary> /// Метод отрисовывающий последовательную электрическую цепь. /// </summary> /// <param name="circuitBase">Электрическая цепь с последовательным соедининением.</param> /// <returns>Рисунок эл. цепи.</returns> private static Bitmap GetCircuitImage(SerialCircuit circuitBase) { var size = GetSize(circuitBase); var bitmap = new Bitmap(size.Width, size.Height); int x = 0; int y = size.Height / ImageDellimitterConst; using (Graphics g = Graphics.FromImage(bitmap)) { foreach (IComponent component in circuitBase) { if (component is IElement element) { var elementImage = GetElementImage(element); g.DrawImage(elementImage, new Point(x, y - elementImage.Height / ImageDellimitterConst)); x += GetSize(element).Width; } else if (component is CircuitBase circuitComponent) { Bitmap circuitImage = new Bitmap(_emptyImageSize.Width, _emptyImageSize.Height); if (circuitComponent is SerialCircuit sc) { circuitImage = GetCircuitImage(sc); } else if (circuitComponent is ParallelCircuit pc) { circuitImage = GetCircuitImage(pc); } g.DrawImage(circuitImage, new Point(x, y - circuitImage.Height / ImageDellimitterConst)); x += GetSize(circuitComponent).Width; } } } return(bitmap); }
/// <summary> /// Создает новый экзмепляр элемента управления. /// </summary> public SerialCircuitControl() { InitializeComponent(); _circuit = new SerialCircuit(); }