diff --git a/lib/drawdxf.py b/lib/drawdxf.py index 0a8be5c..7a9aa77 100644 --- a/lib/drawdxf.py +++ b/lib/drawdxf.py @@ -301,6 +301,13 @@ def write_excel_from_json(plines:Polylines, sens2cable: dict, outpath:str, with_ length_summary = defaultdict(float) sensor_summary = defaultdict(int) + uv_sensor_count = defaultdict(lambda: defaultdict(int)) + uv_artnr_count = defaultdict(lambda: defaultdict(int)) + uv_artnr_length = defaultdict(lambda: defaultdict(float)) + + seen_sensors = set() + uv_sensor_mapping = defaultdict(dict) + #Worksheet 1 - Kabellängen nach Kabel-ID ws1 = wb1.active ws1.title = "Length by ID" @@ -311,17 +318,21 @@ def write_excel_from_json(plines:Polylines, sens2cable: dict, outpath:str, with_ ws1.column_dimensions['C'].width = 15 ws1.column_dimensions['D'].width = 25 - seen_sensors = set() for pl in plines.kabel: length = round(pl.length /1000 , 1) # Umrechnung von mm in m + uv_name = pl.id.split("-")[0] + sensor_name = pl.id.split("-")[-1] - # Sensor Artikelnummern sammeln - sensor_name = pl.id.split("-")[-1] # z.B. "BX0001" + # Globaler Sensor-Count (für erstes Sheet) if sensor_name not in seen_sensors: seen_sensors.add(sensor_name) sensor_summary[pl.s_artinr] += 1 + # UV-spezifische Sensor-Mapping-Zwischenspeicherung + if sensor_name not in uv_sensor_mapping[uv_name]: + uv_sensor_mapping[uv_name][sensor_name] = pl.s_artinr + for artnr in sens2cable[pl.id]: cable_name = "" if artnr.isdigit(): @@ -329,10 +340,17 @@ def write_excel_from_json(plines:Polylines, sens2cable: dict, outpath:str, with_ ws1.append([pl.id, length, artnr, cable_name]) if "MA" in pl.id: - length_summary[artnr] += math.ceil(length) # Aufrunden von z.b. 10,3 auf 11 m (volle Meter!) + length_summary[artnr] += math.ceil(length) # Aufrunden von z.b. 10,3 auf 11 m (volle Meter!) + uv_artnr_length[uv_name][artnr] += math.ceil(length) else: count_summary[artnr] += 1 + uv_artnr_count[uv_name][artnr] += 1 + + # UV-spezifische Sensorzählung (robust, 1x je Sensor pro UV) + for uv_name, sensor_dict in uv_sensor_mapping.items(): + for sensor_name, artnr in sensor_dict.items(): + uv_sensor_count[uv_name][artnr] += 1 # Worksheet 2 - Kabelnummern und Stückzahlen ws2 = wb1.create_sheet("Cables SIVAS") @@ -414,29 +432,87 @@ def write_excel_from_json(plines:Polylines, sens2cable: dict, outpath:str, with_ wb2 = Workbook() ws1 = wb2.active ws1.title = "BOM" - ws1.append(["Type", "Art.-Number", "Name (SIVAS)", "Amount (pcs)", "Length (m)"]) + ws1.append(["Art.-Number", "Name (SIVAS)", "Amount (pcs)", "Length (m)"]) - # Alle Summaries kombinieren - all_summaries = set(count_summary) | set(length_summary) | set(sensor_summary) - - for artnr in sorted(all_summaries): + # Sensoren separat auflisten + for artnr in sorted(sensor_summary.keys()): name = bezeichner_cfg["Sivasnummern"].get(artnr, "") - count = sensor_summary.get(artnr, count_summary.get(artnr, "")) - length = length_summary.get(artnr, "") - typ = "Sensor" if artnr in sensor_summary else "Kabel" - + count = sensor_summary[artnr] if artnr == "": name = "Keine Artikelnummer vergeben. Layout prüfen." - elif artnr != "" and name =="": - name = (f"Kein Eintrag zu Art.-Nr: {artnr} in bezeichner.cfg.") + elif name == "": + name = f"Kein Eintrag zu Art.-Nr: {artnr} in bezeichner.cfg." ws1.append([ - typ, artnr, name, count, - length if typ == "Kabel" else "" + "" # Sensoren haben keine Länge ]) + # Kabel separat auflisten + for artnr in sorted(set(count_summary.keys()) | set(length_summary.keys())): + name = bezeichner_cfg["Sivasnummern"].get(artnr, "") + count = count_summary.get(artnr, "") + length = length_summary.get(artnr, "") + if artnr == "": + name = "Keine Artikelnummer vergeben. Layout prüfen." + elif name == "": + name = f"Kein Eintrag zu Art.-Nr: {artnr} in bezeichner.cfg." + ws1.append([ + artnr, + name, + count, + length + ]) + + # Neues Sheet für UV-spezifische Übersicht + ws_uv = wb2.create_sheet("BOM by UV") + ws_uv.append(["UV", "Art.-Number", "Name (SIVAS)", "Amount (pcs)", "Length (m)"]) + + all_uvs = set(uv_sensor_count.keys()) | set(uv_artnr_count.keys()) | set(uv_artnr_length.keys()) + + for uv in sorted(all_uvs): + all_artnrs = set() + all_artnrs.update(uv_sensor_count.get(uv, {}).keys()) + all_artnrs.update(uv_artnr_count.get(uv, {}).keys()) + all_artnrs.update(uv_artnr_length.get(uv, {}).keys()) + + for artnr in sorted(all_artnrs): + sensor_amount = uv_sensor_count.get(uv, {}).get(artnr, 0) + cable_count = uv_artnr_count.get(uv, {}).get(artnr, 0) + cable_length = uv_artnr_length.get(uv, {}).get(artnr, 0) + name = bezeichner_cfg["Sivasnummern"].get(artnr, "") + + # Sensoren separat eintragen (Anzahl) + if sensor_amount > 0: + ws_uv.append([ + uv, + artnr, + name, + sensor_amount, + "" + ]) + + # a) Nur Anzahl, wenn kein "MA" im Namen + if cable_count > 0 and cable_length == 0: + ws_uv.append([ + uv, + artnr, + name, + cable_count, + "" + ]) + + # b) Nur Länge, wenn Kabel mit "MA" (Meterware) + if cable_length > 0: + ws_uv.append([ + uv, + artnr, + name, + "", + cable_length + ]) + bom_path = outpath.replace("_cables.xlsx", "_BOM.xlsx") wb2.save(bom_path) print(f"BOM saved as an excel file")