diff --git a/.vscode/launch.json b/.vscode/launch.json index 6e44043..eb82f85 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -40,6 +40,54 @@ "easy_positions.json" ] }, + { + "name": "getpositions with easyhoehe.dxf", + "type": "debugpy", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal", + "args": [ + "--filename", + "easyhoehe.dxf", + "--sensors", + "--rack", + "--console", + "--write", + "easyhoehe_positions.json" + ] + }, + { + "name": "getpositions with easysps.dxf", + "type": "debugpy", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal", + "args": [ + "--filename", + "easysps.dxf", + "--sensors", + "--rack", + "--console", + "--write", + "easysps_positions.json" + ] + }, + { + "name": "getpositions with easy_hdiff_nb.dxf", + "type": "debugpy", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal", + "args": [ + "--filename", + "easy_hdiff_nb.dxf", + "--sensors", + "--rack", + "--console", + "--write", + "easy_hdiff_nb_positions.json" + ] + }, { "name": "getpositions with ST500592_Omniflo.dxf", "type": "debugpy", diff --git a/.vscode/settings.json b/.vscode/settings.json index 8b1c6ca..5b30f74 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,5 @@ { - "python.languageServer": "Pylance", + "python.languageServer": "None", "cSpell.words": [ "DXFATTRIBS", "ezdxf" diff --git a/bin/_setenv_automatisierung.bat b/bin/_setenv_automatisierung.bat deleted file mode 100644 index 75c9352..0000000 --- a/bin/_setenv_automatisierung.bat +++ /dev/null @@ -1,33 +0,0 @@ -@echo off -REM ~dp0 steht für das Verzeichnis, in der diese Datei liegt -pushd %~dp0\.. - -set PROJECT=c:\Kabellaengen -set PROJECT_BIN=%PROJECT%\bin -set PROJECT_CFG=%PROJECT%\cfg -set PROJECT_DOC=%PROJECT%\doc -set PROJECT_LIB=%PROJECT%\lib -set PROJECT_DATA=%PROJECT%\data -set PROJECT_WORK=%PROJECT%\work -set PROJECT_TEST=%PROJECT%\testdata - -set SIVAS_TEILESTAMM=\\195.243.223.3\sivas\jit\programme\KSbExcelExportSivasTeilestamm.exe -set SIVAS_EXCEL_EXPORT_DIR=%PROJECT_DATA% - -if not exist %PROJECT%\work mkdir %PROJECT%\work -if not exist %PROJECT%\data mkdir %PROJECT%\data - -set PROJECT_IO_RESULTS=Z:\Automatisierung\Konvertierungstools\4_io-Konvertierer -set PROJECT_BOM_RESULTS="Z:\Automatisierung\Konvertierungstools\3_Kabellängen-Konvertierer" -set INSTALL_DIR="%ONEDRIVE%\Desktop\Kabeltool" - -set PATH=%PROJECT_BIN%;%PATH% - -set NETWORK_INTERPRETER_PATH=U:\Programmierumgebung\Python312 - - -popd -goto :eof - - - diff --git a/bin/_setenv_local.bat b/bin/_setenv_local.bat deleted file mode 100644 index a0ef4b0..0000000 --- a/bin/_setenv_local.bat +++ /dev/null @@ -1,29 +0,0 @@ -@echo off -REM ~dp0 steht für das Verzeichnis, in der diese Datei liegt -pushd %~dp0\.. - -set PROJECT=C:\10-Develop\gitrepos\kabellaengen -set PROJECT_BIN=%PROJECT%\bin -set PROJECT_CFG=%PROJECT%\cfg -set PROJECT_DOC=%PROJECT%\doc -set PROJECT_LIB=%PROJECT%\lib -set PROJECT_DATA=%PROJECT%\data -set PROJECT_WORK=%PROJECT%\work -set PROJECT_TEST=%PROJECT%\testdata - -set SIVAS_TEILESTAMM=\\195.243.223.3\sivas\jit\programme\KSbExcelExportSivasTeilestamm.exe -set SIVAS_EXCEL_EXPORT_DIR=%PROJECT_DATA% - -if not exist %PROJECT%\work mkdir %PROJECT%\work -if not exist %PROJECT%\data mkdir %PROJECT%\data - -set INSTALL_DIR="%ONEDRIVE%\Desktop\Kabeltool" - -set PATH=%PROJECT_BIN%;%PATH% - - -popd -goto :eof - - - diff --git a/bin/draw_dxf.sh b/bin/draw_dxf.sh new file mode 100755 index 0000000..cbb9b2d --- /dev/null +++ b/bin/draw_dxf.sh @@ -0,0 +1,4 @@ +#!/bin/bash +source manage_interpreter.sh activate_interpreter +python "$PROJECT_LIB/drawdxf.py" "$@" +source manage_interpreter.sh deactivate_interpreter diff --git a/bin/getexdraw.bat b/bin/getexdraw.bat index f008b9d..8bdfb2d 100644 --- a/bin/getexdraw.bat +++ b/bin/getexdraw.bat @@ -6,6 +6,7 @@ for %%i in ("%~1") do ( set "EXT=%%~xi" set "DIR=%%~dpi" ) +call C:\kabellaengen\bin\setenv.bat REM echo Dateiname ohne Erweiterung: %FILENAME% REM echo Erweiterung: %EXT% @@ -19,12 +20,12 @@ set ERROR_DOUBLE=%FILENAME%_errors.json set EXCEL_RES=%FILENAME%_cables.xlsx set DXF_RES=%FILENAME%_cables.dxf -echo on -call C:\kabellaengen\bin\setenv.bat -if exist "_setenv_local.bat" ( - call _setenv_local.bat +if exist "%~dp0_setenv.bat" ( + echo Lade lokale Umgebungseinstellungen aus _setenv.bat... + call "%~dp0_setenv.bat" ) +echo on echo. echo === Fetching Positions === call getpositions.bat --filename %1 -s -r -w %JSON_POS% -e %ERROR_DOUBLE% diff --git a/bin/getexdraw.sh b/bin/getexdraw.sh new file mode 100644 index 0000000..cc453fa --- /dev/null +++ b/bin/getexdraw.sh @@ -0,0 +1,68 @@ +#!/bin/bash + +usage() { + echo "Usage: $0 " + exit 1 +} + +if [ $# -eq 0 ]; then + usage +fi + +INPUT_FILE="$1" +FILENAME=$(basename "$INPUT_FILE" .dxf) +DIR=$(dirname "$INPUT_FILE") + +# Namen der Zwischenergebnis Dateien +JSON_POS="${FILENAME}_positionsdraw.json" +JSON_TODRAW="${FILENAME}_todraw.json" +# Namen der Ergebnisdateien +ERROR_DOUBLE="${FILENAME}_errors.json" +EXCEL_RES="${FILENAME}_cables.xlsx" +DXF_RES="${FILENAME}_cables.dxf" + +source $HOME/dxf-calculator/kabellaengen/bin/setenv.sh + +echo +echo "=== Fetching Positions ===" +./getpositions.sh --filename "$1" -s -r -w "$JSON_POS" -e "$ERROR_DOUBLE" + +if [ -f "$PROJECT_WORK/$ERROR_DOUBLE" ]; then + echo "-failed- duplicate IDs in given layout" + read -p "Press any key to continue..." + mv "$PROJECT_WORK/$ERROR_DOUBLE" "$PROJECT_BOM_RESULTS" + exit 1 +fi + +if [ ! -f "$PROJECT_WORK/$JSON_POS" ]; then + echo "-failed- getpositions" + read -p "Press any key to continue..." + exit 1 +fi + +echo +echo "=== Creating Graph for Routing ===" +./routing.sh --filename "$JSON_POS" -w "$JSON_TODRAW" + +if [ ! -f "$PROJECT_WORK/$JSON_TODRAW" ]; then + echo "-failed- routing" + read -p "Press any key to continue..." + exit 1 +fi + +echo +echo "=== Writing Output Files ===" +./draw_dxf.sh --filename "$JSON_TODRAW" --new "$DXF_RES" -x "$EXCEL_RES" + +if [ ! -f "$PROJECT_WORK/$EXCEL_RES" ]; then + echo "-failed- draw_dxf" + read -p "Press any key to continue..." + exit 1 +fi + +echo + +mkdir -p "$PROJECT_BOM_RESULTS/$FILENAME" +mv "$PROJECT_WORK/${FILENAME}_"* "$PROJECT_BOM_RESULTS/$FILENAME" +read -p "Press any key to continue..." + diff --git a/bin/getpositions.sh b/bin/getpositions.sh new file mode 100755 index 0000000..a53e515 --- /dev/null +++ b/bin/getpositions.sh @@ -0,0 +1,6 @@ +#!/bin/bash +# getpositions.sh +#!/bin/bash +source manage_interpreter.sh activate_interpreter +python "$PROJECT_LIB/getpositions.py" "$@" +source manage_interpreter.sh deactivate_interpreter diff --git a/bin/install_py.sh b/bin/install_py.sh new file mode 100755 index 0000000..9b296e7 --- /dev/null +++ b/bin/install_py.sh @@ -0,0 +1,16 @@ +#!/bin/bash +source setenv.sh + +if [ ! -d "$PROJECT/.venv" ]; then + echo "Initialisiere Python virtual environment..." + python3 -m venv "$PROJECT/.venv" --upgrade-deps + echo "Erfolgreich." + + source "$PROJECT/.venv/bin/activate" + echo "Installiere erforderliche Python Packages..." + pip install -r "$PROJECT_LIB/requirements.txt" -q + echo "Erfolgreich" + deactivate +else + echo "Erforderliche Python Packages bereits installiert!" +fi diff --git a/bin/ioconverter.bat b/bin/ioconverter.bat index 02f4e05..9c066a2 100644 --- a/bin/ioconverter.bat +++ b/bin/ioconverter.bat @@ -6,6 +6,7 @@ for %%i in ("%~1") do ( set "EXT=%%~xi" set "DIR=%%~dpi" ) +call C:\kabellaengen\bin\setenv.bat REM echo Dateiname ohne Erweiterung: %FILENAME% REM echo Erweiterung: %EXT% @@ -18,8 +19,11 @@ REM Namen der Ergebnisdateien set ERROR_DOUBLE=%FILENAME%_errors.json set RESULT_TIA=%FILENAME%-*_TIA.xlsx - -call C:\kabellaengen\bin\setenv.bat +if exist "%~dp0_setenv.bat" ( + echo Lade lokale Umgebungseinstellungen aus _setenv.bat... + call "%~dp0_setenv.bat" +) + echo. @@ -44,6 +48,7 @@ if not exist "%PROJECT_WORK%\%RESULT_TIA%" ( goto :eof ) mkdir %PROJECT_IO_RESULTS%\%FILENAME% +echo move %PROJECT_WORK%\%FILENAME%-* %PROJECT_IO_RESULTS%\%FILENAME% move %PROJECT_WORK%\%FILENAME%-* %PROJECT_IO_RESULTS%\%FILENAME% pause goto :eof diff --git a/bin/ioconverter.sh b/bin/ioconverter.sh new file mode 100755 index 0000000..9ea2236 --- /dev/null +++ b/bin/ioconverter.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +usage() { + echo "Usage: $0 " + exit 1 +} + +if [ $# -eq 0 ]; then + usage +fi + +INPUT_FILE="$1" +FILENAME=$(basename "$INPUT_FILE" .dxf) +DIR=$(dirname "$INPUT_FILE") + +source $HOME/dxf-calculator/kabellaengen/bin/setenv.sh + +# Namen der Zwischenergebnis Dateien +JSON_POS="${FILENAME}_positionsconv.json" +JSON_TODRAW="${FILENAME}_todraw.json" +# Namen der Ergebnisdateien +ERROR_DOUBLE="${FILENAME}_errors.json" +RESULT_TIA="${FILENAME}-*_TIA.xlsx" + +echo +echo "=== Fetching Positions ===" +./getpositions.sh --filename "$1" -s -r -w "$JSON_POS" -e "$ERROR_DOUBLE" + +if [ -f "$PROJECT_WORK/$ERROR_DOUBLE" ]; then + echo "== failed: duplicate IDs in given layout" + read -p "Press any key to continue..." + mv "$PROJECT_WORK/$ERROR_DOUBLE" "$PROJECT_IO_RESULTS" + exit 1 +fi + +if [ ! -f "$PROJECT_WORK/$JSON_POS" ]; then + echo "== failed: getpositions" + read -p "Press any key to continue..." + exit 1 +fi + +echo "=== Creating Excel Files for TIA, WSCAD, .. ===" +./portalexport.sh --filename "$JSON_POS" --outname "$FILENAME" + +if [ ! -f "$PROJECT_WORK/$RESULT_TIA" ]; then + echo "== failed: creating .xlsx files" + read -p "Press any key to continue..." + exit 1 +fi + +mkdir -p "$PROJECT_IO_RESULTS/$FILENAME" +echo "move $PROJECT_WORK/${FILENAME}-* $PROJECT_IO_RESULTS/$FILENAME" +mv "$PROJECT_WORK/${FILENAME}"-* "$PROJECT_IO_RESULTS/$FILENAME" +read -p "Press any key to continue..." diff --git a/bin/manage_interpreter.sh b/bin/manage_interpreter.sh new file mode 100755 index 0000000..501fed0 --- /dev/null +++ b/bin/manage_interpreter.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +activate_interpreter() { + if [ -f "$PROJECT/.venv/bin/activate" ]; then + source "$PROJECT/.venv/bin/activate" + else + echo "Virtual environment not found. Run install_py.sh first." + exit 1 + fi +} + +deactivate_interpreter() { + if [ -n "$VIRTUAL_ENV" ]; then + deactivate + fi +} + +# Call function based on argument +case "$1" in + activate_interpreter) + activate_interpreter + ;; + deactivate_interpreter) + deactivate_interpreter + ;; + *) + echo "Usage: $0 {activate_interpreter|deactivate_interpreter}" + exit 1 + ;; +esac diff --git a/bin/portalexport.sh b/bin/portalexport.sh new file mode 100644 index 0000000..ff237ad --- /dev/null +++ b/bin/portalexport.sh @@ -0,0 +1,4 @@ +#!/bin/bash +source manage_interpreter.sh activate_interpreter +python "$PROJECT_LIB/portalexport.py" "$@" +source manage_interpreter.sh deactivate_interpreter diff --git a/bin/routing.sh b/bin/routing.sh new file mode 100755 index 0000000..24779dc --- /dev/null +++ b/bin/routing.sh @@ -0,0 +1,4 @@ +#!/bin/bash +source manage_interpreter.sh activate_interpreter +python "$PROJECT_LIB/routing.py" "$@" +source manage_interpreter.sh deactivate_interpreter diff --git a/bin/setenv.bat b/bin/setenv.bat index 01ec355..870a593 100644 --- a/bin/setenv.bat +++ b/bin/setenv.bat @@ -1,6 +1,8 @@ @echo off +REM falls Umlaute in den Pfaden sind: +chcp 65001 > nul -set PROJECT=c:\Kabellaengen +set PROJECT=c:\kabellaengen set PROJECT_BIN=%PROJECT%\bin set PROJECT_CFG=%PROJECT%\cfg set PROJECT_DOC=%PROJECT%\doc @@ -19,11 +21,13 @@ set PROJECT_IO_RESULTS=Z:\Automatisierung\Konvertierungstools\4_io-Konvertierer set PROJECT_BOM_RESULTS=Z:\Automatisierung\Konvertierungstools\3_Kabellaengen-Konvertierer set INSTALL_DIR="%ONEDRIVE%\Desktop\Kabeltool" +if exist "%~dp0_setenv.bat" ( + echo Lade lokale Umgebungseinstellungen aus _setenv.bat... + call "%~dp0_setenv.bat" +) + set PATH=%PROJECT_BIN%;%PATH% popd goto :eof - - - diff --git a/bin/setenv.sh b/bin/setenv.sh new file mode 100755 index 0000000..be928da --- /dev/null +++ b/bin/setenv.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +export PROJECT=$HOME/dxf-calculator/kabellaengen +export PROJECT_BIN="$PROJECT/bin" +export PROJECT_CFG="$PROJECT/cfg" +export PROJECT_DOC="$PROJECT/doc" +export PROJECT_LIB="$PROJECT/lib" +export PROJECT_DATA="$PROJECT/data" +export PROJECT_WORK="$PROJECT/work" +export PROJECT_TEST="$PROJECT/testdata" + +# Linux executable instead of Windows .exe +export SIVAS_TEILESTAMM="/usr/local/bin/KSbExcelExportSivasTeilestamm" +export SIVAS_EXCEL_EXPORT_DIR="$PROJECT_DATA" + +# Create directories if they don't exist +mkdir -p "$PROJECT/work" +mkdir -p "$PROJECT/data" + +# Samba shares (adjust mount points as needed) +export PROJECT_IO_RESULTS=$PROJECT_WORK +export PROJECT_BOM_RESULTS=$PROJECT_WORK +export INSTALL_DIR="$HOME/kabeltool" + +# Add project bin to PATH +export PATH="$PROJECT_BIN:$PATH" diff --git a/cfg/allgemein.cfg b/cfg/allgemein.cfg index 0d02d6a..9d9a526 100644 --- a/cfg/allgemein.cfg +++ b/cfg/allgemein.cfg @@ -37,6 +37,7 @@ UNTERVERTEILER # Layernames of Tunnels [GetPos-Layer_Tunnel] Busverteiler-Kennzeichnung +0-0_Tunnel # Layernamen des Equipments (Sensoren, Motoren, etc.) diff --git a/cfg/bezeichner.cfg b/cfg/bezeichner.cfg index 651ec1b..4688ade 100644 --- a/cfg/bezeichner.cfg +++ b/cfg/bezeichner.cfg @@ -83,3 +83,5 @@ 200000375 = Halter mit Sensor für Abfrage VARIO Finger 720000007 = Sensor induk. M8x1, NO/ST-M12x1 4.pol, L=66 mm 829434306 = INKREMENTALGEBER 800 5V KPL. + +[Missing] diff --git a/lib/getpositions.py b/lib/getpositions.py index a705f45..53afb3e 100644 --- a/lib/getpositions.py +++ b/lib/getpositions.py @@ -621,10 +621,11 @@ def check_file_in_work(work_dir: Path, filename: Path) -> tuple[Path, bool]: mypath = filename return mypath, fexists -def check_existance(res_mappings: dict, res_dist: dict, res_pos: dict) -> dict: +def check_existance(res_mappings: dict, res_dist: dict, res_pos: dict, res_tunnel: dict) -> dict: ret = dict() ret["missing_distributors"] = list() ret["missing_sensors"] = list() + ret["missing_tunnel"] = list() for dname in res_mappings.keys(): if dname not in res_dist: ret["missing_distributors"].append(dname) @@ -632,7 +633,13 @@ def check_existance(res_mappings: dict, res_dist: dict, res_pos: dict) -> dict: for s in lofsensors: if s not in res_pos: ret['missing_sensors'].append(s) - + for tname in res_tunnel.keys(): + if len(res_tunnel[tname]) < 2 : + ret["missing_tunnel"].append(tname) + if len(res_tunnel[tname]) > 2 : + if "overdefined_tunnel" not in ret: + ret["overdefined_tunnel"] = list() + ret["overdefined_tunnel"].append(tname) return ret def dxf_is_binary(dxf_path: Path) -> bool: @@ -810,11 +817,18 @@ if __name__ == '__main__': if args.write: basename = os.path.splitext(args.write)[0] - res_not_found = check_existance(res_mappings, res_dist, res_sens) + res_not_found = check_existance(res_mappings, res_dist, res_sens, res_tunnel) + if args.errors and "overdefined_tunnel" in res_not_found: + print("unorrect tunnels found. Writing errors-file.") + err_ids = list(res_not_found["overdefined_tunnel"]) + write_results(to_json(list(err_ids)), work_dir, args.errors) + added_warnings = merge_two_dicts(warnings, missing_attribs) res_not_found["missing_attributes"] = added_warnings output_results["not_found"] = res_not_found output_results["double_ids"] = res_double + + write_results(to_json(output_results), work_dir, f"{basename}.json") else: diff --git a/lib/plant.py b/lib/plant.py index 14e868c..3572531 100644 --- a/lib/plant.py +++ b/lib/plant.py @@ -434,11 +434,13 @@ class Anlage(): die Rückage enthält ein Tuple, welche Tunnel keinem Rack zugeordnet werden konnten ''' for tname, pos in self._tunnels.items(): - tunbeg = pos[0] - tunend = pos[1] - trackname = f"t-Rack-{tname}" - self._racks.add_rack(tunbeg, tunend, trackname) - + if len(pos) == 2: + tunbeg = pos[0] + tunend = pos[1] + trackname = f"t-Rack-{tname}" + self._racks.add_rack(tunbeg, tunend, trackname) + else: + raise Exception("Tunnel has more than one begin and end/ just one begin") errors = list() for name, pos in self._tunnels.items(): p1 = self._tunnels[name][0]