示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }
示例#3
0
        /// <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);
        }
示例#4
0
        /// <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);
        }
示例#5
0
        /// <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);
        }
示例#6
0
        /// <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);
        }
示例#7
0
        /// <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);
        }
示例#8
0
        /// <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();
 }