Exemple #1
0
 public Wire(LogicGate lgFrom, LogicGate lgTo, Connection cFrom, Connection cTo)
 {
     derivedwires = new List <Wire>();
     lgDonor      = lgFrom;
     lgReceiver   = lgTo;
     cDonor       = cFrom;
     cReceiver    = cTo;
 }
Exemple #2
0
        private void Update(object sender, EventArgs e)
        {
            gCanvas.Clear(Color.FromArgb(80, 50, 40));
            Vector vMouse   = Input.MousePos();
            Vector vMouseBZ = ScreenToWorld(vMouse);

            if (Input.WheelScrollUp())
            {
                fScale *= 1.1f;
            }
            if (Input.WheelScrollDown())
            {
                fScale *= 0.9f;
            }
            Vector vMouseAZ = ScreenToWorld(vMouse);

            vOffSet += vMouseBZ - vMouseAZ;

            if (Input.KeyPressed(MouseButtons.Middle))
            {
                vStartPan = new Vector(vMouse.x, vMouse.y);
            }
            if (Input.KeyHeld(MouseButtons.Middle))
            {
                vOffSet  -= (vMouse - vStartPan) / fScale;
                vStartPan = new Vector(vMouse.x, vMouse.y);
            }

            if (Input.KeyPressed(MouseButtons.Right))
            {
                if (nSelected == 0)
                {
                    foreach (LogicGate lg in logicgates)
                    {
                        Vector v1 = WorldToScreen(new Vector(lg.vWorldPos.x - lg.nWidth * 0.5f, lg.vWorldPos.y - lg.nHeight * 0.5f));
                        Vector v2 = WorldToScreen(new Vector(lg.vWorldPos.x + lg.nWidth * 0.5f, lg.vWorldPos.y + lg.nHeight * 0.5f));
                        if (!vMouse.OutsideBounds(v1.x, v1.y, v2.x, v2.y))
                        {
                            lgSelected           = lg;
                            lgSelected.bSelected = true;
                            break;
                        }
                    }
                }
                else
                {
                    bool none = true;
                    foreach (LogicGate lg in logicgates)
                    {
                        Vector v1 = WorldToScreen(new Vector(lg.vWorldPos.x - lg.nWidth * 0.5f, lg.vWorldPos.y - lg.nHeight * 0.5f));
                        Vector v2 = WorldToScreen(new Vector(lg.vWorldPos.x + lg.nWidth * 0.5f, lg.vWorldPos.y + lg.nHeight * 0.5f));
                        if (!vMouse.OutsideBounds(v1.x, v1.y, v2.x, v2.y))
                        {
                            if (lg.bSelected)
                            {
                                none = false;
                            }
                            else
                            {
                                lgSelected = lg;
                            }
                            break;
                        }
                    }
                    if (none)
                    {
                        nSelected = 0;
                        foreach (LogicGate lg in logicgates)
                        {
                            lg.bSelected = false;
                        }
                        if (lgSelected != null)
                        {
                            lgSelected.bSelected = true;
                        }
                    }
                }
                vStartPan = new Vector(vMouse.x, vMouse.y);
            }
            if (Input.KeyHeld(MouseButtons.Right))
            {
                if (nSelected == 0)
                {
                    if (lgSelected != null)
                    {
                        lgSelected.vWorldPos += (vMouse - vStartPan) / fScale;
                        vStartPan             = new Vector(vMouse.x, vMouse.y);
                    }
                    else
                    {
                        gCanvas.DrawLine(Pens.Green, vStartPan.x, vStartPan.y, vMouse.x, vStartPan.y);
                        gCanvas.DrawLine(Pens.Green, vStartPan.x, vStartPan.y, vStartPan.x, vMouse.y);
                        gCanvas.DrawLine(Pens.Green, vMouse.x, vStartPan.y, vMouse.x, vMouse.y);
                        gCanvas.DrawLine(Pens.Green, vStartPan.x, vMouse.y, vMouse.x, vMouse.y);
                    }
                }
                else
                {
                    foreach (LogicGate lg in logicgates)
                    {
                        if (lg.bSelected)
                        {
                            lg.vWorldPos += (vMouse - vStartPan) / fScale;
                        }
                    }
                    vStartPan = new Vector(vMouse.x, vMouse.y);
                }
            }
            if (Input.KeyReleased(MouseButtons.Right))
            {
                if (lgSelected != null)
                {
                    lgSelected.bSelected = false;
                    lgSelected           = null;
                }
                foreach (LogicGate lg in logicgates)
                {
                    Vector mouseworld    = ScreenToWorld(vMouse);
                    Vector startpanworld = ScreenToWorld(vStartPan);
                    if (!lg.vWorldPos.OutsideBounds(mouseworld.x, mouseworld.y, startpanworld.x, startpanworld.y))
                    {
                        lg.bSelected = true;
                        nSelected++;
                    }
                }
            }

            if (Input.KeyPressed(MouseButtons.Left))
            {
                foreach (LogicGate lg in logicgates)
                {
                    foreach (Connection c in lg.cConnections)
                    {
                        if ((c.vScreenPos - vMouse).Magnitude() < c.nSize * fScale * 0.5f)
                        {
                            lgSelected = lg;
                            cSelected  = c;
                            goto Next;
                        }
                    }
                }
                foreach (Wire w in wires)
                {
                    if (DistancePointToLine(vMouse, w) <= 10f * fScale * 0.5f)
                    {
                        lgSelected = w.lgDonor;
                        cSelected  = w.cDonor;
                        bDerived   = true;
                        wDerived   = w;
                        goto Next;
                    }
                }
Next:
                vStartPan = new Vector(vMouse.x, vMouse.y);
            }
            if (Input.KeyHeld(MouseButtons.Left))
            {
                if (cSelected != null)
                {
                    gCanvas.DrawLine(new Pen(cSelected.bState ? Color.Green : Color.Red, 10f * fScale),
                                     vStartPan.AsPoint(), vMouse.AsPoint());
                }
            }
            if (Input.KeyReleased(MouseButtons.Left))
            {
                if (cSelected != null)
                {
                    foreach (LogicGate lg in logicgates)
                    {
                        foreach (Connection c in lg.cConnections)
                        {
                            if ((c.vScreenPos - vMouse).Magnitude() < c.nSize * fScale * 0.5f &&
                                c.bAsInput != cSelected.bAsInput && lg != lgSelected && !c.bConnected && !cSelected.bConnected)
                            {
                                Wire w = new Wire(lgSelected, lg, cSelected, c);
                                c.bConnected         = true;
                                c.wLinkWire          = w;
                                cSelected.bConnected = true;
                                cSelected.wLinkWire  = w;
                                wires.Add(w);
                                goto Next;
                            }
                            if ((c.vScreenPos - vMouse).Magnitude() < c.nSize * fScale * 0.5f &&
                                c.bAsInput != cSelected.bAsInput && lg != lgSelected && bDerived)
                            {
                                Wire w = new Wire(lgSelected, lg, cSelected, c);
                                wDerived.derivedwires.Add(w);
                                w.bDerivedWire = true;
                                w.vDerivedPin  = PointOnLineClosest(vStartPan, wDerived);
                                w.wParentWire  = wDerived;
                                w.Calculate();
                                c.bConnected = true;
                                c.wLinkWire  = w;
                                wires.Add(w);
                                goto Next;
                            }
                            if ((c.vScreenPos - vMouse).Magnitude() < c.nSize * fScale * 0.5f &&
                                lg == lgSelected && lg.eGateType == GateType.IN)
                            {
                                lg.bState = !lg.bState;
                                goto Next;
                            }
                        }
                    }
                    for (int i = 0; i < wires.Count; i++)
                    {
                        if (wires[i] == cSelected.wLinkWire && !bDerived)
                        {
                            if (!wires[i].bDerivedWire)
                            {
                                wires[i].cDonor.wLinkWire     = null;
                                wires[i].cReceiver.wLinkWire  = null;
                                wires[i].cDonor.bConnected    = false;
                                wires[i].cReceiver.bConnected = false;
                                wires[i].cDonor.bState        = false;
                                wires[i].cReceiver.bState     = false;
                            }
                            else
                            {
                                wires[i].cReceiver.wLinkWire  = null;
                                wires[i].cReceiver.bConnected = false;
                                wires[i].cReceiver.bState     = false;
                            }
                            DeleteDerivedWires(wires[i]);
                            wires.RemoveAt(i);
                            goto Next;
                        }
                    }
Next:
                    bDerived   = false;
                    wDerived   = null;
                    lgSelected = null;
                    cSelected  = null;
                }
            }

            if (Input.KeyPressed(Keys.I))
            {
                Vector v = ScreenToWorld(vMouse);
                logicgates.Add(new IN(v.x, v.y));
            }
            if (Input.KeyPressed(Keys.O))
            {
                Vector v = ScreenToWorld(vMouse);
                logicgates.Add(new OUT(v.x, v.y));
            }
            if (Input.KeyPressed(Keys.D1))
            {
                Vector v = ScreenToWorld(vMouse);
                logicgates.Add(new NOT(v.x, v.y));
            }
            if (Input.KeyPressed(Keys.D2))
            {
                Vector v = ScreenToWorld(vMouse);
                logicgates.Add(new AND(v.x, v.y));
            }
            if (Input.KeyPressed(Keys.D3))
            {
                Vector v = ScreenToWorld(vMouse);
                logicgates.Add(new OR(v.x, v.y));
            }
            if (Input.KeyPressed(Keys.D4))
            {
                Vector v = ScreenToWorld(vMouse);
                logicgates.Add(new NAND(v.x, v.y));
            }
            if (Input.KeyPressed(Keys.D5))
            {
                Vector v = ScreenToWorld(vMouse);
                logicgates.Add(new NOR(v.x, v.y));
            }
            if (Input.KeyPressed(Keys.D6))
            {
                Vector v = ScreenToWorld(vMouse);
                logicgates.Add(new XOR(v.x, v.y));
            }
            if (Input.KeyPressed(Keys.D7))
            {
                Vector v = ScreenToWorld(vMouse);
                logicgates.Add(new XNOR(v.x, v.y));
            }
            if (Input.KeyPressed(Keys.Delete) && nSelected > 0)
            {
                while (nSelected > 0)
                {
                    for (int i = 0; i < logicgates.Count; i++)
                    {
                        if (logicgates[i].bSelected)
                        {
                            for (int j = 0; j < logicgates[i].cConnections.Length; j++)
                            {
                                Wire w = logicgates[i].cConnections[j].wLinkWire;
                                if (w != null)
                                {
                                    w.cDonor.wLinkWire     = null;
                                    w.cReceiver.wLinkWire  = null;
                                    w.cDonor.bConnected    = false;
                                    w.cReceiver.bConnected = false;
                                    w.cDonor.bState        = false;
                                    w.cReceiver.bState     = false;
                                }
                                wires.Remove(w);
                            }
                            logicgates.RemoveAt(i);
                            nSelected--;
                        }
                    }
                }
            }

            Vector coordonates = ScreenToWorld(vMouse);

            foreach (LogicGate lg in logicgates)
            {
                lg.Render(ref gCanvas, vOffSet, fScale);
            }
            foreach (Wire w in wires)
            {
                w.Render(ref gCanvas, fScale);
            }
            gCanvas.DrawString("Zoom Level: " + (int)(fScale * 100) + "%\n" +
                               "World coordonates: " + (int)coordonates.x + " " + -(int)coordonates.y,
                               new Font("Times New Roman", 15f), Brushes.Black, 0, 0);
            if (bHelpMenu)
            {
                gCanvas.DrawString(sHelpText, HelpFont, Brushes.Black, vHelpPos.AsPoint());
            }
            Canvas.Image = bCanvas;
            Input.UpdateKeys();
        }