Esempio n. 1
0
        /// <summary>
        /// Метод, для вычисления длины параллельной цепи в схеме.
        /// </summary>
        /// <param name="circuit">Входная схема цепи</param>
        /// <returns></returns>
        private int CalculateParallelCircuitLength(ParallelCircuit circuit)
        {
            List <SerialCircuit> serials = new List <SerialCircuit>();

            for (int i = 0; i < circuit.Circuit.Count; i++)
            {
                if (circuit.Circuit[i] is SerialCircuit)
                {
                    serials.Add(circuit.Circuit[i] as SerialCircuit);
                }
            }
            if (serials.Count > 0)
            {
                int length = CalculateSerialCircuitLength(serials[0]);
                for (int i = 1; i < serials.Count; i++)
                {
                    if (CalculateSerialCircuitLength(serials[i]) > length)
                    {
                        length = CalculateSerialCircuitLength(serials[i]);
                    }
                }
                return(length + 30);
            }
            return(110);
        }
Esempio n. 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);
        }
Esempio n. 3
0
        /// <summary>
        /// Вычисляет размер рисунка эл. цепи с параллельным соединением.
        /// </summary>
        /// <param name="circuitBase">Эл. цепь с параллельным соединением.</param>
        /// <returns>Размер рисунка эл.цепи.</returns>
        private static Size GetSize(ParallelCircuit circuitBase)
        {
            var size = circuitBase.Count > 0 ? new Size(0, 0) : new Size(_emptyImageSize.Width, _emptyImageSize.Height);

            foreach (var component in circuitBase)
            {
                if (component is IElement element)
                {
                    size.Height = size.Height + GetSize(element).Height;
                    size.Width  = size.Width < GetSize(element).Width ? GetSize(element).Width : size.Width;
                }
                else if (component is SerialCircuit sc)
                {
                    var scSize = GetSize(sc);
                    size.Width  = size.Width < scSize.Width ? scSize.Width : size.Width;
                    size.Height = size.Height + scSize.Height;
                }
                else if (component is ParallelCircuit pc)
                {
                    var pcSize = GetSize(pc);
                    size.Width  = size.Width < pcSize.Width ? pcSize.Width : size.Width;
                    size.Height = size.Height + pcSize.Height;
                }
            }
            size.Width += InputLineLength + OutputLineLength;
            return(size);
        }
Esempio n. 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);
        }
Esempio n. 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);
        }
Esempio n. 6
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);
        }
Esempio n. 7
0
        /// <summary>
        /// Метод, для отрисовки параллельной цепи.
        /// </summary>
        /// <param name="circuit">Входная схема цепи</param>
        /// <param name="bmp">Рисунок</param>
        /// <param name="x">Входное значение координаты по оси Ох</param>
        /// <param name="y">Входное значение координаты по оси Оу</param>
        /// <returns></returns>
        private Bitmap DrawParallelCircuit(ParallelCircuit circuit, Bitmap bmp, int x, int y)
        {
            Graphics graph = Graphics.FromImage(bmp);

            graph.DrawLine(_pen, x, y, x + 15, y);
            int startY = y;
            int height = CalculateParallelCircuitHeight(circuit);

            y -= height * (circuit.Circuit.Count - 1) / 2;
            var h = y;

            foreach (IComponent component in circuit.Circuit)
            {
                if (component is Resistor)
                {
                    bmp = DrawResistor(bmp, x + 15, y, CalculateParallelCircuitLength(circuit));
                    y  += height;
                }
                else if (component is Inductor)
                {
                    bmp = DrawInductor(bmp, x + 15, y, CalculateParallelCircuitLength(circuit));
                    y  += height;
                }
                else if (component is Capacitor)
                {
                    bmp = DrawCapacitor(bmp, x + 15, y, CalculateParallelCircuitLength(circuit));
                    y  += height;
                }
                else
                {
                    bmp = DrawSerialCircuit(component as SerialCircuit, bmp, x + 15, y,
                                            CalculateParallelCircuitLength(circuit));
                    y += height;
                }
            }
            graph.DrawLine(_pen, x + 15, h, x + 15, y - height);
            graph.DrawLine(_pen, x + CalculateParallelCircuitLength(circuit) - 15, h,
                           x + CalculateParallelCircuitLength(circuit) - 15, y - height);
            graph.DrawLine(_pen, x + CalculateParallelCircuitLength(circuit) - 15, startY,
                           x + CalculateParallelCircuitLength(circuit), startY);
            return(bmp);
        }
Esempio n. 8
0
 /// <summary>
 /// Создает экземпляр элемента управления.
 /// </summary>
 public ParallelCircuitControl()
 {
     InitializeComponent();
     _circuit = new ParallelCircuit();
 }
Esempio n. 9
0
        /// <summary>
        /// Метод отрисовывающий эл. цепь с параллельным соединением.
        /// </summary>
        /// <param name="circuitBase">Эл. цепь с параллельным соединением.</param>
        /// <returns>Рисунок эл. цепи.</returns>
        private static Bitmap GetCircuitImage(ParallelCircuit circuitBase)
        {
            var size = GetSize(circuitBase);

            var bitmap = new Bitmap(size.Width, size.Height);

            int x = InputLineLength;
            int y = 0;

            var firstComponent = circuitBase.FirstOrDefault();
            var lastElement    = circuitBase.LastOrDefault();

            if (firstComponent == null || lastElement == null)
            {
                return(bitmap);
            }
            int firstHeight = GetSize(firstComponent).Height;
            int lastHeight  = GetSize(lastElement).Height;

            using (Graphics g = Graphics.FromImage(bitmap))
            {
                g.DrawLine(_standartPen, 0, size.Height / ImageDellimitterConst, InputLineLength, size.Height / ImageDellimitterConst);
                g.DrawLine(_standartPen, 0, size.Height / ImageDellimitterConst - 1, InputLineLength, size.Height / ImageDellimitterConst - 1);

                g.DrawLine(_standartPen, x, y + firstHeight / ImageDellimitterConst, x, size.Height - lastHeight / ImageDellimitterConst);
                g.DrawLine(_standartPen, x + 1, y + firstHeight / ImageDellimitterConst, x + 1, size.Height - lastHeight / ImageDellimitterConst);
                foreach (var component in circuitBase)
                {
                    if (component is IElement element)
                    {
                        var elementImage = GetElementImage(element);
                        g.DrawImage(elementImage, new Point(x, y));
                        g.DrawLine(_standartPen, x + elementImage.Width, y + elementImage.Height / ImageDellimitterConst, bitmap.Width - ParallelConnectorMargin, y + elementImage.Height / ImageDellimitterConst);
                        g.DrawLine(_standartPen, x + elementImage.Width, y + elementImage.Height / ImageDellimitterConst - 1, bitmap.Width - ParallelConnectorMargin, y + elementImage.Height / ImageDellimitterConst - 1);
                        y += elementImage.Height;
                    }
                    else if (component is CircuitBase circuitComponent)
                    {
                        Bitmap circuitImage = new Bitmap(1, 1);
                        if (circuitComponent is SerialCircuit sc)
                        {
                            circuitImage = GetCircuitImage(sc);
                        }
                        else if (circuitComponent is ParallelCircuit pc)
                        {
                            circuitImage = GetCircuitImage(pc);
                        }
                        g.DrawImage(circuitImage, new Point(x, y));
                        g.DrawLine(_standartPen, x + circuitImage.Width, y + circuitImage.Height / ImageDellimitterConst, bitmap.Width - ParallelConnectorMargin, y + circuitImage.Height / ImageDellimitterConst);
                        g.DrawLine(_standartPen, x + circuitImage.Width, y + circuitImage.Height / ImageDellimitterConst - 1, bitmap.Width - ParallelConnectorMargin, y + circuitImage.Height / ImageDellimitterConst - 1);
                        y += circuitImage.Height;
                    }
                }

                g.DrawLine(_standartPen, bitmap.Width - ParallelConnectorMargin, firstHeight / ImageDellimitterConst, bitmap.Width - ParallelConnectorMargin, size.Height - lastHeight / ImageDellimitterConst);
                g.DrawLine(_standartPen, bitmap.Width - ParallelConnectorMargin - 1, firstHeight / ImageDellimitterConst, bitmap.Width - ParallelConnectorMargin - 1, size.Height - lastHeight / ImageDellimitterConst);

                g.DrawLine(_standartPen, bitmap.Width - ParallelConnectorMargin, bitmap.Height / ImageDellimitterConst, bitmap.Width, bitmap.Height / ImageDellimitterConst);
                g.DrawLine(_standartPen, bitmap.Width - ParallelConnectorMargin, bitmap.Height / ImageDellimitterConst - 1, bitmap.Width, bitmap.Height / ImageDellimitterConst - 1);
            }
            return(bitmap);
        }