# -*- coding: utf-8 -*- """ Created on Thursday May 30 2024 @author: Edward Middleton-Smith """ # import argument_validation as av # from translate_msg_2_braille import product, gen_braille_inputs_4_openscad # from translate_braille_2_scad import scrabble_dimensions, export_colour_theme, input_colour_themes, gen_openscad_braille, gen_path_braille_scrabble, input_product_size # from character_braille import Size_Character_Braille, Style_Character_Braille, Colour_Theme_Character_Braille from keyboard_3d import Size_Character_Braille, Style_Character_Braille, Colour_Theme_Character_Braille, Enum_Justification_Text, Keyboard_3D # import model_gen.utils_system from translation_braille import Translation_Braille import openpyscad as ops #, Assembly, Union from typing import Optional, List from pydantic import BaseModel, Field from itertools import product class Array_Keyboard_3D(BaseModel): sizes_characters: List[Size_Character_Braille] styles_characters: List[Style_Character_Braille] colour_themes: List[Colour_Theme_Character_Braille] justifications_text: List[Enum_Justification_Text] path_dir: str max_characters_per_rows: List[int] translations: List[Translation_Braille] fn: int = Field(ge=0) keyboards: List[Keyboard_3D] = [] has_files_openscad: bool = False has_files_stl: bool = False has_files_png: bool = False def __init__(self, **data): super().__init__(**data) if len(self.sizes_characters) == 0: self.sizes_characters = Size_Character_Braille.get_defaults() if len(self.styles_characters) == 0: self.styles_characters = [Style_Character_Braille.get_default()] if len(self.colour_themes) == 0: self.colour_themes = Colour_Theme_Character_Braille.get_defaults() if len(self.justifications_text) == 0: self.justifications_text = [Enum_Justification_Text.get_default()] self.make_combinations() self.has_files_openscad = False self.has_files_stl = False self.has_files_png = False def make_combinations(self): configuration_keyboards = product(self.sizes_characters, self.styles_characters, self.colour_themes, self.justifications_text, self.max_characters_per_rows, self.translations) self.keyboards = [] for configuration_keyboard in configuration_keyboards: # self.keyboards.append(Keyboard_3D(*configuration_keyboard)) # Keyboard_3D(size_characters=size_default, style_characters=style_default, # colour_theme=colour_default, justification_text=justification_default, path_dir=path_dir, max_characters_per_row=10, translation=translation_extended_alphabet, fn=25) self.keyboards.append( Keyboard_3D(size_characters=configuration_keyboard[0], style_characters=configuration_keyboard[1], colour_theme=configuration_keyboard[2], justification_text=configuration_keyboard[3], path_dir=self.path_dir, max_characters_per_row=configuration_keyboard[4], translation=configuration_keyboard[5], fn=self.fn)) def update_configurations_styles(self, sizes_characters, style_characters, colour_themes, justifications_text): self.sizes_characters = sizes_characters self.styles_characters = style_characters self.colour_themes = colour_themes self.justifications_text = justifications_text self.make_combinations() def make_combined_assembly(self, dx, dy, max_keyboards_per_row): count_keyboards_in_row = 0 count_rows = 0 assembly = ops.Assembly() for keyboard in self.keyboards: assembly.add(keyboard.make_model_openpyscad().translate([dx * count_keyboards_in_row, dy * count_rows, 0])) count_keyboards_in_row += 1 if count_keyboards_in_row >= max_keyboards_per_row: count_keyboards_in_row = 0 count_rows += 1 return assembly def make_files_openscad(self): for keyboard in self.keyboards: keyboard.make_file_openscad() self.has_files_openscad = True def make_files_stl(self): for keyboard in self.keyboards: keyboard.make_file_stl() self.has_files_stl = True def make_files_png(self): for keyboard in self.keyboards: keyboard.make_file_png() self.has_files_png = True def make_files(self): for keyboard in self.keyboards: keyboard.make_file_openscad() keyboard.make_file_stl() keyboard.make_file_png()