/// <summary>
        /// Connects this terminal to another terminal via a wire.
        /// </summary>
        /// <param name="wire">The wire to connect the terminals with.</param>
        /// <param name="otherTerminal">The terminal to wire to.</param>
        public override void ConnectWire(WireModel wire, TerminalModel otherTerminal)
        {
            if (ConnectedWires.Contains(wire))
            {
                throw new ModelValidationException(this, "Remove this wire from a terminal before connecting it again");
            }

            if (otherTerminal is InputTerminalModel)
            {
                throw new ModelValidationException(this, "Connect this terminal to an output instead of an input");
            }

            wire.SinkTerminal   = this;
            wire.SourceTerminal = otherTerminal;
            otherTerminal.ConnectedWires.Add(wire);
            ConnectedWires.Add(wire);
            wire.PropagateData();
        }
Exemple #2
0
        public override void OnMove(int dx, int dy)
        {
            //check for merge
            var   a = new Vector2(Graphics.Position.X + dx, Graphics.Position.Y + dy);
            Joint j;

            if ((j = MicroWorld.Logics.GameInputHandler.HasJointAtCoord((int)a.X, (int)a.Y)) != null && ContainingComponents.Count == 0 && j.ContainingComponents.Count == 0)
            {
                for (int i = 0; i < ConnectedWires.Count; i++)
                {
                    if (ConnectedWires[i].J1.ID == ID)
                    {
                        ConnectedWires[i].J1 = j;
                    }
                    else
                    {
                        ConnectedWires[i].J2 = j;
                    }
                    //if (ConnectedWires[i].Graphics.Visible)
                    //{
                    ConnectedWires[i].RemoveComponentFromVisibilityMap();
                    if (ConnectedWires[i].J1.ID == ConnectedWires[i].J2.ID)
                    {
                        ConnectedWires[i].Remove();
                        ConnectedWires.RemoveAt(i);
                        i--;
                        continue;
                    }
                    ConnectedWires[i].Initialize();
                    if ((ConnectedWires[i].Graphics as Graphics.WireGraphics).DrawPath.Count == 0)
                    {
                        ConnectedWires[i].Remove();
                        ConnectedWires.RemoveAt(i);
                        i--;
                        continue;
                    }
                    ConnectedWires[i].SetComponentOnVisibilityMap();
                    //}
                    j.ConnectedWires.Add(ConnectedWires[i]);
                    ConnectedWires.RemoveAt(0);
                    i--;
                }
                Remove();
                return;
            }

            base.OnMove(dx, dy);
            for (int i = 0; i < ConnectedWires.Count; i++)
            {
                if (ConnectedWires[i].Graphics.Visible)
                {
                    ConnectedWires[i].RemoveComponentFromVisibilityMap();
                    if (ConnectedWires[i].J1.Graphics.Position == ConnectedWires[i].J2.Graphics.Position)
                    {
                        ConnectedWires[i].Remove();
                        ConnectedWires.RemoveAt(i);
                        i--;
                        continue;
                    }
                    ConnectedWires[i].Graphics.Initialize();
                    if ((ConnectedWires[i].Graphics as Graphics.WireGraphics).DrawPath.Count == 0)
                    {
                        int t = ConnectedWires.Count;
                        ConnectedWires[i].Remove();
                        if (t == ConnectedWires.Count)
                        {
                            ConnectedWires.RemoveAt(i);
                        }
                        i--;
                        continue;
                    }
                    ConnectedWires[i].SetComponentOnVisibilityMap();
                }
            }
        }