48 lines
2.4 KiB
Python
48 lines
2.4 KiB
Python
from helix.constants.subarray import SUBARRAY_SIZE_BIG
|
|
from helix.constants.system_type import SystemType
|
|
from helix.models.dxf.dxf_error import DXFError
|
|
from helix.models.dxf.graph_direction import GraphDirection
|
|
|
|
|
|
class SubarrayValidator(object):
|
|
"""
|
|
Tests to make sure that Single Tilt systems have East or West neighbors
|
|
(as a panel without an East/West neighbor is
|
|
invalid, and that Dual Tilt systems have North or South neighbors.
|
|
Also checks to make sure that all "sides" of the
|
|
subarray are less than 150' long (due to government safety requirements).
|
|
"""
|
|
|
|
@staticmethod
|
|
def validate_subarray(node_graph, subarray_number, system_type):
|
|
subarray_node_graph = [node for node in node_graph if node.panel.subarray == subarray_number]
|
|
furthest_west = subarray_node_graph[0].panel.coordinate.unrotate()
|
|
furthest_east = subarray_node_graph[0].panel.coordinate.unrotate()
|
|
furthest_north = subarray_node_graph[0].panel.coordinate.unrotate()
|
|
furthest_south = subarray_node_graph[0].panel.coordinate.unrotate()
|
|
|
|
for node in subarray_node_graph:
|
|
if system_type == SystemType.singleTilt:
|
|
if not (node.has_existing_neighbor(GraphDirection.East) or node.has_existing_neighbor(GraphDirection.West)):
|
|
raise DXFError("Error - Unsupported panel configuration in subarray %d." % subarray_number)
|
|
if not (node.has_existing_neighbor(GraphDirection.North) or node.has_existing_neighbor(GraphDirection.South)):
|
|
raise DXFError("Error - Unsupported panel configuration in subarray %d." % subarray_number)
|
|
rotated_coordinate = node.panel.coordinate.unrotate()
|
|
if rotated_coordinate.x < furthest_west.x:
|
|
furthest_west = rotated_coordinate
|
|
elif rotated_coordinate.x > furthest_east.x:
|
|
furthest_east = rotated_coordinate
|
|
if rotated_coordinate.y < furthest_south.y:
|
|
furthest_south = rotated_coordinate
|
|
elif rotated_coordinate.y > furthest_north.y:
|
|
furthest_north = rotated_coordinate
|
|
|
|
# detect subarray size
|
|
horizontal_distance = furthest_east.x - furthest_west.x
|
|
if horizontal_distance > (150 * 12):
|
|
raise DXFError(SUBARRAY_SIZE_BIG)
|
|
|
|
vertical_distance = furthest_north.y - furthest_south.y
|
|
if vertical_distance > (150 * 12):
|
|
raise DXFError(SUBARRAY_SIZE_BIG)
|