import os import json from configparser import ConfigParser """ Diese Lib verwaltet alle Config dateien (als .cfg oder als .json) von CreoMigrate """ class JsonBasedConfig: """Klasse mit generellen Methoden für alle Config Objekte mit json files""" def __init__(self, config_dir, config_file): """merke dir den Pfad zu den Configdateien""" self.config_path = os.path.join(config_dir, config_file) def load_json_from_file(self): """lade das json file vom gegeben Pfad in ein json Objekt""" with open(self.config_path, 'r', encoding='utf-8') as fh: return json.loads(fh.read()) def from_json(self, json_str): """nimm den Json String zur Initialisierung des Objektes""" return json.loads(json_str) class TOSGroupsConfig(JsonBasedConfig): """Auslesen der Config Angaben zu den TOS Gruppen""" def __init__(self, config_dir='.', config_file='TOS-Gruppen.json'): self.tos_hierarchy = None super().__init__(config_dir, config_file) def get_children_keys(self, tos_hierarchy, currentId, result): # wenn eine Referenz nicht weiter in der TOS Hierarchy vorkommt, dann nicht mit einsammeln if currentId not in tos_hierarchy: return None childIds = tos_hierarchy[currentId]["reference-ids"].values() level = tos_hierarchy[currentId]["TOS-level"] if len(childIds) > 0: for cId in childIds: # prüfen, ob die Referenz sonst noch verwendet wird if cId in tos_hierarchy: result[cId] = level for cId in childIds: self.get_children_keys(tos_hierarchy, cId, result) def get_all_keywords(self): """hole alle TOS Keywords, welche in der config Datei definiert sind""" # lazy. nur einmal laden, wenn noch nicht geschehen if not self.tos_hierarchy: self.tos_hierarchy = super().load_json_from_file() # beginne mit root als ersten, vordefiniertem Keyword rootid = self.tos_hierarchy["root"] # und von dort aus folge dann allen Referenzen result = dict() # root als Nullte Ebene dazu result[rootid] = 0 self.get_children_keys(self.tos_hierarchy, rootid, result) return result def get_keywords_of_level(self, allKeywords, levelnum): """hole alle TOS Keywords der gegebenen Hierarchiestufe "levelnum" """ ret = list() for kw in allKeywords: if allKeywords[kw] == levelnum: ret.append(kw) return ret def from_json(self, json_str): """lade den Json String zur Initialisierung des Objektes""" self.tos_hierarchy = super().from_json(json_str) class MaterialTransConfig(JsonBasedConfig): """Auslesen der Config zu allen Materialangaben""" def __init__(self, config_dir='.', config_file='Materialübersetzung.json'): self.materials = None super().__init__(config_dir, config_file) def from_json(self, json_str): """lade den Json String zur Initialisierung des Objektes""" self.materials = super().from_json(json_str) def get_all_materials(self): """hole alle Materialien, welche in der config Datei definiert sind""" if not self.materials: self.materials = super().load_json_from_file() ret = list() for k in self.materials.keys(): ret.append(k) return ret def get_material_of_type(self, mat): """hole alle Materialien, welche in der config Datei definiert sind""" if not self.materials: self.load_materials() return self.materials[mat] class IniBasedConfig: """Klasse mit generellen Methoden für alle Config Objekte mit .cfg/.ini files""" def __init__(self, config_dir, config_file): """merke dir den Pfad zu den Configdateien""" self.config_path = os.path.join(config_dir, config_file) self.isInitalized = False self.config = ConfigParser(allow_no_value=True) self.config.optionxform = lambda option: option # preserve case for letters def from_cfg_str(self, cfg_str): """nimm den config String zur Initialisierung des Objektes""" self.config.read_string(cfg_str) self.isInitalized = True def load_cfg_from_file(self): """lade das config file vom gegeben Pfad""" self.config.read(self.config_path) self.isInitalized = True def get_section_options(self, section_name): if not self.isInitalized: self.load_cfg_from_file() return self.config.options(section_name) def sections(self): if not self.isInitalized: self.load_cfg_from_file() return self.config.sections() def get_int(self, section_name, option): if not self.isInitalized: self.load_cfg_from_file() return self.config.getint(section_name, option) def get_dict(self, section_name): if not self.isInitalized: self.load_cfg_from_file() return dict(self.config.items(section_name)) class AllgmeinConfig(IniBasedConfig): """Auslesen der Config für alle allgemeinen Angaben""" def __init__(self, config_dir='.', config_file='Allgmein.cfg'): super().__init__(config_dir, config_file) def get_sections(self): """ gibt alle Sektionen zurück wie Kategorien, Dispogruppe, Dispolaufgruppe, EinheitAusw, ... """ return super().sections() def get_options(self, section_name): """ get all options below""" return super().get_section_options(section_name) class BezeichnerConfig(IniBasedConfig): """Auslesen der Config zu allen möglichen Bezeichner""" def __init__(self, config_dir='.', config_file='Bezeichner.cfg'): super().__init__(config_dir, config_file) def get(self): """hole alle möglichen Bezeichner """ return super().get_section_options("Bezeichner") class FarbenConfig(IniBasedConfig): """Auslesen der Config zu allen Farbensarten""" def __init__(self, config_dir='.', config_file='Farbensarten.cfg'): super().__init__(config_dir, config_file) def get_farbauswahl(self): """hole alle Farben die möglich sind -> [RAL 1004 Goldgelb, RAL 2000 Gelborange, RAL 3002 Kaminrot, RAL 5010 Enzianblau] """ return super().get_section_options("Farbauswahl") def get_farben_eloxieren(self): """hole alle Farben fürs eloxieren -> [Rot, Grün, Blau, Gelb, Schwarz, Violett, Natur] """ return super().get_section_options("FarbeEloxieren") class FertigungsartConfig(IniBasedConfig): """Auslesen der Config zu allen Fertigungsarten""" def __init__(self, config_dir='.', config_file='Fertigungsarten.cfg'): super().__init__(config_dir, config_file) def get_fertigungsarten(self): """hole alle Fertigungsarten, welche als Sektionen in der config gegeben sind, also Fertigungsart, Allgemeintoleranz3DDruck, AllgemeintoleranzGiessen, AllgemeintoleranzExtrudieren, ... """ return super().sections() def get_normen_of_type(self, ftype): """hole alle möglichen Oberflächen Behandlungsarten zum gegebenen Material Allgemeintoleranz3DDruck ftype -> [ISO 2768:1991-fH, ISO 2768:1991-fK, ISO 2768:1991-fL, ISO 2768:1991-mH, , ...] """ return super().get_section_options(ftype) class HerstellerConfig(IniBasedConfig): """Auslesen der Config zu allen möglichen Hersteller""" def __init__(self, config_dir='.', config_file='Hersteller.cfg'): super().__init__(config_dir, config_file) def get(self): """hole alle möglichen Bezeichner """ return super().get_section_options("Hersteller") class NormenConfig(IniBasedConfig): """Auslesen der Config zu allen Normen""" def __init__(self, config_dir='.', config_file='Normen.cfg'): super().__init__(config_dir, config_file) def get_normen(self): """hole alle Normen, welche als Sektionen in der config gegeben sind, also Oberflaechennorm, Kantennorm, Massnorm, Tolerierungsnorm,.. """ return super().sections() def get_normen_of_type(self, otype): """hole alle möglichen Oberflächen Behandlungsarten zum gegebenen Material Oberfläche otype Oberflaechennorm -> [ISO 1302:2002, ISO 21920] Tolerierungsnorm, ... """ return super().get_section_options(otype) class OberflächeConfig(IniBasedConfig): """Auslesen der Config zu allen Oberflächen""" def __init__(self, config_dir='.', config_file='Oberflächenbehandlung.cfg'): super().__init__(config_dir, config_file) def get_oberflächen(self): """hole alle Oberflächen, welche als Sektionen in der config gegeben sind, also OberflächenbehandlungStahl, OberflächenbehandlungAluminium, ... """ return super().sections() def get_oberfläche_of_type(self, otype): """hole alle möglichen Oberflächen Behandlungsarten zum gegebenen Material Oberfläche otype OberflächenbehandlungStahl --> [lackieren, pulverbeschichten, verzinken, vernickeln, brünieren, härten, bürsten, sandstrahlen] OberflächenbehandlungAluminium ... """ return super().get_section_options(otype) class WerkstoffeConfig(IniBasedConfig): """Auslesen der Config zu allen Werkstoffen""" def __init__(self, config_dir='.', config_file='Werkstoff.cfg'): super().__init__(config_dir, config_file) def get_werkstoff_namen(self): """hole alle Werkstoffe, welche als Sektionen in der config gegeben sind, also z.B. Stahl, Aluminium, Kunst-/ Verbundstoff, ... """ return super().sections() def get_werkstoffe_of_name(self, wName): """hole alle Werkstoffe unter der gegebenen Sektion Werkstofftyp wName Stahl --> [ 1.0035 (S185), 1.0038 (S235JR), 1.0122 (S235JRC), 1.0122+C (S235JRC+C), 1.0330 (DC01), ... ] Aluminium, ... """ return super().get_section_options(wName) class PfadConfig(IniBasedConfig): """Auslesen der Config zu allen Pfaden""" def __init__(self, config_dir='.', config_file='Zielpfade.cfg'): super().__init__(config_dir, config_file) def get(self): """hole alle möglichen Bezeichner """ return super().get_section_options("Zielpfade") if __name__ == '__main__': Kalkulationsart