public static bool CheckEdgeAndNodesCongruence(ElectricNetworkEdge edge, ElectricNetworkNode node1, ElectricNetworkNode node2) { bool nodesAreConnectedProperly = CheckNodesConnection(node1, node2); bool nodesHaveOneCommonEdge = CheckCommonEdge(node1, node2); return(nodesAreConnectedProperly && nodesHaveOneCommonEdge); }
// 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); }
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; }
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); }
// 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); }
//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); }
//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); }