Example #1
0
    public static bool CheckEdgeAndNodesCongruence(ElectricNetworkEdge edge, ElectricNetworkNode node1, ElectricNetworkNode node2)
    {
        bool nodesAreConnectedProperly = CheckNodesConnection(node1, node2);
        bool nodesHaveOneCommonEdge    = CheckCommonEdge(node1, node2);

        return(nodesAreConnectedProperly && nodesHaveOneCommonEdge);
    }
Example #2
0
    // Unlike the other Connect method, this one is used to create a preview edge. This preview edge is shown, when
    // hovering a building, so the according cables are displayed. The preview edge is only added to the previewNetwork.
    public static void ConnectPreview(ElectricNetworkNode node1, ElectricNetworkNode node2, ElectricNetwork previewNetwork)
    {
        // Create preview edge between node1 and node2
        ElectricNetworkEdge previewEdge = new ElectricNetworkEdge(node1, node2);

        previewEdge.type = ElectricNetworkEdge.Type.Preview;

        // Register edge in previewNetwork and vice versa
        Register(previewNetwork, previewEdge);
    }
Example #3
0
    public static void Unregister(ElectricNetwork network, ElectricNetworkEdge edge)
    {
        if (!network.edges.Contains(edge))
        {
            Debug.LogError($"ERROR UNLINKING: Network \"{network}\" does not contain Edge \"{edge}\". ");
        }
        network.edges.Remove(edge);

        if (edge.connectedNetwork != network)
        {
            Debug.LogError($"ERROR UNLINKING: Edge \"{edge}\" was not connected to Network \"{network}\" in the first place. ");
        }
        edge.connectedNetwork = null;
    }
Example #4
0
    public static void Register(ElectricNetwork network, ElectricNetworkEdge edge)
    {
        if (network.edges.Contains(edge))
        {
            Debug.LogError($"ERROR REGISTERING: Network \"{network}\" already contains Edge \"{edge}\". ");
        }
        network.edges.Add(edge);

        if (edge.connectedNetwork == network)
        {
            Debug.LogError($"ERROR REGISTERING: Edge \"{edge}\" is already linked to Network \"{network}\". ");
        }
        edge.connectedNetwork = network;
    }
        /*
         * There are actually two lists with traveresed nodes in this NetworkResolver:
         * 1) traversedNodes represents all nodes that have been passed through the traversal
         * 2) nodesInThisNetwork represents a subset of all traversed nodes, namely only those that are connected with each other (--> network)
         */
        private ElectricNetworkSeed TraverseNodesInQueueAndResolveAsNetwork(Queue <ElectricNetworkNode> nodeQueue)
        {
            List <ElectricNetworkNode> nodesInThisNetwork  = new List <ElectricNetworkNode>();
            List <ElectricNetworkEdge> edgesInThisNetwork  = new List <ElectricNetworkEdge>();
            ElectricNetworkSeed        resolvedNetworkSeed = new ElectricNetworkSeed();

            while (nodeQueue.Count > 0)
            {
                ElectricNetworkNode nodeOnTop = nodeQueue.Peek();

                // Add each connected node to the network (plus the corresponding edge)
                foreach (ElectricNetworkNode connectedNode in nodeOnTop.connectedNodes)
                {
                    // If the resolver already visited this node, continue
                    if (traversedNodes.Contains(connectedNode))
                    {
                        continue;
                    }

                    // Add connected Node to queue
                    nodeQueue.Enqueue(connectedNode);

                    // Add node to traversed nodes (as soon as they are in queue, they count as traversed/visited)
                    traversedNodes.Add(connectedNode);

                    // Get edge between two nodes
                    ElectricNetworkEdge commonEdge = ElectricNetworkUtil.GetCommonEdge(nodeOnTop, connectedNode);
                    if (commonEdge == null)
                    {
                        Debug.LogError($"ERROR RESOLVING NETWORKS: " +
                                       $"There is no common edge between Node 1 {nodeOnTop} and Node 2 {connectedNode}. ");
                    }
                    edgesInThisNetwork.Add(commonEdge);
                }

                // Add traversed node to all 1) visited nodes and 2) nodes for network
                traversedNodes.Add(nodeOnTop);
                nodesInThisNetwork.Add(nodeOnTop);

                // Remove top node from queue
                nodeQueue.Dequeue();
            }

            // Return resolved network
            resolvedNetworkSeed.nodes = nodesInThisNetwork;
            resolvedNetworkSeed.edges = edgesInThisNetwork;
            return(resolvedNetworkSeed);
        }
Example #6
0
    // Effectively destroys the edge
    public static void Disconnect(ElectricNetworkEdge edge)
    {
        // Disconnect nodes from each other
        ElectricNetworkNode node1 = edge.nodes.Item1;
        ElectricNetworkNode node2 = edge.nodes.Item2;

        node1.connectedNodes.Remove(node2);
        node2.connectedNodes.Remove(node1);

        // "Destroy" edge between nodes
        edge.nodes.Item1.connectedEdges.Remove(edge);
        edge.nodes.Item2.connectedEdges.Remove(edge);

        // Unregister edge from network
        Unregister(edge.connectedNetwork, edge);
    }
Example #7
0
    //TODO: Iterate over electric network and create cable objects for each edge


    public static void Connect(ElectricNetworkNode node1, ElectricNetworkNode node2)
    {
        // Connect nodes with each other
        node1.connectedNodes.Add(node2);
        node2.connectedNodes.Add(node1);

        // Create edge between node1 and node2
        ElectricNetworkEdge edge = new ElectricNetworkEdge(node1, node2);

        // Add edge to nodes
        node1.connectedEdges.Add(edge);
        node2.connectedEdges.Add(edge);

        // Check if both nodes have the same network
        if (node1.connectedNetwork != node2.connectedNetwork)
        {
            Debug.LogError($"ERROR CONNECTING: Node 1 and Node 2 have a different network. " +
                           $"Node 1: {node1} - {node1.connectedNetwork}; Node 2: {node2} - {node2.connectedNetwork}. ");
        }

        // Register edge in network and vice versa
        Register(node1.connectedNetwork, edge);
    }
Example #8
0
    //TODO: Optimize by only updating position of cables in CableDrawer, when edge.type == ElectricNetworkEdge.Type.Preview is.
    // But not necessary at this point (and it could lead to some inconsistencies when moving things around in the editor).

    private void Awake()
    {
        edge   = new ElectricNetworkEdge(null, null);
        cableA = Instantiate(cablePrefab, gameObject.transform);
        cableB = Instantiate(cablePrefab, gameObject.transform);
    }