diff --git a/bin/getexdraw.bat b/bin/getexdraw.bat index 7cf279d..4b3c558 100644 --- a/bin/getexdraw.bat +++ b/bin/getexdraw.bat @@ -12,7 +12,7 @@ call getpositions.bat --filename %1 -s -r -w %FILENAME%_positions.json echo --erzeuge Graph mit Routing call routing.bat --filename %FILENAME%_positions.json -w %FILENAME%_todraw.json echo --zeichne Kabel in dxf Datei -call draw_dxf.bat --filename %FILENAME%_todraw.json --new %FILENAME%_cables.dxf -x %FILENAME%_cables.xlsx -p %FILENAME%_positions.json +call draw_dxf.bat --filename %FILENAME%_todraw.json --new %FILENAME%_cables.dxf -x %FILENAME%_cables.xlsx move %PROJECT_WORK%\%FILENAME%_* %INSTALL_DIR% pause diff --git a/cfg/BMK.cfg b/cfg/BMK.cfg new file mode 100644 index 0000000..bfccf72 --- /dev/null +++ b/cfg/BMK.cfg @@ -0,0 +1,38 @@ +# Konfigurationsdatei, welche das Einlesen / Ignorieren bestimmter Blöcke anhand der Betriebsmittelkennzeichnung (BMK) steuert +# Configuration file that controls the reading / ignoring of certain blocks based on the equipment identification (BMK) + + +# Prefixes, that should be included in Routing-Process +[Routing-Include] +MA # Motor +MB # Ventil +QM # Ventil +BG # Stauesensor +BP # Duckluftschalter +BX # Scanner + +# Prefixes, that should be ignored in Routing-Process +[Routing-Ignore] +FC # Motorschutzschalter +PF # Leuchtmelder +DI # Feedback von Gerät +QA # Hauptschütz +SF # Drucktaster an Schaltschrank + + +# Mapping of Equipment-Prefixes to Cable Types found in kabel.cfg +[Cable-Mapping] +# Format: PREFIX = Cabel-Sekcion[, Section2, ...] +MA = MA +MB = WD_Q +QM = WD_Q +BG = WD_I +BG-829422026 = WD_I-829422026 # Spezialfall für Sensor mit ArtiNr: 829422026 +BG-720002003 = WD_I-720002003 # Spezialfall für Sensor mit ArtiNr: 720002003 +BX = WF_B, WD_I # Scanner mit zwei benötigten Kabeln + + +# Adjustment of Cable-Lenght's due to for example existing connection cables on sensor +[Length-Adjustments] +# Format: PREFIX = Length (m) to subtract +BX = 4 \ No newline at end of file diff --git a/cfg/kabel.cfg b/cfg/kabel.cfg index 8211044..97caec7 100644 --- a/cfg/kabel.cfg +++ b/cfg/kabel.cfg @@ -82,7 +82,7 @@ 95.0=726001061 -# Bezeichner jeder Verbindungsleitung +# Bezeichner jeder Verbindungsleitung (gekürzt) [Sivasnummern] 725000015=4G1,5mm², Steuerleitung 722001300=M12 St-0°/ M8 Bu-0° 1m diff --git a/lib/drawdxf.py b/lib/drawdxf.py index 801f9f1..727eb3a 100644 --- a/lib/drawdxf.py +++ b/lib/drawdxf.py @@ -49,11 +49,6 @@ class Polylines: errors_existing_dists: List[str] errors_existing_sensors: List[str] -@dataclass -class Sensors: - name: str - artinr: str - pos: List[float] def add_polyline(msp, points:Polyline, dxf_attribs): pts = points.to_tuple() @@ -125,7 +120,6 @@ def find_close_key(pos2sensors, x, y, tolerance=10): # !!! Toleranz nicht return (px, py) return None - def draw_sensors(plines, doc): msp = doc.modelspace() timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M") @@ -485,13 +479,47 @@ def map_sensor_to_cable(plines): return sens2cable +def map_sensor_to_cable_cfg(plines): + sens2cable = defaultdict(list) + mapping = config_BMK["Cable-Mapping"] + for pl in plines.kabel: + sensor_name = pl.id.split('-')[-1] + cable_length = pl.length/1000 + sensor_artinr = pl.s_artinr + name_prefix = sensor_name[:2] + + # Suche nach Key in der BMK-Config + key_with_artnr = f"{name_prefix}-{sensor_artinr}" + if key_with_artnr in mapping: + section_list = mapping[key_with_artnr] + elif name_prefix in mapping: + section_list = mapping[name_prefix] + else: + sens2cable[pl.id].append("Kein Kabeltyp zugewiesen") + + # Liste aus evtl. mehreren Sektionen erzeugen + sections = [s.strip for s in section_list.split(",")] + + # Evtl. Kabelkürzung durchführen, fall Kabelschwanz vorhanden + if config_BMK.has_section("Length-Adjustments") and config_BMK.has_option("Length-Adjustments", name_prefix): + length_reduction = float(config_BMK.get("Length-Adjustments", name_prefix)) + cable_length = max(0.0, cable_length-length_reduction) + + # Kabel-Atikelnummer innerhalb der Sektion der kabel.cfg bestimmen + for section in sections: + cable_artnr = get_cable_artnr(section, cable_length) + if cable_artnr is None: + sens2cable[pl.id].append(f"Kabel länger als max. Kabellänge") + else: + sens2cable[pl.id].append(cable_artnr) + + return sens2cable if __name__ == '__main__': parser = argparse.ArgumentParser(description='draws a dxf file with the given cable coordinates', prog='drawdxf') parser.add_argument('-f', '--filename', action='store', required=True, help='this json file contains all cables and its coordinates which should be drawn. Saved with an unique timestamp', metavar='myfile.json') - parser.add_argument('-p','--positions', action='store', required=True, help='this json file contains positional information written by getpositions', metavar='myfile.json') parser.add_argument('-d', '--dxf', action='store', help='this dxf drawing will be copied and the new layer with the cables will be added. Original file must be added with --origin', metavar='myfile.dxf') parser.add_argument('-c', '--copy_layer', action='store', help='copy layers of racks, sensors, distributors into a new .dxf-file. File also contains cable paths. Original file must be added with --origin', metavar='original.dxf') parser.add_argument('-n', '--new', action='store', help='create a new dxf file only with cables in it. Name is basename and a timestamp') @@ -519,20 +547,24 @@ if __name__ == '__main__': exit() plines = model_from_json(json_path) - sensors = parse_sensors_from_json(positions_path) - # Allgemeine Config laden config = configparser.ConfigParser(allow_no_value=True, delimiters=("=")) config.optionxform = lambda option: option # preserve case for letters config.read(os.path.join(config_dir, "allgemein.cfg")) - # Config für Kabel-Atikelnummern laden + # Config für Kabel-Artikelnummern laden cable_cfg = configparser.ConfigParser() cable_cfg.optionxform = str #Keys case-sensitive with open(os.path.join(config_dir, "kabel.cfg"), encoding="utf-8") as f: cable_cfg.read_file(f) + # Betriebsmittelkennzeichnungs-Config laden + config_BMK = configparser.ConfigParser(allow_no_value=True, delimiters=("=")) + config_BMK.optionxform = lambda option: option # preserve case for letters + config_BMK.read(os.path.join(config_dir, "BMK.cfg")) + + dxf_file = args.dxf if args.dxf or args.copy_layer: diff --git a/lib/getpositions.py b/lib/getpositions.py index e8711e2..127eac7 100644 --- a/lib/getpositions.py +++ b/lib/getpositions.py @@ -55,7 +55,7 @@ def get_type_of_name(name): "SF" # Drucktaster ] - prefix = name[0:2] + prefix = name[:2] if prefix in SpecialKeys: typ = "Sensor" @@ -72,6 +72,16 @@ def get_type_of_name(name): return typ +def get_type_of_name_cfg(name): + prefix = name[:2] + + if config_BMK.has_option("Routing-Include", prefix): + return "Sensor" + elif config_BMK.has_option("Routing-Ignore", prefix): + return "Schaltschrankelement" + else: + return "unknown" + def get_attributes_of_insert(insert): id = "" ld = dict() @@ -441,10 +451,15 @@ if __name__ == '__main__': if args.sensors or args.dists or args.rack: + # Allgemeine Config Laden config = configparser.ConfigParser(allow_no_value=True, delimiters=("=")) config.optionxform = lambda option: option # preserve case for letters - config.read(os.path.join(config_dir, "allgemein.cfg")) + + # Betriebsmittelkennzeichnungs-Config laden + config_BMK = configparser.ConfigParser(allow_no_value=True, delimiters=("=")) + config_BMK.optionxform = lambda option: option # preserve case for letters + config_BMK.read(os.path.join(config_dir, "BMK.cfg")) output_results = dict()