Beispiel #1
0
    public void RemoveWire(string id)
    {
        Guid guid            = Guid.Parse(id);
        IntegratedCircuit ic = breadBoard.GetIntegratedCircuit(guid);

        breadBoard.UnlinkNodes(ic.GetPinNode(0), ic.GetPinNodeIndex(0), ic.GetPinNode(1), ic.GetPinNodeIndex(1));
        breadBoard.components.Remove(guid);
    }
Beispiel #2
0
    public void RemoveIntegratedCircuit(string id)
    {
        Guid guid            = Guid.Parse(id);
        IntegratedCircuit ic = breadBoard.GetIntegratedCircuit(guid);

        ic.Update(true);
        for (int i = 0; i < ic.Pins; i++)
        {
            breadBoard.RemoveNodeConnection(ic.GetPinNode(i), ic.GetPinNodeIndex(i));
        }
        breadBoard.components.Remove(guid);
    }
        public void GivenOneIC_WhenRemoveOnlyIC_ThenStoreShouldBeEmpty()
        {
            var ic = new IntegratedCircuit {
                Code = "1", Description = "Test1"
            };

            Session.Save(ic);
            Session.Flush();

            var result = Post("/api/deleteic/" + ic.Id, new { });

            result.StatusCode.ShouldBe(HttpStatusCode.OK);
            Session.Query <IntegratedCircuit>().ShouldBeEmpty();
        }
        // todo: find a way to wire this into the UI. this will make a comprehensive demo.
        public IHttpActionResult Post(PostModel model)
        {
            if (!_devAccessChecker.UserHasDevAccess())
                return NotFound();

            if (string.IsNullOrWhiteSpace(model.code) || string.IsNullOrWhiteSpace(model.description))
                return BadRequest("IC was not added: please send all fields.");

            var newIc = new IntegratedCircuit { Code = model.code, Description = model.description };
            _session.Save(newIc);

            var location = Url.Link("DefaultApi", new { controller = "ics", id = newIc.Id });
            return Created(location, newIc);
        }
Beispiel #5
0
    public GameObject GetIntegratedCircuitObj(IntegratedCircuit circuit)
    {
        GameObject obj = GetIntegratedCircuitObj(circuit.ModelName);

        circuit.AssignObjRef(obj);

        obj.name = circuit.SetBreadBoard(breadBoard).ToString();

        Text text = obj.GetComponentInChildren <Text>();

        if (text != null && circuit.OverwriteObjText)
        {
            text.text = circuit.GetType().Name.Split('_')[0];
        }

        return(obj);
    }
Beispiel #6
0
    private Vector2Int NodeValues(string nodeId)
    {
        Vector2Int result = new Vector2Int(0, 0);

        int           nodeListIndex = 0;
        List <string> nodeList      = new List <string>();

        nodeList.Add(nodeId);

        while (nodeListIndex < nodeList.Count)
        {
            Node node = nodes[nodeList[nodeListIndex]];
            nodeListIndex++;

            foreach (Connection connection in node.connections.Values)
            {
                if (!connection.ID.Equals(""))
                {
                    if (connection.IsNode)
                    {
                        if (!nodeList.Contains(connection.ID))
                        {
                            nodeList.Add(connection.ID);
                        }
                    }
                    else
                    {
                        IntegratedCircuit ic = components[Guid.Parse(connection.ID)];
                        int state            = ic.GetPinState(connection.Index);
                        if (state == -1)
                        {
                            result.y--;
                        }
                        else if (state == 1)
                        {
                            result.x++;
                        }
                    }
                }
            }
        }
        return(result);
    }
        // todo: find a way to wire this into the UI. this will make a comprehensive demo.
        public IHttpActionResult Post(PostModel model)
        {
            if (!_devAccessChecker.UserHasDevAccess())
            {
                return(NotFound());
            }

            if (string.IsNullOrWhiteSpace(model.code) || string.IsNullOrWhiteSpace(model.description))
            {
                return(BadRequest("IC was not added: please send all fields."));
            }

            var newIc = new IntegratedCircuit {
                Code = model.code, Description = model.description
            };

            _session.Save(newIc);

            var location = Url.Link("DefaultApi", new { controller = "ics", id = newIc.Id });

            return(Created(location, newIc));
        }
Beispiel #8
0
        public bool GetIntegratedCircuit(out RaycastHit hit, out IntegratedCircuit ic)
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            ic = null;

            int layer_mask = LayerMask.GetMask("Component");

            if (Physics.Raycast(ray, out hit, 500, layer_mask) && !EventSystem.current.IsPointerOverGameObject())
            {
                if (Guid.TryParse(hit.transform.parent.gameObject.name, out Guid guid))
                {
                    ic = breadBoard.components[guid];
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            return(false);
        }
Beispiel #9
0
 public bool NodeHasICType(string nodeId, ICType iCType)
 {
     if (nodes.ContainsKey(nodeId))
     {
         Node node = nodes[nodeId];
         foreach (Connection connection in node.connections.Values)
         {
             if (!connection.IsNode)
             {
                 Guid id = Guid.Parse(connection.ID);
                 if (!connection.IsNode && components.ContainsKey(id))
                 {
                     IntegratedCircuit c = components[id];
                     if (c.IcType == iCType)
                     {
                         return(true);
                     }
                 }
             }
         }
     }
     return(false);
 }
Beispiel #10
0
    public GameObject PlaceIntegratedCircuit(IntegratedCircuit ic, string nodeIdA, int indexA, string nodeIdB, int indexB, bool skipUpdate)
    {
        // Debug.Log("Placing: " + IcName);
        GameObject obj = Instantiate(GetIntegratedCircuitObj(ic), new Vector3(0, 0, 0), Quaternion.identity) as GameObject;

        obj.transform.parent = parent;

        ic.AssignObjRef(obj);

        obj.name = ic.SetBreadBoard(breadBoard).ToString();

        bool rotated = Helper.CircuitHelper.IsNodeRotated(nodeIdA);

        switch (ic.IcType)
        {
        case ICType.solo:
            breadBoard.SetNodeConnection(false, nodeIdA, indexA, 0, ic.GetId().ToString());
            ic.SetPinIndex(0, indexA);
            ic.SetPinNode(0, nodeIdA);
            break;

        case ICType.dual:

            breadBoard.SetNodeConnection(false, nodeIdA, indexA, 0, ic.GetId().ToString());
            ic.SetPinIndex(0, indexA);
            ic.SetPinNode(0, nodeIdA);

            breadBoard.SetNodeConnection(false, nodeIdB, indexB, 1, ic.GetId().ToString());
            ic.SetPinIndex(1, indexB);
            ic.SetPinNode(1, nodeIdB);

            break;

        case ICType.wire:
            ic.SetPinNode(0, nodeIdA);
            ic.SetPinIndex(0, indexA);
            ic.SetPinNode(1, nodeIdB);
            ic.SetPinIndex(1, indexB);
            break;

        case ICType.ic6:
        case ICType.ic4:

            string[] id = nodeIdA.Split('x');
            int      a  = int.Parse(id[0]);
            int      b  = int.Parse(id[1]);
            int      c  = int.Parse(id[2]);
            int      d  = int.Parse(id[3]);

            for (int i = 0; i < 2; i++)
            {
                for (int j = 0; j < ic.Pins / 2; j++)
                {
                    string nodeId;
                    if (rotated)
                    {
                        nodeId = $"{a + i}x{b + (i * 7)}x{c}x{d + j}x{id[4]}";
                    }
                    else
                    {
                        nodeId = $"{a + i}x{b}x{c + (i * 7)}x{d + j}x{id[4]}";
                    }
                    int index = i == 0 ? 4 : 0;

                    if (ic.IcType == ICType.ic6)
                    {
                        index = i == 0 ? indexA : indexA - 1;
                    }

                    int pinIndex = i == 0 ? j : (ic.Pins - 1) - j;

                    if (ic.WriteToNodes)
                    {
                        breadBoard.SetNodeConnection(false, nodeId, index, pinIndex, ic.GetId().ToString());
                    }
                    ic.SetPinIndex(pinIndex, index);
                    ic.SetPinNode(pinIndex, nodeId);
                }
            }

            break;

        default:
            return(null);
        }

        breadBoard.components.Add(ic.GetId(), ic);

        if (!skipUpdate)
        {
            ic.Update();
        }

        return(obj);
    }
Beispiel #11
0
    public GameObject PlaceIntegratedCircuit(string IcName, string nodeIdA, int indexA, string nodeIdB, int indexB, bool skipUpdate)
    {
        IntegratedCircuit ic = GetIntegratedCircuit(IcName);

        return(PlaceIntegratedCircuit(ic, nodeIdA, indexA, nodeIdB, indexB, skipUpdate));
    }
Beispiel #12
0
 public GameObject PlaceIntegratedCircuit(IntegratedCircuit ic, string nodeIdA, int indexA, bool skipUpdate)
 {
     return(PlaceIntegratedCircuit(ic, nodeIdA, indexA, "", 0, skipUpdate));
 }
Beispiel #13
0
    private void LoadComponents(ZipArchive archive)
    {
        int index = GetZipArchiveEntryIndex("components.json", archive);

        if (index == -1)
        {
            return;
        }

        ZipArchiveEntry entry = archive.Entries[index];

        using (StreamReader file = new StreamReader(entry.Open()))
        {
            JsonSerializer serializer = new JsonSerializer
            {
                TypeNameHandling       = TypeNameHandling.Auto,
                ObjectCreationHandling = ObjectCreationHandling.Replace,
                Converters             = { new BitArrayConverter(), new Vector3Converter(), new WireConverter() }
            };
            Dictionary <Guid, IntegratedCircuit> components = (Dictionary <Guid, IntegratedCircuit>)serializer.Deserialize(file, typeof(Dictionary <Guid, IntegratedCircuit>));

            foreach (Guid g in components.Keys)
            {
                IntegratedCircuit ic = components[g];
                GameObject        obj;

                switch (ic.IcType)
                {
                case ICType.solo:

                    obj = cp.PlaceIntegratedCircuit(ic, ic.GetPinNode(0), ic.GetPinNodeIndex(0), true);
                    obj.transform.position = CircuitHelper.GetPositionFromNode(ic.GetPinNode(0), ic.GetPinNodeIndex(0));

                    break;

                case ICType.dual:

                    obj = cp.PlaceIntegratedCircuit(ic, ic.GetPinNode(0), ic.GetPinNodeIndex(0), ic.GetPinNode(1), ic.GetPinNodeIndex(1), true);

                    Vector3 locationA = CircuitHelper.GetPositionFromNode(ic.GetPinNode(0), ic.GetPinNodeIndex(0));
                    Vector3 locationB = CircuitHelper.GetPositionFromNode(ic.GetPinNode(1), ic.GetPinNodeIndex(1));

                    obj.transform.position   = new Vector3((locationA.x + locationB.x) / 2, 0, (locationA.z + locationB.z) / 2);
                    obj.transform.localScale = new Vector3(Vector3.Distance(locationB, locationA) / 2, 1, 1);
                    float angle = CircuitHelper.AngleBetweenVector3(locationB, locationA);
                    angle = locationA.z > locationB.z ? -angle : angle;
                    obj.transform.rotation = Quaternion.Euler(0, angle, 0);

                    break;

                case ICType.ic4:
                    obj = cp.PlaceIntegratedCircuit(ic, ic.GetPinNode(0), ic.GetPinNodeIndex(0), true);
                    obj.transform.position = CircuitHelper.GetPositionFromNode(ic.GetPinNode(0), ic.GetPinNodeIndex(0));
                    break;

                case ICType.ic6:
                    obj = cp.PlaceIntegratedCircuit(ic, ic.GetPinNode(0), ic.GetPinNodeIndex(0), true);
                    obj.transform.position = CircuitHelper.GetPositionFromNode(ic.GetPinNode(0), ic.GetPinNodeIndex(0));
                    break;

                case ICType.wire:

                    obj = cp.PlaceIntegratedCircuit(ic, ic.GetPinNode(0), ic.GetPinNodeIndex(0), ic.GetPinNode(1), ic.GetPinNodeIndex(1), true);

                    Vector3[] vectors = ((Wire)ic).points;

                    LineRenderer lineRenderer = obj.GetComponentInChildren <LineRenderer>();
                    lineRenderer.positionCount = vectors.Length;
                    lineRenderer.SetPositions(vectors);

                    CircuitHelper.CreateColliderChain(obj, vectors);

                    break;

                default:
                    break;
                }

                ic.CustomMethod();
            }
        }
    }
Beispiel #14
0
 public AndGate(string name, IntegratedCircuit circuit, bool inverted = false, NodeType type = NodeType.internalNode, params LogicNode[] inputs)
     : base(name, circuit, inverted, type, inputs)
 {
 }
Beispiel #15
0
    public void RemoveBreadBoard(GameObject boardObj)
    {
        HashSet <string> nodesToDelete      = new HashSet <string>();
        HashSet <Guid>   componentsToDelete = new HashSet <Guid>();
        HashSet <Guid>   wiresToDelete      = new HashSet <Guid>();

        for (int i = 0; i < boardObj.transform.childCount; i++)
        {
            string id = boardObj.transform.GetChild(i).name;
            if (id == "none")
            {
                continue;
            }

            foreach (string s in breadBoard.nodes.Keys.Where(x => x.StartsWith(id)))
            {
                nodesToDelete.Add(s);
                foreach (Connection c in breadBoard.nodes[s].connections.Values)
                {
                    if (!c.IsNode)
                    {
                        componentsToDelete.Add(Guid.Parse(c.ID));
                    }
                }
            }

            foreach (Guid g in breadBoard.components.Keys)
            {
                IntegratedCircuit ic = breadBoard.components[g];
                if (ic.IcType == ICType.wire)
                {
                    if (ic.GetPinNode(0).StartsWith(id) || ic.GetPinNode(1).StartsWith(id))
                    {
                        wiresToDelete.Add(g);
                    }
                }
                else if (!ic.WriteToNodes)
                {
                    if (ic.GetPinNode(0).StartsWith(id))
                    {
                        componentsToDelete.Add(g);
                    }
                }
            }
        }

        for (int i = breadBoardData.Count - 1; i >= 0; i--)
        {
            if (boardObj.transform.name == breadBoardData[i].ToString())
            {
                breadBoardData.RemoveAt(i);
            }
        }

        foreach (Guid g in componentsToDelete)
        {
            Destroy(breadBoard.components[g].GetObjRef());
            circuitPool.RemoveIntegratedCircuit(g.ToString());
        }
        foreach (Guid g in wiresToDelete)
        {
            Destroy(breadBoard.components[g].GetObjRef());
            circuitPool.RemoveWire(g.ToString());
        }
        foreach (string s in nodesToDelete)
        {
            breadBoard.nodes.Remove(s);
        }
        Destroy(boardObj.transform.gameObject);
    }