erste Fassung rein
This commit is contained in:
+35
-9
@@ -3,7 +3,7 @@ import os
|
||||
import re
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from configparser import ConfigParser
|
||||
from configparser import RawConfigParser
|
||||
from fnmatch import fnmatch
|
||||
|
||||
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}")
|
||||
sys.exit(1)
|
||||
|
||||
config = ConfigParser()
|
||||
# RawConfigParser verhindert dass Backslashes in Regex-Mustern escaped werden
|
||||
config = RawConfigParser()
|
||||
try:
|
||||
config.read(config_file, encoding='utf-8')
|
||||
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
|
||||
|
||||
|
||||
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.
|
||||
|
||||
@@ -89,6 +90,7 @@ def should_ignore_text(text: str, wildcard_patterns: list[str], regex_patterns:
|
||||
text: Zu prüfender Text
|
||||
wildcard_patterns: Liste der Wildcard-Muster (*,?)
|
||||
regex_patterns: Liste der regulären Ausdrücke
|
||||
debug: Wenn True, gibt Debug-Informationen aus
|
||||
|
||||
Returns:
|
||||
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
|
||||
for pattern in wildcard_patterns:
|
||||
if fnmatch(text, pattern):
|
||||
if debug:
|
||||
print(f" DEBUG: '{text}' matched wildcard '{pattern}'")
|
||||
return True
|
||||
|
||||
# Prüfe Regex-Muster
|
||||
for pattern in regex_patterns:
|
||||
try:
|
||||
if re.search(pattern, text):
|
||||
if debug:
|
||||
print(f" DEBUG: '{text}' matched regex '{pattern}'")
|
||||
return True
|
||||
except re.error:
|
||||
# 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
|
||||
|
||||
|
||||
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.
|
||||
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
|
||||
wildcard_patterns: Liste der Wildcard-Muster zum Filtern
|
||||
regex_patterns: Liste der Regex-Muster zum Filtern
|
||||
debug: Wenn True, gibt Debug-Informationen aus
|
||||
|
||||
Returns:
|
||||
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'):
|
||||
if entity.dxf.text:
|
||||
total_count += 1
|
||||
text = entity.dxf.text
|
||||
if should_ignore_text(text, wildcard_patterns, regex_patterns):
|
||||
text = entity.dxf.text.strip() # Entferne führende/nachfolgende Leerzeichen
|
||||
|
||||
# Ignoriere leere Texte
|
||||
if not text:
|
||||
ignored_count += 1
|
||||
continue
|
||||
|
||||
if should_ignore_text(text, wildcard_patterns, regex_patterns, debug):
|
||||
ignored_count += 1
|
||||
else:
|
||||
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'):
|
||||
if entity.text:
|
||||
total_count += 1
|
||||
text = entity.text
|
||||
if should_ignore_text(text, wildcard_patterns, regex_patterns):
|
||||
text = entity.text.strip() # Entferne führende/nachfolgende Leerzeichen
|
||||
|
||||
# Ignoriere leere Texte
|
||||
if not text:
|
||||
ignored_count += 1
|
||||
continue
|
||||
|
||||
if should_ignore_text(text, wildcard_patterns, regex_patterns, debug):
|
||||
ignored_count += 1
|
||||
else:
|
||||
texts_set.add(text)
|
||||
@@ -221,6 +240,11 @@ if __name__ == '__main__':
|
||||
help='Name der Ausgabedatei (ohne Pfad, mit oder ohne .xlsx Endung)',
|
||||
metavar='output.xlsx'
|
||||
)
|
||||
parser.add_argument(
|
||||
'-d', '--debug',
|
||||
action='store_true',
|
||||
help='Aktiviert Debug-Ausgabe für Pattern-Matching'
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
@@ -251,7 +275,9 @@ if __name__ == '__main__':
|
||||
# Extrahiere Texte aus DXF
|
||||
if args.extract:
|
||||
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
|
||||
if args.outname:
|
||||
|
||||
Reference in New Issue
Block a user