# PointCab Projekt Umbenenner v4.1.1

Ein GUI-Tool zum Umbenennen von Scans in PointCab-Projekten und zum Zusammenführen mehrerer Projekte.

## Funktionen

### 1. 📁 Einzelprojekt bearbeiten
- Einzelnes PointCab-Projekt auswählen und Scans umbenennen
- Vollständige Scan-Namen: `1.lsd → Projektname_01.lsd`
- Clustername-Bereinigung über Konfigurationsdatei
- Automatisches Backup der LSDX-Datei

### 2. 📂 Batch Renamer
- Mehrere Projekte in einem Verzeichnis automatisch verarbeiten
- Fortschrittsanzeige und detailliertes Logging
- Fehlertoleranz: Bei Fehler wird mit nächstem Projekt fortgefahren

### 3. 🔀 Projektmerger (verbessert in v4.1)
- Mehrere PointCab-Projekte in ein Stammprojekt zusammenführen
- Zwei Modi: Einzelprojekt oder Batch-Merge
- **NEU**: Intelligente Cluster-Duplikat-Erkennung
- Intelligente Namenskonflikt-Behandlung
- Vollständige LSDX-Zusammenführung mit detailliertem Logging

## Installation

### Voraussetzungen
- Python 3.8 oder höher
- Tkinter (normalerweise in Python enthalten)

### Ausführen
```bash
python pointcab_renamer.py
```

## Projektmerger - Detaillierte Dokumentation

### Konzept
Der Projektmerger ermöglicht das Zusammenführen mehrerer PointCab-Projekte in ein einzelnes Stammprojekt. Dies ist nützlich wenn:
- Mehrere Scan-Sessions zu einem Projekt gehören
- Projekte nachträglich zusammengeführt werden sollen
- Daten aus verschiedenen Quellen konsolidiert werden müssen

### Modi

#### Einzelprojekt hinzufügen
1. Stammprojekt (Ziel) auswählen
2. Ein einzelnes Quellprojekt auswählen
3. Vorschau anzeigen
4. Merge durchführen

#### Batch-Merge
1. Stammprojekt (Ziel) auswählen
2. Hauptverzeichnis mit mehreren Quellprojekten auswählen
3. Alle gefundenen Projekte werden automatisch erkannt
4. Vorschau anzeigen
5. Merge durchführen

### Merge-Operationen

Der Projektmerger führt folgende Operationen durch:

1. **Backup erstellen**
   - Vor dem Merge wird ein Backup der Stammprojekt-LSDX erstellt
   - Format: `projektname.lsdx.backup_YYYYMMDD_HHMMSS`

2. **LSD-Dateien kopieren**
   - Alle LSD-Dateien aus den Quellprojekten werden in das Stammprojekt kopiert
   - Bei Namenskonflikten: Automatische Umbenennung (siehe unten)

3. **PNG-Dateien kopieren**
   - Alle Preview-Bilder werden in den Previews-Ordner des Stammprojekts kopiert
   - Bei Namenskonflikten: Automatische Umbenennung

4. **LSDX zusammenführen**
   - **Cluster-Duplikat-Erkennung** (NEU in v4.1):
     - Prüft ob Cluster mit gleichem Namen bereits existiert
     - Bei Duplikat: Scans werden dem existierenden Cluster zugeordnet
     - Bei neuem Cluster: Neuer Cluster wird mit neuer UUID hinzugefügt
   - Alle Scan-Elemente werden mit korrekten Parent-Referenzen eingefügt
   - UUIDs werden neu generiert um Konflikte zu vermeiden
   - FilePath-Referenzen werden bei Umbenennung angepasst
   - Detailliertes Logging aller Operationen

### Namenskonflikt-Behandlung

Wenn eine Datei im Zielordner bereits existiert:

```
Vor Merge:
  Stammprojekt/PointCloud/scan_01.lsd (existiert)
  Quellprojekt/PointCloud/scan_01.lsd (zu mergen)

Nach Merge:
  Stammprojekt/PointCloud/scan_01.lsd (original)
  Stammprojekt/PointCloud/scan_01_merged_1.lsd (aus Quellprojekt)
```

Die LSDX-Referenzen werden automatisch aktualisiert:
```xml
<!-- Vorher -->
<FilePath type="lsd">scan_01.lsd</FilePath>

<!-- Nachher (für gemergtes Element) -->
<FilePath type="lsd">scan_01_merged_1.lsd</FilePath>
```

### Beispiel: Einzelprojekt-Merge

```
Vorher:
├── Stammprojekt/
│   ├── Stammprojekt_PointCloud/
│   │   ├── Stammprojekt.lsdx
│   │   ├── 1.lsd
│   │   ├── 2.lsd
│   │   └── Previews/
│   │       ├── 1.png
│   │       └── 2.png

├── Quellprojekt/
│   ├── Quellprojekt_PointCloud/
│   │   ├── Quellprojekt.lsdx
│   │   ├── 1.lsd
│   │   ├── 2.lsd
│   │   └── Previews/
│   │       ├── 1.png
│   │       └── 2.png

Nachher:
├── Stammprojekt/
│   ├── Stammprojekt_PointCloud/
│   │   ├── Stammprojekt.lsdx (zusammengeführt)
│   │   ├── Stammprojekt.lsdx.backup_20260114_101500
│   │   ├── 1.lsd
│   │   ├── 2.lsd
│   │   ├── 1_merged_1.lsd (aus Quellprojekt)
│   │   ├── 2_merged_2.lsd (aus Quellprojekt)
│   │   └── Previews/
│   │       ├── 1.png
│   │       ├── 2.png
│   │       ├── 1_merged_1.png
│   │       └── 2_merged_2.png
│   └── merge_20260114_101500.log
```

### Beispiel: Batch-Merge

```
Vorher:
├── Hauptverzeichnis/
│   ├── Stammprojekt/
│   │   └── Stammprojekt_PointCloud/
│   │       ├── Stammprojekt.lsdx
│   │       └── (Scans 1-5)
│   ├── Projekt_A/
│   │   └── Projekt_A_PointCloud/
│   │       ├── Projekt_A.lsdx
│   │       └── (Scans 1-3)
│   └── Projekt_B/
│       └── Projekt_B_PointCloud/
│           ├── Projekt_B.lsdx
│           └── (Scans 1-4)

Nach Batch-Merge (Stammprojekt als Ziel, Hauptverzeichnis als Quelle):
├── Stammprojekt/
│   └── Stammprojekt_PointCloud/
│       ├── Stammprojekt.lsdx (enthält jetzt 12 Scans)
│       ├── Stammprojekt.lsdx.backup_...
│       └── (alle LSD/PNG-Dateien)
│   └── merge_....log
```

### Logging

Jeder Merge-Vorgang erstellt eine detaillierte Log-Datei:

- **Einzelprojekt-Merge**: `merge_YYYYMMDD_HHMMSS.log` im Stammprojekt-Verzeichnis
- **Batch-Merge**: Eine Log-Datei pro Merge-Vorgang

Log-Inhalt:
- Alle kopierten Dateien
- Umbenennungen bei Konflikten
- Aktualisierte LSDX-Referenzen
- Fehler und Warnungen

### Fehlerbehandlung

- **Fehlende Dateien**: Werden übersprungen, Warnung im Log
- **Batch-Merge bei Fehler**: Verarbeitung wird mit nächstem Projekt fortgesetzt
- **LSDX-Parsing-Fehler**: Projekt wird übersprungen
- **Backup**: Immer vor Änderungen erstellt

## Konfiguration

### cluster_cleanup.txt
Strings die aus dem Clusternamen entfernt werden:
```
_re
_li
_mi
# Kommentare mit # beginnen
```

## Executable erstellen

### Windows (auf Windows)
```bash
pip install pyinstaller
pyinstaller --onefile --windowed pointcab_renamer.py
```

### Linux
```bash
./build_linux.sh
```

### Cross-Compilation: Windows .exe unter Linux
Es ist möglich, eine Windows .exe unter Linux zu erstellen. Dazu stehen zwei Methoden zur Verfügung:

```bash
# Methode 1: Docker (empfohlen)
./build_windows_on_linux.sh

# Methode 2: Wine (Fallback)
./build_windows_wine.sh
```

Die Docker-Methode ist zuverlässiger und wird empfohlen. Für Details siehe [DEPLOYMENT.md](DEPLOYMENT.md).

**Wichtig:** Die `cluster_cleanup.txt` muss neben der .exe-Datei liegen.

## Changelog

### v4.1.1 (2026-01-14)
- **NEU**: Cross-Compilation-Unterstützung für Windows .exe unter Linux
  - Docker-basiertes Build-Skript (`build_windows_on_linux.sh`)
  - Wine-basiertes Fallback-Skript (`build_windows_wine.sh`)
  - GitHub Actions Beispiel-Workflow
- Erweiterte DEPLOYMENT.md-Dokumentation

### v4.1 (2026-01-14)
- **FIX**: Projektmerger LSDX-Zusammenführung komplett überarbeitet
  - Cluster-Duplikat-Erkennung: Verhindert doppelte Cluster bei gleichem Namen
  - Scans werden korrekt dem existierenden oder neuen Cluster zugeordnet
  - Parent-Referenzen werden jetzt korrekt gesetzt (Cluster→Registration, Scan→Cluster)
  - Detailliertes Logging aller Merge-Operationen
  - Finale Scan/Cluster-Statistik nach Merge
- LSDX-Struktur im Code dokumentiert

### v4.0 (2026-01-14)
- **NEU**: Projektmerger-Funktion
  - Einzelprojekt- und Batch-Merge-Modi
  - Intelligente Namenskonflikt-Behandlung
  - Automatische UUID-Neugenerierung
  - Vollständige LSDX-Zusammenführung
- Hauptmenü auf 3 Optionen erweitert
- Verbesserte Fehlerbehandlung

### v3.1 (2026-01-14)
- Full-Scan-Name-Pattern: `1.lsd → Projektname_01.lsd`
- Konsistente Benennung in Dateien und LSDX

### v3.0 (2026-01-14)
- Batch Renamer hinzugefügt
- Hauptmenü für Modus-Auswahl

### v2.0 (2026-01-14)
- Clustername-Bereinigung via Konfigurationsdatei

### v1.0 (2026-01-14)
- Initiale Version

## Lizenz

MIT License
