erste Fassung rein

This commit is contained in:
2025-12-02 22:56:45 +01:00
parent f7f8aca5f1
commit ed416a5315
3 changed files with 98 additions and 13 deletions
+46
View File
@@ -0,0 +1,46 @@
@echo off
if [%1]==[] goto usage
for %%i in ("%~1") do (
set "FILENAME=%%~ni"
set "EXT=%%~xi"
set "DIR=%%~dpi"
)
call C:\10-develop\gitea\kabellaengen\bin\setenv.bat
REM echo Dateiname ohne Erweiterung: %FILENAME%
REM echo Erweiterung: %EXT%
REM echo Verzeichnis: %DIR%
REM
REM Namen der Ergebnisdateien
set RESULT_EXCEL=%FILENAME%_texts.xlsx
if exist "%~dp0_setenv.bat" (
echo Lade lokale Umgebungseinstellungen aus _setenv.bat...
call "%~dp0_setenv.bat"
)
REM Zielverzeichnis
set TARGET_DIR=%PROJECT_WORK%
mkdir "%TARGET_DIR%"
echo.
echo === Extracting TEXT and MTEXT from DXF ===
call translate.bat --filename %FILENAME%%EXT% --extract --outname %RESULT_EXCEL%
if not exist "%PROJECT_WORK%\%RESULT_EXCEL%
" (
@echo == failed: extracting texts
pause
goto :eof
)
echo.
echo === Translation file created: %PROJECT_WORK%\%RESULT_EXCEL% ===
pause
goto :eof
:usage
@echo Usage: %0 ^<dxfinWorkOrdner.dxf^>
exit /B 1
goto :eof
+17 -4
View File
@@ -15,16 +15,21 @@ coord_y = Y=*
coord_z = Z=* coord_z = Z=*
[ignore_pattern_regex] [ignore_pattern_regex]
# Reguläre Ausdrücke für Texte die NICHT in die Excel Datei geschrieben werden sollen # Reguläre Ausdrücke für Texte die NICHT in die Excel Datei geschrieben werden sollen
# Ein Ausdruck pro Zeile (Python regex Syntax) # Ein Ausdruck pro Zeile (Python regex Syntax)
# Format: pattern_name = regex # Format: pattern_name = regex
# Formeln wie =A1 +AB12 # Angaben wie =A1 +AB12 oder =A2+UZ304
formula = ^=A\d\s*\+[A-Z]{2}\d+ anlagen_nr = ^=A\d\s*\+[A-Z]{2}\d+
anlagen_nr3 = ^=A\d\+UZ\d{3}
ein_zeichen = ^[A-F]$
# Technische Angaben # Technische Angaben
height = ^\\H1.875x h1875 = ^\\H1.875x
h1875ff = ^\\H1.875x;.*$
millimeter = ^\d+\s*mm$ millimeter = ^\d+\s*mm$
m_numbers = ^M\d{3}$ m_numbers = ^M\d{3}$
@@ -32,4 +37,12 @@ m_numbers = ^M\d{3}$
coord_arrows = ^\+\d{1,3}(?:[.,]\d{3})\s*(?:<<<|>>>)\s*\+\d{1,3}(?:[.,]\d{3})$ coord_arrows = ^\+\d{1,3}(?:[.,]\d{3})\s*(?:<<<|>>>)\s*\+\d{1,3}(?:[.,]\d{3})$
# +UC3206\P3 x ET200 SP DI16 402.0 # +UC3206\P3 x ET200 SP DI16 402.0
uc4 = ^\+UC\d{4} uc4 = ^\+UC\d{4}
uc2 = ^=A\d\+UC\d{2} uc2 = ^=A\d\+UC\d{2}
uc3 = ^=A\d\+UC\d{3}
uz2 = ^=A\d\+UZ\d{2}
uz3 = ^=A\d\+UZ\d{3}
ip_adresse = ^\\fArial Narrow.*(\d{1,3}\.){3}\d{1,3}$
tunnel = ^\\fArial.*TUNNEL\d+-\d{4}$
kr = ^KR-\d{3,4}$
+35 -9
View File
@@ -3,7 +3,7 @@ import os
import re import re
import sys import sys
from pathlib import Path from pathlib import Path
from configparser import ConfigParser from configparser import RawConfigParser
from fnmatch import fnmatch from fnmatch import fnmatch
import ezdxf import ezdxf
@@ -46,7 +46,8 @@ def load_ignore_patterns(cfg_path: Path) -> tuple[list[str], list[str]]:
print(f"Bitte erstellen Sie die Datei 'translator.cfg' im Verzeichnis: {cfg_path}") print(f"Bitte erstellen Sie die Datei 'translator.cfg' im Verzeichnis: {cfg_path}")
sys.exit(1) sys.exit(1)
config = ConfigParser() # RawConfigParser verhindert dass Backslashes in Regex-Mustern escaped werden
config = RawConfigParser()
try: try:
config.read(config_file, encoding='utf-8') config.read(config_file, encoding='utf-8')
except Exception as e: except Exception as e:
@@ -81,7 +82,7 @@ def load_ignore_patterns(cfg_path: Path) -> tuple[list[str], list[str]]:
return wildcard_patterns, regex_patterns return wildcard_patterns, regex_patterns
def should_ignore_text(text: str, wildcard_patterns: list[str], regex_patterns: list[str]) -> bool: def should_ignore_text(text: str, wildcard_patterns: list[str], regex_patterns: list[str], debug: bool = False) -> bool:
""" """
Prüft ob ein Text ignoriert werden soll basierend auf den Mustern. Prüft ob ein Text ignoriert werden soll basierend auf den Mustern.
@@ -89,6 +90,7 @@ def should_ignore_text(text: str, wildcard_patterns: list[str], regex_patterns:
text: Zu prüfender Text text: Zu prüfender Text
wildcard_patterns: Liste der Wildcard-Muster (*,?) wildcard_patterns: Liste der Wildcard-Muster (*,?)
regex_patterns: Liste der regulären Ausdrücke regex_patterns: Liste der regulären Ausdrücke
debug: Wenn True, gibt Debug-Informationen aus
Returns: Returns:
True wenn Text ignoriert werden soll, False sonst True wenn Text ignoriert werden soll, False sonst
@@ -96,12 +98,16 @@ def should_ignore_text(text: str, wildcard_patterns: list[str], regex_patterns:
# Prüfe Wildcard-Muster # Prüfe Wildcard-Muster
for pattern in wildcard_patterns: for pattern in wildcard_patterns:
if fnmatch(text, pattern): if fnmatch(text, pattern):
if debug:
print(f" DEBUG: '{text}' matched wildcard '{pattern}'")
return True return True
# Prüfe Regex-Muster # Prüfe Regex-Muster
for pattern in regex_patterns: for pattern in regex_patterns:
try: try:
if re.search(pattern, text): if re.search(pattern, text):
if debug:
print(f" DEBUG: '{text}' matched regex '{pattern}'")
return True return True
except re.error: except re.error:
# Falls ungültiger Regex, ignoriere dieses Muster # Falls ungültiger Regex, ignoriere dieses Muster
@@ -111,7 +117,7 @@ def should_ignore_text(text: str, wildcard_patterns: list[str], regex_patterns:
return False return False
def extract_text_from_dxf(filename: Path, wildcard_patterns: list[str], regex_patterns: list[str]) -> list[str]: def extract_text_from_dxf(filename: Path, wildcard_patterns: list[str], regex_patterns: list[str], debug: bool = False) -> list[str]:
""" """
Extrahiert alle TEXT und MTEXT Objekte aus einer DXF Datei. Extrahiert alle TEXT und MTEXT Objekte aus einer DXF Datei.
Verwendet ein Set, um Duplikate zu vermeiden. Verwendet ein Set, um Duplikate zu vermeiden.
@@ -120,6 +126,7 @@ def extract_text_from_dxf(filename: Path, wildcard_patterns: list[str], regex_pa
filename: Pfad zur DXF Datei filename: Pfad zur DXF Datei
wildcard_patterns: Liste der Wildcard-Muster zum Filtern wildcard_patterns: Liste der Wildcard-Muster zum Filtern
regex_patterns: Liste der Regex-Muster zum Filtern regex_patterns: Liste der Regex-Muster zum Filtern
debug: Wenn True, gibt Debug-Informationen aus
Returns: Returns:
Alphabetisch sortierte Liste mit allen gefundenen Texten (nach Filterung, ohne Duplikate) Alphabetisch sortierte Liste mit allen gefundenen Texten (nach Filterung, ohne Duplikate)
@@ -136,8 +143,14 @@ def extract_text_from_dxf(filename: Path, wildcard_patterns: list[str], regex_pa
for entity in msp.query('TEXT'): for entity in msp.query('TEXT'):
if entity.dxf.text: if entity.dxf.text:
total_count += 1 total_count += 1
text = entity.dxf.text text = entity.dxf.text.strip() # Entferne führende/nachfolgende Leerzeichen
if should_ignore_text(text, wildcard_patterns, regex_patterns):
# Ignoriere leere Texte
if not text:
ignored_count += 1
continue
if should_ignore_text(text, wildcard_patterns, regex_patterns, debug):
ignored_count += 1 ignored_count += 1
else: else:
texts_set.add(text) texts_set.add(text)
@@ -146,8 +159,14 @@ def extract_text_from_dxf(filename: Path, wildcard_patterns: list[str], regex_pa
for entity in msp.query('MTEXT'): for entity in msp.query('MTEXT'):
if entity.text: if entity.text:
total_count += 1 total_count += 1
text = entity.text text = entity.text.strip() # Entferne führende/nachfolgende Leerzeichen
if should_ignore_text(text, wildcard_patterns, regex_patterns):
# Ignoriere leere Texte
if not text:
ignored_count += 1
continue
if should_ignore_text(text, wildcard_patterns, regex_patterns, debug):
ignored_count += 1 ignored_count += 1
else: else:
texts_set.add(text) texts_set.add(text)
@@ -221,6 +240,11 @@ if __name__ == '__main__':
help='Name der Ausgabedatei (ohne Pfad, mit oder ohne .xlsx Endung)', help='Name der Ausgabedatei (ohne Pfad, mit oder ohne .xlsx Endung)',
metavar='output.xlsx' metavar='output.xlsx'
) )
parser.add_argument(
'-d', '--debug',
action='store_true',
help='Aktiviert Debug-Ausgabe für Pattern-Matching'
)
args = parser.parse_args() args = parser.parse_args()
@@ -251,7 +275,9 @@ if __name__ == '__main__':
# Extrahiere Texte aus DXF # Extrahiere Texte aus DXF
if args.extract: if args.extract:
print(f"Lese DXF Datei: {filename}") print(f"Lese DXF Datei: {filename}")
texts = extract_text_from_dxf(filename, wildcard_patterns, regex_patterns) if args.debug:
print("DEBUG-Modus aktiviert")
texts = extract_text_from_dxf(filename, wildcard_patterns, regex_patterns, args.debug)
# Erstelle Output-Dateinamen # Erstelle Output-Dateinamen
if args.outname: if args.outname: