43 lines
2.1 KiB
Python
43 lines
2.1 KiB
Python
import copy
|
|
from helix.calculators.subarray_graph import SubarrayGraph, Direction
|
|
from helix.calculators.subarray_helper import extract_subarray
|
|
from helix.constants.panel_type import PanelType
|
|
|
|
|
|
class GraphRepository(object):
|
|
def __init__(self, panels, subarrays, system_type):
|
|
self.graphs = {}
|
|
for subarray in subarrays:
|
|
subarray_panels = extract_subarray(panels, subarray.subarray_number)
|
|
self.graphs[subarray.subarray_number] = SubarrayGraph(panels=subarray_panels, system_type=system_type)
|
|
|
|
def walk_callback(_, next_direction, direction_to_get_here):
|
|
if next_direction == Direction.North:
|
|
self.rows_perimeter += 1
|
|
elif next_direction == Direction.East:
|
|
self.columns_perimeter += 1
|
|
|
|
for subarray in subarrays:
|
|
graph = self.graphs[subarray.subarray_number]
|
|
|
|
subarray_panels = extract_subarray(panels, subarray.subarray_number)
|
|
rows_fallback = sum(1 for panel in subarray_panels if panel.panel_type == PanelType.Corner or panel.panel_type == PanelType.EastWest) / 2
|
|
columns_fallback = sum(1 for panel in subarray_panels if panel.panel_type == PanelType.Corner or panel.panel_type == PanelType.NorthSouth) / 2
|
|
|
|
if len(graph.nodes) == 0:
|
|
subarray.row_count = rows_fallback
|
|
subarray.column_count = columns_fallback
|
|
subarray.row_counted_geometrically = False
|
|
subarray.column_counted_geometrically = False
|
|
continue
|
|
self.rows_perimeter = 1
|
|
self.columns_perimeter = 1
|
|
graph.walk_graph_perimeter(graph.lower_left_node(graph.nodes), walk_callback, repeat_steps=False)
|
|
subarray.row_count = max(self.rows_perimeter, rows_fallback)
|
|
subarray.row_counted_geometrically = self.rows_perimeter >= rows_fallback
|
|
subarray.column_count = max(self.columns_perimeter, columns_fallback)
|
|
subarray.column_counted_geometrically = self.columns_perimeter >= columns_fallback
|
|
|
|
def subarray_graph(self, subarray_number):
|
|
return copy.deepcopy(self.graphs[subarray_number])
|