Treeview angepasst, damit die Bezeichnung der obersten Baugruppe angezeigt wird, da dies bisher nicht der Fall war. Da die Bezeichnung nicht in der Baugruppen-JSON aufgeführt ist, ist es erforderlich die CSV mit den Teilestamm-Metadaten zur Baugruppennummer herunterzuladen. Damit dies möglich ist, wurde wurde in manage_configs.py eine neue Subclass 'TeilestammMetadata' ergänzt. In compare_lists.py wurden dabei weitere Flags ergänzt, mit denen gesteuert werden kann, ob die Bezeichnung aus der lokalen CSV-Datei gezogen werden sollen, oder ob die CSV mit jedem Programmlauf neu erstellt wird. Defaultmäßig wird sie mit jedem Programmlauf neu erstellt

This commit is contained in:
2025-03-09 21:22:15 +01:00
parent 4f740e81ad
commit 5f3615548b
3 changed files with 111 additions and 33 deletions
+75 -23
View File
@@ -1,4 +1,4 @@
from manage_configs import SivasAssemblyData, RuleDesignerDatabaseConfig, MigrationStatus
from manage_configs import SivasAssemblyData, RuleDesignerDatabaseConfig, MigrationStatus, TeilestammMetadata
import argparse
import os
@@ -13,7 +13,14 @@ Dieses Programm kann:
class ExcelExport:
def __init__(self, asm_id, asm_json_dir, asm_json_filename, rd_dbase_dir, rd_dbase_filename, load_local_asm_json, load_local_rd_dbase):
def __init__(self,
asm_id,
asm_json_dir,
asm_json_filename,
rd_dbase_dir,
rd_dbase_filename,
load_local_asm_json,
load_local_rd_dbase):
self.asm_id = asm_id
self.asm_data = SivasAssemblyData(asm_json_dir, asm_json_filename, load_local_asm_json)
self.rd_data = RuleDesignerDatabaseConfig(rd_dbase_dir, rd_dbase_filename, load_local_rd_dbase)
@@ -142,17 +149,44 @@ class Treeview:
}
def __init__(self, asm_id, asm_json_dir, asm_json_filename, rd_dbase_dir, rd_dbase_filename, load_local_asm_json, load_local_rd_dbase):
def __init__(self,
asm_id,
asm_json_dir,
asm_json_filename,
asm_csv_dir,
asm_csv_filename,
rd_dbase_dir,
rd_dbase_filename,
load_local_asm_json,
load_local_asm_csv,
load_local_rd_dbase):
self.asm_id = asm_id
self.asm_data = SivasAssemblyData(asm_json_dir, asm_json_filename, load_local_asm_json)
self.asm_bom_data = SivasAssemblyData(asm_json_dir, asm_json_filename, load_local_asm_json)
self.asm_metadata = TeilestammMetadata(asm_csv_dir, asm_csv_filename, load_local_asm_csv)
self.rd_data = RuleDesignerDatabaseConfig(rd_dbase_dir, rd_dbase_filename, load_local_rd_dbase)
self._migration_status = None
self._longest_entry = None
@property
def migration_status(self):
if self._migration_status is None:
self._migration_status = MigrationStatus(self.asm_data.child_ids, self.rd_data.ids)
self._migration_status = MigrationStatus(self.asm_bom_data.child_ids, self.rd_data.ids)
return self._migration_status
@property
def longest_entry(self):
# Längster Eintrag wird zur Bestimmung der Leerraum-Breite zwischen Teilenummer und Bezeichnung im Baum benötigt
# Es hätte für die Berechnung sowohl ein anderer Farbcode, als auch ein anderes Verbindersymbol angegeben werden können,
# da die Anderen gleich lang wie die Angegebenen sind
if self._longest_entry is None:
self._longest_entry = self.asm_bom_data.max_bom_depth * len(Treeview.prefix_types["PIPE"]) \
+ len(self.asm_bom_data.longest_child_id) \
+ len(Treeview.connector_symbols["T"]) \
+ len(Treeview.console_colors["RESET"]) \
+ len(Treeview.console_colors["RED"])
return self._longest_entry
def generate_tree(self):
self._tree_header()
@@ -163,8 +197,13 @@ class Treeview:
"""Prints root number (number for which the user wants to see the tree) to the console"""
background_color = self._set_text_background_color(self.asm_id)
print(f"{background_color}{self.asm_id}{Treeview.console_colors['RESET']}")
id = self.asm_id
color = self._set_text_background_color(id)
text_before_description = f"{color}{id}{Treeview.console_colors['RESET']}".ljust(self.longest_entry)
description = self.asm_metadata.get_property_values("Bezeichnung1")
print(f"{text_before_description} {description}")
def _tree_body(self, parent_id=None, prefix=""):
@@ -173,7 +212,7 @@ class Treeview:
if parent_id is None:
parent_id = self.asm_id
parent_children = self.asm_data.parent_children
parent_children = self.asm_bom_data.parent_children
children_ids = parent_children[parent_id]
for index, child_id in enumerate(children_ids):
@@ -194,7 +233,7 @@ class Treeview:
amount_migrated_ids = len(self.migration_status.green_ids)
amount_unmigrated_ids = len(self.migration_status.red_ids)
progress = int(amount_migrated_ids / len(self.asm_data.child_ids) * 100)
progress = int(amount_migrated_ids / len(self.asm_bom_data.child_ids) * 100)
column_width = 5
border_padding = "".ljust(column_width, "")
@@ -215,15 +254,9 @@ class Treeview:
"""Prints tree entry"""
# Necessary for calculating the padding-width after the partnumber
longest_entry = self.asm_data.max_bom_depth * len(Treeview.prefix_types["PIPE"]) \
+ len(connector) \
+ len(self.asm_data.longest_child_id) \
+ len(Treeview.console_colors["RESET"]) \
+ len(Treeview.console_colors["RED"]) # other color codes (ansi escape sequences) could have been used instead since they all have the same length
text_before_description = f"{prefix}{connector}{color}{child_id}{Treeview.console_colors['RESET']}".ljust(longest_entry)
description = self.asm_data.get_bom_property_values("Bezeichnung")[child_id]
text_before_description = f"{prefix}{connector}{color}{child_id}{Treeview.console_colors['RESET']}".ljust(self.longest_entry)
description = self.asm_bom_data.get_bom_property_values("Bezeichnung")[child_id]
print(f"{text_before_description} {description}")
@@ -266,20 +299,39 @@ if __name__ == '__main__':
parser.add_argument('-e', '--excel', action='store_true', help='Exportiert Baugruppenstruktur als Excel-Datei mit farbiger Hervorhebung der Stücklistenpositionen, in Abhängigkeit vom Migrationsstatus')
parser.add_argument('-rddir', '--rd_dbase_dir',required=False, action='store', default=os.environ.get("CREMIG_DATA"), help='Legt das Verzeichnis fest, in dem die CSV-Datei liegt, in der die RuleDesigner-Teilenummern aufgelistet sind. Default: Umgebungsvariable %CREMIG_DATA%')
parser.add_argument('-rdfn', '--rd_dbase_filename', required=False, action='store', default=os.environ.get("RD_DATABASE_NAME"), help='Name der CSV-Datei, in der die RuleDesigner-Teilenummern aufgelistet sind. Default: Umgebungsvariable %RD_DATABASE_NAME%')
parser.add_argument('-asmdir', '--asm_json_dir', required=False, action='store', default=os.environ.get("CREMIG_DATA"), help='Legt das Verzeichnis fest, JSON-Datei mit den Baugruppeninformationen liegen soll. Default: Umgebungsvariable %CREMIG_DATA%', metavar='filename')
parser.add_argument('-ljson', '--local_asm_json', required=False, action='store_true', default=False, help='Legt fest, ob die JSON der Baugruppe bei jedem Programmlauf neu geladen wird, oder ob die lokale Datei eingelesen werden soll. Default: Neu laden bei jedem Programmlauf')
parser.add_argument('-lcsv', '--local_rd_csv', required=False, action='store_true', default=False, help='Legt fest, ob die CSV, die die RuleDesigner-Teilenummern enthält (RD-Teilenummer.csv) bei jedem Programmlauf vom Server in das lokale Verzeichnis kopiert werden soll. Default: Kopieren bei jedem Programmlauf')
parser.add_argument('-asmjdir', '--asm_json_dir', required=False, action='store', default=os.environ.get("CREMIG_DATA"), help='Legt das Verzeichnis fest, in dem die JSON-Datei mit den Baugruppeninformationen liegt. Default: Umgebungsvariable %CREMIG_DATA%', metavar='directory')
parser.add_argument('-asmcdir', '--asm_csv_dir', required=False, action='store', default=os.environ.get("CREMIG_DATA"), help='Legt das Verzeichnis fest, in dem die CSV-Datei mit den Teilestamm-Metadaten der Baugruppennummer liegt. Default: Umgebungsvariable %CREMIG_DATA%', metavar='directory')
parser.add_argument('-lasmjson', '--local_asm_json', required=False, action='store_true', default=False, help='Legt fest, ob die JSON der Baugruppe bei jedem Programmlauf neu geladen wird, oder ob die lokale Datei eingelesen werden soll. Default: Neu laden bei jedem Programmlauf')
parser.add_argument('-lasmcsv', '--local_asm_csv', required=False, action='store_true', default=False, help='Legt fest, ob die Metadaten-CSV der Baugruppennummer bei jedem Programmlauf neu geladen wird. Default: Neu laden bei jedem Programmlauf')
parser.add_argument('-lrdcsv', '--local_rd_csv', required=False, action='store_true', default=False, help='Legt fest, ob die CSV, die die RuleDesigner-Teilenummern enthält (RD-Teilenummer.csv) bei jedem Programmlauf vom Server in das lokale Verzeichnis kopiert werden soll. Default: Kopieren bei jedem Programmlauf')
args = parser.parse_args()
asm_id = args.sivasid.lstrip()
asm_json_filename = f'{asm_id}.json'
asm_bom_filename = f'{asm_id}.json'
asm_metadata_filename = f'{asm_id}.csv'
if args.excel:
excel_comparison = ExcelExport(asm_id, args.asm_json_dir, asm_json_filename, args.rd_dbase_dir, args.rd_dbase_filename, args.local_asm_json, args.local_rd_csv)
excel_comparison = ExcelExport(asm_id=asm_id,
asm_json_dir=args.asm_json_dir,
asm_json_filename=asm_bom_filename,
rd_dbase_dir=args.rd_dbase_dir,
rd_dbase_filename=args.rd_dbase_filename,
load_local_asm_json=args.local_asm_json,
load_local_rd_dbase=args.local_rd_csv)
excel_comparison.write_excel()
elif args.tree:
treeview_comparison = Treeview(asm_id, args.asm_json_dir, asm_json_filename, args.rd_dbase_dir, args.rd_dbase_filename, args.local_asm_json, args.local_rd_csv)
treeview_comparison = Treeview(asm_id=asm_id,
asm_json_dir=args.asm_json_dir,
asm_json_filename=asm_bom_filename,
asm_csv_dir=args.asm_csv_dir,
asm_csv_filename=asm_metadata_filename,
rd_dbase_dir=args.rd_dbase_dir,
rd_dbase_filename=args.rd_dbase_filename,
load_local_asm_json=args.local_asm_json,
load_local_asm_csv=args.local_asm_csv,
load_local_rd_dbase=args.local_rd_csv)
treeview_comparison.generate_tree()
else:
parser.print_help()