69 lines
2.3 KiB
Python
69 lines
2.3 KiB
Python
from helix.models.dxf.graph_direction import GraphDirection
|
|
|
|
|
|
class GraphNode(object):
|
|
def __init__(self, panel, x_spacing, y_spacing):
|
|
self.neighbors = {}
|
|
self.neighbors = {
|
|
GraphDirection.North: None,
|
|
GraphDirection.NorthEast: None,
|
|
GraphDirection.East: None,
|
|
GraphDirection.SouthEast: None,
|
|
GraphDirection.South: None,
|
|
GraphDirection.SouthWest: None,
|
|
GraphDirection.West: None,
|
|
GraphDirection.NorthWest: None
|
|
}
|
|
self.panel = panel
|
|
self.x_spacing = x_spacing
|
|
self.y_spacing = y_spacing
|
|
|
|
@property
|
|
def coordinate(self):
|
|
return self.panel.coordinate
|
|
|
|
def has_existing_neighbor(self, direction):
|
|
return self.neighbors.get(direction) is not None
|
|
|
|
def add_neighbor(self, other_node, direction):
|
|
if other_node is not None:
|
|
if direction:
|
|
self.neighbors[direction] = other_node
|
|
opposite_direction = direction.opposite_direction()
|
|
other_node.neighbors[opposite_direction] = self
|
|
|
|
def neighboring_nodes(self):
|
|
return [neighbor for neighbor in self.neighbors.values() if neighbor is not None]
|
|
|
|
def ordinal_neighbors(self):
|
|
neighbors = {}
|
|
for direction in GraphDirection.ordinal_directions():
|
|
if self.neighbors.get(direction):
|
|
neighbors[direction] = self.neighbors[direction]
|
|
return neighbors
|
|
|
|
def __hash__(self):
|
|
return self.panel.coordinate.__hash__()
|
|
|
|
def __repr__(self):
|
|
neighbors = {}
|
|
for key, value in self.neighbors.items():
|
|
if value is not None:
|
|
neighbors[key] = value.panel
|
|
return str(self.panel) + " - " + str(neighbors)
|
|
|
|
def __eq__(self, other):
|
|
if self is other:
|
|
return True
|
|
if not self.panel == other.panel and self.x_spacing != other.x_spacing and self.y_spacing != other.y_spacing:
|
|
return False
|
|
for key, value in self.neighbors.items():
|
|
other_neighbor = other.neighbors[key]
|
|
if value is None and other_neighbor is None:
|
|
continue
|
|
elif value is None or other_neighbor is None:
|
|
return False
|
|
elif value.panel != other_neighbor.panel:
|
|
return False
|
|
return True
|