59 lines
2.1 KiB
Python
59 lines
2.1 KiB
Python
from numpy import array, ceil
|
|
|
|
from helix.calculators.bom_helper import add_parts_to_list, apply_package_size_rounding
|
|
from helix.calculators.ebom_calculator import EbomCalculator
|
|
from helix.calculators.mechanical_bom_calculator import MechanicalBomCalculator
|
|
from helix.constants.parts import *
|
|
|
|
|
|
class BomCalculator(object):
|
|
def __init__(self, values, panels, subarrays, graph_repository):
|
|
self.values = values
|
|
self.panels = panels
|
|
self.subarrays = subarrays
|
|
self.graph_repository = graph_repository
|
|
|
|
def compute_bom(self):
|
|
output_array = []
|
|
for part, quantity in self.parts_list().items():
|
|
if ceil(quantity) <= 0:
|
|
continue
|
|
row = list(part)
|
|
row.append(int(ceil(quantity)))
|
|
output_array.append(row)
|
|
|
|
output_array.sort(key=lambda x: x[0] + x[1])
|
|
return array(output_array)
|
|
|
|
def documentation_bom(self):
|
|
parts_list = self.parts_list()
|
|
|
|
for part in all_parts:
|
|
if part not in parts_list.keys():
|
|
parts_list[part] = 0
|
|
|
|
output_array = []
|
|
for part, quantity in parts_list.items():
|
|
if part == ballast:
|
|
row = 'ballast'
|
|
elif part == anchor:
|
|
row = 'anchors'
|
|
elif part == module:
|
|
row = 'modules'
|
|
else:
|
|
row = part[0]
|
|
quantity = max(0, quantity)
|
|
output_array.append((row, int(ceil(quantity))))
|
|
return output_array
|
|
|
|
def parts_list(self):
|
|
row_count = sum(subarray.row_count for subarray in self.subarrays)
|
|
column_count = sum(subarray.column_count for subarray in self.subarrays)
|
|
parts_list = MechanicalBomCalculator(self.values, self.panels, self.subarrays).mechanical_bom()
|
|
ebom_parts_list = EbomCalculator(self.values, ceil(row_count), ceil(column_count), parts_list.get(module)).compute_ebom()
|
|
|
|
add_parts_to_list(parts_list, ebom_parts_list)
|
|
|
|
apply_package_size_rounding(parts_list, package_sizes)
|
|
return parts_list
|