# Cellario modules from HRB.Cellario.Scripting import * from HRB.Cellario.Scripting.API import * import json from os import path, listdir from dataclasses import dataclass def Execute(api: PythonScriptingApi): available_barcodes = "C:/temp/availabletubes.txt" letter_dir = "C:/temp/letters" input = "EH" available_tubes = read_available(available_barcodes) letters = [] for letter in input: x = get_tubes_for_letter(letter, len(letters) + 1, available_tubes, letter_dir) available_tubes = available_tubes[len(x):] letters += x output = letter_tubes_to_obj(letters) api.Messaging.WriteDiagnostic(ScriptLogLevel.Normal, json.dumps(output)) list(api.CurrentRun.RunOrderParameters)[ 0].ParameterValue = json.dumps(output) @dataclass(frozen=True) class Tube: barcode: str row: int col: int @dataclass(frozen=True) class LetterTube: barcode: str index: int group: int def letter_tubes_to_obj(x): output = {} output["Items"] = [{"BarcodeValue": y.barcode} for y in x] output["TargetPositions"] = [{"PositionIndex": y.index, "GroupIndex": y.group} for y in x] return output def get_tubes_for_letter(letter: str, letter_index: int, available_tubes, letter_dir: str): positions = get_letter_positions(letter, letter_dir) if len(positions) > len(available_tubes): raise Exception("Insufficient tubes to fill order") pixels = [] for i, position in enumerate(positions): pixel = LetterTube(available_tubes[i], position, letter_index) pixels.append(pixel) return pixels def read_available(p: str): with open(p, 'r') as file: return [x.strip() for x in file.readlines()] def validate_word(input: str, letter_dir: str) -> bool: letters_available = [x[0] for x in listdir(letter_dir)] has_required_letters = all([x in letters_available for x in input]) return has_required_letters def get_letter_positions(letter: str, letter_dir: str): filename = [f for f in listdir(letter_dir) if f[0] == letter][0] with open(path.join(letter_dir, filename), 'r') as file: return [int(x.strip()) for x in file.readlines()]