Initial commit

This commit is contained in:
Sebastian Zell 2026-01-16 11:08:31 +01:00
commit 73e365d217
53 changed files with 22309 additions and 0 deletions

1
.abacus.donotdelete Normal file

File diff suppressed because one or more lines are too long

385
BENUTZERHANDBUCH.md Normal file
View File

@ -0,0 +1,385 @@
# PointCab Renamer - Benutzerhandbuch
**Version 4.1** | Datum: 14. Januar 2026
---
## Inhaltsverzeichnis
1. [Einführung](#einführung)
2. [Installation](#installation)
3. [Programmstart](#programmstart)
4. [Die drei Modi](#die-drei-modi)
- [Einzelprojekt-Modus](#einzelprojekt-modus)
- [Batch-Modus](#batch-modus)
- [Projekt-Merger](#projekt-merger)
5. [Konfiguration](#konfiguration)
6. [Troubleshooting](#troubleshooting)
7. [FAQ](#faq)
---
## Einführung
### Was ist der PointCab Renamer?
Der **PointCab Renamer** ist ein Werkzeug zur automatischen Umbenennung von PointCab-Projektdateien. Es löst das Problem, dass PointCab-Scandateien oft kryptische Namen haben (z.B. `1.lsd`, `2.lsd`) und benennt diese nach einem einheitlichen Schema um:
**Format:** `[ClusterName]_[ScanName].[Erweiterung]`
**Beispiel:** `EG_Flur_scan001.lsd`
### Hauptfunktionen
- **Einzelprojekt-Modus**: Ein einzelnes PointCab-Projekt umbenennen
- **Batch-Modus**: Mehrere Projekte gleichzeitig verarbeiten
- **Projekt-Merger**: Mehrere Projekte in ein Zielprojekt zusammenführen
- **Cluster-Bereinigung**: Automatische Entfernung von Suffixen wie `_re`, `_li` aus Clusternamen
- **Detailliertes Logging**: Vollständige Protokollierung aller Änderungen
---
## Installation
### Windows
1. Laden Sie die Datei `pointcab_renamer.exe` herunter
2. Speichern Sie die Datei in einem beliebigen Ordner (z.B. `C:\Tools\`)
3. Kopieren Sie die `cluster_cleanup.txt` in denselben Ordner
4. Starten Sie das Programm mit Doppelklick auf die `.exe`
### Ubuntu/Linux
1. Laden Sie die Datei `pointcab_renamer` herunter
2. Speichern Sie die Datei in einem beliebigen Ordner (z.B. `/home/benutzer/tools/`)
3. Kopieren Sie die `cluster_cleanup.txt` in denselben Ordner
4. Machen Sie die Datei ausführbar:
```bash
chmod +x pointcab_renamer
```
5. Starten Sie das Programm:
```bash
./pointcab_renamer
```
### Aus dem Quellcode (für Entwickler)
1. Stellen Sie sicher, dass Python 3.8+ installiert ist
2. Laden Sie den Quellcode herunter
3. Starten Sie mit:
```bash
python pointcab_renamer.py
```
---
## Programmstart
### Hauptmenü
Nach dem Start erscheint das Hauptmenü mit drei Optionen:
```
╔═══════════════════════════════════════════╗
║ PointCab Renamer v4.1 ║
╠═══════════════════════════════════════════╣
║ ║
║ [Einzelprojekt umbenennen] ║
║ ║
║ [Batch-Verarbeitung] ║
║ ║
║ [Projekt Merger] ║
║ ║
╚═══════════════════════════════════════════╝
```
---
## Die drei Modi
### Einzelprojekt-Modus
**Verwendung:** Wenn Sie ein einzelnes PointCab-Projekt umbenennen möchten.
#### Schritt-für-Schritt-Anleitung
1. Klicken Sie auf **"Einzelprojekt umbenennen"**
2. Wählen Sie die **LSDX-Projektdatei** aus (z.B. `Am_Upstall_4.lsdx`)
3. Wählen Sie den **PointCloud-Ordner** aus (enthält die `.lsd` Dateien)
4. Das Programm zeigt eine **Vorschau** der Änderungen:
```
Vorschau der Umbenennung:
─────────────────────────
1.lsd → EG_Flur_scan001.lsd
2.lsd → EG_Flur_scan002.lsd
3.lsd → OG_Bad_scan001.lsd
...
```
5. Klicken Sie auf **"Umbenennen starten"**
6. Nach Abschluss wird ein Protokoll angezeigt
#### Dateistruktur (Vorher → Nachher)
**Vorher:**
```
Am_Upstall_4_PointCloud/
├── 1.lsd
├── 2.lsd
├── 3.lsd
└── ...
```
**Nachher:**
```
Am_Upstall_4_PointCloud/
├── EG_Flur_scan001.lsd
├── EG_Flur_scan002.lsd
├── OG_Bad_scan001.lsd
└── ...
```
---
### Batch-Modus
**Verwendung:** Wenn Sie mehrere PointCab-Projekte auf einmal verarbeiten möchten.
#### Schritt-für-Schritt-Anleitung
1. Klicken Sie auf **"Batch-Verarbeitung"**
2. Wählen Sie den **Basisordner** aus, der alle Projekte enthält
3. Das Programm erkennt automatisch alle PointCab-Projekte:
```
Gefundene Projekte:
─────────────────────
☑ Projekt_A (15 Scans)
☑ Projekt_B (22 Scans)
☑ Projekt_C (8 Scans)
```
4. Wählen Sie die gewünschten Projekte aus (oder behalten Sie alle ausgewählt)
5. Klicken Sie auf **"Batch-Verarbeitung starten"**
6. Der Fortschritt wird angezeigt:
```
Verarbeite Projekt 1/3: Projekt_A
[████████████░░░░░░░░] 60%
```
7. Nach Abschluss wird eine Zusammenfassung angezeigt
#### Erwartete Ordnerstruktur
```
Basisordner/
├── Projekt_A/
│ ├── Projekt_A.lsdx
│ └── Projekt_A_PointCloud/
│ ├── 1.lsd
│ └── ...
├── Projekt_B/
│ ├── Projekt_B.lsdx
│ └── Projekt_B_PointCloud/
└── Projekt_C/
├── Projekt_C.lsdx
└── Projekt_C_PointCloud/
```
---
### Projekt-Merger
**Verwendung:** Wenn Sie mehrere PointCab-Projekte in ein einziges Projekt zusammenführen möchten.
#### Schritt-für-Schritt-Anleitung
1. Klicken Sie auf **"Projekt Merger"**
2. Wählen Sie den **Modus**:
- **Einzelprojekt zusammenführen**: Ein Quellprojekt → Zielprojekt
- **Batch-Merge**: Mehrere Quellprojekte → Zielprojekt
3. Wählen Sie das **Zielprojekt** (in das zusammengeführt wird)
4. Wählen Sie das/die **Quellprojekt(e)**
5. Das Programm zeigt eine **Vorschau** mit Konfliktauflösung:
```
Merge-Vorschau:
─────────────────────
Zielprojekt: Haupt_Projekt (5 Cluster, 25 Scans)
Quellprojekt: Teil_A (2 Cluster, 10 Scans)
Zu übertragende Dateien:
- EG_Flur_scan001.lsd
- EG_Flur_scan002.lsd (Konflikt → EG_Flur_scan002_merged_1.lsd)
- ...
```
6. Klicken Sie auf **"Merge starten"**
7. Nach Abschluss werden die Statistiken angezeigt:
```
Merge abgeschlossen!
─────────────────────
Cluster vorher: 5 → nachher: 7
Scans vorher: 25 → nachher: 35
Dateien kopiert: 10
Konflikte gelöst: 1
```
#### Konfliktauflösung
Wenn eine Datei im Zielprojekt bereits existiert:
- Die neue Datei wird umbenannt: `dateiname_merged_1.lsd`
- Bei weiteren Konflikten: `dateiname_merged_2.lsd`, etc.
- Die LSDX-Datei wird entsprechend aktualisiert
#### Wichtige Hinweise
- **Backup**: Das Zielprojekt wird vor dem Merge gesichert (`.lsdx.backup`)
- **UUID-Regenerierung**: Alle übertragenen Elemente erhalten neue eindeutige IDs
- **Cluster-Duplikate**: Gleichnamige Cluster werden zusammengeführt
---
## Konfiguration
### Die Datei cluster_cleanup.txt
Diese Konfigurationsdatei definiert, welche Suffixe aus Clusternamen entfernt werden sollen.
#### Speicherort
- **Windows**: Im selben Ordner wie `pointcab_renamer.exe`
- **Linux**: Im selben Ordner wie `pointcab_renamer`
#### Format
```
# Dies ist ein Kommentar
_re
_li
_mi
_mi-li
_mi-re
```
- Jede Zeile = ein zu entfernender String
- Zeilen mit `#` am Anfang sind Kommentare
- Leere Zeilen werden ignoriert
#### Beispiel
Mit der obigen Konfiguration:
- `Flur_re``Flur`
- `Bad_mi-li``Bad`
- `Küche_li``Küche`
#### Konfiguration neu laden
Änderungen an `cluster_cleanup.txt` werden nach einem Neustart oder über den Button **"Konfiguration neu laden"** übernommen.
---
## Troubleshooting
### Häufige Fehler und Lösungen
#### "LSDX-Datei nicht gefunden"
**Problem**: Das Programm kann die Projektdatei nicht finden.
**Lösung**:
- Stellen Sie sicher, dass die `.lsdx`-Datei im Projektordner existiert
- Prüfen Sie, ob Sie Leserechte für die Datei haben
- Der Dateiname sollte mit `.lsdx` enden (nicht `.LSDX`)
#### "PointCloud-Ordner nicht gefunden"
**Problem**: Der Ordner mit den Scandaten fehlt.
**Lösung**:
- Der Ordner muss `_PointCloud` im Namen haben
- Beispiel: `Projekt_A_PointCloud`
- Prüfen Sie die Ordnerstruktur
#### "Keine Projekte gefunden" (Batch-Modus)
**Problem**: Im Basisordner werden keine Projekte erkannt.
**Lösung**:
- Jedes Projekt muss eine `.lsdx`-Datei und einen `_PointCloud`-Ordner haben
- Der Projektname in der LSDX muss mit dem Ordnernamen übereinstimmen
#### "Zugriff verweigert"
**Problem**: Dateien können nicht umbenannt werden.
**Lösung**:
- Schließen Sie PointCab
- Prüfen Sie, ob andere Programme die Dateien verwenden
- Unter Windows: Als Administrator ausführen
- Unter Linux: Prüfen Sie die Dateiberechtigungen
#### "GUI startet nicht" (Linux)
**Problem**: Keine grafische Oberfläche unter Linux.
**Lösung**:
- Installieren Sie tkinter: `sudo apt install python3-tk`
- Stellen Sie sicher, dass ein Display verfügbar ist
---
## FAQ
### Allgemeine Fragen
**F: Werden die Originaldateien gelöscht?**
A: Nein, die Dateien werden nur umbenannt. Es werden keine Daten gelöscht.
**F: Kann ich die Umbenennung rückgängig machen?**
A: Die ursprünglichen Namen werden im Log-Datei protokolliert. Eine automatische Rückgängig-Funktion gibt es nicht.
**F: Funktioniert das Tool auch mit älteren PointCab-Versionen?**
A: Das Tool wurde für PointCab-Projekte mit LSDX-Format entwickelt. Ältere Formate werden möglicherweise nicht unterstützt.
**F: Wie viele Projekte kann ich im Batch-Modus verarbeiten?**
A: Es gibt keine feste Grenze. Die Verarbeitungszeit hängt von der Anzahl der Scans ab.
### Technische Fragen
**F: Wo werden die Log-Dateien gespeichert?**
A: Im Projektordner, mit dem Format:
- Einzelprojekt: `rename_YYYYMMDD_HHMMSS.log`
- Batch: `batch_YYYYMMDD_HHMMSS.log`
- Merger: `merge_YYYYMMDD_HHMMSS.log`
**F: Was passiert bei einem Stromausfall während der Verarbeitung?**
A: Die bereits umbenannten Dateien bleiben umbenannt. Die LSDX-Datei wird erst nach erfolgreicher Umbenennung aktualisiert.
**F: Kann ich das Tool über die Kommandozeile nutzen?**
A: Aktuell nur mit grafischer Oberfläche. Kommandozeilen-Unterstützung ist für eine zukünftige Version geplant.
### Merger-Fragen
**F: Was passiert mit den Originalprojekten beim Merge?**
A: Die Quellprojekte werden nicht verändert. Dateien werden kopiert, nicht verschoben.
**F: Kann ich den Merge rückgängig machen?**
A: Die ursprüngliche LSDX wird als `.backup` gespeichert. Die kopierten Dateien müssen manuell gelöscht werden.
**F: Werden alle Unterordner (Previews, etc.) auch gemergt?**
A: Ja, alle relevanten Unterordner werden übertragen.
---
## Support
Bei Fragen oder Problemen wenden Sie sich an Ihren Administrator.
---
*PointCab Renamer v4.1 - © 2026*

171
CHANGELOG.md Normal file
View File

@ -0,0 +1,171 @@
# Changelog - PointCab Renamer
Alle wichtigen Änderungen an diesem Projekt werden hier dokumentiert.
---
## [v4.2.1] - 2026-01-16
### Behoben
- **build_linux.sh überarbeitet und getestet**
- Verwendet `python3 -m PyInstaller` für bessere Kompatibilität
- Verbesserte Voraussetzungsprüfungen
- Bessere Fehlerbehandlung und Statusmeldungen
- ✅ GETESTET: Funktioniert erfolgreich
- **build_windows_wine.sh überarbeitet**
- Bessere Erkennung von Headless-Umgebungen
- Automatische Xvfb-Unterstützung falls verfügbar
- Klare Warnungen zu Wine-Einschränkungen
- Hilfreiche Alternativ-Vorschläge bei Fehlern
- ⚠️ HINWEIS: Wine-Builds in Headless-Umgebungen oft problematisch
### Dokumentation
- Build-Skript-Versionsnummern auf 4.2.1 aktualisiert
- DEPLOYMENT.md mit Testergebnissen aktualisiert
### Bekannte Einschränkungen
- Wine-basierte Windows-Builds funktionieren nicht zuverlässig auf Headless-Servern
- Empfehlung: Windows .exe auf echtem Windows-System erstellen
---
## [v4.2] - 2026-01-16
### Behoben
- **Windows build_windows.bat komplett überarbeitet**
- Verwendet jetzt `py` statt `python` (Python Launcher für Windows)
- Verwendet `py -m PyInstaller` statt direktem `pyinstaller`-Aufruf
- Korrekte --add-data Syntax für Windows (Semikolon als Trennzeichen)
- Verbesserte Fehlerbehandlung und Statusmeldungen
- **cluster_cleanup.txt Parser verbessert**
- Unterstützt jetzt UTF-8-BOM (von Windows-Editoren erzeugt)
- Robustere Behandlung von Leerzeilen und Kommentaren
- Gibt jetzt Anzahl geladener Einträge aus
### Hinzugefügt
- **cluster_cleanup.txt erweitert**
- Neue Einträge: `_part_1`, `_part_2`, `_part_3`, `_part_4`, `_part_5`
- **Git-Repository Setup**
- `.gitignore` für sauberes Repository
- `GIT_SETUP.md` mit Anleitung für Gitea/GitHub Push
### Dokumentation
- VERSION.txt aktualisiert
- CHANGELOG.md erweitert
---
## [v4.1.1] - 2026-01-14
### Hinzugefügt
- **Cross-Compilation-Unterstützung**: Windows .exe unter Linux erstellen
- `build_windows_on_linux.sh`: Docker-basiertes Build (empfohlen)
- `build_windows_wine.sh`: Wine-basiertes Build (Fallback)
- GitHub Actions Workflow-Beispiel für automatisierte Builds
### Dokumentation
- DEPLOYMENT.md um Cross-Compilation-Sektion erweitert
- Schritt-für-Schritt-Anleitung für Docker-Methode
- Troubleshooting für häufige Probleme
- Vergleichstabelle der Build-Methoden
- README.md mit Build-Optionen aktualisiert
---
## [v4.1] - 2026-01-14
### Behoben
- **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 korrekt gesetzt (Cluster→Registration, Scan→Cluster)
- Detailliertes Logging aller Merge-Operationen
- Finale Scan/Cluster-Statistik nach Merge
### Verbessert
- LSDX-Struktur im Code dokumentiert
- Verbesserte Fehlerbehandlung beim Merge
---
## [v4.0] - 2026-01-10
### Hinzugefügt
- **Projekt Merger**: Neuer Modus zum Zusammenführen mehrerer PointCab-Projekte
- Einzelprojekt-Merge: Ein Quellprojekt → Zielprojekt
- Batch-Merge: Mehrere Quellprojekte → Zielprojekt
- Intelligente Konfliktauflösung mit `_merged_N` Suffix
- Vollständige LSDX-Zusammenführung (Cluster, Scans, Dateireferenzen)
- UUID-Regenerierung für alle übertragenen Elemente
- Automatisches Backup der Ziel-LSDX vor dem Merge
### Verbessert
- Neue GUI für den Merger mit Konfliktvorschau
- Batch-Merge mit Fortschrittsanzeige
---
## [v3.1] - 2026-01-05
### Geändert
- **Neues Namensformat**: `[ClusterName]_[ScanName].[Erweiterung]`
- Vorher: `[ClusterName].[Erweiterung]`
- Nachher: `EG_Flur_scan001.lsd`
- Scan-Namen werden aus der LSDX extrahiert
- Cluster-Nummer-Duplikate werden vermieden
---
## [v3.0] - 2025-12-20
### Hinzugefügt
- **Batch-Verarbeitung**: Mehrere Projekte gleichzeitig umbenennen
- Automatische Projekterkennung im Basisordner
- Selektive Projektauswahl
- Fortschrittsanzeige für Batch-Operationen
- Zusammenfassendes Batch-Log
### Verbessert
- GUI-Umstrukturierung mit Hauptmenü
- Verbesserte Fehlerbehandlung bei Dateioperationen
---
## [v2.0] - 2025-12-01
### Hinzugefügt
- **Cluster-Bereinigung**: Automatische Entfernung von Suffixen
- Konfigurierbar über `cluster_cleanup.txt`
- Entfernt `_re`, `_li`, `_mi`, etc.
- Button "Konfiguration neu laden"
### Verbessert
- Verbesserte Vorschau der Umbenennung
- Detaillierteres Logging
---
## [v1.0] - 2025-11-15
### Erstveröffentlichung
- Grundfunktion: LSDX-Dateien einlesen
- Scans aus PointCloud-Ordner umbenennen
- Grafische Benutzeroberfläche (tkinter)
- Vorschau vor Umbenennung
- Log-Datei-Erstellung
---
## Geplante Features
- [ ] Kommandozeilen-Unterstützung (CLI-Modus)
- [ ] Rückgängig-Funktion für Umbenennungen
- [ ] Automatische Updates
- [ ] Mehrsprachige Unterstützung (Englisch)
---
*Hinweis: Dieses Changelog folgt dem Format von [Keep a Changelog](https://keepachangelog.com/).*

592
DEPLOYMENT.md Normal file
View File

@ -0,0 +1,592 @@
# PointCab Renamer - Deployment-Anleitung
**Version 4.2.1** | Datum: 16. Januar 2026
---
## Build-Status (Testergebnisse 2026-01-16)
| Build-Methode | Status | Hinweise |
|---------------|--------|----------|
| `build_windows.bat` | ✅ Funktioniert | Empfohlen auf Windows |
| `build_linux.sh` | ✅ Getestet | Funktioniert auf Ubuntu 20.04+ |
| `build_windows_wine.sh` | ⚠️ Experimentell | Fehlschläge auf Headless-Servern möglich |
| `build_windows_on_linux.sh` | ⚠️ Docker | Nicht in Docker-in-Docker möglich |
---
## Übersicht
Diese Anleitung beschreibt, wie Sie aus dem Python-Quellcode ausführbare Dateien für Windows (.exe) und Ubuntu (Binary) erstellen.
---
## Voraussetzungen
### Benötigte Software
| Komponente | Windows | Ubuntu |
|------------|---------|--------|
| Python | 3.8+ | 3.8+ |
| PyInstaller | 5.0+ | 5.0+ |
| tkinter | (in Python enthalten) | `python3-tk` |
### Installation der Voraussetzungen
#### Windows
1. **Python installieren:**
- Laden Sie Python von https://www.python.org/downloads/ herunter
- Bei der Installation: ☑ "Add Python to PATH" aktivieren
2. **PyInstaller installieren:**
```cmd
pip install pyinstaller
```
#### Ubuntu
1. **Python und tkinter installieren:**
```bash
sudo apt update
sudo apt install python3 python3-pip python3-tk
```
2. **PyInstaller installieren:**
```bash
pip3 install pyinstaller
```
---
## Windows-Build (.exe)
### Automatisch (empfohlen)
1. Öffnen Sie eine Eingabeaufforderung (cmd)
2. Navigieren Sie zum Projektordner:
```cmd
cd C:\Pfad\zum\pointcab_renamer
```
3. Führen Sie das Build-Skript aus:
```cmd
build_windows.bat
```
4. Die fertige `.exe` finden Sie im Ordner `dist\pointcab_renamer\`
### Manuell
1. Öffnen Sie eine Eingabeaufforderung
2. Navigieren Sie zum Quellcode-Ordner
3. Führen Sie PyInstaller aus:
```cmd
pyinstaller --onefile --windowed --name "PointCab_Renamer" ^<br> --add-data "cluster_cleanup.txt;." ^<br> pointcab_renamer.py
```
4. Die `.exe` befindet sich in `dist\PointCab_Renamer.exe`
### PyInstaller-Optionen erklärt
| Option | Beschreibung |
|--------|-------------|
| `--onefile` | Alles in eine einzige .exe packen |
| `--windowed` | Kein Konsolenfenster anzeigen |
| `--name` | Name der Ausgabedatei |
| `--add-data` | Zusätzliche Dateien einbinden |
| `--icon` | (Optional) Icon-Datei (.ico) |
### Bekannte Probleme unter Windows
**Problem:** Antivirus blockiert die .exe
**Lösung:** Die erstellte .exe als Ausnahme hinzufügen oder signieren.
**Problem:** "DLL nicht gefunden"
**Lösung:** Visual C++ Redistributable installieren.
---
## Ubuntu-Build (Binary)
### Automatisch (empfohlen)
1. Öffnen Sie ein Terminal
2. Navigieren Sie zum Projektordner:
```bash
cd /pfad/zum/pointcab_renamer
```
3. Machen Sie das Build-Skript ausführbar und führen Sie es aus:
```bash
chmod +x build_linux.sh
./build_linux.sh
```
4. Das fertige Binary finden Sie im Ordner `dist/`
### Manuell
1. Öffnen Sie ein Terminal
2. Navigieren Sie zum Quellcode-Ordner
3. Führen Sie PyInstaller aus:
```bash
pyinstaller --onefile --name "pointcab_renamer" \
--add-data "cluster_cleanup.txt:." \
pointcab_renamer.py
```
4. Das Binary befindet sich in `dist/pointcab_renamer`
5. Machen Sie es ausführbar:
```bash
chmod +x dist/pointcab_renamer
```
### Bekannte Probleme unter Ubuntu
**Problem:** "No display name and no $DISPLAY environment variable"
**Lösung:** Das Binary muss in einer grafischen Umgebung gestartet werden, nicht über SSH.
**Problem:** "_tkinter not found"
**Lösung:** `sudo apt install python3-tk`
---
## Cross-Compilation: Windows .exe unter Linux erstellen
Es gibt mehrere Möglichkeiten, eine Windows .exe unter Linux zu erstellen, ohne Windows zu installieren.
### Methode 1: Docker (Empfohlen)
Die Docker-Methode ist die zuverlässigste und reproduzierbarste Option.
#### Voraussetzungen
1. **Docker installieren:**
```bash
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
```
2. **Benutzer zur docker-Gruppe hinzufügen:**
```bash
sudo usermod -aG docker $USER
# Danach neu einloggen oder:
newgrp docker
```
3. **Docker-Installation testen:**
```bash
docker run hello-world
```
#### Verwendung
1. Navigieren Sie zum Projektordner:
```bash
cd /pfad/zum/pointcab_renamer
```
2. Führen Sie das Build-Skript aus:
```bash
./build_windows_on_linux.sh
```
3. Die fertige `.exe` befindet sich in `dist/PointCab_Renamer.exe`
#### Was das Skript macht
1. Prüft Docker-Installation und -Status
2. Lädt das `cdrx/pyinstaller-windows` Docker-Image (beim ersten Mal)
3. Startet einen Container mit Windows-Umgebung
4. Führt PyInstaller im Container aus
5. Kopiert die .exe und Zusatzdateien nach `dist/`
#### Vorteile der Docker-Methode
- ✅ Zuverlässig und reproduzierbar
- ✅ Isolierte Build-Umgebung
- ✅ Keine manuelle Windows-Python-Installation
- ✅ Gleiche Ergebnisse wie auf echtem Windows
- ✅ Einfach in CI/CD-Pipelines integrierbar
#### Troubleshooting Docker
**Problem:** "Permission denied" beim Docker-Aufruf
**Lösung:**
```bash
sudo usermod -aG docker $USER
# Neu einloggen erforderlich!
```
**Problem:** Docker-Image-Download schlägt fehl
**Lösung:** Proxy-Einstellungen prüfen oder manuell herunterladen:
```bash
docker pull cdrx/pyinstaller-windows:python3
```
**Problem:** Container startet nicht
**Lösung:** Docker-Daemon prüfen:
```bash
sudo systemctl status docker
sudo systemctl restart docker
```
---
### Methode 2: Wine (Fallback)
Die Wine-Methode ist weniger zuverlässig, kann aber ohne Docker verwendet werden.
#### Voraussetzungen
1. **Wine installieren:**
```bash
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install wine64 wine32
```
2. **Installation prüfen:**
```bash
wine --version
```
#### Verwendung
1. Navigieren Sie zum Projektordner:
```bash
cd /pfad/zum/pointcab_renamer
```
2. Führen Sie das Build-Skript aus:
```bash
./build_windows_wine.sh
```
3. Das Skript installiert automatisch:
- Windows-Python in Wine
- PyInstaller
#### Einschränkungen der Wine-Methode
- ⚠️ Nicht alle Windows-Funktionen werden unterstützt
- ⚠️ Kann bei komplexen Abhängigkeiten fehlschlagen
- ⚠️ Langsamerer Build-Prozess
- ⚠️ Ergebnisse können von echter Windows-Build abweichen
---
### Methode 3: GitHub Actions (Automatisiert)
Für regelmäßige Builds können Sie GitHub Actions verwenden.
Erstellen Sie `.github/workflows/build.yml`:
```yaml
name: Build Windows Executable
on:
push:
tags:
- 'v*'
workflow_dispatch:
jobs:
build-windows:
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install dependencies
run: pip install pyinstaller
- name: Build executable
run: |
pyinstaller --onefile --windowed --name "PointCab_Renamer" `
--add-data "cluster_cleanup.txt;." `
--add-data "BENUTZERHANDBUCH.md;." `
pointcab_renamer.py
- name: Upload artifact
uses: actions/upload-artifact@v3
with:
name: PointCab_Renamer_Windows
path: |
dist/PointCab_Renamer.exe
cluster_cleanup.txt
BENUTZERHANDBUCH.md
```
---
### Vergleich der Cross-Compilation-Methoden
| Methode | Zuverlässigkeit | Geschwindigkeit | Aufwand |
|---------|-----------------|-----------------|---------|
| Docker | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | Niedrig |
| Wine | ⭐⭐ | ⭐⭐ | Mittel |
| GitHub Actions | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | Niedrig |
| Echtes Windows | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | Hoch (VM) |
**Empfehlung:** Verwenden Sie die Docker-Methode für lokale Builds und GitHub Actions für automatisierte Release-Builds.
---
## Testen der Executables
### Windows-Test
1. Kopieren Sie die `.exe` und `cluster_cleanup.txt` in einen Testordner
2. Doppelklicken Sie auf die `.exe`
3. Das Hauptmenü sollte erscheinen
4. Testen Sie alle drei Modi mit einem Testprojekt
### Ubuntu-Test
1. Kopieren Sie das Binary und `cluster_cleanup.txt` in einen Testordner
2. Starten Sie das Programm:
```bash
./pointcab_renamer
```
3. Das Hauptmenü sollte erscheinen
4. Testen Sie alle drei Modi mit einem Testprojekt
### Checkliste für Tests
- [ ] Programm startet ohne Fehler
- [ ] Hauptmenü wird angezeigt
- [ ] LSDX-Datei kann ausgewählt werden
- [ ] PointCloud-Ordner wird erkannt
- [ ] Vorschau wird korrekt angezeigt
- [ ] Umbenennung funktioniert
- [ ] LSDX wird aktualisiert
- [ ] Log-Datei wird erstellt
- [ ] Batch-Modus funktioniert
- [ ] Merger funktioniert
---
## Distribution an Mitarbeiter
### Bereitstellung
1. **Für Windows:**
- Kopieren Sie diese Dateien in einen Ordner:
- `PointCab_Renamer.exe`
- `cluster_cleanup.txt`
- `BENUTZERHANDBUCH.md` (oder als PDF)
- Erstellen Sie ein ZIP-Archiv
- Verteilen Sie über Netzlaufwerk oder E-Mail
2. **Für Ubuntu:**
- Kopieren Sie diese Dateien in einen Ordner:
- `pointcab_renamer`
- `cluster_cleanup.txt`
- `BENUTZERHANDBUCH.md`
- Erstellen Sie ein tar.gz-Archiv:
```bash
tar -czvf pointcab_renamer_linux.tar.gz pointcab_renamer cluster_cleanup.txt BENUTZERHANDBUCH.md
```
- Verteilen Sie über Netzlaufwerk
### Empfohlene Ordnerstruktur für Mitarbeiter
```
PointCab_Renamer/
├── PointCab_Renamer.exe (oder pointcab_renamer für Linux)
├── cluster_cleanup.txt
├── BENUTZERHANDBUCH.md
└── logs/ (wird automatisch erstellt)
```
### Updates verteilen
1. Erstellen Sie die neue Executable
2. Informieren Sie die Mitarbeiter über Änderungen (CHANGELOG)
3. Mitarbeiter ersetzen die alte .exe durch die neue
4. `cluster_cleanup.txt` kann beibehalten werden (falls angepasst)
---
## Troubleshooting beim Build
### "ModuleNotFoundError"
**Lösung:** Fehlende Module installieren:
```bash
pip install <modulname>
```
### "Hidden import not found"
**Lösung:** Hidden imports hinzufügen:
```bash
pyinstaller --hidden-import=<modulname> ...
```
### "Executable zu groß" (>100MB)
**Lösung:** UPX-Kompression aktivieren:
```bash
pip install upx
pyinstaller --onefile --upx-dir=/pfad/zu/upx ...
```
### "tkinter funktioniert nicht"
**Windows:** tkinter ist normalerweise in Python enthalten. Reinstallieren Sie Python mit der "tcl/tk" Option.
**Ubuntu:** Installieren Sie python3-tk:
```bash
sudo apt install python3-tk
```
---
## Versionskontrolle
Bei jeder neuen Version:
1. Version im Quellcode aktualisieren (`VERSION = "4.2"` etc.)
2. CHANGELOG.md aktualisieren
3. Neue Builds für Windows und Ubuntu erstellen
4. Builds testen
5. Im Git-Repository taggen:
```bash
git tag -a v4.2 -m "Version 4.2"
git push origin v4.2
```
---
---
## Troubleshooting: Docker-Probleme
### Docker ist nicht installiert
**Ubuntu/Debian:**
```bash
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker $USER
# Dann neu einloggen oder: newgrp docker
```
**Fedora/RHEL:**
```bash
sudo dnf install docker
sudo systemctl start docker
```
### Docker-Daemon startet nicht
**Symptom:** `Cannot connect to the Docker daemon`
**Lösungen:**
1. **Service starten:**
```bash
sudo systemctl start docker
```
2. **Status prüfen:**
```bash
sudo systemctl status docker
```
3. **Logs prüfen:**
```bash
sudo journalctl -u docker.service
```
### Berechtigung verweigert
**Symptom:** `permission denied while trying to connect to the Docker daemon`
**Lösung:** Benutzer zur Docker-Gruppe hinzufügen:
```bash
sudo usermod -aG docker $USER
# Danach neu einloggen
```
Oder mit sudo ausführen:
```bash
sudo ./build_windows_on_linux.sh
```
### Docker in Container-Umgebung (Docker-in-Docker)
**Problem:** Docker kann nicht in unprivilegierten Containern laufen.
**Lösungen:**
1. **Wine-Alternative verwenden:**
```bash
./build_windows_wine.sh
```
2. **Auf Host-System bauen**
3. **GitHub Actions nutzen** (siehe `.github/workflows/`)
4. **Container mit `--privileged` starten** (nicht empfohlen für Produktion)
### WSL2 unter Windows
**Problem:** Docker-Befehle schlagen in WSL2 fehl.
**Lösung:**
1. Docker Desktop für Windows installieren
2. In Docker Desktop: Settings → Resources → WSL Integration aktivieren
3. WSL-Distribution auswählen
### Docker-Image Download schlägt fehl
**Symptom:** `Error pulling image` oder Timeout
**Lösungen:**
1. **Internetverbindung prüfen**
2. **Proxy konfigurieren:**
```bash
export HTTP_PROXY=http://proxy:port
export HTTPS_PROXY=http://proxy:port
```
3. **Manueller Download:**
```bash
sudo docker pull cdrx/pyinstaller-windows:python3
```
---
## Vergleich der Build-Methoden
| Methode | Plattform | Vorteile | Nachteile |
|---------|-----------|----------|-----------|
| `build_windows.bat` | Windows | Nativ, zuverlässig | Braucht Windows |
| `build_windows_on_linux.sh` | Linux + Docker | Cross-compilation | Docker erforderlich |
| `build_windows_wine.sh` | Linux + Wine | Kein Docker nötig | Weniger zuverlässig |
| GitHub Actions | Cloud | Automatisiert | Braucht GitHub-Repo |
**Empfehlung:** Für zuverlässige Windows-Builds verwenden Sie:
1. **Native Windows** (build_windows.bat) - Am zuverlässigsten
2. **Docker auf Linux** (build_windows_on_linux.sh) - Gut für CI/CD
3. **GitHub Actions** - Automatisiert bei jedem Push/Release
---
*PointCab Renamer Deployment Guide v4.1.2 - © 2026*

BIN
DEPLOYMENT.pdf Normal file

Binary file not shown.

107
GIT_SETUP.md Normal file
View File

@ -0,0 +1,107 @@
# Git-Repository Setup für PointCab Renamer
## Voraussetzungen
- Git installiert
- Zugang zu Gitea/GitHub Repository
## Lokales Repository initialisieren
Das Repository wurde bereits initialisiert. Falls Sie ein neues Repository erstellen möchten:
```bash
cd pointcab_renamer
git init
git add .
git commit -m "Initial commit: PointCab Renamer v4.2"
```
## Zu Gitea pushen
1. **Repository auf Gitea erstellen** (falls noch nicht geschehen)
- Loggen Sie sich bei Gitea ein
- Erstellen Sie ein neues Repository (z.B. `pointcab_renamer`)
- Kopieren Sie die Repository-URL
2. **Remote hinzufügen und pushen:**
```bash
# Remote hinzufügen
git remote add origin https://gitea.example.com/username/pointcab_renamer.git
# Oder für SSH:
git remote add origin git@gitea.example.com:username/pointcab_renamer.git
# Push zum Remote
git push -u origin main
```
## Zu GitHub pushen
```bash
# Remote hinzufügen
git remote add origin https://github.com/username/pointcab_renamer.git
# Oder für SSH:
git remote add origin git@github.com:username/pointcab_renamer.git
# Push zum Remote
git push -u origin main
```
## Änderungen pushen
Nach dem initialen Push:
```bash
# Änderungen hinzufügen
git add .
# Commit erstellen
git commit -m "Beschreibung der Änderungen"
# Pushen
git push
```
## Branching-Strategie
- `main` - Stabiler Release-Branch
- `develop` - Entwicklungs-Branch
- `feature/*` - Feature-Branches
- `bugfix/*` - Bugfix-Branches
## Releases erstellen
```bash
# Tag für Release erstellen
git tag -a v4.2 -m "Release v4.2 - Bugfixes und Parser-Verbesserungen"
# Tag pushen
git push origin v4.2
```
## Häufige Befehle
```bash
# Status anzeigen
git status
# Log anzeigen
git log --oneline
# Änderungen abrufen
git pull
# Branch wechseln
git checkout branch-name
# Neuen Branch erstellen
git checkout -b neuer-branch
```
## Hinweise
- Die `.gitignore` ignoriert Build-Artefakte, Logs und temporäre Dateien
- Bei Konflikten: `git pull --rebase` verwenden
- Regelmäßig pushen, um Datenverlust zu vermeiden

73
INSTALLATION.txt Normal file
View File

@ -0,0 +1,73 @@
=====================================================
PointCab Renamer v4.1 - Schnellstart-Anleitung
=====================================================
INHALT DES ARCHIVS:
-------------------
- pointcab_renamer.py - Hauptprogramm (Quellcode)
- cluster_cleanup.txt - Konfigurationsdatei
- BENUTZERHANDBUCH.md - Ausführliche Anleitung
- DEPLOYMENT.md - Anleitung zum Erstellen von .exe/Binary
- README.md - Projektübersicht
- CHANGELOG.md - Versionsänderungen
- build_windows.bat - Build-Skript für Windows
- build_linux.sh - Build-Skript für Linux
- requirements.txt - Python-Abhängigkeiten
- LICENSE.txt - Lizenzinformationen
- VERSION.txt - Versionsinformationen
SCHNELLSTART - WINDOWS:
-----------------------
1. Entpacken Sie das Archiv in einen beliebigen Ordner
2. Option A - Mit Python:
- Python 3.8+ installieren (python.org)
- Doppelklick auf pointcab_renamer.py
Option B - Als .exe erstellen:
- Doppelklick auf build_windows.bat
- Fertige .exe liegt in dist/
SCHNELLSTART - LINUX/UBUNTU:
----------------------------
1. Entpacken Sie das Archiv:
unzip pointcab_renamer_v4.1_release.zip
cd pointcab_renamer_release
2. Option A - Mit Python:
sudo apt install python3 python3-tk
python3 pointcab_renamer.py
Option B - Als Binary erstellen:
chmod +x build_linux.sh
./build_linux.sh
./dist/pointcab_renamer
ERSTE SCHRITTE:
---------------
1. Starten Sie das Programm
2. Wählen Sie einen Modus:
- Einzelprojekt: Ein PointCab-Projekt umbenennen
- Batch: Mehrere Projekte auf einmal
- Merger: Projekte zusammenführen
3. Folgen Sie den Anweisungen auf dem Bildschirm
WICHTIGE HINWEISE:
------------------
- Die Datei cluster_cleanup.txt muss im selben Ordner
wie das Programm liegen
- Vor dem Umbenennen immer ein Backup erstellen!
- Bei Problemen: BENUTZERHANDBUCH.md lesen
SUPPORT:
--------
Bei Fragen wenden Sie sich an die IT-Abteilung.
=====================================================
Version 4.1 | Januar 2026
=====================================================

32
LICENSE.txt Normal file
View File

@ -0,0 +1,32 @@
PointCab Renamer - Lizenzvereinbarung
=====================================
Copyright (c) 2026 - Alle Rechte vorbehalten
NUTZUNGSBEDINGUNGEN:
1. INTERNE NUTZUNG
Diese Software ist ausschließlich für den internen Gebrauch
innerhalb des Unternehmens bestimmt.
2. WEITERGABE
Die Weitergabe an Dritte außerhalb des Unternehmens ist
ohne ausdrückliche schriftliche Genehmigung untersagt.
3. VERÄNDERUNGEN
Änderungen am Quellcode sind nur mit Rücksprache mit der
IT-Abteilung gestattet.
4. GEWÄHRLEISTUNG
Die Software wird "wie besehen" ohne jegliche Gewährleistung
bereitgestellt. Der Autor haftet nicht für Schäden, die durch
die Nutzung dieser Software entstehen könnten.
5. SUPPORT
Bei Fragen oder Problemen wenden Sie sich bitte an die
IT-Abteilung.
---
Diese Lizenz gilt für alle Versionen der Software, sofern
nicht anders angegeben.

276
README.md Normal file
View File

@ -0,0 +1,276 @@
# 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

1
VERSION.txt Normal file
View File

@ -0,0 +1 @@
4.2.1

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,913 @@
('/home/ubuntu/pointcab_renamer/dist/pointcab_renamer',
True,
False,
False,
None,
None,
False,
False,
None,
True,
False,
None,
None,
None,
'/home/ubuntu/pointcab_renamer/build/pointcab_renamer/pointcab_renamer.pkg',
[('pyi-contents-directory _internal', '', 'OPTION'),
('PYZ-00.pyz',
'/home/ubuntu/pointcab_renamer/build/pointcab_renamer/PYZ-00.pyz',
'PYZ'),
('python3.11/lib-dynload/_struct.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_struct.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/zlib.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/zlib.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('struct',
'/home/ubuntu/pointcab_renamer/build/pointcab_renamer/localpycs/struct.pyc',
'PYMODULE'),
('pyimod01_archive',
'/home/ubuntu/pointcab_renamer/build/pointcab_renamer/localpycs/pyimod01_archive.pyc',
'PYMODULE'),
('pyimod02_importers',
'/home/ubuntu/pointcab_renamer/build/pointcab_renamer/localpycs/pyimod02_importers.pyc',
'PYMODULE'),
('pyimod03_ctypes',
'/home/ubuntu/pointcab_renamer/build/pointcab_renamer/localpycs/pyimod03_ctypes.pyc',
'PYMODULE'),
('pyiboot01_bootstrap',
'/home/ubuntu/.local/lib/python3.11/site-packages/PyInstaller/loader/pyiboot01_bootstrap.py',
'PYSOURCE'),
('pyi_rth_inspect',
'/home/ubuntu/.local/lib/python3.11/site-packages/PyInstaller/hooks/rthooks/pyi_rth_inspect.py',
'PYSOURCE'),
('pyi_rth__tkinter',
'/home/ubuntu/.local/lib/python3.11/site-packages/PyInstaller/hooks/rthooks/pyi_rth__tkinter.py',
'PYSOURCE'),
('pointcab_renamer',
'/home/ubuntu/pointcab_renamer/pointcab_renamer.py',
'PYSOURCE'),
('libpython3.11.so.1.0',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/libpython3.11.so.1.0',
'BINARY'),
('python3.11/lib-dynload/_typing.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_typing.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_statistics.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_statistics.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_contextvars.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_contextvars.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_decimal.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_decimal.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_hashlib.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_hashlib.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_sha3.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_sha3.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_blake2.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_blake2.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_sha256.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_sha256.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_md5.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_md5.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_sha1.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_sha1.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_sha512.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_sha512.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_random.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_random.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_bisect.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_bisect.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/math.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/math.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/unicodedata.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/unicodedata.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/array.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/array.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/select.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/select.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_socket.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_socket.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_csv.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_csv.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/resource.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/resource.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_lzma.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_lzma.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_bz2.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_bz2.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/binascii.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/binascii.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_opcode.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_opcode.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_pickle.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_pickle.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_multibytecodec.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_multibytecodec.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_codecs_jp.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_codecs_jp.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_codecs_kr.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_codecs_kr.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_codecs_iso2022.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_codecs_iso2022.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_codecs_cn.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_codecs_cn.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_codecs_tw.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_codecs_tw.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_codecs_hk.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_codecs_hk.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_heapq.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_heapq.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_uuid.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_uuid.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/grp.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/grp.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_posixsubprocess.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_posixsubprocess.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/fcntl.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/fcntl.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_elementtree.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_elementtree.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/pyexpat.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/pyexpat.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/termios.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/termios.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_ssl.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_ssl.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_datetime.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_datetime.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_tkinter.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_tkinter.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('libcrypto.so.3', '/lib/x86_64-linux-gnu/libcrypto.so.3', 'BINARY'),
('liblzma.so.5', '/lib/x86_64-linux-gnu/liblzma.so.5', 'BINARY'),
('libbz2.so.1.0', '/lib/x86_64-linux-gnu/libbz2.so.1.0', 'BINARY'),
('libz.so.1', '/lib/x86_64-linux-gnu/libz.so.1', 'BINARY'),
('libuuid.so.1', '/lib/x86_64-linux-gnu/libuuid.so.1', 'BINARY'),
('libssl.so.3', '/lib/x86_64-linux-gnu/libssl.so.3', 'BINARY'),
('libfreetype.so.6', '/lib/x86_64-linux-gnu/libfreetype.so.6', 'BINARY'),
('libXau.so.6', '/lib/x86_64-linux-gnu/libXau.so.6', 'BINARY'),
('libbrotlicommon.so.1',
'/lib/x86_64-linux-gnu/libbrotlicommon.so.1',
'BINARY'),
('libtk8.6.so', '/lib/x86_64-linux-gnu/libtk8.6.so', 'BINARY'),
('libtcl8.6.so', '/lib/x86_64-linux-gnu/libtcl8.6.so', 'BINARY'),
('libmd.so.0', '/lib/x86_64-linux-gnu/libmd.so.0', 'BINARY'),
('libexpat.so.1', '/lib/x86_64-linux-gnu/libexpat.so.1', 'BINARY'),
('libXext.so.6', '/lib/x86_64-linux-gnu/libXext.so.6', 'BINARY'),
('libXdmcp.so.6', '/lib/x86_64-linux-gnu/libXdmcp.so.6', 'BINARY'),
('libbrotlidec.so.1', '/lib/x86_64-linux-gnu/libbrotlidec.so.1', 'BINARY'),
('libpng16.so.16', '/lib/x86_64-linux-gnu/libpng16.so.16', 'BINARY'),
('libfontconfig.so.1', '/lib/x86_64-linux-gnu/libfontconfig.so.1', 'BINARY'),
('libXrender.so.1', '/lib/x86_64-linux-gnu/libXrender.so.1', 'BINARY'),
('libXft.so.2', '/lib/x86_64-linux-gnu/libXft.so.2', 'BINARY'),
('libX11.so.6', '/lib/x86_64-linux-gnu/libX11.so.6', 'BINARY'),
('libbsd.so.0', '/lib/x86_64-linux-gnu/libbsd.so.0', 'BINARY'),
('libXss.so.1', '/lib/x86_64-linux-gnu/libXss.so.1', 'BINARY'),
('cluster_cleanup.txt',
'/home/ubuntu/pointcab_renamer/cluster_cleanup.txt',
'DATA'),
('_tcl_data/tcl8/tcltest-2.5.5.tm',
'/usr/share/tcltk/tcl8.6/tcl8/tcltest-2.5.5.tm',
'DATA'),
('_tk_data/choosedir.tcl', '/usr/share/tcltk/tk8.6/choosedir.tcl', 'DATA'),
('_tcl_data/msgs/fr_ca.msg',
'/usr/share/tcltk/tcl8.6/msgs/fr_ca.msg',
'DATA'),
('_tcl_data/msgs/fi.msg', '/usr/share/tcltk/tcl8.6/msgs/fi.msg', 'DATA'),
('_tcl_data/encoding/cp874.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp874.enc',
'DATA'),
('_tk_data/ttk/ttk.tcl', '/usr/share/tcltk/tk8.6/ttk/ttk.tcl', 'DATA'),
('_tcl_data/msgs/bn_in.msg',
'/usr/share/tcltk/tcl8.6/msgs/bn_in.msg',
'DATA'),
('_tcl_data/encoding/cp850.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp850.enc',
'DATA'),
('_tcl_data/msgs/hu.msg', '/usr/share/tcltk/tcl8.6/msgs/hu.msg', 'DATA'),
('_tk_data/dialog.tcl', '/usr/share/tcltk/tk8.6/dialog.tcl', 'DATA'),
('_tk_data/ttk/sizegrip.tcl',
'/usr/share/tcltk/tk8.6/ttk/sizegrip.tcl',
'DATA'),
('_tcl_data/msgs/mk.msg', '/usr/share/tcltk/tcl8.6/msgs/mk.msg', 'DATA'),
('_tk_data/images/logoMed.gif',
'/usr/share/tcltk/tk8.6/images/logoMed.gif',
'DATA'),
('_tcl_data/msgs/sq.msg', '/usr/share/tcltk/tcl8.6/msgs/sq.msg', 'DATA'),
('_tk_data/ttk/vistaTheme.tcl',
'/usr/share/tcltk/tk8.6/ttk/vistaTheme.tcl',
'DATA'),
('_tk_data/msgs/pl.msg', '/usr/share/tcltk/tk8.6/msgs/pl.msg', 'DATA'),
('_tk_data/ttk/scrollbar.tcl',
'/usr/share/tcltk/tk8.6/ttk/scrollbar.tcl',
'DATA'),
('_tk_data/panedwindow.tcl',
'/usr/share/tcltk/tk8.6/panedwindow.tcl',
'DATA'),
('_tcl_data/encoding/iso2022.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso2022.enc',
'DATA'),
('_tcl_data/encoding/euc-jp.enc',
'/usr/share/tcltk/tcl8.6/encoding/euc-jp.enc',
'DATA'),
('_tcl_data/tcl8/msgcat-1.6.1.tm',
'/usr/share/tcltk/tcl8.6/tcl8/msgcat-1.6.1.tm',
'DATA'),
('_tcl_data/encoding/dingbats.enc',
'/usr/share/tcltk/tcl8.6/encoding/dingbats.enc',
'DATA'),
('_tcl_data/encoding/macRoman.enc',
'/usr/share/tcltk/tcl8.6/encoding/macRoman.enc',
'DATA'),
('_tk_data/tkAppInit.c', '/usr/share/tcltk/tk8.6/tkAppInit.c', 'DATA'),
('_tk_data/ttk/combobox.tcl',
'/usr/share/tcltk/tk8.6/ttk/combobox.tcl',
'DATA'),
('_tcl_data/msgs/fr.msg', '/usr/share/tcltk/tcl8.6/msgs/fr.msg', 'DATA'),
('_tcl_data/tclIndex', '/usr/share/tcltk/tcl8.6/tclIndex', 'DATA'),
('_tk_data/msgs/en.msg', '/usr/share/tcltk/tk8.6/msgs/en.msg', 'DATA'),
('_tcl_data/msgs/en_ph.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_ph.msg',
'DATA'),
('_tk_data/images/pwrdLogo75.gif',
'/usr/share/tcltk/tk8.6/images/pwrdLogo75.gif',
'DATA'),
('_tcl_data/msgs/zh_cn.msg',
'/usr/share/tcltk/tcl8.6/msgs/zh_cn.msg',
'DATA'),
('_tcl_data/encoding/cp866.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp866.enc',
'DATA'),
('_tcl_data/msgs/mr.msg', '/usr/share/tcltk/tcl8.6/msgs/mr.msg', 'DATA'),
('_tk_data/ttk/winTheme.tcl',
'/usr/share/tcltk/tk8.6/ttk/winTheme.tcl',
'DATA'),
('_tcl_data/msgs/es_hn.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_hn.msg',
'DATA'),
('_tcl_data/msgs/th.msg', '/usr/share/tcltk/tcl8.6/msgs/th.msg', 'DATA'),
('_tk_data/msgs/hu.msg', '/usr/share/tcltk/tk8.6/msgs/hu.msg', 'DATA'),
('_tk_data/images/pwrdLogo175.gif',
'/usr/share/tcltk/tk8.6/images/pwrdLogo175.gif',
'DATA'),
('_tcl_data/encoding/iso8859-9.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-9.enc',
'DATA'),
('_tk_data/tkfbox.tcl', '/usr/share/tcltk/tk8.6/tkfbox.tcl', 'DATA'),
('_tcl_data/msgs/sk.msg', '/usr/share/tcltk/tcl8.6/msgs/sk.msg', 'DATA'),
('_tcl_data/encoding/macUkraine.enc',
'/usr/share/tcltk/tcl8.6/encoding/macUkraine.enc',
'DATA'),
('_tcl_data/encoding/ebcdic.enc',
'/usr/share/tcltk/tcl8.6/encoding/ebcdic.enc',
'DATA'),
('_tk_data/ttk/clamTheme.tcl',
'/usr/share/tcltk/tk8.6/ttk/clamTheme.tcl',
'DATA'),
('_tcl_data/encoding/macJapan.enc',
'/usr/share/tcltk/tcl8.6/encoding/macJapan.enc',
'DATA'),
('_tk_data/msgs/fi.msg', '/usr/share/tcltk/tk8.6/msgs/fi.msg', 'DATA'),
('_tcl_data/tm.tcl', '/usr/share/tcltk/tcl8.6/tm.tcl', 'DATA'),
('_tk_data/images/logoLarge.gif',
'/usr/share/tcltk/tk8.6/images/logoLarge.gif',
'DATA'),
('_tcl_data/msgs/ja.msg', '/usr/share/tcltk/tcl8.6/msgs/ja.msg', 'DATA'),
('_tcl_data/msgs/gl.msg', '/usr/share/tcltk/tcl8.6/msgs/gl.msg', 'DATA'),
('_tk_data/safetk.tcl', '/usr/share/tcltk/tk8.6/safetk.tcl', 'DATA'),
('_tcl_data/msgs/kok.msg', '/usr/share/tcltk/tcl8.6/msgs/kok.msg', 'DATA'),
('_tcl_data/msgs/mr_in.msg',
'/usr/share/tcltk/tcl8.6/msgs/mr_in.msg',
'DATA'),
('_tk_data/iconlist.tcl', '/usr/share/tcltk/tk8.6/iconlist.tcl', 'DATA'),
('_tcl_data/msgs/es_ni.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_ni.msg',
'DATA'),
('_tcl_data/encoding/macRomania.enc',
'/usr/share/tcltk/tcl8.6/encoding/macRomania.enc',
'DATA'),
('_tk_data/fontchooser.tcl',
'/usr/share/tcltk/tk8.6/fontchooser.tcl',
'DATA'),
('_tk_data/ttk/entry.tcl', '/usr/share/tcltk/tk8.6/ttk/entry.tcl', 'DATA'),
('_tcl_data/encoding/cp737.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp737.enc',
'DATA'),
('_tcl_data/msgs/zh_tw.msg',
'/usr/share/tcltk/tcl8.6/msgs/zh_tw.msg',
'DATA'),
('_tcl_data/msgs/es_co.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_co.msg',
'DATA'),
('_tcl_data/msgs/pl.msg', '/usr/share/tcltk/tcl8.6/msgs/pl.msg', 'DATA'),
('_tk_data/images/logo64.gif',
'/usr/share/tcltk/tk8.6/images/logo64.gif',
'DATA'),
('_tcl_data/msgs/sl.msg', '/usr/share/tcltk/tcl8.6/msgs/sl.msg', 'DATA'),
('_tk_data/msgs/en_gb.msg', '/usr/share/tcltk/tk8.6/msgs/en_gb.msg', 'DATA'),
('_tcl_data/msgs/kl.msg', '/usr/share/tcltk/tcl8.6/msgs/kl.msg', 'DATA'),
('_tcl_data/encoding/cp864.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp864.enc',
'DATA'),
('_tcl_data/msgs/lv.msg', '/usr/share/tcltk/tcl8.6/msgs/lv.msg', 'DATA'),
('_tcl_data/encoding/iso8859-8.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-8.enc',
'DATA'),
('_tcl_data/msgs/de_be.msg',
'/usr/share/tcltk/tcl8.6/msgs/de_be.msg',
'DATA'),
('_tcl_data/encoding/cp936.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp936.enc',
'DATA'),
('_tcl_data/msgs/hr.msg', '/usr/share/tcltk/tcl8.6/msgs/hr.msg', 'DATA'),
('_tcl_data/encoding/big5.enc',
'/usr/share/tcltk/tcl8.6/encoding/big5.enc',
'DATA'),
('_tcl_data/encoding/macIceland.enc',
'/usr/share/tcltk/tcl8.6/encoding/macIceland.enc',
'DATA'),
('_tcl_data/history.tcl', '/usr/share/tcltk/tcl8.6/history.tcl', 'DATA'),
('_tcl_data/msgs/hi.msg', '/usr/share/tcltk/tcl8.6/msgs/hi.msg', 'DATA'),
('_tcl_data/msgs/kw.msg', '/usr/share/tcltk/tcl8.6/msgs/kw.msg', 'DATA'),
('_tcl_data/msgs/en_au.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_au.msg',
'DATA'),
('_tk_data/ttk/scale.tcl', '/usr/share/tcltk/tk8.6/ttk/scale.tcl', 'DATA'),
('_tcl_data/msgs/fa_in.msg',
'/usr/share/tcltk/tcl8.6/msgs/fa_in.msg',
'DATA'),
('_tcl_data/encoding/iso8859-4.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-4.enc',
'DATA'),
('_tcl_data/msgs/ru_ua.msg',
'/usr/share/tcltk/tcl8.6/msgs/ru_ua.msg',
'DATA'),
('_tcl_data/encoding/iso8859-6.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-6.enc',
'DATA'),
('_tcl_data/encoding/cp1251.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp1251.enc',
'DATA'),
('_tcl_data/msgs/es_pe.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_pe.msg',
'DATA'),
('_tcl_data/opt0.4/pkgIndex.tcl',
'/usr/share/tcltk/tcl8.6/opt0.4/pkgIndex.tcl',
'DATA'),
('_tcl_data/msgs/et.msg', '/usr/share/tcltk/tcl8.6/msgs/et.msg', 'DATA'),
('_tcl_data/msgs/kl_gl.msg',
'/usr/share/tcltk/tcl8.6/msgs/kl_gl.msg',
'DATA'),
('_tcl_data/encoding/cp1256.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp1256.enc',
'DATA'),
('_tcl_data/encoding/jis0201.enc',
'/usr/share/tcltk/tcl8.6/encoding/jis0201.enc',
'DATA'),
('_tk_data/text.tcl', '/usr/share/tcltk/tk8.6/text.tcl', 'DATA'),
('_tk_data/images/tai-ku.gif',
'/usr/share/tcltk/tk8.6/images/tai-ku.gif',
'DATA'),
('_tcl_data/msgs/kok_in.msg',
'/usr/share/tcltk/tcl8.6/msgs/kok_in.msg',
'DATA'),
('_tk_data/ttk/xpTheme.tcl',
'/usr/share/tcltk/tk8.6/ttk/xpTheme.tcl',
'DATA'),
('_tk_data/icons.tcl', '/usr/share/tcltk/tk8.6/icons.tcl', 'DATA'),
('_tcl_data/msgs/sv.msg', '/usr/share/tcltk/tcl8.6/msgs/sv.msg', 'DATA'),
('_tk_data/ttk/aquaTheme.tcl',
'/usr/share/tcltk/tk8.6/ttk/aquaTheme.tcl',
'DATA'),
('_tcl_data/msgs/lt.msg', '/usr/share/tcltk/tcl8.6/msgs/lt.msg', 'DATA'),
('_tcl_data/msgs/fo_fo.msg',
'/usr/share/tcltk/tcl8.6/msgs/fo_fo.msg',
'DATA'),
('_tcl_data/encoding/macCentEuro.enc',
'/usr/share/tcltk/tcl8.6/encoding/macCentEuro.enc',
'DATA'),
('_tcl_data/msgs/en_bw.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_bw.msg',
'DATA'),
('_tcl_data/encoding/iso8859-14.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-14.enc',
'DATA'),
('_tk_data/ttk/altTheme.tcl',
'/usr/share/tcltk/tk8.6/ttk/altTheme.tcl',
'DATA'),
('_tcl_data/encoding/gb2312.enc',
'/usr/share/tcltk/tcl8.6/encoding/gb2312.enc',
'DATA'),
('_tcl_data/encoding/cp1252.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp1252.enc',
'DATA'),
('_tcl_data/encoding/cp1255.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp1255.enc',
'DATA'),
('_tk_data/palette.tcl', '/usr/share/tcltk/tk8.6/palette.tcl', 'DATA'),
('_tcl_data/msgs/eo.msg', '/usr/share/tcltk/tcl8.6/msgs/eo.msg', 'DATA'),
('_tcl_data/encoding/iso8859-13.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-13.enc',
'DATA'),
('_tcl_data/msgs/nl.msg', '/usr/share/tcltk/tcl8.6/msgs/nl.msg', 'DATA'),
('_tcl_data/msgs/en_ie.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_ie.msg',
'DATA'),
('_tcl_data/msgs/es_bo.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_bo.msg',
'DATA'),
('_tcl_data/msgs/ta.msg', '/usr/share/tcltk/tcl8.6/msgs/ta.msg', 'DATA'),
('_tcl_data/encoding/euc-kr.enc',
'/usr/share/tcltk/tcl8.6/encoding/euc-kr.enc',
'DATA'),
('_tk_data/scale.tcl', '/usr/share/tcltk/tk8.6/scale.tcl', 'DATA'),
('_tcl_data/tclAppInit.c', '/usr/share/tcltk/tcl8.6/tclAppInit.c', 'DATA'),
('_tcl_data/encoding/iso2022-kr.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso2022-kr.enc',
'DATA'),
('_tcl_data/msgs/ar_jo.msg',
'/usr/share/tcltk/tcl8.6/msgs/ar_jo.msg',
'DATA'),
('_tcl_data/msgs/en_gb.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_gb.msg',
'DATA'),
('_tcl_data/msgs/sh.msg', '/usr/share/tcltk/tcl8.6/msgs/sh.msg', 'DATA'),
('_tcl_data/msgs/da.msg', '/usr/share/tcltk/tcl8.6/msgs/da.msg', 'DATA'),
('_tcl_data/msgs/nl_be.msg',
'/usr/share/tcltk/tcl8.6/msgs/nl_be.msg',
'DATA'),
('_tcl_data/encoding/cp852.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp852.enc',
'DATA'),
('_tcl_data/msgs/be.msg', '/usr/share/tcltk/tcl8.6/msgs/be.msg', 'DATA'),
('_tk_data/msgs/nl.msg', '/usr/share/tcltk/tk8.6/msgs/nl.msg', 'DATA'),
('_tcl_data/msgs/fa_ir.msg',
'/usr/share/tcltk/tcl8.6/msgs/fa_ir.msg',
'DATA'),
('_tcl_data/msgs/it.msg', '/usr/share/tcltk/tcl8.6/msgs/it.msg', 'DATA'),
('_tk_data/ttk/cursors.tcl',
'/usr/share/tcltk/tk8.6/ttk/cursors.tcl',
'DATA'),
('_tcl_data/msgs/zh_sg.msg',
'/usr/share/tcltk/tcl8.6/msgs/zh_sg.msg',
'DATA'),
('_tk_data/spinbox.tcl', '/usr/share/tcltk/tk8.6/spinbox.tcl', 'DATA'),
('_tk_data/msgs/es.msg', '/usr/share/tcltk/tk8.6/msgs/es.msg', 'DATA'),
('_tk_data/msgs/el.msg', '/usr/share/tcltk/tk8.6/msgs/el.msg', 'DATA'),
('_tcl_data/msgs/ar_sy.msg',
'/usr/share/tcltk/tcl8.6/msgs/ar_sy.msg',
'DATA'),
('_tcl_data/msgs/ar.msg', '/usr/share/tcltk/tcl8.6/msgs/ar.msg', 'DATA'),
('_tcl_data/msgs/ga_ie.msg',
'/usr/share/tcltk/tcl8.6/msgs/ga_ie.msg',
'DATA'),
('_tk_data/msgs/sv.msg', '/usr/share/tcltk/tk8.6/msgs/sv.msg', 'DATA'),
('_tk_data/tclIndex', '/usr/share/tcltk/tk8.6/tclIndex', 'DATA'),
('_tcl_data/msgs/uk.msg', '/usr/share/tcltk/tcl8.6/msgs/uk.msg', 'DATA'),
('_tcl_data/word.tcl', '/usr/share/tcltk/tcl8.6/word.tcl', 'DATA'),
('_tcl_data/msgs/ga.msg', '/usr/share/tcltk/tcl8.6/msgs/ga.msg', 'DATA'),
('_tcl_data/msgs/en_za.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_za.msg',
'DATA'),
('_tcl_data/msgs/fr_be.msg',
'/usr/share/tcltk/tcl8.6/msgs/fr_be.msg',
'DATA'),
('_tk_data/msgbox.tcl', '/usr/share/tcltk/tk8.6/msgbox.tcl', 'DATA'),
('_tcl_data/encoding/cp1257.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp1257.enc',
'DATA'),
('_tcl_data/encoding/iso8859-3.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-3.enc',
'DATA'),
('_tcl_data/encoding/euc-cn.enc',
'/usr/share/tcltk/tcl8.6/encoding/euc-cn.enc',
'DATA'),
('_tcl_data/msgs/id.msg', '/usr/share/tcltk/tcl8.6/msgs/id.msg', 'DATA'),
('_tk_data/ttk/menubutton.tcl',
'/usr/share/tcltk/tk8.6/ttk/menubutton.tcl',
'DATA'),
('_tk_data/tearoff.tcl', '/usr/share/tcltk/tk8.6/tearoff.tcl', 'DATA'),
('_tk_data/optMenu.tcl', '/usr/share/tcltk/tk8.6/optMenu.tcl', 'DATA'),
('_tcl_data/tcl8/platform/shell-1.1.4.tm',
'/usr/share/tcltk/tcl8.6/tcl8/platform/shell-1.1.4.tm',
'DATA'),
('_tcl_data/encoding/cp860.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp860.enc',
'DATA'),
('_tcl_data/encoding/macCroatian.enc',
'/usr/share/tcltk/tcl8.6/encoding/macCroatian.enc',
'DATA'),
('_tcl_data/encoding/cp1253.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp1253.enc',
'DATA'),
('_tcl_data/msgs/gv.msg', '/usr/share/tcltk/tcl8.6/msgs/gv.msg', 'DATA'),
('_tcl_data/init.tcl', '/usr/share/tcltk/tcl8.6/init.tcl', 'DATA'),
('_tcl_data/msgs/fr_ch.msg',
'/usr/share/tcltk/tcl8.6/msgs/fr_ch.msg',
'DATA'),
('_tcl_data/encoding/iso8859-10.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-10.enc',
'DATA'),
('_tcl_data/msgs/bg.msg', '/usr/share/tcltk/tcl8.6/msgs/bg.msg', 'DATA'),
('_tcl_data/msgs/ro.msg', '/usr/share/tcltk/tcl8.6/msgs/ro.msg', 'DATA'),
('_tcl_data/encoding/cp857.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp857.enc',
'DATA'),
('_tcl_data/msgs/gl_es.msg',
'/usr/share/tcltk/tcl8.6/msgs/gl_es.msg',
'DATA'),
('_tcl_data/msgs/es_uy.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_uy.msg',
'DATA'),
('_tk_data/ttk/panedwindow.tcl',
'/usr/share/tcltk/tk8.6/ttk/panedwindow.tcl',
'DATA'),
('_tcl_data/msgs/af.msg', '/usr/share/tcltk/tcl8.6/msgs/af.msg', 'DATA'),
('_tcl_data/msgs/de_at.msg',
'/usr/share/tcltk/tcl8.6/msgs/de_at.msg',
'DATA'),
('_tcl_data/auto.tcl', '/usr/share/tcltk/tcl8.6/auto.tcl', 'DATA'),
('_tcl_data/msgs/ms_my.msg',
'/usr/share/tcltk/tcl8.6/msgs/ms_my.msg',
'DATA'),
('_tcl_data/msgs/ms.msg', '/usr/share/tcltk/tcl8.6/msgs/ms.msg', 'DATA'),
('_tcl_data/encoding/gb12345.enc',
'/usr/share/tcltk/tcl8.6/encoding/gb12345.enc',
'DATA'),
('_tcl_data/msgs/ru.msg', '/usr/share/tcltk/tcl8.6/msgs/ru.msg', 'DATA'),
('_tcl_data/msgs/sr.msg', '/usr/share/tcltk/tcl8.6/msgs/sr.msg', 'DATA'),
('_tcl_data/msgs/zh.msg', '/usr/share/tcltk/tcl8.6/msgs/zh.msg', 'DATA'),
('_tcl_data/msgs/mt.msg', '/usr/share/tcltk/tcl8.6/msgs/mt.msg', 'DATA'),
('_tcl_data/encoding/jis0208.enc',
'/usr/share/tcltk/tcl8.6/encoding/jis0208.enc',
'DATA'),
('_tcl_data/encoding/iso8859-15.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-15.enc',
'DATA'),
('_tk_data/msgs/zh_cn.msg', '/usr/share/tcltk/tk8.6/msgs/zh_cn.msg', 'DATA'),
('_tcl_data/encoding/iso8859-16.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-16.enc',
'DATA'),
('_tcl_data/encoding/koi8-u.enc',
'/usr/share/tcltk/tcl8.6/encoding/koi8-u.enc',
'DATA'),
('_tk_data/unsupported.tcl',
'/usr/share/tcltk/tk8.6/unsupported.tcl',
'DATA'),
('_tcl_data/encoding/cp865.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp865.enc',
'DATA'),
('_tcl_data/msgs/es_ar.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_ar.msg',
'DATA'),
('_tk_data/msgs/cs.msg', '/usr/share/tcltk/tk8.6/msgs/cs.msg', 'DATA'),
('_tcl_data/encoding/koi8-r.enc',
'/usr/share/tcltk/tcl8.6/encoding/koi8-r.enc',
'DATA'),
('_tcl_data/parray.tcl', '/usr/share/tcltk/tcl8.6/parray.tcl', 'DATA'),
('_tk_data/ttk/classicTheme.tcl',
'/usr/share/tcltk/tk8.6/ttk/classicTheme.tcl',
'DATA'),
('_tcl_data/encoding/cp1254.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp1254.enc',
'DATA'),
('_tcl_data/encoding/symbol.enc',
'/usr/share/tcltk/tcl8.6/encoding/symbol.enc',
'DATA'),
('_tcl_data/msgs/sw.msg', '/usr/share/tcltk/tcl8.6/msgs/sw.msg', 'DATA'),
('_tk_data/images/pwrdLogo.eps',
'/usr/share/tcltk/tk8.6/images/pwrdLogo.eps',
'DATA'),
('_tcl_data/msgs/es.msg', '/usr/share/tcltk/tcl8.6/msgs/es.msg', 'DATA'),
('_tcl_data/package.tcl', '/usr/share/tcltk/tcl8.6/package.tcl', 'DATA'),
('_tcl_data/encoding/macTurkish.enc',
'/usr/share/tcltk/tcl8.6/encoding/macTurkish.enc',
'DATA'),
('_tk_data/bgerror.tcl', '/usr/share/tcltk/tk8.6/bgerror.tcl', 'DATA'),
('_tk_data/listbox.tcl', '/usr/share/tcltk/tk8.6/listbox.tcl', 'DATA'),
('_tcl_data/msgs/es_mx.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_mx.msg',
'DATA'),
('_tk_data/msgs/it.msg', '/usr/share/tcltk/tk8.6/msgs/it.msg', 'DATA'),
('_tcl_data/encoding/iso8859-2.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-2.enc',
'DATA'),
('_tcl_data/encoding/cp1250.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp1250.enc',
'DATA'),
('_tcl_data/encoding/macThai.enc',
'/usr/share/tcltk/tcl8.6/encoding/macThai.enc',
'DATA'),
('_tcl_data/encoding/macGreek.enc',
'/usr/share/tcltk/tcl8.6/encoding/macGreek.enc',
'DATA'),
('_tcl_data/opt0.4/optparse.tcl',
'/usr/share/tcltk/tcl8.6/opt0.4/optparse.tcl',
'DATA'),
('_tk_data/msgs/ru.msg', '/usr/share/tcltk/tk8.6/msgs/ru.msg', 'DATA'),
('_tcl_data/encoding/ksc5601.enc',
'/usr/share/tcltk/tcl8.6/encoding/ksc5601.enc',
'DATA'),
('_tcl_data/encoding/jis0212.enc',
'/usr/share/tcltk/tcl8.6/encoding/jis0212.enc',
'DATA'),
('_tcl_data/encoding/tis-620.enc',
'/usr/share/tcltk/tcl8.6/encoding/tis-620.enc',
'DATA'),
('_tk_data/tk.tcl', '/usr/share/tcltk/tk8.6/tk.tcl', 'DATA'),
('_tk_data/console.tcl', '/usr/share/tcltk/tk8.6/console.tcl', 'DATA'),
('_tcl_data/msgs/it_ch.msg',
'/usr/share/tcltk/tcl8.6/msgs/it_ch.msg',
'DATA'),
('_tcl_data/encoding/macDingbats.enc',
'/usr/share/tcltk/tcl8.6/encoding/macDingbats.enc',
'DATA'),
('_tcl_data/encoding/cp437.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp437.enc',
'DATA'),
('_tcl_data/msgs/en_be.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_be.msg',
'DATA'),
('_tcl_data/tcl8/platform-1.0.19.tm',
'/usr/share/tcltk/tcl8.6/tcl8/platform-1.0.19.tm',
'DATA'),
('_tcl_data/msgs/pt_br.msg',
'/usr/share/tcltk/tcl8.6/msgs/pt_br.msg',
'DATA'),
('_tcl_data/clock.tcl', '/usr/share/tcltk/tcl8.6/clock.tcl', 'DATA'),
('_tk_data/ttk/spinbox.tcl',
'/usr/share/tcltk/tk8.6/ttk/spinbox.tcl',
'DATA'),
('_tcl_data/encoding/iso8859-7.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-7.enc',
'DATA'),
('_tk_data/obsolete.tcl', '/usr/share/tcltk/tk8.6/obsolete.tcl', 'DATA'),
('_tcl_data/tcl8/http-2.9.8.tm',
'/usr/share/tcltk/tcl8.6/tcl8/http-2.9.8.tm',
'DATA'),
('_tcl_data/msgs/es_ec.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_ec.msg',
'DATA'),
('_tk_data/msgs/pt.msg', '/usr/share/tcltk/tk8.6/msgs/pt.msg', 'DATA'),
('_tcl_data/encoding/cns11643.enc',
'/usr/share/tcltk/tcl8.6/encoding/cns11643.enc',
'DATA'),
('_tk_data/focus.tcl', '/usr/share/tcltk/tk8.6/focus.tcl', 'DATA'),
('_tcl_data/msgs/is.msg', '/usr/share/tcltk/tcl8.6/msgs/is.msg', 'DATA'),
('_tcl_data/msgs/en_hk.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_hk.msg',
'DATA'),
('_tcl_data/msgs/bn.msg', '/usr/share/tcltk/tcl8.6/msgs/bn.msg', 'DATA'),
('_tcl_data/encoding/cp861.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp861.enc',
'DATA'),
('_tcl_data/msgs/kw_gb.msg',
'/usr/share/tcltk/tcl8.6/msgs/kw_gb.msg',
'DATA'),
('_tcl_data/encoding/cp869.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp869.enc',
'DATA'),
('_tcl_data/msgs/en_zw.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_zw.msg',
'DATA'),
('_tk_data/button.tcl', '/usr/share/tcltk/tk8.6/button.tcl', 'DATA'),
('_tk_data/ttk/treeview.tcl',
'/usr/share/tcltk/tk8.6/ttk/treeview.tcl',
'DATA'),
('_tcl_data/msgs/es_cl.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_cl.msg',
'DATA'),
('_tk_data/ttk/defaults.tcl',
'/usr/share/tcltk/tk8.6/ttk/defaults.tcl',
'DATA'),
('_tcl_data/encoding/cp932.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp932.enc',
'DATA'),
('_tk_data/xmfbox.tcl', '/usr/share/tcltk/tk8.6/xmfbox.tcl', 'DATA'),
('_tcl_data/msgs/el.msg', '/usr/share/tcltk/tcl8.6/msgs/el.msg', 'DATA'),
('_tcl_data/msgs/fo.msg', '/usr/share/tcltk/tcl8.6/msgs/fo.msg', 'DATA'),
('_tcl_data/encoding/cp949.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp949.enc',
'DATA'),
('_tcl_data/safe.tcl', '/usr/share/tcltk/tcl8.6/safe.tcl', 'DATA'),
('_tk_data/images/pwrdLogo150.gif',
'/usr/share/tcltk/tk8.6/images/pwrdLogo150.gif',
'DATA'),
('_tk_data/entry.tcl', '/usr/share/tcltk/tk8.6/entry.tcl', 'DATA'),
('_tcl_data/msgs/vi.msg', '/usr/share/tcltk/tcl8.6/msgs/vi.msg', 'DATA'),
('_tcl_data/http1.0/pkgIndex.tcl',
'/usr/share/tcltk/tcl8.6/http1.0/pkgIndex.tcl',
'DATA'),
('_tk_data/msgs/de.msg', '/usr/share/tcltk/tk8.6/msgs/de.msg', 'DATA'),
('_tcl_data/encoding/cp855.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp855.enc',
'DATA'),
('_tcl_data/msgs/ar_lb.msg',
'/usr/share/tcltk/tcl8.6/msgs/ar_lb.msg',
'DATA'),
('_tcl_data/msgs/eu_es.msg',
'/usr/share/tcltk/tcl8.6/msgs/eu_es.msg',
'DATA'),
('_tcl_data/msgs/cs.msg', '/usr/share/tcltk/tcl8.6/msgs/cs.msg', 'DATA'),
('_tcl_data/encoding/cp862.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp862.enc',
'DATA'),
('_tcl_data/msgs/pt.msg', '/usr/share/tcltk/tcl8.6/msgs/pt.msg', 'DATA'),
('_tk_data/ttk/progress.tcl',
'/usr/share/tcltk/tk8.6/ttk/progress.tcl',
'DATA'),
('_tcl_data/encoding/gb2312-raw.enc',
'/usr/share/tcltk/tcl8.6/encoding/gb2312-raw.enc',
'DATA'),
('_tk_data/clrpick.tcl', '/usr/share/tcltk/tk8.6/clrpick.tcl', 'DATA'),
('_tcl_data/encoding/shiftjis.enc',
'/usr/share/tcltk/tcl8.6/encoding/shiftjis.enc',
'DATA'),
('_tcl_data/msgs/nb.msg', '/usr/share/tcltk/tcl8.6/msgs/nb.msg', 'DATA'),
('_tcl_data/msgs/he.msg', '/usr/share/tcltk/tcl8.6/msgs/he.msg', 'DATA'),
('_tk_data/msgs/fr.msg', '/usr/share/tcltk/tk8.6/msgs/fr.msg', 'DATA'),
('_tk_data/comdlg.tcl', '/usr/share/tcltk/tk8.6/comdlg.tcl', 'DATA'),
('_tcl_data/http1.0/http.tcl',
'/usr/share/tcltk/tcl8.6/http1.0/http.tcl',
'DATA'),
('_tcl_data/msgs/fa.msg', '/usr/share/tcltk/tcl8.6/msgs/fa.msg', 'DATA'),
('_tcl_data/encoding/gb1988.enc',
'/usr/share/tcltk/tcl8.6/encoding/gb1988.enc',
'DATA'),
('_tk_data/images/logo100.gif',
'/usr/share/tcltk/tk8.6/images/logo100.gif',
'DATA'),
('_tcl_data/msgs/es_gt.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_gt.msg',
'DATA'),
('_tcl_data/msgs/ta_in.msg',
'/usr/share/tcltk/tcl8.6/msgs/ta_in.msg',
'DATA'),
('_tcl_data/encoding/cp863.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp863.enc',
'DATA'),
('_tcl_data/msgs/tr.msg', '/usr/share/tcltk/tcl8.6/msgs/tr.msg', 'DATA'),
('_tcl_data/msgs/es_pr.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_pr.msg',
'DATA'),
('_tcl_data/msgs/ca.msg', '/usr/share/tcltk/tcl8.6/msgs/ca.msg', 'DATA'),
('_tk_data/menu.tcl', '/usr/share/tcltk/tk8.6/menu.tcl', 'DATA'),
('_tk_data/msgs/da.msg', '/usr/share/tcltk/tk8.6/msgs/da.msg', 'DATA'),
('_tk_data/images/README', '/usr/share/tcltk/tk8.6/images/README', 'DATA'),
('_tcl_data/encoding/iso8859-1.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-1.enc',
'DATA'),
('_tcl_data/msgs/es_py.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_py.msg',
'DATA'),
('_tk_data/ttk/notebook.tcl',
'/usr/share/tcltk/tk8.6/ttk/notebook.tcl',
'DATA'),
('_tcl_data/msgs/ar_in.msg',
'/usr/share/tcltk/tcl8.6/msgs/ar_in.msg',
'DATA'),
('_tcl_data/encoding/cp1258.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp1258.enc',
'DATA'),
('_tcl_data/msgs/hi_in.msg',
'/usr/share/tcltk/tcl8.6/msgs/hi_in.msg',
'DATA'),
('_tcl_data/msgs/de.msg', '/usr/share/tcltk/tcl8.6/msgs/de.msg', 'DATA'),
('_tk_data/ttk/button.tcl', '/usr/share/tcltk/tk8.6/ttk/button.tcl', 'DATA'),
('_tk_data/msgs/eo.msg', '/usr/share/tcltk/tk8.6/msgs/eo.msg', 'DATA'),
('_tcl_data/msgs/id_id.msg',
'/usr/share/tcltk/tcl8.6/msgs/id_id.msg',
'DATA'),
('_tcl_data/msgs/en_sg.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_sg.msg',
'DATA'),
('_tcl_data/msgs/es_ve.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_ve.msg',
'DATA'),
('_tcl_data/msgs/te_in.msg',
'/usr/share/tcltk/tcl8.6/msgs/te_in.msg',
'DATA'),
('_tcl_data/encoding/macCyrillic.enc',
'/usr/share/tcltk/tcl8.6/encoding/macCyrillic.enc',
'DATA'),
('_tcl_data/encoding/cp950.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp950.enc',
'DATA'),
('_tcl_data/encoding/iso8859-11.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-11.enc',
'DATA'),
('_tcl_data/msgs/en_in.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_in.msg',
'DATA'),
('_tcl_data/encoding/iso2022-jp.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso2022-jp.enc',
'DATA'),
('_tk_data/ttk/utils.tcl', '/usr/share/tcltk/tk8.6/ttk/utils.tcl', 'DATA'),
('_tcl_data/msgs/te.msg', '/usr/share/tcltk/tcl8.6/msgs/te.msg', 'DATA'),
('_tcl_data/msgs/ko_kr.msg',
'/usr/share/tcltk/tcl8.6/msgs/ko_kr.msg',
'DATA'),
('_tk_data/images/logo.eps',
'/usr/share/tcltk/tk8.6/images/logo.eps',
'DATA'),
('_tcl_data/msgs/gv_gb.msg',
'/usr/share/tcltk/tcl8.6/msgs/gv_gb.msg',
'DATA'),
('_tk_data/scrlbar.tcl', '/usr/share/tcltk/tk8.6/scrlbar.tcl', 'DATA'),
('_tcl_data/msgs/en_ca.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_ca.msg',
'DATA'),
('_tk_data/images/pwrdLogo200.gif',
'/usr/share/tcltk/tk8.6/images/pwrdLogo200.gif',
'DATA'),
('_tcl_data/msgs/es_do.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_do.msg',
'DATA'),
('_tcl_data/msgs/nn.msg', '/usr/share/tcltk/tcl8.6/msgs/nn.msg', 'DATA'),
('_tk_data/megawidget.tcl', '/usr/share/tcltk/tk8.6/megawidget.tcl', 'DATA'),
('_tcl_data/encoding/ascii.enc',
'/usr/share/tcltk/tcl8.6/encoding/ascii.enc',
'DATA'),
('_tcl_data/encoding/cp775.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp775.enc',
'DATA'),
('_tcl_data/msgs/en_nz.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_nz.msg',
'DATA'),
('_tcl_data/msgs/eu.msg', '/usr/share/tcltk/tcl8.6/msgs/eu.msg', 'DATA'),
('_tcl_data/msgs/es_cr.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_cr.msg',
'DATA'),
('_tcl_data/msgs/es_sv.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_sv.msg',
'DATA'),
('_tcl_data/msgs/af_za.msg',
'/usr/share/tcltk/tcl8.6/msgs/af_za.msg',
'DATA'),
('_tcl_data/msgs/es_pa.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_pa.msg',
'DATA'),
('_tk_data/ttk/fonts.tcl', '/usr/share/tcltk/tk8.6/ttk/fonts.tcl', 'DATA'),
('_tk_data/images/pwrdLogo100.gif',
'/usr/share/tcltk/tk8.6/images/pwrdLogo100.gif',
'DATA'),
('_tcl_data/msgs/zh_hk.msg',
'/usr/share/tcltk/tcl8.6/msgs/zh_hk.msg',
'DATA'),
('_tk_data/mkpsenc.tcl', '/usr/share/tcltk/tk8.6/mkpsenc.tcl', 'DATA'),
('_tcl_data/msgs/ko.msg', '/usr/share/tcltk/tcl8.6/msgs/ko.msg', 'DATA'),
('_tcl_data/encoding/iso8859-5.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-5.enc',
'DATA'),
('base_library.zip',
'/home/ubuntu/pointcab_renamer/build/pointcab_renamer/base_library.zip',
'DATA')],
[],
False,
False,
1768557080,
[('run',
'/home/ubuntu/.local/lib/python3.11/site-packages/PyInstaller/bootloader/Linux-64bit-intel/run',
'EXECUTABLE')],
'/opt/computersetup/.pyenv/versions/3.11.6/lib/libpython3.11.so.1.0')

View File

@ -0,0 +1,908 @@
('/home/ubuntu/pointcab_renamer/build/pointcab_renamer/pointcab_renamer.pkg',
{'BINARY': True,
'DATA': True,
'EXECUTABLE': True,
'EXTENSION': True,
'PYMODULE': True,
'PYSOURCE': True,
'PYZ': False,
'SPLASH': True,
'SYMLINK': False},
[('pyi-contents-directory _internal', '', 'OPTION'),
('PYZ-00.pyz',
'/home/ubuntu/pointcab_renamer/build/pointcab_renamer/PYZ-00.pyz',
'PYZ'),
('python3.11/lib-dynload/_struct.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_struct.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/zlib.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/zlib.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('struct',
'/home/ubuntu/pointcab_renamer/build/pointcab_renamer/localpycs/struct.pyc',
'PYMODULE'),
('pyimod01_archive',
'/home/ubuntu/pointcab_renamer/build/pointcab_renamer/localpycs/pyimod01_archive.pyc',
'PYMODULE'),
('pyimod02_importers',
'/home/ubuntu/pointcab_renamer/build/pointcab_renamer/localpycs/pyimod02_importers.pyc',
'PYMODULE'),
('pyimod03_ctypes',
'/home/ubuntu/pointcab_renamer/build/pointcab_renamer/localpycs/pyimod03_ctypes.pyc',
'PYMODULE'),
('pyiboot01_bootstrap',
'/home/ubuntu/.local/lib/python3.11/site-packages/PyInstaller/loader/pyiboot01_bootstrap.py',
'PYSOURCE'),
('pyi_rth_inspect',
'/home/ubuntu/.local/lib/python3.11/site-packages/PyInstaller/hooks/rthooks/pyi_rth_inspect.py',
'PYSOURCE'),
('pyi_rth__tkinter',
'/home/ubuntu/.local/lib/python3.11/site-packages/PyInstaller/hooks/rthooks/pyi_rth__tkinter.py',
'PYSOURCE'),
('pointcab_renamer',
'/home/ubuntu/pointcab_renamer/pointcab_renamer.py',
'PYSOURCE'),
('libpython3.11.so.1.0',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/libpython3.11.so.1.0',
'BINARY'),
('python3.11/lib-dynload/_typing.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_typing.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_statistics.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_statistics.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_contextvars.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_contextvars.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_decimal.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_decimal.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_hashlib.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_hashlib.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_sha3.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_sha3.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_blake2.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_blake2.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_sha256.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_sha256.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_md5.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_md5.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_sha1.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_sha1.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_sha512.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_sha512.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_random.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_random.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_bisect.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_bisect.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/math.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/math.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/unicodedata.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/unicodedata.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/array.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/array.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/select.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/select.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_socket.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_socket.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_csv.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_csv.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/resource.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/resource.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_lzma.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_lzma.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_bz2.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_bz2.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/binascii.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/binascii.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_opcode.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_opcode.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_pickle.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_pickle.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_multibytecodec.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_multibytecodec.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_codecs_jp.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_codecs_jp.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_codecs_kr.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_codecs_kr.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_codecs_iso2022.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_codecs_iso2022.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_codecs_cn.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_codecs_cn.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_codecs_tw.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_codecs_tw.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_codecs_hk.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_codecs_hk.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_heapq.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_heapq.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_uuid.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_uuid.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/grp.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/grp.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_posixsubprocess.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_posixsubprocess.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/fcntl.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/fcntl.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_elementtree.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_elementtree.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/pyexpat.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/pyexpat.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/termios.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/termios.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_ssl.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_ssl.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_datetime.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_datetime.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.11/lib-dynload/_tkinter.cpython-311-x86_64-linux-gnu.so',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lib-dynload/_tkinter.cpython-311-x86_64-linux-gnu.so',
'EXTENSION'),
('libcrypto.so.3', '/lib/x86_64-linux-gnu/libcrypto.so.3', 'BINARY'),
('liblzma.so.5', '/lib/x86_64-linux-gnu/liblzma.so.5', 'BINARY'),
('libbz2.so.1.0', '/lib/x86_64-linux-gnu/libbz2.so.1.0', 'BINARY'),
('libz.so.1', '/lib/x86_64-linux-gnu/libz.so.1', 'BINARY'),
('libuuid.so.1', '/lib/x86_64-linux-gnu/libuuid.so.1', 'BINARY'),
('libssl.so.3', '/lib/x86_64-linux-gnu/libssl.so.3', 'BINARY'),
('libfreetype.so.6', '/lib/x86_64-linux-gnu/libfreetype.so.6', 'BINARY'),
('libXau.so.6', '/lib/x86_64-linux-gnu/libXau.so.6', 'BINARY'),
('libbrotlicommon.so.1',
'/lib/x86_64-linux-gnu/libbrotlicommon.so.1',
'BINARY'),
('libtk8.6.so', '/lib/x86_64-linux-gnu/libtk8.6.so', 'BINARY'),
('libtcl8.6.so', '/lib/x86_64-linux-gnu/libtcl8.6.so', 'BINARY'),
('libmd.so.0', '/lib/x86_64-linux-gnu/libmd.so.0', 'BINARY'),
('libexpat.so.1', '/lib/x86_64-linux-gnu/libexpat.so.1', 'BINARY'),
('libXext.so.6', '/lib/x86_64-linux-gnu/libXext.so.6', 'BINARY'),
('libXdmcp.so.6', '/lib/x86_64-linux-gnu/libXdmcp.so.6', 'BINARY'),
('libbrotlidec.so.1', '/lib/x86_64-linux-gnu/libbrotlidec.so.1', 'BINARY'),
('libpng16.so.16', '/lib/x86_64-linux-gnu/libpng16.so.16', 'BINARY'),
('libfontconfig.so.1', '/lib/x86_64-linux-gnu/libfontconfig.so.1', 'BINARY'),
('libXrender.so.1', '/lib/x86_64-linux-gnu/libXrender.so.1', 'BINARY'),
('libXft.so.2', '/lib/x86_64-linux-gnu/libXft.so.2', 'BINARY'),
('libX11.so.6', '/lib/x86_64-linux-gnu/libX11.so.6', 'BINARY'),
('libbsd.so.0', '/lib/x86_64-linux-gnu/libbsd.so.0', 'BINARY'),
('libXss.so.1', '/lib/x86_64-linux-gnu/libXss.so.1', 'BINARY'),
('cluster_cleanup.txt',
'/home/ubuntu/pointcab_renamer/cluster_cleanup.txt',
'DATA'),
('_tcl_data/tcl8/tcltest-2.5.5.tm',
'/usr/share/tcltk/tcl8.6/tcl8/tcltest-2.5.5.tm',
'DATA'),
('_tk_data/choosedir.tcl', '/usr/share/tcltk/tk8.6/choosedir.tcl', 'DATA'),
('_tcl_data/msgs/fr_ca.msg',
'/usr/share/tcltk/tcl8.6/msgs/fr_ca.msg',
'DATA'),
('_tcl_data/msgs/fi.msg', '/usr/share/tcltk/tcl8.6/msgs/fi.msg', 'DATA'),
('_tcl_data/encoding/cp874.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp874.enc',
'DATA'),
('_tk_data/ttk/ttk.tcl', '/usr/share/tcltk/tk8.6/ttk/ttk.tcl', 'DATA'),
('_tcl_data/msgs/bn_in.msg',
'/usr/share/tcltk/tcl8.6/msgs/bn_in.msg',
'DATA'),
('_tcl_data/encoding/cp850.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp850.enc',
'DATA'),
('_tcl_data/msgs/hu.msg', '/usr/share/tcltk/tcl8.6/msgs/hu.msg', 'DATA'),
('_tk_data/dialog.tcl', '/usr/share/tcltk/tk8.6/dialog.tcl', 'DATA'),
('_tk_data/ttk/sizegrip.tcl',
'/usr/share/tcltk/tk8.6/ttk/sizegrip.tcl',
'DATA'),
('_tcl_data/msgs/mk.msg', '/usr/share/tcltk/tcl8.6/msgs/mk.msg', 'DATA'),
('_tk_data/images/logoMed.gif',
'/usr/share/tcltk/tk8.6/images/logoMed.gif',
'DATA'),
('_tcl_data/msgs/sq.msg', '/usr/share/tcltk/tcl8.6/msgs/sq.msg', 'DATA'),
('_tk_data/ttk/vistaTheme.tcl',
'/usr/share/tcltk/tk8.6/ttk/vistaTheme.tcl',
'DATA'),
('_tk_data/msgs/pl.msg', '/usr/share/tcltk/tk8.6/msgs/pl.msg', 'DATA'),
('_tk_data/ttk/scrollbar.tcl',
'/usr/share/tcltk/tk8.6/ttk/scrollbar.tcl',
'DATA'),
('_tk_data/panedwindow.tcl',
'/usr/share/tcltk/tk8.6/panedwindow.tcl',
'DATA'),
('_tcl_data/encoding/iso2022.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso2022.enc',
'DATA'),
('_tcl_data/encoding/euc-jp.enc',
'/usr/share/tcltk/tcl8.6/encoding/euc-jp.enc',
'DATA'),
('_tcl_data/tcl8/msgcat-1.6.1.tm',
'/usr/share/tcltk/tcl8.6/tcl8/msgcat-1.6.1.tm',
'DATA'),
('_tcl_data/encoding/dingbats.enc',
'/usr/share/tcltk/tcl8.6/encoding/dingbats.enc',
'DATA'),
('_tcl_data/encoding/macRoman.enc',
'/usr/share/tcltk/tcl8.6/encoding/macRoman.enc',
'DATA'),
('_tk_data/tkAppInit.c', '/usr/share/tcltk/tk8.6/tkAppInit.c', 'DATA'),
('_tk_data/ttk/combobox.tcl',
'/usr/share/tcltk/tk8.6/ttk/combobox.tcl',
'DATA'),
('_tcl_data/msgs/fr.msg', '/usr/share/tcltk/tcl8.6/msgs/fr.msg', 'DATA'),
('_tcl_data/tclIndex', '/usr/share/tcltk/tcl8.6/tclIndex', 'DATA'),
('_tk_data/msgs/en.msg', '/usr/share/tcltk/tk8.6/msgs/en.msg', 'DATA'),
('_tcl_data/msgs/en_ph.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_ph.msg',
'DATA'),
('_tk_data/images/pwrdLogo75.gif',
'/usr/share/tcltk/tk8.6/images/pwrdLogo75.gif',
'DATA'),
('_tcl_data/msgs/zh_cn.msg',
'/usr/share/tcltk/tcl8.6/msgs/zh_cn.msg',
'DATA'),
('_tcl_data/encoding/cp866.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp866.enc',
'DATA'),
('_tcl_data/msgs/mr.msg', '/usr/share/tcltk/tcl8.6/msgs/mr.msg', 'DATA'),
('_tk_data/ttk/winTheme.tcl',
'/usr/share/tcltk/tk8.6/ttk/winTheme.tcl',
'DATA'),
('_tcl_data/msgs/es_hn.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_hn.msg',
'DATA'),
('_tcl_data/msgs/th.msg', '/usr/share/tcltk/tcl8.6/msgs/th.msg', 'DATA'),
('_tk_data/msgs/hu.msg', '/usr/share/tcltk/tk8.6/msgs/hu.msg', 'DATA'),
('_tk_data/images/pwrdLogo175.gif',
'/usr/share/tcltk/tk8.6/images/pwrdLogo175.gif',
'DATA'),
('_tcl_data/encoding/iso8859-9.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-9.enc',
'DATA'),
('_tk_data/tkfbox.tcl', '/usr/share/tcltk/tk8.6/tkfbox.tcl', 'DATA'),
('_tcl_data/msgs/sk.msg', '/usr/share/tcltk/tcl8.6/msgs/sk.msg', 'DATA'),
('_tcl_data/encoding/macUkraine.enc',
'/usr/share/tcltk/tcl8.6/encoding/macUkraine.enc',
'DATA'),
('_tcl_data/encoding/ebcdic.enc',
'/usr/share/tcltk/tcl8.6/encoding/ebcdic.enc',
'DATA'),
('_tk_data/ttk/clamTheme.tcl',
'/usr/share/tcltk/tk8.6/ttk/clamTheme.tcl',
'DATA'),
('_tcl_data/encoding/macJapan.enc',
'/usr/share/tcltk/tcl8.6/encoding/macJapan.enc',
'DATA'),
('_tk_data/msgs/fi.msg', '/usr/share/tcltk/tk8.6/msgs/fi.msg', 'DATA'),
('_tcl_data/tm.tcl', '/usr/share/tcltk/tcl8.6/tm.tcl', 'DATA'),
('_tk_data/images/logoLarge.gif',
'/usr/share/tcltk/tk8.6/images/logoLarge.gif',
'DATA'),
('_tcl_data/msgs/ja.msg', '/usr/share/tcltk/tcl8.6/msgs/ja.msg', 'DATA'),
('_tcl_data/msgs/gl.msg', '/usr/share/tcltk/tcl8.6/msgs/gl.msg', 'DATA'),
('_tk_data/safetk.tcl', '/usr/share/tcltk/tk8.6/safetk.tcl', 'DATA'),
('_tcl_data/msgs/kok.msg', '/usr/share/tcltk/tcl8.6/msgs/kok.msg', 'DATA'),
('_tcl_data/msgs/mr_in.msg',
'/usr/share/tcltk/tcl8.6/msgs/mr_in.msg',
'DATA'),
('_tk_data/iconlist.tcl', '/usr/share/tcltk/tk8.6/iconlist.tcl', 'DATA'),
('_tcl_data/msgs/es_ni.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_ni.msg',
'DATA'),
('_tcl_data/encoding/macRomania.enc',
'/usr/share/tcltk/tcl8.6/encoding/macRomania.enc',
'DATA'),
('_tk_data/fontchooser.tcl',
'/usr/share/tcltk/tk8.6/fontchooser.tcl',
'DATA'),
('_tk_data/ttk/entry.tcl', '/usr/share/tcltk/tk8.6/ttk/entry.tcl', 'DATA'),
('_tcl_data/encoding/cp737.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp737.enc',
'DATA'),
('_tcl_data/msgs/zh_tw.msg',
'/usr/share/tcltk/tcl8.6/msgs/zh_tw.msg',
'DATA'),
('_tcl_data/msgs/es_co.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_co.msg',
'DATA'),
('_tcl_data/msgs/pl.msg', '/usr/share/tcltk/tcl8.6/msgs/pl.msg', 'DATA'),
('_tk_data/images/logo64.gif',
'/usr/share/tcltk/tk8.6/images/logo64.gif',
'DATA'),
('_tcl_data/msgs/sl.msg', '/usr/share/tcltk/tcl8.6/msgs/sl.msg', 'DATA'),
('_tk_data/msgs/en_gb.msg', '/usr/share/tcltk/tk8.6/msgs/en_gb.msg', 'DATA'),
('_tcl_data/msgs/kl.msg', '/usr/share/tcltk/tcl8.6/msgs/kl.msg', 'DATA'),
('_tcl_data/encoding/cp864.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp864.enc',
'DATA'),
('_tcl_data/msgs/lv.msg', '/usr/share/tcltk/tcl8.6/msgs/lv.msg', 'DATA'),
('_tcl_data/encoding/iso8859-8.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-8.enc',
'DATA'),
('_tcl_data/msgs/de_be.msg',
'/usr/share/tcltk/tcl8.6/msgs/de_be.msg',
'DATA'),
('_tcl_data/encoding/cp936.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp936.enc',
'DATA'),
('_tcl_data/msgs/hr.msg', '/usr/share/tcltk/tcl8.6/msgs/hr.msg', 'DATA'),
('_tcl_data/encoding/big5.enc',
'/usr/share/tcltk/tcl8.6/encoding/big5.enc',
'DATA'),
('_tcl_data/encoding/macIceland.enc',
'/usr/share/tcltk/tcl8.6/encoding/macIceland.enc',
'DATA'),
('_tcl_data/history.tcl', '/usr/share/tcltk/tcl8.6/history.tcl', 'DATA'),
('_tcl_data/msgs/hi.msg', '/usr/share/tcltk/tcl8.6/msgs/hi.msg', 'DATA'),
('_tcl_data/msgs/kw.msg', '/usr/share/tcltk/tcl8.6/msgs/kw.msg', 'DATA'),
('_tcl_data/msgs/en_au.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_au.msg',
'DATA'),
('_tk_data/ttk/scale.tcl', '/usr/share/tcltk/tk8.6/ttk/scale.tcl', 'DATA'),
('_tcl_data/msgs/fa_in.msg',
'/usr/share/tcltk/tcl8.6/msgs/fa_in.msg',
'DATA'),
('_tcl_data/encoding/iso8859-4.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-4.enc',
'DATA'),
('_tcl_data/msgs/ru_ua.msg',
'/usr/share/tcltk/tcl8.6/msgs/ru_ua.msg',
'DATA'),
('_tcl_data/encoding/iso8859-6.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-6.enc',
'DATA'),
('_tcl_data/encoding/cp1251.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp1251.enc',
'DATA'),
('_tcl_data/msgs/es_pe.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_pe.msg',
'DATA'),
('_tcl_data/opt0.4/pkgIndex.tcl',
'/usr/share/tcltk/tcl8.6/opt0.4/pkgIndex.tcl',
'DATA'),
('_tcl_data/msgs/et.msg', '/usr/share/tcltk/tcl8.6/msgs/et.msg', 'DATA'),
('_tcl_data/msgs/kl_gl.msg',
'/usr/share/tcltk/tcl8.6/msgs/kl_gl.msg',
'DATA'),
('_tcl_data/encoding/cp1256.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp1256.enc',
'DATA'),
('_tcl_data/encoding/jis0201.enc',
'/usr/share/tcltk/tcl8.6/encoding/jis0201.enc',
'DATA'),
('_tk_data/text.tcl', '/usr/share/tcltk/tk8.6/text.tcl', 'DATA'),
('_tk_data/images/tai-ku.gif',
'/usr/share/tcltk/tk8.6/images/tai-ku.gif',
'DATA'),
('_tcl_data/msgs/kok_in.msg',
'/usr/share/tcltk/tcl8.6/msgs/kok_in.msg',
'DATA'),
('_tk_data/ttk/xpTheme.tcl',
'/usr/share/tcltk/tk8.6/ttk/xpTheme.tcl',
'DATA'),
('_tk_data/icons.tcl', '/usr/share/tcltk/tk8.6/icons.tcl', 'DATA'),
('_tcl_data/msgs/sv.msg', '/usr/share/tcltk/tcl8.6/msgs/sv.msg', 'DATA'),
('_tk_data/ttk/aquaTheme.tcl',
'/usr/share/tcltk/tk8.6/ttk/aquaTheme.tcl',
'DATA'),
('_tcl_data/msgs/lt.msg', '/usr/share/tcltk/tcl8.6/msgs/lt.msg', 'DATA'),
('_tcl_data/msgs/fo_fo.msg',
'/usr/share/tcltk/tcl8.6/msgs/fo_fo.msg',
'DATA'),
('_tcl_data/encoding/macCentEuro.enc',
'/usr/share/tcltk/tcl8.6/encoding/macCentEuro.enc',
'DATA'),
('_tcl_data/msgs/en_bw.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_bw.msg',
'DATA'),
('_tcl_data/encoding/iso8859-14.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-14.enc',
'DATA'),
('_tk_data/ttk/altTheme.tcl',
'/usr/share/tcltk/tk8.6/ttk/altTheme.tcl',
'DATA'),
('_tcl_data/encoding/gb2312.enc',
'/usr/share/tcltk/tcl8.6/encoding/gb2312.enc',
'DATA'),
('_tcl_data/encoding/cp1252.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp1252.enc',
'DATA'),
('_tcl_data/encoding/cp1255.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp1255.enc',
'DATA'),
('_tk_data/palette.tcl', '/usr/share/tcltk/tk8.6/palette.tcl', 'DATA'),
('_tcl_data/msgs/eo.msg', '/usr/share/tcltk/tcl8.6/msgs/eo.msg', 'DATA'),
('_tcl_data/encoding/iso8859-13.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-13.enc',
'DATA'),
('_tcl_data/msgs/nl.msg', '/usr/share/tcltk/tcl8.6/msgs/nl.msg', 'DATA'),
('_tcl_data/msgs/en_ie.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_ie.msg',
'DATA'),
('_tcl_data/msgs/es_bo.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_bo.msg',
'DATA'),
('_tcl_data/msgs/ta.msg', '/usr/share/tcltk/tcl8.6/msgs/ta.msg', 'DATA'),
('_tcl_data/encoding/euc-kr.enc',
'/usr/share/tcltk/tcl8.6/encoding/euc-kr.enc',
'DATA'),
('_tk_data/scale.tcl', '/usr/share/tcltk/tk8.6/scale.tcl', 'DATA'),
('_tcl_data/tclAppInit.c', '/usr/share/tcltk/tcl8.6/tclAppInit.c', 'DATA'),
('_tcl_data/encoding/iso2022-kr.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso2022-kr.enc',
'DATA'),
('_tcl_data/msgs/ar_jo.msg',
'/usr/share/tcltk/tcl8.6/msgs/ar_jo.msg',
'DATA'),
('_tcl_data/msgs/en_gb.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_gb.msg',
'DATA'),
('_tcl_data/msgs/sh.msg', '/usr/share/tcltk/tcl8.6/msgs/sh.msg', 'DATA'),
('_tcl_data/msgs/da.msg', '/usr/share/tcltk/tcl8.6/msgs/da.msg', 'DATA'),
('_tcl_data/msgs/nl_be.msg',
'/usr/share/tcltk/tcl8.6/msgs/nl_be.msg',
'DATA'),
('_tcl_data/encoding/cp852.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp852.enc',
'DATA'),
('_tcl_data/msgs/be.msg', '/usr/share/tcltk/tcl8.6/msgs/be.msg', 'DATA'),
('_tk_data/msgs/nl.msg', '/usr/share/tcltk/tk8.6/msgs/nl.msg', 'DATA'),
('_tcl_data/msgs/fa_ir.msg',
'/usr/share/tcltk/tcl8.6/msgs/fa_ir.msg',
'DATA'),
('_tcl_data/msgs/it.msg', '/usr/share/tcltk/tcl8.6/msgs/it.msg', 'DATA'),
('_tk_data/ttk/cursors.tcl',
'/usr/share/tcltk/tk8.6/ttk/cursors.tcl',
'DATA'),
('_tcl_data/msgs/zh_sg.msg',
'/usr/share/tcltk/tcl8.6/msgs/zh_sg.msg',
'DATA'),
('_tk_data/spinbox.tcl', '/usr/share/tcltk/tk8.6/spinbox.tcl', 'DATA'),
('_tk_data/msgs/es.msg', '/usr/share/tcltk/tk8.6/msgs/es.msg', 'DATA'),
('_tk_data/msgs/el.msg', '/usr/share/tcltk/tk8.6/msgs/el.msg', 'DATA'),
('_tcl_data/msgs/ar_sy.msg',
'/usr/share/tcltk/tcl8.6/msgs/ar_sy.msg',
'DATA'),
('_tcl_data/msgs/ar.msg', '/usr/share/tcltk/tcl8.6/msgs/ar.msg', 'DATA'),
('_tcl_data/msgs/ga_ie.msg',
'/usr/share/tcltk/tcl8.6/msgs/ga_ie.msg',
'DATA'),
('_tk_data/msgs/sv.msg', '/usr/share/tcltk/tk8.6/msgs/sv.msg', 'DATA'),
('_tk_data/tclIndex', '/usr/share/tcltk/tk8.6/tclIndex', 'DATA'),
('_tcl_data/msgs/uk.msg', '/usr/share/tcltk/tcl8.6/msgs/uk.msg', 'DATA'),
('_tcl_data/word.tcl', '/usr/share/tcltk/tcl8.6/word.tcl', 'DATA'),
('_tcl_data/msgs/ga.msg', '/usr/share/tcltk/tcl8.6/msgs/ga.msg', 'DATA'),
('_tcl_data/msgs/en_za.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_za.msg',
'DATA'),
('_tcl_data/msgs/fr_be.msg',
'/usr/share/tcltk/tcl8.6/msgs/fr_be.msg',
'DATA'),
('_tk_data/msgbox.tcl', '/usr/share/tcltk/tk8.6/msgbox.tcl', 'DATA'),
('_tcl_data/encoding/cp1257.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp1257.enc',
'DATA'),
('_tcl_data/encoding/iso8859-3.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-3.enc',
'DATA'),
('_tcl_data/encoding/euc-cn.enc',
'/usr/share/tcltk/tcl8.6/encoding/euc-cn.enc',
'DATA'),
('_tcl_data/msgs/id.msg', '/usr/share/tcltk/tcl8.6/msgs/id.msg', 'DATA'),
('_tk_data/ttk/menubutton.tcl',
'/usr/share/tcltk/tk8.6/ttk/menubutton.tcl',
'DATA'),
('_tk_data/tearoff.tcl', '/usr/share/tcltk/tk8.6/tearoff.tcl', 'DATA'),
('_tk_data/optMenu.tcl', '/usr/share/tcltk/tk8.6/optMenu.tcl', 'DATA'),
('_tcl_data/tcl8/platform/shell-1.1.4.tm',
'/usr/share/tcltk/tcl8.6/tcl8/platform/shell-1.1.4.tm',
'DATA'),
('_tcl_data/encoding/cp860.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp860.enc',
'DATA'),
('_tcl_data/encoding/macCroatian.enc',
'/usr/share/tcltk/tcl8.6/encoding/macCroatian.enc',
'DATA'),
('_tcl_data/encoding/cp1253.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp1253.enc',
'DATA'),
('_tcl_data/msgs/gv.msg', '/usr/share/tcltk/tcl8.6/msgs/gv.msg', 'DATA'),
('_tcl_data/init.tcl', '/usr/share/tcltk/tcl8.6/init.tcl', 'DATA'),
('_tcl_data/msgs/fr_ch.msg',
'/usr/share/tcltk/tcl8.6/msgs/fr_ch.msg',
'DATA'),
('_tcl_data/encoding/iso8859-10.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-10.enc',
'DATA'),
('_tcl_data/msgs/bg.msg', '/usr/share/tcltk/tcl8.6/msgs/bg.msg', 'DATA'),
('_tcl_data/msgs/ro.msg', '/usr/share/tcltk/tcl8.6/msgs/ro.msg', 'DATA'),
('_tcl_data/encoding/cp857.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp857.enc',
'DATA'),
('_tcl_data/msgs/gl_es.msg',
'/usr/share/tcltk/tcl8.6/msgs/gl_es.msg',
'DATA'),
('_tcl_data/msgs/es_uy.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_uy.msg',
'DATA'),
('_tk_data/ttk/panedwindow.tcl',
'/usr/share/tcltk/tk8.6/ttk/panedwindow.tcl',
'DATA'),
('_tcl_data/msgs/af.msg', '/usr/share/tcltk/tcl8.6/msgs/af.msg', 'DATA'),
('_tcl_data/msgs/de_at.msg',
'/usr/share/tcltk/tcl8.6/msgs/de_at.msg',
'DATA'),
('_tcl_data/auto.tcl', '/usr/share/tcltk/tcl8.6/auto.tcl', 'DATA'),
('_tcl_data/msgs/ms_my.msg',
'/usr/share/tcltk/tcl8.6/msgs/ms_my.msg',
'DATA'),
('_tcl_data/msgs/ms.msg', '/usr/share/tcltk/tcl8.6/msgs/ms.msg', 'DATA'),
('_tcl_data/encoding/gb12345.enc',
'/usr/share/tcltk/tcl8.6/encoding/gb12345.enc',
'DATA'),
('_tcl_data/msgs/ru.msg', '/usr/share/tcltk/tcl8.6/msgs/ru.msg', 'DATA'),
('_tcl_data/msgs/sr.msg', '/usr/share/tcltk/tcl8.6/msgs/sr.msg', 'DATA'),
('_tcl_data/msgs/zh.msg', '/usr/share/tcltk/tcl8.6/msgs/zh.msg', 'DATA'),
('_tcl_data/msgs/mt.msg', '/usr/share/tcltk/tcl8.6/msgs/mt.msg', 'DATA'),
('_tcl_data/encoding/jis0208.enc',
'/usr/share/tcltk/tcl8.6/encoding/jis0208.enc',
'DATA'),
('_tcl_data/encoding/iso8859-15.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-15.enc',
'DATA'),
('_tk_data/msgs/zh_cn.msg', '/usr/share/tcltk/tk8.6/msgs/zh_cn.msg', 'DATA'),
('_tcl_data/encoding/iso8859-16.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-16.enc',
'DATA'),
('_tcl_data/encoding/koi8-u.enc',
'/usr/share/tcltk/tcl8.6/encoding/koi8-u.enc',
'DATA'),
('_tk_data/unsupported.tcl',
'/usr/share/tcltk/tk8.6/unsupported.tcl',
'DATA'),
('_tcl_data/encoding/cp865.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp865.enc',
'DATA'),
('_tcl_data/msgs/es_ar.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_ar.msg',
'DATA'),
('_tk_data/msgs/cs.msg', '/usr/share/tcltk/tk8.6/msgs/cs.msg', 'DATA'),
('_tcl_data/encoding/koi8-r.enc',
'/usr/share/tcltk/tcl8.6/encoding/koi8-r.enc',
'DATA'),
('_tcl_data/parray.tcl', '/usr/share/tcltk/tcl8.6/parray.tcl', 'DATA'),
('_tk_data/ttk/classicTheme.tcl',
'/usr/share/tcltk/tk8.6/ttk/classicTheme.tcl',
'DATA'),
('_tcl_data/encoding/cp1254.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp1254.enc',
'DATA'),
('_tcl_data/encoding/symbol.enc',
'/usr/share/tcltk/tcl8.6/encoding/symbol.enc',
'DATA'),
('_tcl_data/msgs/sw.msg', '/usr/share/tcltk/tcl8.6/msgs/sw.msg', 'DATA'),
('_tk_data/images/pwrdLogo.eps',
'/usr/share/tcltk/tk8.6/images/pwrdLogo.eps',
'DATA'),
('_tcl_data/msgs/es.msg', '/usr/share/tcltk/tcl8.6/msgs/es.msg', 'DATA'),
('_tcl_data/package.tcl', '/usr/share/tcltk/tcl8.6/package.tcl', 'DATA'),
('_tcl_data/encoding/macTurkish.enc',
'/usr/share/tcltk/tcl8.6/encoding/macTurkish.enc',
'DATA'),
('_tk_data/bgerror.tcl', '/usr/share/tcltk/tk8.6/bgerror.tcl', 'DATA'),
('_tk_data/listbox.tcl', '/usr/share/tcltk/tk8.6/listbox.tcl', 'DATA'),
('_tcl_data/msgs/es_mx.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_mx.msg',
'DATA'),
('_tk_data/msgs/it.msg', '/usr/share/tcltk/tk8.6/msgs/it.msg', 'DATA'),
('_tcl_data/encoding/iso8859-2.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-2.enc',
'DATA'),
('_tcl_data/encoding/cp1250.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp1250.enc',
'DATA'),
('_tcl_data/encoding/macThai.enc',
'/usr/share/tcltk/tcl8.6/encoding/macThai.enc',
'DATA'),
('_tcl_data/encoding/macGreek.enc',
'/usr/share/tcltk/tcl8.6/encoding/macGreek.enc',
'DATA'),
('_tcl_data/opt0.4/optparse.tcl',
'/usr/share/tcltk/tcl8.6/opt0.4/optparse.tcl',
'DATA'),
('_tk_data/msgs/ru.msg', '/usr/share/tcltk/tk8.6/msgs/ru.msg', 'DATA'),
('_tcl_data/encoding/ksc5601.enc',
'/usr/share/tcltk/tcl8.6/encoding/ksc5601.enc',
'DATA'),
('_tcl_data/encoding/jis0212.enc',
'/usr/share/tcltk/tcl8.6/encoding/jis0212.enc',
'DATA'),
('_tcl_data/encoding/tis-620.enc',
'/usr/share/tcltk/tcl8.6/encoding/tis-620.enc',
'DATA'),
('_tk_data/tk.tcl', '/usr/share/tcltk/tk8.6/tk.tcl', 'DATA'),
('_tk_data/console.tcl', '/usr/share/tcltk/tk8.6/console.tcl', 'DATA'),
('_tcl_data/msgs/it_ch.msg',
'/usr/share/tcltk/tcl8.6/msgs/it_ch.msg',
'DATA'),
('_tcl_data/encoding/macDingbats.enc',
'/usr/share/tcltk/tcl8.6/encoding/macDingbats.enc',
'DATA'),
('_tcl_data/encoding/cp437.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp437.enc',
'DATA'),
('_tcl_data/msgs/en_be.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_be.msg',
'DATA'),
('_tcl_data/tcl8/platform-1.0.19.tm',
'/usr/share/tcltk/tcl8.6/tcl8/platform-1.0.19.tm',
'DATA'),
('_tcl_data/msgs/pt_br.msg',
'/usr/share/tcltk/tcl8.6/msgs/pt_br.msg',
'DATA'),
('_tcl_data/clock.tcl', '/usr/share/tcltk/tcl8.6/clock.tcl', 'DATA'),
('_tk_data/ttk/spinbox.tcl',
'/usr/share/tcltk/tk8.6/ttk/spinbox.tcl',
'DATA'),
('_tcl_data/encoding/iso8859-7.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-7.enc',
'DATA'),
('_tk_data/obsolete.tcl', '/usr/share/tcltk/tk8.6/obsolete.tcl', 'DATA'),
('_tcl_data/tcl8/http-2.9.8.tm',
'/usr/share/tcltk/tcl8.6/tcl8/http-2.9.8.tm',
'DATA'),
('_tcl_data/msgs/es_ec.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_ec.msg',
'DATA'),
('_tk_data/msgs/pt.msg', '/usr/share/tcltk/tk8.6/msgs/pt.msg', 'DATA'),
('_tcl_data/encoding/cns11643.enc',
'/usr/share/tcltk/tcl8.6/encoding/cns11643.enc',
'DATA'),
('_tk_data/focus.tcl', '/usr/share/tcltk/tk8.6/focus.tcl', 'DATA'),
('_tcl_data/msgs/is.msg', '/usr/share/tcltk/tcl8.6/msgs/is.msg', 'DATA'),
('_tcl_data/msgs/en_hk.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_hk.msg',
'DATA'),
('_tcl_data/msgs/bn.msg', '/usr/share/tcltk/tcl8.6/msgs/bn.msg', 'DATA'),
('_tcl_data/encoding/cp861.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp861.enc',
'DATA'),
('_tcl_data/msgs/kw_gb.msg',
'/usr/share/tcltk/tcl8.6/msgs/kw_gb.msg',
'DATA'),
('_tcl_data/encoding/cp869.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp869.enc',
'DATA'),
('_tcl_data/msgs/en_zw.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_zw.msg',
'DATA'),
('_tk_data/button.tcl', '/usr/share/tcltk/tk8.6/button.tcl', 'DATA'),
('_tk_data/ttk/treeview.tcl',
'/usr/share/tcltk/tk8.6/ttk/treeview.tcl',
'DATA'),
('_tcl_data/msgs/es_cl.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_cl.msg',
'DATA'),
('_tk_data/ttk/defaults.tcl',
'/usr/share/tcltk/tk8.6/ttk/defaults.tcl',
'DATA'),
('_tcl_data/encoding/cp932.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp932.enc',
'DATA'),
('_tk_data/xmfbox.tcl', '/usr/share/tcltk/tk8.6/xmfbox.tcl', 'DATA'),
('_tcl_data/msgs/el.msg', '/usr/share/tcltk/tcl8.6/msgs/el.msg', 'DATA'),
('_tcl_data/msgs/fo.msg', '/usr/share/tcltk/tcl8.6/msgs/fo.msg', 'DATA'),
('_tcl_data/encoding/cp949.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp949.enc',
'DATA'),
('_tcl_data/safe.tcl', '/usr/share/tcltk/tcl8.6/safe.tcl', 'DATA'),
('_tk_data/images/pwrdLogo150.gif',
'/usr/share/tcltk/tk8.6/images/pwrdLogo150.gif',
'DATA'),
('_tk_data/entry.tcl', '/usr/share/tcltk/tk8.6/entry.tcl', 'DATA'),
('_tcl_data/msgs/vi.msg', '/usr/share/tcltk/tcl8.6/msgs/vi.msg', 'DATA'),
('_tcl_data/http1.0/pkgIndex.tcl',
'/usr/share/tcltk/tcl8.6/http1.0/pkgIndex.tcl',
'DATA'),
('_tk_data/msgs/de.msg', '/usr/share/tcltk/tk8.6/msgs/de.msg', 'DATA'),
('_tcl_data/encoding/cp855.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp855.enc',
'DATA'),
('_tcl_data/msgs/ar_lb.msg',
'/usr/share/tcltk/tcl8.6/msgs/ar_lb.msg',
'DATA'),
('_tcl_data/msgs/eu_es.msg',
'/usr/share/tcltk/tcl8.6/msgs/eu_es.msg',
'DATA'),
('_tcl_data/msgs/cs.msg', '/usr/share/tcltk/tcl8.6/msgs/cs.msg', 'DATA'),
('_tcl_data/encoding/cp862.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp862.enc',
'DATA'),
('_tcl_data/msgs/pt.msg', '/usr/share/tcltk/tcl8.6/msgs/pt.msg', 'DATA'),
('_tk_data/ttk/progress.tcl',
'/usr/share/tcltk/tk8.6/ttk/progress.tcl',
'DATA'),
('_tcl_data/encoding/gb2312-raw.enc',
'/usr/share/tcltk/tcl8.6/encoding/gb2312-raw.enc',
'DATA'),
('_tk_data/clrpick.tcl', '/usr/share/tcltk/tk8.6/clrpick.tcl', 'DATA'),
('_tcl_data/encoding/shiftjis.enc',
'/usr/share/tcltk/tcl8.6/encoding/shiftjis.enc',
'DATA'),
('_tcl_data/msgs/nb.msg', '/usr/share/tcltk/tcl8.6/msgs/nb.msg', 'DATA'),
('_tcl_data/msgs/he.msg', '/usr/share/tcltk/tcl8.6/msgs/he.msg', 'DATA'),
('_tk_data/msgs/fr.msg', '/usr/share/tcltk/tk8.6/msgs/fr.msg', 'DATA'),
('_tk_data/comdlg.tcl', '/usr/share/tcltk/tk8.6/comdlg.tcl', 'DATA'),
('_tcl_data/http1.0/http.tcl',
'/usr/share/tcltk/tcl8.6/http1.0/http.tcl',
'DATA'),
('_tcl_data/msgs/fa.msg', '/usr/share/tcltk/tcl8.6/msgs/fa.msg', 'DATA'),
('_tcl_data/encoding/gb1988.enc',
'/usr/share/tcltk/tcl8.6/encoding/gb1988.enc',
'DATA'),
('_tk_data/images/logo100.gif',
'/usr/share/tcltk/tk8.6/images/logo100.gif',
'DATA'),
('_tcl_data/msgs/es_gt.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_gt.msg',
'DATA'),
('_tcl_data/msgs/ta_in.msg',
'/usr/share/tcltk/tcl8.6/msgs/ta_in.msg',
'DATA'),
('_tcl_data/encoding/cp863.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp863.enc',
'DATA'),
('_tcl_data/msgs/tr.msg', '/usr/share/tcltk/tcl8.6/msgs/tr.msg', 'DATA'),
('_tcl_data/msgs/es_pr.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_pr.msg',
'DATA'),
('_tcl_data/msgs/ca.msg', '/usr/share/tcltk/tcl8.6/msgs/ca.msg', 'DATA'),
('_tk_data/menu.tcl', '/usr/share/tcltk/tk8.6/menu.tcl', 'DATA'),
('_tk_data/msgs/da.msg', '/usr/share/tcltk/tk8.6/msgs/da.msg', 'DATA'),
('_tk_data/images/README', '/usr/share/tcltk/tk8.6/images/README', 'DATA'),
('_tcl_data/encoding/iso8859-1.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-1.enc',
'DATA'),
('_tcl_data/msgs/es_py.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_py.msg',
'DATA'),
('_tk_data/ttk/notebook.tcl',
'/usr/share/tcltk/tk8.6/ttk/notebook.tcl',
'DATA'),
('_tcl_data/msgs/ar_in.msg',
'/usr/share/tcltk/tcl8.6/msgs/ar_in.msg',
'DATA'),
('_tcl_data/encoding/cp1258.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp1258.enc',
'DATA'),
('_tcl_data/msgs/hi_in.msg',
'/usr/share/tcltk/tcl8.6/msgs/hi_in.msg',
'DATA'),
('_tcl_data/msgs/de.msg', '/usr/share/tcltk/tcl8.6/msgs/de.msg', 'DATA'),
('_tk_data/ttk/button.tcl', '/usr/share/tcltk/tk8.6/ttk/button.tcl', 'DATA'),
('_tk_data/msgs/eo.msg', '/usr/share/tcltk/tk8.6/msgs/eo.msg', 'DATA'),
('_tcl_data/msgs/id_id.msg',
'/usr/share/tcltk/tcl8.6/msgs/id_id.msg',
'DATA'),
('_tcl_data/msgs/en_sg.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_sg.msg',
'DATA'),
('_tcl_data/msgs/es_ve.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_ve.msg',
'DATA'),
('_tcl_data/msgs/te_in.msg',
'/usr/share/tcltk/tcl8.6/msgs/te_in.msg',
'DATA'),
('_tcl_data/encoding/macCyrillic.enc',
'/usr/share/tcltk/tcl8.6/encoding/macCyrillic.enc',
'DATA'),
('_tcl_data/encoding/cp950.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp950.enc',
'DATA'),
('_tcl_data/encoding/iso8859-11.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-11.enc',
'DATA'),
('_tcl_data/msgs/en_in.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_in.msg',
'DATA'),
('_tcl_data/encoding/iso2022-jp.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso2022-jp.enc',
'DATA'),
('_tk_data/ttk/utils.tcl', '/usr/share/tcltk/tk8.6/ttk/utils.tcl', 'DATA'),
('_tcl_data/msgs/te.msg', '/usr/share/tcltk/tcl8.6/msgs/te.msg', 'DATA'),
('_tcl_data/msgs/ko_kr.msg',
'/usr/share/tcltk/tcl8.6/msgs/ko_kr.msg',
'DATA'),
('_tk_data/images/logo.eps',
'/usr/share/tcltk/tk8.6/images/logo.eps',
'DATA'),
('_tcl_data/msgs/gv_gb.msg',
'/usr/share/tcltk/tcl8.6/msgs/gv_gb.msg',
'DATA'),
('_tk_data/scrlbar.tcl', '/usr/share/tcltk/tk8.6/scrlbar.tcl', 'DATA'),
('_tcl_data/msgs/en_ca.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_ca.msg',
'DATA'),
('_tk_data/images/pwrdLogo200.gif',
'/usr/share/tcltk/tk8.6/images/pwrdLogo200.gif',
'DATA'),
('_tcl_data/msgs/es_do.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_do.msg',
'DATA'),
('_tcl_data/msgs/nn.msg', '/usr/share/tcltk/tcl8.6/msgs/nn.msg', 'DATA'),
('_tk_data/megawidget.tcl', '/usr/share/tcltk/tk8.6/megawidget.tcl', 'DATA'),
('_tcl_data/encoding/ascii.enc',
'/usr/share/tcltk/tcl8.6/encoding/ascii.enc',
'DATA'),
('_tcl_data/encoding/cp775.enc',
'/usr/share/tcltk/tcl8.6/encoding/cp775.enc',
'DATA'),
('_tcl_data/msgs/en_nz.msg',
'/usr/share/tcltk/tcl8.6/msgs/en_nz.msg',
'DATA'),
('_tcl_data/msgs/eu.msg', '/usr/share/tcltk/tcl8.6/msgs/eu.msg', 'DATA'),
('_tcl_data/msgs/es_cr.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_cr.msg',
'DATA'),
('_tcl_data/msgs/es_sv.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_sv.msg',
'DATA'),
('_tcl_data/msgs/af_za.msg',
'/usr/share/tcltk/tcl8.6/msgs/af_za.msg',
'DATA'),
('_tcl_data/msgs/es_pa.msg',
'/usr/share/tcltk/tcl8.6/msgs/es_pa.msg',
'DATA'),
('_tk_data/ttk/fonts.tcl', '/usr/share/tcltk/tk8.6/ttk/fonts.tcl', 'DATA'),
('_tk_data/images/pwrdLogo100.gif',
'/usr/share/tcltk/tk8.6/images/pwrdLogo100.gif',
'DATA'),
('_tcl_data/msgs/zh_hk.msg',
'/usr/share/tcltk/tcl8.6/msgs/zh_hk.msg',
'DATA'),
('_tk_data/mkpsenc.tcl', '/usr/share/tcltk/tk8.6/mkpsenc.tcl', 'DATA'),
('_tcl_data/msgs/ko.msg', '/usr/share/tcltk/tcl8.6/msgs/ko.msg', 'DATA'),
('_tcl_data/encoding/iso8859-5.enc',
'/usr/share/tcltk/tcl8.6/encoding/iso8859-5.enc',
'DATA'),
('base_library.zip',
'/home/ubuntu/pointcab_renamer/build/pointcab_renamer/base_library.zip',
'DATA')],
'libpython3.11.so.1.0',
False,
False,
False,
[],
None,
None,
None)

Binary file not shown.

View File

@ -0,0 +1,412 @@
('/home/ubuntu/pointcab_renamer/build/pointcab_renamer/PYZ-00.pyz',
[('_compat_pickle',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/_compat_pickle.py',
'PYMODULE'),
('_compression',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/_compression.py',
'PYMODULE'),
('_py_abc',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/_py_abc.py',
'PYMODULE'),
('_pydecimal',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/_pydecimal.py',
'PYMODULE'),
('_strptime',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/_strptime.py',
'PYMODULE'),
('_threading_local',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/_threading_local.py',
'PYMODULE'),
('argparse',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/argparse.py',
'PYMODULE'),
('ast',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/ast.py',
'PYMODULE'),
('base64',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/base64.py',
'PYMODULE'),
('bisect',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/bisect.py',
'PYMODULE'),
('bz2',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/bz2.py',
'PYMODULE'),
('calendar',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/calendar.py',
'PYMODULE'),
('contextlib',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/contextlib.py',
'PYMODULE'),
('contextvars',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/contextvars.py',
'PYMODULE'),
('copy',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/copy.py',
'PYMODULE'),
('csv',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/csv.py',
'PYMODULE'),
('dataclasses',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/dataclasses.py',
'PYMODULE'),
('datetime',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/datetime.py',
'PYMODULE'),
('decimal',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/decimal.py',
'PYMODULE'),
('dis',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/dis.py',
'PYMODULE'),
('email',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/email/__init__.py',
'PYMODULE'),
('email._encoded_words',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/email/_encoded_words.py',
'PYMODULE'),
('email._header_value_parser',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/email/_header_value_parser.py',
'PYMODULE'),
('email._parseaddr',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/email/_parseaddr.py',
'PYMODULE'),
('email._policybase',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/email/_policybase.py',
'PYMODULE'),
('email.base64mime',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/email/base64mime.py',
'PYMODULE'),
('email.charset',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/email/charset.py',
'PYMODULE'),
('email.contentmanager',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/email/contentmanager.py',
'PYMODULE'),
('email.encoders',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/email/encoders.py',
'PYMODULE'),
('email.errors',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/email/errors.py',
'PYMODULE'),
('email.feedparser',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/email/feedparser.py',
'PYMODULE'),
('email.generator',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/email/generator.py',
'PYMODULE'),
('email.header',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/email/header.py',
'PYMODULE'),
('email.headerregistry',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/email/headerregistry.py',
'PYMODULE'),
('email.iterators',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/email/iterators.py',
'PYMODULE'),
('email.message',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/email/message.py',
'PYMODULE'),
('email.parser',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/email/parser.py',
'PYMODULE'),
('email.policy',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/email/policy.py',
'PYMODULE'),
('email.quoprimime',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/email/quoprimime.py',
'PYMODULE'),
('email.utils',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/email/utils.py',
'PYMODULE'),
('fnmatch',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/fnmatch.py',
'PYMODULE'),
('fractions',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/fractions.py',
'PYMODULE'),
('ftplib',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/ftplib.py',
'PYMODULE'),
('getopt',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/getopt.py',
'PYMODULE'),
('getpass',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/getpass.py',
'PYMODULE'),
('gettext',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/gettext.py',
'PYMODULE'),
('gzip',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/gzip.py',
'PYMODULE'),
('hashlib',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/hashlib.py',
'PYMODULE'),
('http',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/http/__init__.py',
'PYMODULE'),
('http.client',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/http/client.py',
'PYMODULE'),
('http.cookiejar',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/http/cookiejar.py',
'PYMODULE'),
('importlib',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/importlib/__init__.py',
'PYMODULE'),
('importlib._abc',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/importlib/_abc.py',
'PYMODULE'),
('importlib._bootstrap',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/importlib/_bootstrap.py',
'PYMODULE'),
('importlib._bootstrap_external',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/importlib/_bootstrap_external.py',
'PYMODULE'),
('importlib.abc',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/importlib/abc.py',
'PYMODULE'),
('importlib.machinery',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/importlib/machinery.py',
'PYMODULE'),
('importlib.metadata',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/importlib/metadata/__init__.py',
'PYMODULE'),
('importlib.metadata._adapters',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/importlib/metadata/_adapters.py',
'PYMODULE'),
('importlib.metadata._collections',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/importlib/metadata/_collections.py',
'PYMODULE'),
('importlib.metadata._functools',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/importlib/metadata/_functools.py',
'PYMODULE'),
('importlib.metadata._itertools',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/importlib/metadata/_itertools.py',
'PYMODULE'),
('importlib.metadata._meta',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/importlib/metadata/_meta.py',
'PYMODULE'),
('importlib.metadata._text',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/importlib/metadata/_text.py',
'PYMODULE'),
('importlib.readers',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/importlib/readers.py',
'PYMODULE'),
('importlib.resources',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/importlib/resources/__init__.py',
'PYMODULE'),
('importlib.resources._adapters',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/importlib/resources/_adapters.py',
'PYMODULE'),
('importlib.resources._common',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/importlib/resources/_common.py',
'PYMODULE'),
('importlib.resources._itertools',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/importlib/resources/_itertools.py',
'PYMODULE'),
('importlib.resources._legacy',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/importlib/resources/_legacy.py',
'PYMODULE'),
('importlib.resources.abc',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/importlib/resources/abc.py',
'PYMODULE'),
('importlib.resources.readers',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/importlib/resources/readers.py',
'PYMODULE'),
('importlib.util',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/importlib/util.py',
'PYMODULE'),
('inspect',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/inspect.py',
'PYMODULE'),
('ipaddress',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/ipaddress.py',
'PYMODULE'),
('logging',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/logging/__init__.py',
'PYMODULE'),
('lzma',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/lzma.py',
'PYMODULE'),
('mimetypes',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/mimetypes.py',
'PYMODULE'),
('netrc',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/netrc.py',
'PYMODULE'),
('nturl2path',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/nturl2path.py',
'PYMODULE'),
('numbers',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/numbers.py',
'PYMODULE'),
('opcode',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/opcode.py',
'PYMODULE'),
('pathlib',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/pathlib.py',
'PYMODULE'),
('pickle',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/pickle.py',
'PYMODULE'),
('platform',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/platform.py',
'PYMODULE'),
('pprint',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/pprint.py',
'PYMODULE'),
('py_compile',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/py_compile.py',
'PYMODULE'),
('quopri',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/quopri.py',
'PYMODULE'),
('random',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/random.py',
'PYMODULE'),
('selectors',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/selectors.py',
'PYMODULE'),
('shlex',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/shlex.py',
'PYMODULE'),
('shutil',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/shutil.py',
'PYMODULE'),
('signal',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/signal.py',
'PYMODULE'),
('socket',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/socket.py',
'PYMODULE'),
('ssl',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/ssl.py',
'PYMODULE'),
('statistics',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/statistics.py',
'PYMODULE'),
('string',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/string.py',
'PYMODULE'),
('stringprep',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/stringprep.py',
'PYMODULE'),
('subprocess',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/subprocess.py',
'PYMODULE'),
('tarfile',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/tarfile.py',
'PYMODULE'),
('tempfile',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/tempfile.py',
'PYMODULE'),
('textwrap',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/textwrap.py',
'PYMODULE'),
('threading',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/threading.py',
'PYMODULE'),
('tkinter',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/tkinter/__init__.py',
'PYMODULE'),
('tkinter.commondialog',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/tkinter/commondialog.py',
'PYMODULE'),
('tkinter.constants',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/tkinter/constants.py',
'PYMODULE'),
('tkinter.dialog',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/tkinter/dialog.py',
'PYMODULE'),
('tkinter.filedialog',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/tkinter/filedialog.py',
'PYMODULE'),
('tkinter.messagebox',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/tkinter/messagebox.py',
'PYMODULE'),
('tkinter.scrolledtext',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/tkinter/scrolledtext.py',
'PYMODULE'),
('tkinter.simpledialog',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/tkinter/simpledialog.py',
'PYMODULE'),
('tkinter.ttk',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/tkinter/ttk.py',
'PYMODULE'),
('token',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/token.py',
'PYMODULE'),
('tokenize',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/tokenize.py',
'PYMODULE'),
('tracemalloc',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/tracemalloc.py',
'PYMODULE'),
('typing',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/typing.py',
'PYMODULE'),
('urllib',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/urllib/__init__.py',
'PYMODULE'),
('urllib.error',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/urllib/error.py',
'PYMODULE'),
('urllib.parse',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/urllib/parse.py',
'PYMODULE'),
('urllib.request',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/urllib/request.py',
'PYMODULE'),
('urllib.response',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/urllib/response.py',
'PYMODULE'),
('uuid',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/uuid.py',
'PYMODULE'),
('xml',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/xml/__init__.py',
'PYMODULE'),
('xml.etree',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/xml/etree/__init__.py',
'PYMODULE'),
('xml.etree.ElementInclude',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/xml/etree/ElementInclude.py',
'PYMODULE'),
('xml.etree.ElementPath',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/xml/etree/ElementPath.py',
'PYMODULE'),
('xml.etree.ElementTree',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/xml/etree/ElementTree.py',
'PYMODULE'),
('xml.etree.cElementTree',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/xml/etree/cElementTree.py',
'PYMODULE'),
('xml.parsers',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/xml/parsers/__init__.py',
'PYMODULE'),
('xml.parsers.expat',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/xml/parsers/expat.py',
'PYMODULE'),
('xml.sax',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/xml/sax/__init__.py',
'PYMODULE'),
('xml.sax._exceptions',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/xml/sax/_exceptions.py',
'PYMODULE'),
('xml.sax.expatreader',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/xml/sax/expatreader.py',
'PYMODULE'),
('xml.sax.handler',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/xml/sax/handler.py',
'PYMODULE'),
('xml.sax.saxutils',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/xml/sax/saxutils.py',
'PYMODULE'),
('xml.sax.xmlreader',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/xml/sax/xmlreader.py',
'PYMODULE'),
('zipfile',
'/opt/computersetup/.pyenv/versions/3.11.6/lib/python3.11/zipfile.py',
'PYMODULE')])

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,29 @@
This file lists modules PyInstaller was not able to find. This does not
necessarily mean these modules are required for running your program. Both
Python's standard library and 3rd-party Python packages often conditionally
import optional modules, some of which may be available only on certain
platforms.
Types of import:
* top-level: imported at the top-level - look at these first
* conditional: imported within an if-statement
* delayed: imported within a function
* optional: imported within a try-except-statement
IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for
tracking down the missing module yourself. Thanks!
missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional)
excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional)
missing module named winreg - imported by importlib._bootstrap_external (conditional), platform (delayed, optional), mimetypes (optional), urllib.request (delayed, conditional, optional)
missing module named nt - imported by os (delayed, conditional, optional), ntpath (optional), shutil (conditional), importlib._bootstrap_external (conditional)
missing module named org - imported by pickle (optional)
missing module named _winapi - imported by encodings (delayed, conditional, optional), ntpath (optional), subprocess (conditional), mimetypes (optional)
missing module named 'org.python' - imported by copy (optional), xml.sax (delayed, conditional)
missing module named msvcrt - imported by subprocess (optional), getpass (optional)
missing module named vms_lib - imported by platform (delayed, optional)
missing module named 'java.lang' - imported by platform (delayed, optional), xml.sax._exceptions (conditional)
missing module named java - imported by platform (delayed)
missing module named _winreg - imported by platform (delayed, optional)
missing module named _scproxy - imported by urllib.request (conditional)

File diff suppressed because it is too large Load Diff

160
build_linux.sh Executable file
View File

@ -0,0 +1,160 @@
#!/bin/bash
# ============================================
# PointCab Renamer - Linux Build Script
# Version 4.2.1
# ============================================
set -e # Bei Fehlern abbrechen
echo ""
echo "==================================="
echo " PointCab Renamer - Linux Build"
echo " Version 4.2.1"
echo "==================================="
echo ""
# Farben für Ausgabe
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Arbeitsverzeichnis
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
echo -e "${BLUE}[1/6] Prüfe Voraussetzungen...${NC}"
# Prüfe ob Python3 installiert ist
if ! command -v python3 &> /dev/null; then
echo -e "${RED}[FEHLER] Python3 ist nicht installiert.${NC}"
echo ""
echo "Installation:"
echo " Ubuntu/Debian: sudo apt install python3 python3-pip python3-tk"
echo " Fedora: sudo dnf install python3 python3-pip python3-tkinter"
exit 1
fi
PYTHON_VERSION=$(python3 --version 2>&1)
echo -e "${GREEN}✓ Python3 gefunden: $PYTHON_VERSION${NC}"
# Prüfe ob tkinter installiert ist
echo -e "${BLUE}[2/6] Prüfe tkinter...${NC}"
if ! python3 -c "import tkinter" 2>/dev/null; then
echo -e "${YELLOW}[WARNUNG] tkinter nicht gefunden.${NC}"
echo ""
echo "Installation von tkinter:"
echo " Ubuntu/Debian: sudo apt install python3-tk"
echo " Fedora: sudo dnf install python3-tkinter"
echo ""
# Versuche automatische Installation (nur wenn sudo verfügbar)
if command -v apt &> /dev/null && [ -w /etc/apt ]; then
echo "Versuche automatische Installation..."
sudo apt install -y python3-tk || {
echo -e "${RED}[FEHLER] Automatische Installation fehlgeschlagen.${NC}"
echo "Bitte manuell installieren: sudo apt install python3-tk"
exit 1
}
else
echo -e "${RED}[FEHLER] tkinter muss manuell installiert werden.${NC}"
exit 1
fi
fi
echo -e "${GREEN}✓ tkinter verfügbar${NC}"
# Prüfe ob pip installiert ist
echo -e "${BLUE}[3/6] Prüfe pip...${NC}"
if ! command -v pip3 &> /dev/null && ! python3 -m pip --version &> /dev/null; then
echo -e "${YELLOW}[INFO] pip3 nicht gefunden.${NC}"
echo ""
echo "Installation von pip:"
echo " Ubuntu/Debian: sudo apt install python3-pip"
echo " Fedora: sudo dnf install python3-pip"
echo " Oder: python3 -m ensurepip --upgrade"
exit 1
fi
echo -e "${GREEN}✓ pip verfügbar${NC}"
# Prüfe ob PyInstaller installiert ist
echo -e "${BLUE}[4/6] Prüfe PyInstaller...${NC}"
if ! python3 -m PyInstaller --version &> /dev/null 2>&1; then
echo -e "${YELLOW}[INFO] PyInstaller nicht gefunden. Installiere...${NC}"
python3 -m pip install --user pyinstaller || {
echo -e "${RED}[FEHLER] PyInstaller konnte nicht installiert werden.${NC}"
echo "Versuche: pip3 install pyinstaller"
exit 1
}
fi
PYINSTALLER_VERSION=$(python3 -m PyInstaller --version 2>&1)
echo -e "${GREEN}✓ PyInstaller installiert: $PYINSTALLER_VERSION${NC}"
# Prüfe Projektdateien
echo -e "${BLUE}[5/6] Prüfe Projektdateien...${NC}"
if [ ! -f "pointcab_renamer.py" ]; then
echo -e "${RED}[FEHLER] pointcab_renamer.py nicht gefunden!${NC}"
echo "Bitte führen Sie das Skript im Projektverzeichnis aus."
exit 1
fi
if [ ! -f "cluster_cleanup.txt" ]; then
echo -e "${RED}[FEHLER] cluster_cleanup.txt nicht gefunden!${NC}"
exit 1
fi
echo -e "${GREEN}✓ Projektdateien vorhanden${NC}"
# Lösche alte Build-Verzeichnisse
echo ""
echo -e "${BLUE}[6/6] Starte Build-Prozess...${NC}"
echo "[INFO] Räume alte Build-Dateien auf..."
rm -rf build dist *.spec 2>/dev/null || true
echo "[INFO] Erstelle Linux-Binary..."
echo ""
# PyInstaller ausführen
python3 -m PyInstaller \
--onefile \
--name "pointcab_renamer" \
--add-data "cluster_cleanup.txt:." \
pointcab_renamer.py
if [ $? -ne 0 ]; then
echo ""
echo -e "${RED}[FEHLER] Build fehlgeschlagen!${NC}"
echo ""
echo "Mögliche Ursachen:"
echo " - PyInstaller-Version inkompatibel"
echo " - Fehlende Abhängigkeiten"
echo ""
echo "Versuche: pip3 install --upgrade pyinstaller"
exit 1
fi
echo ""
echo -e "${GREEN}[INFO] Build erfolgreich!${NC}"
echo ""
# Kopiere notwendige Dateien in dist-Ordner
echo "[INFO] Kopiere zusätzliche Dateien..."
cp cluster_cleanup.txt dist/
[ -f BENUTZERHANDBUCH.md ] && cp BENUTZERHANDBUCH.md dist/
# Mache das Binary ausführbar
chmod +x dist/pointcab_renamer
# Zeige Ergebnis
echo ""
echo -e "${GREEN}===================================${NC}"
echo -e "${GREEN} BUILD ERFOLGREICH!${NC}"
echo -e "${GREEN}===================================${NC}"
echo ""
echo "Erstellte Dateien:"
ls -lh dist/
echo ""
echo "Verwendung:"
echo " cd dist && ./pointcab_renamer"
echo ""
echo "Für Distribution alle Dateien aus dist/ kopieren."
echo ""

119
build_windows.bat Normal file
View File

@ -0,0 +1,119 @@
@echo off
REM ============================================
REM PointCab Renamer - Windows Build Script v4.2
REM ============================================
REM Verwendet den Python Launcher (py) für bessere Kompatibilität
REM
REM Voraussetzungen:
REM - Python 3.8+ mit py Launcher installiert
REM - PyInstaller (wird bei Bedarf installiert)
REM
REM Verwendung:
REM 1. Öffnen Sie die Eingabeaufforderung (cmd)
REM 2. Navigieren Sie zum Projektordner
REM 3. Führen Sie: build_windows.bat aus
REM ============================================
setlocal enabledelayedexpansion
echo.
echo ============================================
echo PointCab Renamer - Windows Build v4.2
echo ============================================
echo.
REM Prüfe Python Installation
echo [1/5] Prüfe Python Installation...
py --version >nul 2>&1
if errorlevel 1 (
echo.
echo FEHLER: Python wurde nicht gefunden!
echo.
echo Bitte installieren Sie Python von:
echo https://www.python.org/downloads/
echo.
echo Stellen Sie sicher, dass bei der Installation
echo "Add Python to PATH" aktiviert ist.
echo.
pause
exit /b 1
)
for /f "tokens=2" %%v in ('py --version 2^>^&1') do set PYTHON_VERSION=%%v
echo Python %PYTHON_VERSION% gefunden.
REM Prüfe/Installiere PyInstaller
echo.
echo [2/5] Prüfe PyInstaller...
py -m PyInstaller --version >nul 2>&1
if errorlevel 1 (
echo PyInstaller nicht gefunden. Installiere...
py -m pip install pyinstaller
if errorlevel 1 (
echo.
echo FEHLER: PyInstaller konnte nicht installiert werden!
echo Bitte führen Sie manuell aus:
echo py -m pip install pyinstaller
echo.
pause
exit /b 1
)
)
for /f "tokens=*" %%v in ('py -m PyInstaller --version 2^>^&1') do set PYINSTALLER_VERSION=%%v
echo PyInstaller %PYINSTALLER_VERSION% gefunden.
REM Bereinige alte Builds
echo.
echo [3/5] Bereinige alte Build-Dateien...
if exist build rmdir /s /q build
if exist dist rmdir /s /q dist
if exist *.spec del /f /q *.spec
echo Alte Dateien entfernt.
REM Erstelle Executable
echo.
echo [4/5] Erstelle Windows Executable...
echo Dies kann einige Minuten dauern...
echo.
py -m PyInstaller --onefile --windowed --name "PointCab_Renamer" ^
--add-data "cluster_cleanup.txt;." ^
--add-data "BENUTZERHANDBUCH.md;." ^
pointcab_renamer.py
if errorlevel 1 (
echo.
echo FEHLER: Build fehlgeschlagen!
echo Bitte prüfen Sie die Fehlermeldungen oben.
echo.
pause
exit /b 1
)
REM Kopiere zusätzliche Dateien
echo.
echo [5/5] Kopiere zusätzliche Dateien...
copy cluster_cleanup.txt dist\ >nul 2>&1
copy BENUTZERHANDBUCH.md dist\ >nul 2>&1
copy README.md dist\ >nul 2>&1
echo Dateien kopiert.
REM Erfolgsmeldung
echo.
echo ============================================
echo BUILD ERFOLGREICH!
echo ============================================
echo.
echo Die Executable befindet sich in:
echo dist\PointCab_Renamer.exe
echo.
echo Zusätzliche Dateien in dist\:
echo - cluster_cleanup.txt
echo - BENUTZERHANDBUCH.md
echo - README.md
echo.
echo Hinweis: Die cluster_cleanup.txt muss neben
echo der .exe Datei liegen!
echo.
echo ============================================
pause

278
build_windows_on_linux.sh Executable file
View File

@ -0,0 +1,278 @@
#!/bin/bash
# ============================================================================
# PointCab Renamer - Windows Build unter Linux (Docker-Methode)
# Version: 4.1.2
# ============================================================================
#
# Dieses Skript erstellt eine Windows .exe unter Linux mittels Docker.
# Es verwendet das cdrx/pyinstaller-windows Image für zuverlässige Builds.
#
# VORAUSSETZUNGEN:
# - Docker muss installiert sein (wird bei Bedarf mit sudo gestartet)
# - Internet-Verbindung für den ersten Docker-Image-Download
#
# VERWENDUNG:
# ./build_windows_on_linux.sh
#
# TROUBLESHOOTING:
# Falls Docker nicht startet, prüfen Sie:
# - sudo systemctl start docker
# - Benutzer zur docker-Gruppe hinzufügen: sudo usermod -aG docker $USER
# - In Container-Umgebungen (z.B. Docker-in-Docker): --privileged Flag nötig
#
# ============================================================================
set -e # Bei Fehlern abbrechen
# Farben für Ausgabe
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Banner
echo -e "${BLUE}"
echo "============================================================================"
echo " PointCab Renamer - Windows Cross-Compilation unter Linux"
echo " Version 4.1.2"
echo "============================================================================"
echo -e "${NC}"
# Hilfsfunktion: Docker-Befehl mit oder ohne sudo
docker_cmd() {
if docker "$@" 2>/dev/null; then
return 0
elif sudo docker "$@" 2>/dev/null; then
USE_SUDO=1
return 0
else
return 1
fi
}
run_docker() {
if [ "$USE_SUDO" = "1" ]; then
sudo docker "$@"
else
docker "$@"
fi
}
# [1/7] Prüfe ob Docker installiert ist
echo -e "${YELLOW}[1/7] Prüfe Docker-Installation...${NC}"
if ! command -v docker &> /dev/null; then
echo -e "${RED}FEHLER: Docker ist nicht installiert!${NC}"
echo ""
echo "Installiere Docker mit:"
echo " Ubuntu/Debian:"
echo " sudo apt update"
echo " sudo apt install docker.io"
echo " sudo systemctl start docker"
echo " sudo systemctl enable docker"
echo " sudo usermod -aG docker \$USER"
echo " # Danach neu einloggen oder: newgrp docker"
echo ""
echo " Fedora/RHEL:"
echo " sudo dnf install docker"
echo " sudo systemctl start docker"
echo ""
echo "Alternativ: Verwende ./build_windows_wine.sh (Wine-basiert)"
exit 1
fi
echo -e "${GREEN}✓ Docker ist installiert${NC}"
# [2/7] Prüfe ob Docker-Daemon läuft, versuche Start mit sudo falls nötig
echo -e "${YELLOW}[2/7] Prüfe Docker-Daemon...${NC}"
USE_SUDO=0
if docker info &> /dev/null; then
echo -e "${GREEN}✓ Docker-Daemon läuft (ohne sudo)${NC}"
elif sudo docker info &> /dev/null; then
USE_SUDO=1
echo -e "${GREEN}✓ Docker-Daemon läuft (mit sudo)${NC}"
else
# Versuche Docker zu starten
echo -e "${YELLOW}Docker-Daemon läuft nicht. Versuche zu starten...${NC}"
# Versuche systemd
if command -v systemctl &> /dev/null; then
sudo systemctl start docker 2>/dev/null && sleep 2
fi
# Prüfe erneut
if docker info &> /dev/null; then
echo -e "${GREEN}✓ Docker-Daemon erfolgreich gestartet${NC}"
elif sudo docker info &> /dev/null; then
USE_SUDO=1
echo -e "${GREEN}✓ Docker-Daemon erfolgreich gestartet (mit sudo)${NC}"
else
echo -e "${RED}FEHLER: Docker-Daemon konnte nicht gestartet werden!${NC}"
echo ""
echo "Mögliche Ursachen und Lösungen:"
echo ""
echo "1. Docker-Service nicht gestartet:"
echo " sudo systemctl start docker"
echo ""
echo "2. Berechtigungsproblem:"
echo " sudo usermod -aG docker \$USER"
echo " # Dann neu einloggen"
echo ""
echo "3. In Container-Umgebung (Docker-in-Docker):"
echo " Docker kann nicht in unprivilegierten Containern laufen."
echo " Nutze stattdessen: ./build_windows_wine.sh"
echo " Oder: Baue auf einem System mit nativem Docker."
echo ""
echo "4. WSL2 unter Windows:"
echo " Starte Docker Desktop und aktiviere WSL2-Integration."
echo ""
echo "Alternative Build-Methoden:"
echo " - ./build_windows_wine.sh (Wine-basiert)"
echo " - GitHub Actions (siehe .github/workflows/)"
echo " - Natives Windows: build_windows.bat"
exit 1
fi
fi
# Arbeitsverzeichnis
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
# [3/7] Prüfe ob notwendige Dateien existieren
echo -e "${YELLOW}[3/7] Prüfe Projektdateien...${NC}"
if [ ! -f "pointcab_renamer.py" ]; then
echo -e "${RED}FEHLER: pointcab_renamer.py nicht gefunden!${NC}"
echo "Stelle sicher, dass du dich im richtigen Verzeichnis befindest."
exit 1
fi
if [ ! -f "cluster_cleanup.txt" ]; then
echo -e "${RED}FEHLER: cluster_cleanup.txt nicht gefunden!${NC}"
exit 1
fi
echo -e "${GREEN}✓ Alle Projektdateien vorhanden${NC}"
# [4/7] Aufräumen
echo -e "${YELLOW}[4/7] Räume alte Build-Artefakte auf...${NC}"
rm -rf build/ dist/ *.spec 2>/dev/null || true
mkdir -p dist
echo -e "${GREEN}✓ Build-Verzeichnisse bereinigt${NC}"
# Docker Image
DOCKER_IMAGE="cdrx/pyinstaller-windows:python3"
# [5/7] Prüfe/Lade Docker Image
echo -e "${YELLOW}[5/7] Prüfe Docker Image...${NC}"
echo " Image: $DOCKER_IMAGE"
echo " (Beim ersten Mal wird ~1.5 GB heruntergeladen)"
if ! run_docker image inspect "$DOCKER_IMAGE" &> /dev/null; then
echo ""
echo "Lade Docker Image herunter..."
run_docker pull "$DOCKER_IMAGE"
fi
echo -e "${GREEN}✓ Docker Image bereit${NC}"
# [6/7] Build durchführen
echo -e "${YELLOW}[6/7] Erstelle Windows .exe mit PyInstaller...${NC}"
echo " Dies kann 2-5 Minuten dauern..."
echo ""
# Erstelle temporäres Build-Skript für Docker-Container
BUILD_SCRIPT=$(mktemp)
cat > "$BUILD_SCRIPT" << 'DOCKERSCRIPT'
#!/bin/bash
set -e
cd /src
echo "=== Docker Container gestartet ==="
echo "Python-Version: $(python --version)"
echo "PyInstaller-Version: $(pip show pyinstaller | grep Version)"
echo ""
# Installiere requirements falls vorhanden
if [ -f "requirements.txt" ]; then
echo "Installiere requirements..."
pip install -r requirements.txt --quiet
fi
echo "Starte PyInstaller Build..."
# PyInstaller Build
pyinstaller --onefile \
--windowed \
--name "PointCab_Renamer" \
--add-data "cluster_cleanup.txt;." \
--add-data "BENUTZERHANDBUCH.md;." \
--icon="NONE" \
--clean \
pointcab_renamer.py
echo ""
echo "=== Build im Container abgeschlossen ==="
DOCKERSCRIPT
chmod +x "$BUILD_SCRIPT"
# Docker Container ausführen
if [ "$USE_SUDO" = "1" ]; then
sudo docker run --rm \
-v "$SCRIPT_DIR":/src \
-v "$BUILD_SCRIPT":/docker_build.sh:ro \
"$DOCKER_IMAGE" \
bash /docker_build.sh
else
docker run --rm \
-v "$SCRIPT_DIR":/src \
-v "$BUILD_SCRIPT":/docker_build.sh:ro \
"$DOCKER_IMAGE" \
bash /docker_build.sh
fi
# Aufräumen
rm -f "$BUILD_SCRIPT"
# [7/7] Prüfe Ergebnis
echo ""
echo -e "${YELLOW}[7/7] Verifiziere Build-Ergebnis...${NC}"
if [ -f "dist/PointCab_Renamer.exe" ]; then
echo -e "${GREEN}✓ Windows .exe erfolgreich erstellt!${NC}"
# Kopiere zusätzliche Dateien
cp cluster_cleanup.txt dist/
[ -f "BENUTZERHANDBUCH.md" ] && cp BENUTZERHANDBUCH.md dist/
[ -f "BENUTZERHANDBUCH.pdf" ] && cp BENUTZERHANDBUCH.pdf dist/
[ -f "README.md" ] && cp README.md dist/
[ -f "LICENSE.txt" ] && cp LICENSE.txt dist/
# Zeige Ergebnis
echo ""
echo -e "${BLUE}============================================================================${NC}"
echo -e "${GREEN}BUILD ERFOLGREICH!${NC}"
echo -e "${BLUE}============================================================================${NC}"
echo ""
echo "Erstellte Dateien in dist/:"
ls -lh dist/
echo ""
EXE_SIZE=$(du -h "dist/PointCab_Renamer.exe" | cut -f1)
echo "Executable-Größe: $EXE_SIZE"
echo ""
echo "Pfad: $SCRIPT_DIR/dist/"
echo ""
echo -e "${YELLOW}WICHTIG:${NC}"
echo " 1. Teste die .exe auf einem echten Windows-System!"
echo " 2. Stelle sicher, dass cluster_cleanup.txt im gleichen"
echo " Ordner wie die .exe liegt."
echo ""
else
echo -e "${RED}FEHLER: Build fehlgeschlagen!${NC}"
echo ""
echo "Die Datei dist/PointCab_Renamer.exe wurde nicht erstellt."
echo ""
echo "Prüfe die Fehlermeldungen oben und versuche:"
echo " 1. ./build_windows_wine.sh (Wine-Alternative)"
echo " 2. Build auf nativem Windows mit build_windows.bat"
echo ""
exit 1
fi

274
build_windows_wine.sh Executable file
View File

@ -0,0 +1,274 @@
#!/bin/bash
# ============================================================================
# PointCab Renamer - Windows Build unter Linux (Wine-Methode)
# Version: 4.2.1
# ============================================================================
#
# WICHTIG: Wine-basierte Builds sind EXPERIMENTELL und können fehlschlagen!
#
# BEKANNTE EINSCHRÄNKUNGEN:
# - Headless Server (ohne GUI): Python-Installation kann fehlschlagen
# - Manche Wine-Versionen haben Kompatibilitätsprobleme
# - GUI-basierte Python-Installer benötigen X11/Display
#
# EMPFOHLENE ALTERNATIVEN:
# 1. Windows-PC: build_windows.bat direkt ausführen
# 2. GitHub Actions: CI/CD für automatisierte Builds
# 3. Dual-Boot/VM: Windows-Build in echter Windows-Umgebung
#
# ============================================================================
# Farben für Ausgabe
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Konfiguration
PYTHON_VERSION="3.10.11"
PYTHON_INSTALLER="python-${PYTHON_VERSION}-amd64.exe"
PYTHON_URL="https://www.python.org/ftp/python/${PYTHON_VERSION}/${PYTHON_INSTALLER}"
WINE_PREFIX="$HOME/.wine_python"
# Banner
echo -e "${BLUE}"
echo "============================================================================"
echo " PointCab Renamer - Windows Cross-Compilation (Wine-Methode)"
echo " Version 4.2.1 - EXPERIMENTELL"
echo "============================================================================"
echo -e "${NC}"
echo -e "${YELLOW}╔════════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${YELLOW}║ WARNUNG: Diese Methode ist EXPERIMENTELL und kann fehlschlagen! ║${NC}"
echo -e "${YELLOW}╚════════════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo "Bekannte Probleme:"
echo " • Headless Server ohne X11: Python-Installer kann hängen"
echo " • Wine-Kompatibilität variiert je nach Version"
echo " • ~500MB Download und 10+ Minuten Installationszeit"
echo ""
echo "Empfohlene Alternativen:"
echo " 1. Windows-PC: build_windows.bat ausführen"
echo " 2. GitHub Actions: Automatisierte CI/CD Builds"
echo ""
read -p "Trotzdem fortfahren? (j/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Jj]$ ]]; then
echo ""
echo "Abgebrochen. Alternative Methoden:"
echo " • Kopiere das Projekt auf einen Windows-PC"
echo " • Führe dort build_windows.bat aus"
exit 0
fi
echo ""
# Arbeitsverzeichnis
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
# Funktion für Fehlerbehandlung
fail_with_alternatives() {
echo ""
echo -e "${RED}╔════════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${RED}║ BUILD FEHLGESCHLAGEN ║${NC}"
echo -e "${RED}╚════════════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo -e "${YELLOW}Alternative Methoden:${NC}"
echo ""
echo " 1. ${GREEN}Windows-PC (EMPFOHLEN):${NC}"
echo " - Kopiere das gesamte Projektverzeichnis"
echo " - Führe build_windows.bat aus"
echo ""
echo " 2. ${GREEN}GitHub Actions:${NC}"
echo " - Push zu GitHub mit Actions Workflow"
echo " - Automatisierter Windows-Build"
echo ""
echo " 3. ${GREEN}Virtual Machine:${NC}"
echo " - Windows-VM mit VirtualBox/VMware"
echo " - Shared Folder für Projektdateien"
echo ""
exit 1
}
# Prüfe Wine
echo -e "${BLUE}[1/7] Prüfe Wine-Installation...${NC}"
if ! command -v wine &> /dev/null; then
echo -e "${RED}FEHLER: Wine ist nicht installiert!${NC}"
echo ""
echo "Installation auf Ubuntu/Debian:"
echo " sudo dpkg --add-architecture i386"
echo " sudo apt update"
echo " sudo apt install wine64 wine32"
echo ""
echo "Installation auf Fedora:"
echo " sudo dnf install wine"
echo ""
fail_with_alternatives
fi
WINE_VERSION=$(wine --version 2>/dev/null || echo "unknown")
echo -e "${GREEN}✓ Wine installiert: $WINE_VERSION${NC}"
# Prüfe auf Display (wichtig für GUI-Installer)
echo -e "${BLUE}[2/7] Prüfe Display-Umgebung...${NC}"
if [ -z "$DISPLAY" ]; then
echo -e "${YELLOW}⚠ Kein DISPLAY gesetzt - Headless-Modus erkannt${NC}"
echo ""
echo "Python-Installer benötigt möglicherweise X11/GUI."
echo "Dies kann in Headless-Umgebungen fehlschlagen."
echo ""
echo "Optionen:"
echo " • Virtuelles Display mit Xvfb (experimentell)"
echo " • X11 Forwarding bei SSH (-X Option)"
echo " • Desktop-Umgebung verwenden"
echo ""
# Versuche Xvfb falls verfügbar
if command -v Xvfb &> /dev/null; then
echo "Xvfb gefunden - starte virtuelles Display..."
Xvfb :99 -screen 0 1024x768x24 &
XVFB_PID=$!
export DISPLAY=:99
sleep 2
echo -e "${GREEN}✓ Virtuelles Display gestartet (:99)${NC}"
else
echo -e "${YELLOW}Xvfb nicht installiert. Versuche ohne Display...${NC}"
echo " Installation: sudo apt install xvfb"
fi
else
echo -e "${GREEN}✓ Display vorhanden: $DISPLAY${NC}"
fi
# Prüfe Projektdateien
echo -e "${BLUE}[3/7] Prüfe Projektdateien...${NC}"
if [ ! -f "pointcab_renamer.py" ]; then
echo -e "${RED}FEHLER: pointcab_renamer.py nicht gefunden!${NC}"
exit 1
fi
if [ ! -f "cluster_cleanup.txt" ]; then
echo -e "${RED}FEHLER: cluster_cleanup.txt nicht gefunden!${NC}"
exit 1
fi
echo -e "${GREEN}✓ Projektdateien vorhanden${NC}"
# Wine-Prefix initialisieren
echo -e "${BLUE}[4/7] Initialisiere Wine-Umgebung...${NC}"
export WINEPREFIX="$WINE_PREFIX"
export WINEARCH=win64
export WINEDEBUG=-all # Unterdrücke Wine Debug-Meldungen
if [ ! -d "$WINE_PREFIX" ]; then
echo "Erstelle Wine-Prefix unter: $WINE_PREFIX"
echo "Dies kann einige Minuten dauern..."
wineboot --init 2>/dev/null || true
sleep 5
fi
echo -e "${GREEN}✓ Wine-Umgebung bereit${NC}"
# Python-Pfade in Wine
WINE_PYTHON="$WINE_PREFIX/drive_c/Python310/python.exe"
WINE_PIP="$WINE_PREFIX/drive_c/Python310/Scripts/pip.exe"
WINE_PYINSTALLER="$WINE_PREFIX/drive_c/Python310/Scripts/pyinstaller.exe"
# Python installieren falls nicht vorhanden
echo -e "${BLUE}[5/7] Prüfe Windows-Python...${NC}"
if [ ! -f "$WINE_PYTHON" ]; then
echo "Windows-Python nicht gefunden, installiere..."
echo ""
# Download Python installer
if [ ! -f "/tmp/$PYTHON_INSTALLER" ]; then
echo "Lade Python herunter: $PYTHON_URL"
echo "Größe: ~28MB"
wget -q --show-progress -O "/tmp/$PYTHON_INSTALLER" "$PYTHON_URL" || {
echo -e "${RED}FEHLER: Python-Download fehlgeschlagen!${NC}"
fail_with_alternatives
}
fi
# Installiere Python
echo ""
echo "Installiere Python in Wine..."
echo "Dies kann 5-10 Minuten dauern..."
echo ""
# Silent Installation mit Timeout
timeout 300 wine "/tmp/$PYTHON_INSTALLER" /quiet InstallAllUsers=0 PrependPath=1 Include_test=0 2>/dev/null || {
echo -e "${YELLOW}⚠ Python-Installation möglicherweise fehlgeschlagen oder Timeout${NC}"
}
sleep 5
# Prüfe Installation
if [ ! -f "$WINE_PYTHON" ]; then
echo ""
echo -e "${RED}FEHLER: Python-Installation fehlgeschlagen!${NC}"
echo ""
echo "Mögliche Ursachen:"
echo " • Headless-Umgebung ohne GUI"
echo " • Wine-Kompatibilitätsproblem"
echo " • Nicht genug Speicherplatz"
echo ""
# Cleanup Xvfb falls gestartet
[ -n "$XVFB_PID" ] && kill $XVFB_PID 2>/dev/null
fail_with_alternatives
fi
fi
echo -e "${GREEN}✓ Windows-Python installiert${NC}"
# PyInstaller installieren
echo -e "${BLUE}[6/7] Prüfe PyInstaller...${NC}"
if [ ! -f "$WINE_PYINSTALLER" ]; then
echo "Installiere PyInstaller..."
wine "$WINE_PIP" install pyinstaller 2>/dev/null || {
echo -e "${RED}FEHLER: PyInstaller-Installation fehlgeschlagen!${NC}"
fail_with_alternatives
}
fi
echo -e "${GREEN}✓ PyInstaller installiert${NC}"
# Aufräumen
echo -e "${BLUE}[7/7] Erstelle Windows .exe...${NC}"
rm -rf build/ dist/ *.spec 2>/dev/null || true
echo "Build läuft... (kann einige Minuten dauern)"
echo ""
# Führe PyInstaller aus
wine "$WINE_PYINSTALLER" \
--onefile \
--windowed \
--name "PointCab_Renamer" \
--add-data "cluster_cleanup.txt;." \
pointcab_renamer.py 2>&1 | grep -v "^fixme:" | grep -v "^err:" || true
# Cleanup Xvfb falls gestartet
[ -n "$XVFB_PID" ] && kill $XVFB_PID 2>/dev/null
# Prüfe Ergebnis
echo ""
if [ -f "dist/PointCab_Renamer.exe" ]; then
echo -e "${GREEN}╔════════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ BUILD ERFOLGREICH! ║${NC}"
echo -e "${GREEN}╚════════════════════════════════════════════════════════════════════╝${NC}"
# Kopiere zusätzliche Dateien
cp cluster_cleanup.txt dist/
cp BENUTZERHANDBUCH.md dist/ 2>/dev/null || true
echo ""
echo "Erstellte Dateien:"
ls -lh dist/
echo ""
echo "Die .exe befindet sich in: $SCRIPT_DIR/dist/"
echo ""
echo -e "${YELLOW}WICHTIG:${NC}"
echo " Die .exe sollte auf einem echten Windows-System"
echo " getestet werden, bevor sie verteilt wird!"
echo ""
else
fail_with_alternatives
fi

16
cluster_cleanup.txt Normal file
View File

@ -0,0 +1,16 @@
# Konfigurationsdatei für Clustername-Bereinigung
# Jede Zeile enthält einen String, der aus dem Stammverzeichnisnamen entfernt wird
# Leerzeilen und Zeilen die mit # beginnen werden ignoriert
#
# Beispiel: Stammverzeichnis "Am_Upstall_4_re" wird zu Clustername "Am_Upstall_4"
#
_re
_li
_mi
_mi-li
_mi-re
_part_1
_part_2
_part_3
_part_4
_part_5

385
dist/BENUTZERHANDBUCH.md vendored Normal file
View File

@ -0,0 +1,385 @@
# PointCab Renamer - Benutzerhandbuch
**Version 4.1** | Datum: 14. Januar 2026
---
## Inhaltsverzeichnis
1. [Einführung](#einführung)
2. [Installation](#installation)
3. [Programmstart](#programmstart)
4. [Die drei Modi](#die-drei-modi)
- [Einzelprojekt-Modus](#einzelprojekt-modus)
- [Batch-Modus](#batch-modus)
- [Projekt-Merger](#projekt-merger)
5. [Konfiguration](#konfiguration)
6. [Troubleshooting](#troubleshooting)
7. [FAQ](#faq)
---
## Einführung
### Was ist der PointCab Renamer?
Der **PointCab Renamer** ist ein Werkzeug zur automatischen Umbenennung von PointCab-Projektdateien. Es löst das Problem, dass PointCab-Scandateien oft kryptische Namen haben (z.B. `1.lsd`, `2.lsd`) und benennt diese nach einem einheitlichen Schema um:
**Format:** `[ClusterName]_[ScanName].[Erweiterung]`
**Beispiel:** `EG_Flur_scan001.lsd`
### Hauptfunktionen
- **Einzelprojekt-Modus**: Ein einzelnes PointCab-Projekt umbenennen
- **Batch-Modus**: Mehrere Projekte gleichzeitig verarbeiten
- **Projekt-Merger**: Mehrere Projekte in ein Zielprojekt zusammenführen
- **Cluster-Bereinigung**: Automatische Entfernung von Suffixen wie `_re`, `_li` aus Clusternamen
- **Detailliertes Logging**: Vollständige Protokollierung aller Änderungen
---
## Installation
### Windows
1. Laden Sie die Datei `pointcab_renamer.exe` herunter
2. Speichern Sie die Datei in einem beliebigen Ordner (z.B. `C:\Tools\`)
3. Kopieren Sie die `cluster_cleanup.txt` in denselben Ordner
4. Starten Sie das Programm mit Doppelklick auf die `.exe`
### Ubuntu/Linux
1. Laden Sie die Datei `pointcab_renamer` herunter
2. Speichern Sie die Datei in einem beliebigen Ordner (z.B. `/home/benutzer/tools/`)
3. Kopieren Sie die `cluster_cleanup.txt` in denselben Ordner
4. Machen Sie die Datei ausführbar:
```bash
chmod +x pointcab_renamer
```
5. Starten Sie das Programm:
```bash
./pointcab_renamer
```
### Aus dem Quellcode (für Entwickler)
1. Stellen Sie sicher, dass Python 3.8+ installiert ist
2. Laden Sie den Quellcode herunter
3. Starten Sie mit:
```bash
python pointcab_renamer.py
```
---
## Programmstart
### Hauptmenü
Nach dem Start erscheint das Hauptmenü mit drei Optionen:
```
╔═══════════════════════════════════════════╗
║ PointCab Renamer v4.1 ║
╠═══════════════════════════════════════════╣
║ ║
║ [Einzelprojekt umbenennen] ║
║ ║
║ [Batch-Verarbeitung] ║
║ ║
║ [Projekt Merger] ║
║ ║
╚═══════════════════════════════════════════╝
```
---
## Die drei Modi
### Einzelprojekt-Modus
**Verwendung:** Wenn Sie ein einzelnes PointCab-Projekt umbenennen möchten.
#### Schritt-für-Schritt-Anleitung
1. Klicken Sie auf **"Einzelprojekt umbenennen"**
2. Wählen Sie die **LSDX-Projektdatei** aus (z.B. `Am_Upstall_4.lsdx`)
3. Wählen Sie den **PointCloud-Ordner** aus (enthält die `.lsd` Dateien)
4. Das Programm zeigt eine **Vorschau** der Änderungen:
```
Vorschau der Umbenennung:
─────────────────────────
1.lsd → EG_Flur_scan001.lsd
2.lsd → EG_Flur_scan002.lsd
3.lsd → OG_Bad_scan001.lsd
...
```
5. Klicken Sie auf **"Umbenennen starten"**
6. Nach Abschluss wird ein Protokoll angezeigt
#### Dateistruktur (Vorher → Nachher)
**Vorher:**
```
Am_Upstall_4_PointCloud/
├── 1.lsd
├── 2.lsd
├── 3.lsd
└── ...
```
**Nachher:**
```
Am_Upstall_4_PointCloud/
├── EG_Flur_scan001.lsd
├── EG_Flur_scan002.lsd
├── OG_Bad_scan001.lsd
└── ...
```
---
### Batch-Modus
**Verwendung:** Wenn Sie mehrere PointCab-Projekte auf einmal verarbeiten möchten.
#### Schritt-für-Schritt-Anleitung
1. Klicken Sie auf **"Batch-Verarbeitung"**
2. Wählen Sie den **Basisordner** aus, der alle Projekte enthält
3. Das Programm erkennt automatisch alle PointCab-Projekte:
```
Gefundene Projekte:
─────────────────────
☑ Projekt_A (15 Scans)
☑ Projekt_B (22 Scans)
☑ Projekt_C (8 Scans)
```
4. Wählen Sie die gewünschten Projekte aus (oder behalten Sie alle ausgewählt)
5. Klicken Sie auf **"Batch-Verarbeitung starten"**
6. Der Fortschritt wird angezeigt:
```
Verarbeite Projekt 1/3: Projekt_A
[████████████░░░░░░░░] 60%
```
7. Nach Abschluss wird eine Zusammenfassung angezeigt
#### Erwartete Ordnerstruktur
```
Basisordner/
├── Projekt_A/
│ ├── Projekt_A.lsdx
│ └── Projekt_A_PointCloud/
│ ├── 1.lsd
│ └── ...
├── Projekt_B/
│ ├── Projekt_B.lsdx
│ └── Projekt_B_PointCloud/
└── Projekt_C/
├── Projekt_C.lsdx
└── Projekt_C_PointCloud/
```
---
### Projekt-Merger
**Verwendung:** Wenn Sie mehrere PointCab-Projekte in ein einziges Projekt zusammenführen möchten.
#### Schritt-für-Schritt-Anleitung
1. Klicken Sie auf **"Projekt Merger"**
2. Wählen Sie den **Modus**:
- **Einzelprojekt zusammenführen**: Ein Quellprojekt → Zielprojekt
- **Batch-Merge**: Mehrere Quellprojekte → Zielprojekt
3. Wählen Sie das **Zielprojekt** (in das zusammengeführt wird)
4. Wählen Sie das/die **Quellprojekt(e)**
5. Das Programm zeigt eine **Vorschau** mit Konfliktauflösung:
```
Merge-Vorschau:
─────────────────────
Zielprojekt: Haupt_Projekt (5 Cluster, 25 Scans)
Quellprojekt: Teil_A (2 Cluster, 10 Scans)
Zu übertragende Dateien:
- EG_Flur_scan001.lsd
- EG_Flur_scan002.lsd (Konflikt → EG_Flur_scan002_merged_1.lsd)
- ...
```
6. Klicken Sie auf **"Merge starten"**
7. Nach Abschluss werden die Statistiken angezeigt:
```
Merge abgeschlossen!
─────────────────────
Cluster vorher: 5 → nachher: 7
Scans vorher: 25 → nachher: 35
Dateien kopiert: 10
Konflikte gelöst: 1
```
#### Konfliktauflösung
Wenn eine Datei im Zielprojekt bereits existiert:
- Die neue Datei wird umbenannt: `dateiname_merged_1.lsd`
- Bei weiteren Konflikten: `dateiname_merged_2.lsd`, etc.
- Die LSDX-Datei wird entsprechend aktualisiert
#### Wichtige Hinweise
- **Backup**: Das Zielprojekt wird vor dem Merge gesichert (`.lsdx.backup`)
- **UUID-Regenerierung**: Alle übertragenen Elemente erhalten neue eindeutige IDs
- **Cluster-Duplikate**: Gleichnamige Cluster werden zusammengeführt
---
## Konfiguration
### Die Datei cluster_cleanup.txt
Diese Konfigurationsdatei definiert, welche Suffixe aus Clusternamen entfernt werden sollen.
#### Speicherort
- **Windows**: Im selben Ordner wie `pointcab_renamer.exe`
- **Linux**: Im selben Ordner wie `pointcab_renamer`
#### Format
```
# Dies ist ein Kommentar
_re
_li
_mi
_mi-li
_mi-re
```
- Jede Zeile = ein zu entfernender String
- Zeilen mit `#` am Anfang sind Kommentare
- Leere Zeilen werden ignoriert
#### Beispiel
Mit der obigen Konfiguration:
- `Flur_re``Flur`
- `Bad_mi-li``Bad`
- `Küche_li``Küche`
#### Konfiguration neu laden
Änderungen an `cluster_cleanup.txt` werden nach einem Neustart oder über den Button **"Konfiguration neu laden"** übernommen.
---
## Troubleshooting
### Häufige Fehler und Lösungen
#### "LSDX-Datei nicht gefunden"
**Problem**: Das Programm kann die Projektdatei nicht finden.
**Lösung**:
- Stellen Sie sicher, dass die `.lsdx`-Datei im Projektordner existiert
- Prüfen Sie, ob Sie Leserechte für die Datei haben
- Der Dateiname sollte mit `.lsdx` enden (nicht `.LSDX`)
#### "PointCloud-Ordner nicht gefunden"
**Problem**: Der Ordner mit den Scandaten fehlt.
**Lösung**:
- Der Ordner muss `_PointCloud` im Namen haben
- Beispiel: `Projekt_A_PointCloud`
- Prüfen Sie die Ordnerstruktur
#### "Keine Projekte gefunden" (Batch-Modus)
**Problem**: Im Basisordner werden keine Projekte erkannt.
**Lösung**:
- Jedes Projekt muss eine `.lsdx`-Datei und einen `_PointCloud`-Ordner haben
- Der Projektname in der LSDX muss mit dem Ordnernamen übereinstimmen
#### "Zugriff verweigert"
**Problem**: Dateien können nicht umbenannt werden.
**Lösung**:
- Schließen Sie PointCab
- Prüfen Sie, ob andere Programme die Dateien verwenden
- Unter Windows: Als Administrator ausführen
- Unter Linux: Prüfen Sie die Dateiberechtigungen
#### "GUI startet nicht" (Linux)
**Problem**: Keine grafische Oberfläche unter Linux.
**Lösung**:
- Installieren Sie tkinter: `sudo apt install python3-tk`
- Stellen Sie sicher, dass ein Display verfügbar ist
---
## FAQ
### Allgemeine Fragen
**F: Werden die Originaldateien gelöscht?**
A: Nein, die Dateien werden nur umbenannt. Es werden keine Daten gelöscht.
**F: Kann ich die Umbenennung rückgängig machen?**
A: Die ursprünglichen Namen werden im Log-Datei protokolliert. Eine automatische Rückgängig-Funktion gibt es nicht.
**F: Funktioniert das Tool auch mit älteren PointCab-Versionen?**
A: Das Tool wurde für PointCab-Projekte mit LSDX-Format entwickelt. Ältere Formate werden möglicherweise nicht unterstützt.
**F: Wie viele Projekte kann ich im Batch-Modus verarbeiten?**
A: Es gibt keine feste Grenze. Die Verarbeitungszeit hängt von der Anzahl der Scans ab.
### Technische Fragen
**F: Wo werden die Log-Dateien gespeichert?**
A: Im Projektordner, mit dem Format:
- Einzelprojekt: `rename_YYYYMMDD_HHMMSS.log`
- Batch: `batch_YYYYMMDD_HHMMSS.log`
- Merger: `merge_YYYYMMDD_HHMMSS.log`
**F: Was passiert bei einem Stromausfall während der Verarbeitung?**
A: Die bereits umbenannten Dateien bleiben umbenannt. Die LSDX-Datei wird erst nach erfolgreicher Umbenennung aktualisiert.
**F: Kann ich das Tool über die Kommandozeile nutzen?**
A: Aktuell nur mit grafischer Oberfläche. Kommandozeilen-Unterstützung ist für eine zukünftige Version geplant.
### Merger-Fragen
**F: Was passiert mit den Originalprojekten beim Merge?**
A: Die Quellprojekte werden nicht verändert. Dateien werden kopiert, nicht verschoben.
**F: Kann ich den Merge rückgängig machen?**
A: Die ursprüngliche LSDX wird als `.backup` gespeichert. Die kopierten Dateien müssen manuell gelöscht werden.
**F: Werden alle Unterordner (Previews, etc.) auch gemergt?**
A: Ja, alle relevanten Unterordner werden übertragen.
---
## Support
Bei Fragen oder Problemen wenden Sie sich an Ihren Administrator.
---
*PointCab Renamer v4.1 - © 2026*

16
dist/cluster_cleanup.txt vendored Normal file
View File

@ -0,0 +1,16 @@
# Konfigurationsdatei für Clustername-Bereinigung
# Jede Zeile enthält einen String, der aus dem Stammverzeichnisnamen entfernt wird
# Leerzeilen und Zeilen die mit # beginnen werden ignoriert
#
# Beispiel: Stammverzeichnis "Am_Upstall_4_re" wird zu Clustername "Am_Upstall_4"
#
_re
_li
_mi
_mi-li
_mi-re
_part_1
_part_2
_part_3
_part_4
_part_5

BIN
dist/pointcab_renamer vendored Executable file

Binary file not shown.

2058
pointcab_renamer.py Normal file

File diff suppressed because it is too large Load Diff

38
pointcab_renamer.spec Normal file
View File

@ -0,0 +1,38 @@
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
['pointcab_renamer.py'],
pathex=[],
binaries=[],
datas=[('cluster_cleanup.txt', '.')],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name='pointcab_renamer',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)

Binary file not shown.

View File

@ -0,0 +1,385 @@
# PointCab Renamer - Benutzerhandbuch
**Version 4.1** | Datum: 14. Januar 2026
---
## Inhaltsverzeichnis
1. [Einführung](#einführung)
2. [Installation](#installation)
3. [Programmstart](#programmstart)
4. [Die drei Modi](#die-drei-modi)
- [Einzelprojekt-Modus](#einzelprojekt-modus)
- [Batch-Modus](#batch-modus)
- [Projekt-Merger](#projekt-merger)
5. [Konfiguration](#konfiguration)
6. [Troubleshooting](#troubleshooting)
7. [FAQ](#faq)
---
## Einführung
### Was ist der PointCab Renamer?
Der **PointCab Renamer** ist ein Werkzeug zur automatischen Umbenennung von PointCab-Projektdateien. Es löst das Problem, dass PointCab-Scandateien oft kryptische Namen haben (z.B. `1.lsd`, `2.lsd`) und benennt diese nach einem einheitlichen Schema um:
**Format:** `[ClusterName]_[ScanName].[Erweiterung]`
**Beispiel:** `EG_Flur_scan001.lsd`
### Hauptfunktionen
- **Einzelprojekt-Modus**: Ein einzelnes PointCab-Projekt umbenennen
- **Batch-Modus**: Mehrere Projekte gleichzeitig verarbeiten
- **Projekt-Merger**: Mehrere Projekte in ein Zielprojekt zusammenführen
- **Cluster-Bereinigung**: Automatische Entfernung von Suffixen wie `_re`, `_li` aus Clusternamen
- **Detailliertes Logging**: Vollständige Protokollierung aller Änderungen
---
## Installation
### Windows
1. Laden Sie die Datei `pointcab_renamer.exe` herunter
2. Speichern Sie die Datei in einem beliebigen Ordner (z.B. `C:\Tools\`)
3. Kopieren Sie die `cluster_cleanup.txt` in denselben Ordner
4. Starten Sie das Programm mit Doppelklick auf die `.exe`
### Ubuntu/Linux
1. Laden Sie die Datei `pointcab_renamer` herunter
2. Speichern Sie die Datei in einem beliebigen Ordner (z.B. `/home/benutzer/tools/`)
3. Kopieren Sie die `cluster_cleanup.txt` in denselben Ordner
4. Machen Sie die Datei ausführbar:
```bash
chmod +x pointcab_renamer
```
5. Starten Sie das Programm:
```bash
./pointcab_renamer
```
### Aus dem Quellcode (für Entwickler)
1. Stellen Sie sicher, dass Python 3.8+ installiert ist
2. Laden Sie den Quellcode herunter
3. Starten Sie mit:
```bash
python pointcab_renamer.py
```
---
## Programmstart
### Hauptmenü
Nach dem Start erscheint das Hauptmenü mit drei Optionen:
```
╔═══════════════════════════════════════════╗
║ PointCab Renamer v4.1 ║
╠═══════════════════════════════════════════╣
║ ║
║ [Einzelprojekt umbenennen] ║
║ ║
║ [Batch-Verarbeitung] ║
║ ║
║ [Projekt Merger] ║
║ ║
╚═══════════════════════════════════════════╝
```
---
## Die drei Modi
### Einzelprojekt-Modus
**Verwendung:** Wenn Sie ein einzelnes PointCab-Projekt umbenennen möchten.
#### Schritt-für-Schritt-Anleitung
1. Klicken Sie auf **"Einzelprojekt umbenennen"**
2. Wählen Sie die **LSDX-Projektdatei** aus (z.B. `Am_Upstall_4.lsdx`)
3. Wählen Sie den **PointCloud-Ordner** aus (enthält die `.lsd` Dateien)
4. Das Programm zeigt eine **Vorschau** der Änderungen:
```
Vorschau der Umbenennung:
─────────────────────────
1.lsd → EG_Flur_scan001.lsd
2.lsd → EG_Flur_scan002.lsd
3.lsd → OG_Bad_scan001.lsd
...
```
5. Klicken Sie auf **"Umbenennen starten"**
6. Nach Abschluss wird ein Protokoll angezeigt
#### Dateistruktur (Vorher → Nachher)
**Vorher:**
```
Am_Upstall_4_PointCloud/
├── 1.lsd
├── 2.lsd
├── 3.lsd
└── ...
```
**Nachher:**
```
Am_Upstall_4_PointCloud/
├── EG_Flur_scan001.lsd
├── EG_Flur_scan002.lsd
├── OG_Bad_scan001.lsd
└── ...
```
---
### Batch-Modus
**Verwendung:** Wenn Sie mehrere PointCab-Projekte auf einmal verarbeiten möchten.
#### Schritt-für-Schritt-Anleitung
1. Klicken Sie auf **"Batch-Verarbeitung"**
2. Wählen Sie den **Basisordner** aus, der alle Projekte enthält
3. Das Programm erkennt automatisch alle PointCab-Projekte:
```
Gefundene Projekte:
─────────────────────
☑ Projekt_A (15 Scans)
☑ Projekt_B (22 Scans)
☑ Projekt_C (8 Scans)
```
4. Wählen Sie die gewünschten Projekte aus (oder behalten Sie alle ausgewählt)
5. Klicken Sie auf **"Batch-Verarbeitung starten"**
6. Der Fortschritt wird angezeigt:
```
Verarbeite Projekt 1/3: Projekt_A
[████████████░░░░░░░░] 60%
```
7. Nach Abschluss wird eine Zusammenfassung angezeigt
#### Erwartete Ordnerstruktur
```
Basisordner/
├── Projekt_A/
│ ├── Projekt_A.lsdx
│ └── Projekt_A_PointCloud/
│ ├── 1.lsd
│ └── ...
├── Projekt_B/
│ ├── Projekt_B.lsdx
│ └── Projekt_B_PointCloud/
└── Projekt_C/
├── Projekt_C.lsdx
└── Projekt_C_PointCloud/
```
---
### Projekt-Merger
**Verwendung:** Wenn Sie mehrere PointCab-Projekte in ein einziges Projekt zusammenführen möchten.
#### Schritt-für-Schritt-Anleitung
1. Klicken Sie auf **"Projekt Merger"**
2. Wählen Sie den **Modus**:
- **Einzelprojekt zusammenführen**: Ein Quellprojekt → Zielprojekt
- **Batch-Merge**: Mehrere Quellprojekte → Zielprojekt
3. Wählen Sie das **Zielprojekt** (in das zusammengeführt wird)
4. Wählen Sie das/die **Quellprojekt(e)**
5. Das Programm zeigt eine **Vorschau** mit Konfliktauflösung:
```
Merge-Vorschau:
─────────────────────
Zielprojekt: Haupt_Projekt (5 Cluster, 25 Scans)
Quellprojekt: Teil_A (2 Cluster, 10 Scans)
Zu übertragende Dateien:
- EG_Flur_scan001.lsd
- EG_Flur_scan002.lsd (Konflikt → EG_Flur_scan002_merged_1.lsd)
- ...
```
6. Klicken Sie auf **"Merge starten"**
7. Nach Abschluss werden die Statistiken angezeigt:
```
Merge abgeschlossen!
─────────────────────
Cluster vorher: 5 → nachher: 7
Scans vorher: 25 → nachher: 35
Dateien kopiert: 10
Konflikte gelöst: 1
```
#### Konfliktauflösung
Wenn eine Datei im Zielprojekt bereits existiert:
- Die neue Datei wird umbenannt: `dateiname_merged_1.lsd`
- Bei weiteren Konflikten: `dateiname_merged_2.lsd`, etc.
- Die LSDX-Datei wird entsprechend aktualisiert
#### Wichtige Hinweise
- **Backup**: Das Zielprojekt wird vor dem Merge gesichert (`.lsdx.backup`)
- **UUID-Regenerierung**: Alle übertragenen Elemente erhalten neue eindeutige IDs
- **Cluster-Duplikate**: Gleichnamige Cluster werden zusammengeführt
---
## Konfiguration
### Die Datei cluster_cleanup.txt
Diese Konfigurationsdatei definiert, welche Suffixe aus Clusternamen entfernt werden sollen.
#### Speicherort
- **Windows**: Im selben Ordner wie `pointcab_renamer.exe`
- **Linux**: Im selben Ordner wie `pointcab_renamer`
#### Format
```
# Dies ist ein Kommentar
_re
_li
_mi
_mi-li
_mi-re
```
- Jede Zeile = ein zu entfernender String
- Zeilen mit `#` am Anfang sind Kommentare
- Leere Zeilen werden ignoriert
#### Beispiel
Mit der obigen Konfiguration:
- `Flur_re``Flur`
- `Bad_mi-li``Bad`
- `Küche_li``Küche`
#### Konfiguration neu laden
Änderungen an `cluster_cleanup.txt` werden nach einem Neustart oder über den Button **"Konfiguration neu laden"** übernommen.
---
## Troubleshooting
### Häufige Fehler und Lösungen
#### "LSDX-Datei nicht gefunden"
**Problem**: Das Programm kann die Projektdatei nicht finden.
**Lösung**:
- Stellen Sie sicher, dass die `.lsdx`-Datei im Projektordner existiert
- Prüfen Sie, ob Sie Leserechte für die Datei haben
- Der Dateiname sollte mit `.lsdx` enden (nicht `.LSDX`)
#### "PointCloud-Ordner nicht gefunden"
**Problem**: Der Ordner mit den Scandaten fehlt.
**Lösung**:
- Der Ordner muss `_PointCloud` im Namen haben
- Beispiel: `Projekt_A_PointCloud`
- Prüfen Sie die Ordnerstruktur
#### "Keine Projekte gefunden" (Batch-Modus)
**Problem**: Im Basisordner werden keine Projekte erkannt.
**Lösung**:
- Jedes Projekt muss eine `.lsdx`-Datei und einen `_PointCloud`-Ordner haben
- Der Projektname in der LSDX muss mit dem Ordnernamen übereinstimmen
#### "Zugriff verweigert"
**Problem**: Dateien können nicht umbenannt werden.
**Lösung**:
- Schließen Sie PointCab
- Prüfen Sie, ob andere Programme die Dateien verwenden
- Unter Windows: Als Administrator ausführen
- Unter Linux: Prüfen Sie die Dateiberechtigungen
#### "GUI startet nicht" (Linux)
**Problem**: Keine grafische Oberfläche unter Linux.
**Lösung**:
- Installieren Sie tkinter: `sudo apt install python3-tk`
- Stellen Sie sicher, dass ein Display verfügbar ist
---
## FAQ
### Allgemeine Fragen
**F: Werden die Originaldateien gelöscht?**
A: Nein, die Dateien werden nur umbenannt. Es werden keine Daten gelöscht.
**F: Kann ich die Umbenennung rückgängig machen?**
A: Die ursprünglichen Namen werden im Log-Datei protokolliert. Eine automatische Rückgängig-Funktion gibt es nicht.
**F: Funktioniert das Tool auch mit älteren PointCab-Versionen?**
A: Das Tool wurde für PointCab-Projekte mit LSDX-Format entwickelt. Ältere Formate werden möglicherweise nicht unterstützt.
**F: Wie viele Projekte kann ich im Batch-Modus verarbeiten?**
A: Es gibt keine feste Grenze. Die Verarbeitungszeit hängt von der Anzahl der Scans ab.
### Technische Fragen
**F: Wo werden die Log-Dateien gespeichert?**
A: Im Projektordner, mit dem Format:
- Einzelprojekt: `rename_YYYYMMDD_HHMMSS.log`
- Batch: `batch_YYYYMMDD_HHMMSS.log`
- Merger: `merge_YYYYMMDD_HHMMSS.log`
**F: Was passiert bei einem Stromausfall während der Verarbeitung?**
A: Die bereits umbenannten Dateien bleiben umbenannt. Die LSDX-Datei wird erst nach erfolgreicher Umbenennung aktualisiert.
**F: Kann ich das Tool über die Kommandozeile nutzen?**
A: Aktuell nur mit grafischer Oberfläche. Kommandozeilen-Unterstützung ist für eine zukünftige Version geplant.
### Merger-Fragen
**F: Was passiert mit den Originalprojekten beim Merge?**
A: Die Quellprojekte werden nicht verändert. Dateien werden kopiert, nicht verschoben.
**F: Kann ich den Merge rückgängig machen?**
A: Die ursprüngliche LSDX wird als `.backup` gespeichert. Die kopierten Dateien müssen manuell gelöscht werden.
**F: Werden alle Unterordner (Previews, etc.) auch gemergt?**
A: Ja, alle relevanten Unterordner werden übertragen.
---
## Support
Bei Fragen oder Problemen wenden Sie sich an Ihren Administrator.
---
*PointCab Renamer v4.1 - © 2026*

View File

@ -0,0 +1,171 @@
# Changelog - PointCab Renamer
Alle wichtigen Änderungen an diesem Projekt werden hier dokumentiert.
---
## [v4.2.1] - 2026-01-16
### Behoben
- **build_linux.sh überarbeitet und getestet**
- Verwendet `python3 -m PyInstaller` für bessere Kompatibilität
- Verbesserte Voraussetzungsprüfungen
- Bessere Fehlerbehandlung und Statusmeldungen
- ✅ GETESTET: Funktioniert erfolgreich
- **build_windows_wine.sh überarbeitet**
- Bessere Erkennung von Headless-Umgebungen
- Automatische Xvfb-Unterstützung falls verfügbar
- Klare Warnungen zu Wine-Einschränkungen
- Hilfreiche Alternativ-Vorschläge bei Fehlern
- ⚠️ HINWEIS: Wine-Builds in Headless-Umgebungen oft problematisch
### Dokumentation
- Build-Skript-Versionsnummern auf 4.2.1 aktualisiert
- DEPLOYMENT.md mit Testergebnissen aktualisiert
### Bekannte Einschränkungen
- Wine-basierte Windows-Builds funktionieren nicht zuverlässig auf Headless-Servern
- Empfehlung: Windows .exe auf echtem Windows-System erstellen
---
## [v4.2] - 2026-01-16
### Behoben
- **Windows build_windows.bat komplett überarbeitet**
- Verwendet jetzt `py` statt `python` (Python Launcher für Windows)
- Verwendet `py -m PyInstaller` statt direktem `pyinstaller`-Aufruf
- Korrekte --add-data Syntax für Windows (Semikolon als Trennzeichen)
- Verbesserte Fehlerbehandlung und Statusmeldungen
- **cluster_cleanup.txt Parser verbessert**
- Unterstützt jetzt UTF-8-BOM (von Windows-Editoren erzeugt)
- Robustere Behandlung von Leerzeilen und Kommentaren
- Gibt jetzt Anzahl geladener Einträge aus
### Hinzugefügt
- **cluster_cleanup.txt erweitert**
- Neue Einträge: `_part_1`, `_part_2`, `_part_3`, `_part_4`, `_part_5`
- **Git-Repository Setup**
- `.gitignore` für sauberes Repository
- `GIT_SETUP.md` mit Anleitung für Gitea/GitHub Push
### Dokumentation
- VERSION.txt aktualisiert
- CHANGELOG.md erweitert
---
## [v4.1.1] - 2026-01-14
### Hinzugefügt
- **Cross-Compilation-Unterstützung**: Windows .exe unter Linux erstellen
- `build_windows_on_linux.sh`: Docker-basiertes Build (empfohlen)
- `build_windows_wine.sh`: Wine-basiertes Build (Fallback)
- GitHub Actions Workflow-Beispiel für automatisierte Builds
### Dokumentation
- DEPLOYMENT.md um Cross-Compilation-Sektion erweitert
- Schritt-für-Schritt-Anleitung für Docker-Methode
- Troubleshooting für häufige Probleme
- Vergleichstabelle der Build-Methoden
- README.md mit Build-Optionen aktualisiert
---
## [v4.1] - 2026-01-14
### Behoben
- **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 korrekt gesetzt (Cluster→Registration, Scan→Cluster)
- Detailliertes Logging aller Merge-Operationen
- Finale Scan/Cluster-Statistik nach Merge
### Verbessert
- LSDX-Struktur im Code dokumentiert
- Verbesserte Fehlerbehandlung beim Merge
---
## [v4.0] - 2026-01-10
### Hinzugefügt
- **Projekt Merger**: Neuer Modus zum Zusammenführen mehrerer PointCab-Projekte
- Einzelprojekt-Merge: Ein Quellprojekt → Zielprojekt
- Batch-Merge: Mehrere Quellprojekte → Zielprojekt
- Intelligente Konfliktauflösung mit `_merged_N` Suffix
- Vollständige LSDX-Zusammenführung (Cluster, Scans, Dateireferenzen)
- UUID-Regenerierung für alle übertragenen Elemente
- Automatisches Backup der Ziel-LSDX vor dem Merge
### Verbessert
- Neue GUI für den Merger mit Konfliktvorschau
- Batch-Merge mit Fortschrittsanzeige
---
## [v3.1] - 2026-01-05
### Geändert
- **Neues Namensformat**: `[ClusterName]_[ScanName].[Erweiterung]`
- Vorher: `[ClusterName].[Erweiterung]`
- Nachher: `EG_Flur_scan001.lsd`
- Scan-Namen werden aus der LSDX extrahiert
- Cluster-Nummer-Duplikate werden vermieden
---
## [v3.0] - 2025-12-20
### Hinzugefügt
- **Batch-Verarbeitung**: Mehrere Projekte gleichzeitig umbenennen
- Automatische Projekterkennung im Basisordner
- Selektive Projektauswahl
- Fortschrittsanzeige für Batch-Operationen
- Zusammenfassendes Batch-Log
### Verbessert
- GUI-Umstrukturierung mit Hauptmenü
- Verbesserte Fehlerbehandlung bei Dateioperationen
---
## [v2.0] - 2025-12-01
### Hinzugefügt
- **Cluster-Bereinigung**: Automatische Entfernung von Suffixen
- Konfigurierbar über `cluster_cleanup.txt`
- Entfernt `_re`, `_li`, `_mi`, etc.
- Button "Konfiguration neu laden"
### Verbessert
- Verbesserte Vorschau der Umbenennung
- Detaillierteres Logging
---
## [v1.0] - 2025-11-15
### Erstveröffentlichung
- Grundfunktion: LSDX-Dateien einlesen
- Scans aus PointCloud-Ordner umbenennen
- Grafische Benutzeroberfläche (tkinter)
- Vorschau vor Umbenennung
- Log-Datei-Erstellung
---
## Geplante Features
- [ ] Kommandozeilen-Unterstützung (CLI-Modus)
- [ ] Rückgängig-Funktion für Umbenennungen
- [ ] Automatische Updates
- [ ] Mehrsprachige Unterstützung (Englisch)
---
*Hinweis: Dieses Changelog folgt dem Format von [Keep a Changelog](https://keepachangelog.com/).*

View File

@ -0,0 +1,592 @@
# PointCab Renamer - Deployment-Anleitung
**Version 4.2.1** | Datum: 16. Januar 2026
---
## Build-Status (Testergebnisse 2026-01-16)
| Build-Methode | Status | Hinweise |
|---------------|--------|----------|
| `build_windows.bat` | ✅ Funktioniert | Empfohlen auf Windows |
| `build_linux.sh` | ✅ Getestet | Funktioniert auf Ubuntu 20.04+ |
| `build_windows_wine.sh` | ⚠️ Experimentell | Fehlschläge auf Headless-Servern möglich |
| `build_windows_on_linux.sh` | ⚠️ Docker | Nicht in Docker-in-Docker möglich |
---
## Übersicht
Diese Anleitung beschreibt, wie Sie aus dem Python-Quellcode ausführbare Dateien für Windows (.exe) und Ubuntu (Binary) erstellen.
---
## Voraussetzungen
### Benötigte Software
| Komponente | Windows | Ubuntu |
|------------|---------|--------|
| Python | 3.8+ | 3.8+ |
| PyInstaller | 5.0+ | 5.0+ |
| tkinter | (in Python enthalten) | `python3-tk` |
### Installation der Voraussetzungen
#### Windows
1. **Python installieren:**
- Laden Sie Python von https://www.python.org/downloads/ herunter
- Bei der Installation: ☑ "Add Python to PATH" aktivieren
2. **PyInstaller installieren:**
```cmd
pip install pyinstaller
```
#### Ubuntu
1. **Python und tkinter installieren:**
```bash
sudo apt update
sudo apt install python3 python3-pip python3-tk
```
2. **PyInstaller installieren:**
```bash
pip3 install pyinstaller
```
---
## Windows-Build (.exe)
### Automatisch (empfohlen)
1. Öffnen Sie eine Eingabeaufforderung (cmd)
2. Navigieren Sie zum Projektordner:
```cmd
cd C:\Pfad\zum\pointcab_renamer
```
3. Führen Sie das Build-Skript aus:
```cmd
build_windows.bat
```
4. Die fertige `.exe` finden Sie im Ordner `dist\pointcab_renamer\`
### Manuell
1. Öffnen Sie eine Eingabeaufforderung
2. Navigieren Sie zum Quellcode-Ordner
3. Führen Sie PyInstaller aus:
```cmd
pyinstaller --onefile --windowed --name "PointCab_Renamer" ^<br> --add-data "cluster_cleanup.txt;." ^<br> pointcab_renamer.py
```
4. Die `.exe` befindet sich in `dist\PointCab_Renamer.exe`
### PyInstaller-Optionen erklärt
| Option | Beschreibung |
|--------|-------------|
| `--onefile` | Alles in eine einzige .exe packen |
| `--windowed` | Kein Konsolenfenster anzeigen |
| `--name` | Name der Ausgabedatei |
| `--add-data` | Zusätzliche Dateien einbinden |
| `--icon` | (Optional) Icon-Datei (.ico) |
### Bekannte Probleme unter Windows
**Problem:** Antivirus blockiert die .exe
**Lösung:** Die erstellte .exe als Ausnahme hinzufügen oder signieren.
**Problem:** "DLL nicht gefunden"
**Lösung:** Visual C++ Redistributable installieren.
---
## Ubuntu-Build (Binary)
### Automatisch (empfohlen)
1. Öffnen Sie ein Terminal
2. Navigieren Sie zum Projektordner:
```bash
cd /pfad/zum/pointcab_renamer
```
3. Machen Sie das Build-Skript ausführbar und führen Sie es aus:
```bash
chmod +x build_linux.sh
./build_linux.sh
```
4. Das fertige Binary finden Sie im Ordner `dist/`
### Manuell
1. Öffnen Sie ein Terminal
2. Navigieren Sie zum Quellcode-Ordner
3. Führen Sie PyInstaller aus:
```bash
pyinstaller --onefile --name "pointcab_renamer" \
--add-data "cluster_cleanup.txt:." \
pointcab_renamer.py
```
4. Das Binary befindet sich in `dist/pointcab_renamer`
5. Machen Sie es ausführbar:
```bash
chmod +x dist/pointcab_renamer
```
### Bekannte Probleme unter Ubuntu
**Problem:** "No display name and no $DISPLAY environment variable"
**Lösung:** Das Binary muss in einer grafischen Umgebung gestartet werden, nicht über SSH.
**Problem:** "_tkinter not found"
**Lösung:** `sudo apt install python3-tk`
---
## Cross-Compilation: Windows .exe unter Linux erstellen
Es gibt mehrere Möglichkeiten, eine Windows .exe unter Linux zu erstellen, ohne Windows zu installieren.
### Methode 1: Docker (Empfohlen)
Die Docker-Methode ist die zuverlässigste und reproduzierbarste Option.
#### Voraussetzungen
1. **Docker installieren:**
```bash
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
```
2. **Benutzer zur docker-Gruppe hinzufügen:**
```bash
sudo usermod -aG docker $USER
# Danach neu einloggen oder:
newgrp docker
```
3. **Docker-Installation testen:**
```bash
docker run hello-world
```
#### Verwendung
1. Navigieren Sie zum Projektordner:
```bash
cd /pfad/zum/pointcab_renamer
```
2. Führen Sie das Build-Skript aus:
```bash
./build_windows_on_linux.sh
```
3. Die fertige `.exe` befindet sich in `dist/PointCab_Renamer.exe`
#### Was das Skript macht
1. Prüft Docker-Installation und -Status
2. Lädt das `cdrx/pyinstaller-windows` Docker-Image (beim ersten Mal)
3. Startet einen Container mit Windows-Umgebung
4. Führt PyInstaller im Container aus
5. Kopiert die .exe und Zusatzdateien nach `dist/`
#### Vorteile der Docker-Methode
- ✅ Zuverlässig und reproduzierbar
- ✅ Isolierte Build-Umgebung
- ✅ Keine manuelle Windows-Python-Installation
- ✅ Gleiche Ergebnisse wie auf echtem Windows
- ✅ Einfach in CI/CD-Pipelines integrierbar
#### Troubleshooting Docker
**Problem:** "Permission denied" beim Docker-Aufruf
**Lösung:**
```bash
sudo usermod -aG docker $USER
# Neu einloggen erforderlich!
```
**Problem:** Docker-Image-Download schlägt fehl
**Lösung:** Proxy-Einstellungen prüfen oder manuell herunterladen:
```bash
docker pull cdrx/pyinstaller-windows:python3
```
**Problem:** Container startet nicht
**Lösung:** Docker-Daemon prüfen:
```bash
sudo systemctl status docker
sudo systemctl restart docker
```
---
### Methode 2: Wine (Fallback)
Die Wine-Methode ist weniger zuverlässig, kann aber ohne Docker verwendet werden.
#### Voraussetzungen
1. **Wine installieren:**
```bash
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install wine64 wine32
```
2. **Installation prüfen:**
```bash
wine --version
```
#### Verwendung
1. Navigieren Sie zum Projektordner:
```bash
cd /pfad/zum/pointcab_renamer
```
2. Führen Sie das Build-Skript aus:
```bash
./build_windows_wine.sh
```
3. Das Skript installiert automatisch:
- Windows-Python in Wine
- PyInstaller
#### Einschränkungen der Wine-Methode
- ⚠️ Nicht alle Windows-Funktionen werden unterstützt
- ⚠️ Kann bei komplexen Abhängigkeiten fehlschlagen
- ⚠️ Langsamerer Build-Prozess
- ⚠️ Ergebnisse können von echter Windows-Build abweichen
---
### Methode 3: GitHub Actions (Automatisiert)
Für regelmäßige Builds können Sie GitHub Actions verwenden.
Erstellen Sie `.github/workflows/build.yml`:
```yaml
name: Build Windows Executable
on:
push:
tags:
- 'v*'
workflow_dispatch:
jobs:
build-windows:
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install dependencies
run: pip install pyinstaller
- name: Build executable
run: |
pyinstaller --onefile --windowed --name "PointCab_Renamer" `
--add-data "cluster_cleanup.txt;." `
--add-data "BENUTZERHANDBUCH.md;." `
pointcab_renamer.py
- name: Upload artifact
uses: actions/upload-artifact@v3
with:
name: PointCab_Renamer_Windows
path: |
dist/PointCab_Renamer.exe
cluster_cleanup.txt
BENUTZERHANDBUCH.md
```
---
### Vergleich der Cross-Compilation-Methoden
| Methode | Zuverlässigkeit | Geschwindigkeit | Aufwand |
|---------|-----------------|-----------------|---------|
| Docker | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | Niedrig |
| Wine | ⭐⭐ | ⭐⭐ | Mittel |
| GitHub Actions | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | Niedrig |
| Echtes Windows | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | Hoch (VM) |
**Empfehlung:** Verwenden Sie die Docker-Methode für lokale Builds und GitHub Actions für automatisierte Release-Builds.
---
## Testen der Executables
### Windows-Test
1. Kopieren Sie die `.exe` und `cluster_cleanup.txt` in einen Testordner
2. Doppelklicken Sie auf die `.exe`
3. Das Hauptmenü sollte erscheinen
4. Testen Sie alle drei Modi mit einem Testprojekt
### Ubuntu-Test
1. Kopieren Sie das Binary und `cluster_cleanup.txt` in einen Testordner
2. Starten Sie das Programm:
```bash
./pointcab_renamer
```
3. Das Hauptmenü sollte erscheinen
4. Testen Sie alle drei Modi mit einem Testprojekt
### Checkliste für Tests
- [ ] Programm startet ohne Fehler
- [ ] Hauptmenü wird angezeigt
- [ ] LSDX-Datei kann ausgewählt werden
- [ ] PointCloud-Ordner wird erkannt
- [ ] Vorschau wird korrekt angezeigt
- [ ] Umbenennung funktioniert
- [ ] LSDX wird aktualisiert
- [ ] Log-Datei wird erstellt
- [ ] Batch-Modus funktioniert
- [ ] Merger funktioniert
---
## Distribution an Mitarbeiter
### Bereitstellung
1. **Für Windows:**
- Kopieren Sie diese Dateien in einen Ordner:
- `PointCab_Renamer.exe`
- `cluster_cleanup.txt`
- `BENUTZERHANDBUCH.md` (oder als PDF)
- Erstellen Sie ein ZIP-Archiv
- Verteilen Sie über Netzlaufwerk oder E-Mail
2. **Für Ubuntu:**
- Kopieren Sie diese Dateien in einen Ordner:
- `pointcab_renamer`
- `cluster_cleanup.txt`
- `BENUTZERHANDBUCH.md`
- Erstellen Sie ein tar.gz-Archiv:
```bash
tar -czvf pointcab_renamer_linux.tar.gz pointcab_renamer cluster_cleanup.txt BENUTZERHANDBUCH.md
```
- Verteilen Sie über Netzlaufwerk
### Empfohlene Ordnerstruktur für Mitarbeiter
```
PointCab_Renamer/
├── PointCab_Renamer.exe (oder pointcab_renamer für Linux)
├── cluster_cleanup.txt
├── BENUTZERHANDBUCH.md
└── logs/ (wird automatisch erstellt)
```
### Updates verteilen
1. Erstellen Sie die neue Executable
2. Informieren Sie die Mitarbeiter über Änderungen (CHANGELOG)
3. Mitarbeiter ersetzen die alte .exe durch die neue
4. `cluster_cleanup.txt` kann beibehalten werden (falls angepasst)
---
## Troubleshooting beim Build
### "ModuleNotFoundError"
**Lösung:** Fehlende Module installieren:
```bash
pip install <modulname>
```
### "Hidden import not found"
**Lösung:** Hidden imports hinzufügen:
```bash
pyinstaller --hidden-import=<modulname> ...
```
### "Executable zu groß" (>100MB)
**Lösung:** UPX-Kompression aktivieren:
```bash
pip install upx
pyinstaller --onefile --upx-dir=/pfad/zu/upx ...
```
### "tkinter funktioniert nicht"
**Windows:** tkinter ist normalerweise in Python enthalten. Reinstallieren Sie Python mit der "tcl/tk" Option.
**Ubuntu:** Installieren Sie python3-tk:
```bash
sudo apt install python3-tk
```
---
## Versionskontrolle
Bei jeder neuen Version:
1. Version im Quellcode aktualisieren (`VERSION = "4.2"` etc.)
2. CHANGELOG.md aktualisieren
3. Neue Builds für Windows und Ubuntu erstellen
4. Builds testen
5. Im Git-Repository taggen:
```bash
git tag -a v4.2 -m "Version 4.2"
git push origin v4.2
```
---
---
## Troubleshooting: Docker-Probleme
### Docker ist nicht installiert
**Ubuntu/Debian:**
```bash
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker $USER
# Dann neu einloggen oder: newgrp docker
```
**Fedora/RHEL:**
```bash
sudo dnf install docker
sudo systemctl start docker
```
### Docker-Daemon startet nicht
**Symptom:** `Cannot connect to the Docker daemon`
**Lösungen:**
1. **Service starten:**
```bash
sudo systemctl start docker
```
2. **Status prüfen:**
```bash
sudo systemctl status docker
```
3. **Logs prüfen:**
```bash
sudo journalctl -u docker.service
```
### Berechtigung verweigert
**Symptom:** `permission denied while trying to connect to the Docker daemon`
**Lösung:** Benutzer zur Docker-Gruppe hinzufügen:
```bash
sudo usermod -aG docker $USER
# Danach neu einloggen
```
Oder mit sudo ausführen:
```bash
sudo ./build_windows_on_linux.sh
```
### Docker in Container-Umgebung (Docker-in-Docker)
**Problem:** Docker kann nicht in unprivilegierten Containern laufen.
**Lösungen:**
1. **Wine-Alternative verwenden:**
```bash
./build_windows_wine.sh
```
2. **Auf Host-System bauen**
3. **GitHub Actions nutzen** (siehe `.github/workflows/`)
4. **Container mit `--privileged` starten** (nicht empfohlen für Produktion)
### WSL2 unter Windows
**Problem:** Docker-Befehle schlagen in WSL2 fehl.
**Lösung:**
1. Docker Desktop für Windows installieren
2. In Docker Desktop: Settings → Resources → WSL Integration aktivieren
3. WSL-Distribution auswählen
### Docker-Image Download schlägt fehl
**Symptom:** `Error pulling image` oder Timeout
**Lösungen:**
1. **Internetverbindung prüfen**
2. **Proxy konfigurieren:**
```bash
export HTTP_PROXY=http://proxy:port
export HTTPS_PROXY=http://proxy:port
```
3. **Manueller Download:**
```bash
sudo docker pull cdrx/pyinstaller-windows:python3
```
---
## Vergleich der Build-Methoden
| Methode | Plattform | Vorteile | Nachteile |
|---------|-----------|----------|-----------|
| `build_windows.bat` | Windows | Nativ, zuverlässig | Braucht Windows |
| `build_windows_on_linux.sh` | Linux + Docker | Cross-compilation | Docker erforderlich |
| `build_windows_wine.sh` | Linux + Wine | Kein Docker nötig | Weniger zuverlässig |
| GitHub Actions | Cloud | Automatisiert | Braucht GitHub-Repo |
**Empfehlung:** Für zuverlässige Windows-Builds verwenden Sie:
1. **Native Windows** (build_windows.bat) - Am zuverlässigsten
2. **Docker auf Linux** (build_windows_on_linux.sh) - Gut für CI/CD
3. **GitHub Actions** - Automatisiert bei jedem Push/Release
---
*PointCab Renamer Deployment Guide v4.1.2 - © 2026*

View File

@ -0,0 +1,107 @@
# Git-Repository Setup für PointCab Renamer
## Voraussetzungen
- Git installiert
- Zugang zu Gitea/GitHub Repository
## Lokales Repository initialisieren
Das Repository wurde bereits initialisiert. Falls Sie ein neues Repository erstellen möchten:
```bash
cd pointcab_renamer
git init
git add .
git commit -m "Initial commit: PointCab Renamer v4.2"
```
## Zu Gitea pushen
1. **Repository auf Gitea erstellen** (falls noch nicht geschehen)
- Loggen Sie sich bei Gitea ein
- Erstellen Sie ein neues Repository (z.B. `pointcab_renamer`)
- Kopieren Sie die Repository-URL
2. **Remote hinzufügen und pushen:**
```bash
# Remote hinzufügen
git remote add origin https://gitea.example.com/username/pointcab_renamer.git
# Oder für SSH:
git remote add origin git@gitea.example.com:username/pointcab_renamer.git
# Push zum Remote
git push -u origin main
```
## Zu GitHub pushen
```bash
# Remote hinzufügen
git remote add origin https://github.com/username/pointcab_renamer.git
# Oder für SSH:
git remote add origin git@github.com:username/pointcab_renamer.git
# Push zum Remote
git push -u origin main
```
## Änderungen pushen
Nach dem initialen Push:
```bash
# Änderungen hinzufügen
git add .
# Commit erstellen
git commit -m "Beschreibung der Änderungen"
# Pushen
git push
```
## Branching-Strategie
- `main` - Stabiler Release-Branch
- `develop` - Entwicklungs-Branch
- `feature/*` - Feature-Branches
- `bugfix/*` - Bugfix-Branches
## Releases erstellen
```bash
# Tag für Release erstellen
git tag -a v4.2 -m "Release v4.2 - Bugfixes und Parser-Verbesserungen"
# Tag pushen
git push origin v4.2
```
## Häufige Befehle
```bash
# Status anzeigen
git status
# Log anzeigen
git log --oneline
# Änderungen abrufen
git pull
# Branch wechseln
git checkout branch-name
# Neuen Branch erstellen
git checkout -b neuer-branch
```
## Hinweise
- Die `.gitignore` ignoriert Build-Artefakte, Logs und temporäre Dateien
- Bei Konflikten: `git pull --rebase` verwenden
- Regelmäßig pushen, um Datenverlust zu vermeiden

View File

@ -0,0 +1,73 @@
=====================================================
PointCab Renamer v4.1 - Schnellstart-Anleitung
=====================================================
INHALT DES ARCHIVS:
-------------------
- pointcab_renamer.py - Hauptprogramm (Quellcode)
- cluster_cleanup.txt - Konfigurationsdatei
- BENUTZERHANDBUCH.md - Ausführliche Anleitung
- DEPLOYMENT.md - Anleitung zum Erstellen von .exe/Binary
- README.md - Projektübersicht
- CHANGELOG.md - Versionsänderungen
- build_windows.bat - Build-Skript für Windows
- build_linux.sh - Build-Skript für Linux
- requirements.txt - Python-Abhängigkeiten
- LICENSE.txt - Lizenzinformationen
- VERSION.txt - Versionsinformationen
SCHNELLSTART - WINDOWS:
-----------------------
1. Entpacken Sie das Archiv in einen beliebigen Ordner
2. Option A - Mit Python:
- Python 3.8+ installieren (python.org)
- Doppelklick auf pointcab_renamer.py
Option B - Als .exe erstellen:
- Doppelklick auf build_windows.bat
- Fertige .exe liegt in dist/
SCHNELLSTART - LINUX/UBUNTU:
----------------------------
1. Entpacken Sie das Archiv:
unzip pointcab_renamer_v4.1_release.zip
cd pointcab_renamer_release
2. Option A - Mit Python:
sudo apt install python3 python3-tk
python3 pointcab_renamer.py
Option B - Als Binary erstellen:
chmod +x build_linux.sh
./build_linux.sh
./dist/pointcab_renamer
ERSTE SCHRITTE:
---------------
1. Starten Sie das Programm
2. Wählen Sie einen Modus:
- Einzelprojekt: Ein PointCab-Projekt umbenennen
- Batch: Mehrere Projekte auf einmal
- Merger: Projekte zusammenführen
3. Folgen Sie den Anweisungen auf dem Bildschirm
WICHTIGE HINWEISE:
------------------
- Die Datei cluster_cleanup.txt muss im selben Ordner
wie das Programm liegen
- Vor dem Umbenennen immer ein Backup erstellen!
- Bei Problemen: BENUTZERHANDBUCH.md lesen
SUPPORT:
--------
Bei Fragen wenden Sie sich an die IT-Abteilung.
=====================================================
Version 4.1 | Januar 2026
=====================================================

View File

@ -0,0 +1,32 @@
PointCab Renamer - Lizenzvereinbarung
=====================================
Copyright (c) 2026 - Alle Rechte vorbehalten
NUTZUNGSBEDINGUNGEN:
1. INTERNE NUTZUNG
Diese Software ist ausschließlich für den internen Gebrauch
innerhalb des Unternehmens bestimmt.
2. WEITERGABE
Die Weitergabe an Dritte außerhalb des Unternehmens ist
ohne ausdrückliche schriftliche Genehmigung untersagt.
3. VERÄNDERUNGEN
Änderungen am Quellcode sind nur mit Rücksprache mit der
IT-Abteilung gestattet.
4. GEWÄHRLEISTUNG
Die Software wird "wie besehen" ohne jegliche Gewährleistung
bereitgestellt. Der Autor haftet nicht für Schäden, die durch
die Nutzung dieser Software entstehen könnten.
5. SUPPORT
Bei Fragen oder Problemen wenden Sie sich bitte an die
IT-Abteilung.
---
Diese Lizenz gilt für alle Versionen der Software, sofern
nicht anders angegeben.

View File

@ -0,0 +1,276 @@
# 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

View File

@ -0,0 +1 @@
4.2.1

View File

@ -0,0 +1,160 @@
#!/bin/bash
# ============================================
# PointCab Renamer - Linux Build Script
# Version 4.2.1
# ============================================
set -e # Bei Fehlern abbrechen
echo ""
echo "==================================="
echo " PointCab Renamer - Linux Build"
echo " Version 4.2.1"
echo "==================================="
echo ""
# Farben für Ausgabe
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Arbeitsverzeichnis
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
echo -e "${BLUE}[1/6] Prüfe Voraussetzungen...${NC}"
# Prüfe ob Python3 installiert ist
if ! command -v python3 &> /dev/null; then
echo -e "${RED}[FEHLER] Python3 ist nicht installiert.${NC}"
echo ""
echo "Installation:"
echo " Ubuntu/Debian: sudo apt install python3 python3-pip python3-tk"
echo " Fedora: sudo dnf install python3 python3-pip python3-tkinter"
exit 1
fi
PYTHON_VERSION=$(python3 --version 2>&1)
echo -e "${GREEN}✓ Python3 gefunden: $PYTHON_VERSION${NC}"
# Prüfe ob tkinter installiert ist
echo -e "${BLUE}[2/6] Prüfe tkinter...${NC}"
if ! python3 -c "import tkinter" 2>/dev/null; then
echo -e "${YELLOW}[WARNUNG] tkinter nicht gefunden.${NC}"
echo ""
echo "Installation von tkinter:"
echo " Ubuntu/Debian: sudo apt install python3-tk"
echo " Fedora: sudo dnf install python3-tkinter"
echo ""
# Versuche automatische Installation (nur wenn sudo verfügbar)
if command -v apt &> /dev/null && [ -w /etc/apt ]; then
echo "Versuche automatische Installation..."
sudo apt install -y python3-tk || {
echo -e "${RED}[FEHLER] Automatische Installation fehlgeschlagen.${NC}"
echo "Bitte manuell installieren: sudo apt install python3-tk"
exit 1
}
else
echo -e "${RED}[FEHLER] tkinter muss manuell installiert werden.${NC}"
exit 1
fi
fi
echo -e "${GREEN}✓ tkinter verfügbar${NC}"
# Prüfe ob pip installiert ist
echo -e "${BLUE}[3/6] Prüfe pip...${NC}"
if ! command -v pip3 &> /dev/null && ! python3 -m pip --version &> /dev/null; then
echo -e "${YELLOW}[INFO] pip3 nicht gefunden.${NC}"
echo ""
echo "Installation von pip:"
echo " Ubuntu/Debian: sudo apt install python3-pip"
echo " Fedora: sudo dnf install python3-pip"
echo " Oder: python3 -m ensurepip --upgrade"
exit 1
fi
echo -e "${GREEN}✓ pip verfügbar${NC}"
# Prüfe ob PyInstaller installiert ist
echo -e "${BLUE}[4/6] Prüfe PyInstaller...${NC}"
if ! python3 -m PyInstaller --version &> /dev/null 2>&1; then
echo -e "${YELLOW}[INFO] PyInstaller nicht gefunden. Installiere...${NC}"
python3 -m pip install --user pyinstaller || {
echo -e "${RED}[FEHLER] PyInstaller konnte nicht installiert werden.${NC}"
echo "Versuche: pip3 install pyinstaller"
exit 1
}
fi
PYINSTALLER_VERSION=$(python3 -m PyInstaller --version 2>&1)
echo -e "${GREEN}✓ PyInstaller installiert: $PYINSTALLER_VERSION${NC}"
# Prüfe Projektdateien
echo -e "${BLUE}[5/6] Prüfe Projektdateien...${NC}"
if [ ! -f "pointcab_renamer.py" ]; then
echo -e "${RED}[FEHLER] pointcab_renamer.py nicht gefunden!${NC}"
echo "Bitte führen Sie das Skript im Projektverzeichnis aus."
exit 1
fi
if [ ! -f "cluster_cleanup.txt" ]; then
echo -e "${RED}[FEHLER] cluster_cleanup.txt nicht gefunden!${NC}"
exit 1
fi
echo -e "${GREEN}✓ Projektdateien vorhanden${NC}"
# Lösche alte Build-Verzeichnisse
echo ""
echo -e "${BLUE}[6/6] Starte Build-Prozess...${NC}"
echo "[INFO] Räume alte Build-Dateien auf..."
rm -rf build dist *.spec 2>/dev/null || true
echo "[INFO] Erstelle Linux-Binary..."
echo ""
# PyInstaller ausführen
python3 -m PyInstaller \
--onefile \
--name "pointcab_renamer" \
--add-data "cluster_cleanup.txt:." \
pointcab_renamer.py
if [ $? -ne 0 ]; then
echo ""
echo -e "${RED}[FEHLER] Build fehlgeschlagen!${NC}"
echo ""
echo "Mögliche Ursachen:"
echo " - PyInstaller-Version inkompatibel"
echo " - Fehlende Abhängigkeiten"
echo ""
echo "Versuche: pip3 install --upgrade pyinstaller"
exit 1
fi
echo ""
echo -e "${GREEN}[INFO] Build erfolgreich!${NC}"
echo ""
# Kopiere notwendige Dateien in dist-Ordner
echo "[INFO] Kopiere zusätzliche Dateien..."
cp cluster_cleanup.txt dist/
[ -f BENUTZERHANDBUCH.md ] && cp BENUTZERHANDBUCH.md dist/
# Mache das Binary ausführbar
chmod +x dist/pointcab_renamer
# Zeige Ergebnis
echo ""
echo -e "${GREEN}===================================${NC}"
echo -e "${GREEN} BUILD ERFOLGREICH!${NC}"
echo -e "${GREEN}===================================${NC}"
echo ""
echo "Erstellte Dateien:"
ls -lh dist/
echo ""
echo "Verwendung:"
echo " cd dist && ./pointcab_renamer"
echo ""
echo "Für Distribution alle Dateien aus dist/ kopieren."
echo ""

View File

@ -0,0 +1,119 @@
@echo off
REM ============================================
REM PointCab Renamer - Windows Build Script v4.2
REM ============================================
REM Verwendet den Python Launcher (py) für bessere Kompatibilität
REM
REM Voraussetzungen:
REM - Python 3.8+ mit py Launcher installiert
REM - PyInstaller (wird bei Bedarf installiert)
REM
REM Verwendung:
REM 1. Öffnen Sie die Eingabeaufforderung (cmd)
REM 2. Navigieren Sie zum Projektordner
REM 3. Führen Sie: build_windows.bat aus
REM ============================================
setlocal enabledelayedexpansion
echo.
echo ============================================
echo PointCab Renamer - Windows Build v4.2
echo ============================================
echo.
REM Prüfe Python Installation
echo [1/5] Prüfe Python Installation...
py --version >nul 2>&1
if errorlevel 1 (
echo.
echo FEHLER: Python wurde nicht gefunden!
echo.
echo Bitte installieren Sie Python von:
echo https://www.python.org/downloads/
echo.
echo Stellen Sie sicher, dass bei der Installation
echo "Add Python to PATH" aktiviert ist.
echo.
pause
exit /b 1
)
for /f "tokens=2" %%v in ('py --version 2^>^&1') do set PYTHON_VERSION=%%v
echo Python %PYTHON_VERSION% gefunden.
REM Prüfe/Installiere PyInstaller
echo.
echo [2/5] Prüfe PyInstaller...
py -m PyInstaller --version >nul 2>&1
if errorlevel 1 (
echo PyInstaller nicht gefunden. Installiere...
py -m pip install pyinstaller
if errorlevel 1 (
echo.
echo FEHLER: PyInstaller konnte nicht installiert werden!
echo Bitte führen Sie manuell aus:
echo py -m pip install pyinstaller
echo.
pause
exit /b 1
)
)
for /f "tokens=*" %%v in ('py -m PyInstaller --version 2^>^&1') do set PYINSTALLER_VERSION=%%v
echo PyInstaller %PYINSTALLER_VERSION% gefunden.
REM Bereinige alte Builds
echo.
echo [3/5] Bereinige alte Build-Dateien...
if exist build rmdir /s /q build
if exist dist rmdir /s /q dist
if exist *.spec del /f /q *.spec
echo Alte Dateien entfernt.
REM Erstelle Executable
echo.
echo [4/5] Erstelle Windows Executable...
echo Dies kann einige Minuten dauern...
echo.
py -m PyInstaller --onefile --windowed --name "PointCab_Renamer" ^
--add-data "cluster_cleanup.txt;." ^
--add-data "BENUTZERHANDBUCH.md;." ^
pointcab_renamer.py
if errorlevel 1 (
echo.
echo FEHLER: Build fehlgeschlagen!
echo Bitte prüfen Sie die Fehlermeldungen oben.
echo.
pause
exit /b 1
)
REM Kopiere zusätzliche Dateien
echo.
echo [5/5] Kopiere zusätzliche Dateien...
copy cluster_cleanup.txt dist\ >nul 2>&1
copy BENUTZERHANDBUCH.md dist\ >nul 2>&1
copy README.md dist\ >nul 2>&1
echo Dateien kopiert.
REM Erfolgsmeldung
echo.
echo ============================================
echo BUILD ERFOLGREICH!
echo ============================================
echo.
echo Die Executable befindet sich in:
echo dist\PointCab_Renamer.exe
echo.
echo Zusätzliche Dateien in dist\:
echo - cluster_cleanup.txt
echo - BENUTZERHANDBUCH.md
echo - README.md
echo.
echo Hinweis: Die cluster_cleanup.txt muss neben
echo der .exe Datei liegen!
echo.
echo ============================================
pause

View File

@ -0,0 +1,278 @@
#!/bin/bash
# ============================================================================
# PointCab Renamer - Windows Build unter Linux (Docker-Methode)
# Version: 4.1.2
# ============================================================================
#
# Dieses Skript erstellt eine Windows .exe unter Linux mittels Docker.
# Es verwendet das cdrx/pyinstaller-windows Image für zuverlässige Builds.
#
# VORAUSSETZUNGEN:
# - Docker muss installiert sein (wird bei Bedarf mit sudo gestartet)
# - Internet-Verbindung für den ersten Docker-Image-Download
#
# VERWENDUNG:
# ./build_windows_on_linux.sh
#
# TROUBLESHOOTING:
# Falls Docker nicht startet, prüfen Sie:
# - sudo systemctl start docker
# - Benutzer zur docker-Gruppe hinzufügen: sudo usermod -aG docker $USER
# - In Container-Umgebungen (z.B. Docker-in-Docker): --privileged Flag nötig
#
# ============================================================================
set -e # Bei Fehlern abbrechen
# Farben für Ausgabe
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Banner
echo -e "${BLUE}"
echo "============================================================================"
echo " PointCab Renamer - Windows Cross-Compilation unter Linux"
echo " Version 4.1.2"
echo "============================================================================"
echo -e "${NC}"
# Hilfsfunktion: Docker-Befehl mit oder ohne sudo
docker_cmd() {
if docker "$@" 2>/dev/null; then
return 0
elif sudo docker "$@" 2>/dev/null; then
USE_SUDO=1
return 0
else
return 1
fi
}
run_docker() {
if [ "$USE_SUDO" = "1" ]; then
sudo docker "$@"
else
docker "$@"
fi
}
# [1/7] Prüfe ob Docker installiert ist
echo -e "${YELLOW}[1/7] Prüfe Docker-Installation...${NC}"
if ! command -v docker &> /dev/null; then
echo -e "${RED}FEHLER: Docker ist nicht installiert!${NC}"
echo ""
echo "Installiere Docker mit:"
echo " Ubuntu/Debian:"
echo " sudo apt update"
echo " sudo apt install docker.io"
echo " sudo systemctl start docker"
echo " sudo systemctl enable docker"
echo " sudo usermod -aG docker \$USER"
echo " # Danach neu einloggen oder: newgrp docker"
echo ""
echo " Fedora/RHEL:"
echo " sudo dnf install docker"
echo " sudo systemctl start docker"
echo ""
echo "Alternativ: Verwende ./build_windows_wine.sh (Wine-basiert)"
exit 1
fi
echo -e "${GREEN}✓ Docker ist installiert${NC}"
# [2/7] Prüfe ob Docker-Daemon läuft, versuche Start mit sudo falls nötig
echo -e "${YELLOW}[2/7] Prüfe Docker-Daemon...${NC}"
USE_SUDO=0
if docker info &> /dev/null; then
echo -e "${GREEN}✓ Docker-Daemon läuft (ohne sudo)${NC}"
elif sudo docker info &> /dev/null; then
USE_SUDO=1
echo -e "${GREEN}✓ Docker-Daemon läuft (mit sudo)${NC}"
else
# Versuche Docker zu starten
echo -e "${YELLOW}Docker-Daemon läuft nicht. Versuche zu starten...${NC}"
# Versuche systemd
if command -v systemctl &> /dev/null; then
sudo systemctl start docker 2>/dev/null && sleep 2
fi
# Prüfe erneut
if docker info &> /dev/null; then
echo -e "${GREEN}✓ Docker-Daemon erfolgreich gestartet${NC}"
elif sudo docker info &> /dev/null; then
USE_SUDO=1
echo -e "${GREEN}✓ Docker-Daemon erfolgreich gestartet (mit sudo)${NC}"
else
echo -e "${RED}FEHLER: Docker-Daemon konnte nicht gestartet werden!${NC}"
echo ""
echo "Mögliche Ursachen und Lösungen:"
echo ""
echo "1. Docker-Service nicht gestartet:"
echo " sudo systemctl start docker"
echo ""
echo "2. Berechtigungsproblem:"
echo " sudo usermod -aG docker \$USER"
echo " # Dann neu einloggen"
echo ""
echo "3. In Container-Umgebung (Docker-in-Docker):"
echo " Docker kann nicht in unprivilegierten Containern laufen."
echo " Nutze stattdessen: ./build_windows_wine.sh"
echo " Oder: Baue auf einem System mit nativem Docker."
echo ""
echo "4. WSL2 unter Windows:"
echo " Starte Docker Desktop und aktiviere WSL2-Integration."
echo ""
echo "Alternative Build-Methoden:"
echo " - ./build_windows_wine.sh (Wine-basiert)"
echo " - GitHub Actions (siehe .github/workflows/)"
echo " - Natives Windows: build_windows.bat"
exit 1
fi
fi
# Arbeitsverzeichnis
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
# [3/7] Prüfe ob notwendige Dateien existieren
echo -e "${YELLOW}[3/7] Prüfe Projektdateien...${NC}"
if [ ! -f "pointcab_renamer.py" ]; then
echo -e "${RED}FEHLER: pointcab_renamer.py nicht gefunden!${NC}"
echo "Stelle sicher, dass du dich im richtigen Verzeichnis befindest."
exit 1
fi
if [ ! -f "cluster_cleanup.txt" ]; then
echo -e "${RED}FEHLER: cluster_cleanup.txt nicht gefunden!${NC}"
exit 1
fi
echo -e "${GREEN}✓ Alle Projektdateien vorhanden${NC}"
# [4/7] Aufräumen
echo -e "${YELLOW}[4/7] Räume alte Build-Artefakte auf...${NC}"
rm -rf build/ dist/ *.spec 2>/dev/null || true
mkdir -p dist
echo -e "${GREEN}✓ Build-Verzeichnisse bereinigt${NC}"
# Docker Image
DOCKER_IMAGE="cdrx/pyinstaller-windows:python3"
# [5/7] Prüfe/Lade Docker Image
echo -e "${YELLOW}[5/7] Prüfe Docker Image...${NC}"
echo " Image: $DOCKER_IMAGE"
echo " (Beim ersten Mal wird ~1.5 GB heruntergeladen)"
if ! run_docker image inspect "$DOCKER_IMAGE" &> /dev/null; then
echo ""
echo "Lade Docker Image herunter..."
run_docker pull "$DOCKER_IMAGE"
fi
echo -e "${GREEN}✓ Docker Image bereit${NC}"
# [6/7] Build durchführen
echo -e "${YELLOW}[6/7] Erstelle Windows .exe mit PyInstaller...${NC}"
echo " Dies kann 2-5 Minuten dauern..."
echo ""
# Erstelle temporäres Build-Skript für Docker-Container
BUILD_SCRIPT=$(mktemp)
cat > "$BUILD_SCRIPT" << 'DOCKERSCRIPT'
#!/bin/bash
set -e
cd /src
echo "=== Docker Container gestartet ==="
echo "Python-Version: $(python --version)"
echo "PyInstaller-Version: $(pip show pyinstaller | grep Version)"
echo ""
# Installiere requirements falls vorhanden
if [ -f "requirements.txt" ]; then
echo "Installiere requirements..."
pip install -r requirements.txt --quiet
fi
echo "Starte PyInstaller Build..."
# PyInstaller Build
pyinstaller --onefile \
--windowed \
--name "PointCab_Renamer" \
--add-data "cluster_cleanup.txt;." \
--add-data "BENUTZERHANDBUCH.md;." \
--icon="NONE" \
--clean \
pointcab_renamer.py
echo ""
echo "=== Build im Container abgeschlossen ==="
DOCKERSCRIPT
chmod +x "$BUILD_SCRIPT"
# Docker Container ausführen
if [ "$USE_SUDO" = "1" ]; then
sudo docker run --rm \
-v "$SCRIPT_DIR":/src \
-v "$BUILD_SCRIPT":/docker_build.sh:ro \
"$DOCKER_IMAGE" \
bash /docker_build.sh
else
docker run --rm \
-v "$SCRIPT_DIR":/src \
-v "$BUILD_SCRIPT":/docker_build.sh:ro \
"$DOCKER_IMAGE" \
bash /docker_build.sh
fi
# Aufräumen
rm -f "$BUILD_SCRIPT"
# [7/7] Prüfe Ergebnis
echo ""
echo -e "${YELLOW}[7/7] Verifiziere Build-Ergebnis...${NC}"
if [ -f "dist/PointCab_Renamer.exe" ]; then
echo -e "${GREEN}✓ Windows .exe erfolgreich erstellt!${NC}"
# Kopiere zusätzliche Dateien
cp cluster_cleanup.txt dist/
[ -f "BENUTZERHANDBUCH.md" ] && cp BENUTZERHANDBUCH.md dist/
[ -f "BENUTZERHANDBUCH.pdf" ] && cp BENUTZERHANDBUCH.pdf dist/
[ -f "README.md" ] && cp README.md dist/
[ -f "LICENSE.txt" ] && cp LICENSE.txt dist/
# Zeige Ergebnis
echo ""
echo -e "${BLUE}============================================================================${NC}"
echo -e "${GREEN}BUILD ERFOLGREICH!${NC}"
echo -e "${BLUE}============================================================================${NC}"
echo ""
echo "Erstellte Dateien in dist/:"
ls -lh dist/
echo ""
EXE_SIZE=$(du -h "dist/PointCab_Renamer.exe" | cut -f1)
echo "Executable-Größe: $EXE_SIZE"
echo ""
echo "Pfad: $SCRIPT_DIR/dist/"
echo ""
echo -e "${YELLOW}WICHTIG:${NC}"
echo " 1. Teste die .exe auf einem echten Windows-System!"
echo " 2. Stelle sicher, dass cluster_cleanup.txt im gleichen"
echo " Ordner wie die .exe liegt."
echo ""
else
echo -e "${RED}FEHLER: Build fehlgeschlagen!${NC}"
echo ""
echo "Die Datei dist/PointCab_Renamer.exe wurde nicht erstellt."
echo ""
echo "Prüfe die Fehlermeldungen oben und versuche:"
echo " 1. ./build_windows_wine.sh (Wine-Alternative)"
echo " 2. Build auf nativem Windows mit build_windows.bat"
echo ""
exit 1
fi

View File

@ -0,0 +1,274 @@
#!/bin/bash
# ============================================================================
# PointCab Renamer - Windows Build unter Linux (Wine-Methode)
# Version: 4.2.1
# ============================================================================
#
# WICHTIG: Wine-basierte Builds sind EXPERIMENTELL und können fehlschlagen!
#
# BEKANNTE EINSCHRÄNKUNGEN:
# - Headless Server (ohne GUI): Python-Installation kann fehlschlagen
# - Manche Wine-Versionen haben Kompatibilitätsprobleme
# - GUI-basierte Python-Installer benötigen X11/Display
#
# EMPFOHLENE ALTERNATIVEN:
# 1. Windows-PC: build_windows.bat direkt ausführen
# 2. GitHub Actions: CI/CD für automatisierte Builds
# 3. Dual-Boot/VM: Windows-Build in echter Windows-Umgebung
#
# ============================================================================
# Farben für Ausgabe
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Konfiguration
PYTHON_VERSION="3.10.11"
PYTHON_INSTALLER="python-${PYTHON_VERSION}-amd64.exe"
PYTHON_URL="https://www.python.org/ftp/python/${PYTHON_VERSION}/${PYTHON_INSTALLER}"
WINE_PREFIX="$HOME/.wine_python"
# Banner
echo -e "${BLUE}"
echo "============================================================================"
echo " PointCab Renamer - Windows Cross-Compilation (Wine-Methode)"
echo " Version 4.2.1 - EXPERIMENTELL"
echo "============================================================================"
echo -e "${NC}"
echo -e "${YELLOW}╔════════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${YELLOW}║ WARNUNG: Diese Methode ist EXPERIMENTELL und kann fehlschlagen! ║${NC}"
echo -e "${YELLOW}╚════════════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo "Bekannte Probleme:"
echo " • Headless Server ohne X11: Python-Installer kann hängen"
echo " • Wine-Kompatibilität variiert je nach Version"
echo " • ~500MB Download und 10+ Minuten Installationszeit"
echo ""
echo "Empfohlene Alternativen:"
echo " 1. Windows-PC: build_windows.bat ausführen"
echo " 2. GitHub Actions: Automatisierte CI/CD Builds"
echo ""
read -p "Trotzdem fortfahren? (j/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Jj]$ ]]; then
echo ""
echo "Abgebrochen. Alternative Methoden:"
echo " • Kopiere das Projekt auf einen Windows-PC"
echo " • Führe dort build_windows.bat aus"
exit 0
fi
echo ""
# Arbeitsverzeichnis
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
# Funktion für Fehlerbehandlung
fail_with_alternatives() {
echo ""
echo -e "${RED}╔════════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${RED}║ BUILD FEHLGESCHLAGEN ║${NC}"
echo -e "${RED}╚════════════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo -e "${YELLOW}Alternative Methoden:${NC}"
echo ""
echo " 1. ${GREEN}Windows-PC (EMPFOHLEN):${NC}"
echo " - Kopiere das gesamte Projektverzeichnis"
echo " - Führe build_windows.bat aus"
echo ""
echo " 2. ${GREEN}GitHub Actions:${NC}"
echo " - Push zu GitHub mit Actions Workflow"
echo " - Automatisierter Windows-Build"
echo ""
echo " 3. ${GREEN}Virtual Machine:${NC}"
echo " - Windows-VM mit VirtualBox/VMware"
echo " - Shared Folder für Projektdateien"
echo ""
exit 1
}
# Prüfe Wine
echo -e "${BLUE}[1/7] Prüfe Wine-Installation...${NC}"
if ! command -v wine &> /dev/null; then
echo -e "${RED}FEHLER: Wine ist nicht installiert!${NC}"
echo ""
echo "Installation auf Ubuntu/Debian:"
echo " sudo dpkg --add-architecture i386"
echo " sudo apt update"
echo " sudo apt install wine64 wine32"
echo ""
echo "Installation auf Fedora:"
echo " sudo dnf install wine"
echo ""
fail_with_alternatives
fi
WINE_VERSION=$(wine --version 2>/dev/null || echo "unknown")
echo -e "${GREEN}✓ Wine installiert: $WINE_VERSION${NC}"
# Prüfe auf Display (wichtig für GUI-Installer)
echo -e "${BLUE}[2/7] Prüfe Display-Umgebung...${NC}"
if [ -z "$DISPLAY" ]; then
echo -e "${YELLOW}⚠ Kein DISPLAY gesetzt - Headless-Modus erkannt${NC}"
echo ""
echo "Python-Installer benötigt möglicherweise X11/GUI."
echo "Dies kann in Headless-Umgebungen fehlschlagen."
echo ""
echo "Optionen:"
echo " • Virtuelles Display mit Xvfb (experimentell)"
echo " • X11 Forwarding bei SSH (-X Option)"
echo " • Desktop-Umgebung verwenden"
echo ""
# Versuche Xvfb falls verfügbar
if command -v Xvfb &> /dev/null; then
echo "Xvfb gefunden - starte virtuelles Display..."
Xvfb :99 -screen 0 1024x768x24 &
XVFB_PID=$!
export DISPLAY=:99
sleep 2
echo -e "${GREEN}✓ Virtuelles Display gestartet (:99)${NC}"
else
echo -e "${YELLOW}Xvfb nicht installiert. Versuche ohne Display...${NC}"
echo " Installation: sudo apt install xvfb"
fi
else
echo -e "${GREEN}✓ Display vorhanden: $DISPLAY${NC}"
fi
# Prüfe Projektdateien
echo -e "${BLUE}[3/7] Prüfe Projektdateien...${NC}"
if [ ! -f "pointcab_renamer.py" ]; then
echo -e "${RED}FEHLER: pointcab_renamer.py nicht gefunden!${NC}"
exit 1
fi
if [ ! -f "cluster_cleanup.txt" ]; then
echo -e "${RED}FEHLER: cluster_cleanup.txt nicht gefunden!${NC}"
exit 1
fi
echo -e "${GREEN}✓ Projektdateien vorhanden${NC}"
# Wine-Prefix initialisieren
echo -e "${BLUE}[4/7] Initialisiere Wine-Umgebung...${NC}"
export WINEPREFIX="$WINE_PREFIX"
export WINEARCH=win64
export WINEDEBUG=-all # Unterdrücke Wine Debug-Meldungen
if [ ! -d "$WINE_PREFIX" ]; then
echo "Erstelle Wine-Prefix unter: $WINE_PREFIX"
echo "Dies kann einige Minuten dauern..."
wineboot --init 2>/dev/null || true
sleep 5
fi
echo -e "${GREEN}✓ Wine-Umgebung bereit${NC}"
# Python-Pfade in Wine
WINE_PYTHON="$WINE_PREFIX/drive_c/Python310/python.exe"
WINE_PIP="$WINE_PREFIX/drive_c/Python310/Scripts/pip.exe"
WINE_PYINSTALLER="$WINE_PREFIX/drive_c/Python310/Scripts/pyinstaller.exe"
# Python installieren falls nicht vorhanden
echo -e "${BLUE}[5/7] Prüfe Windows-Python...${NC}"
if [ ! -f "$WINE_PYTHON" ]; then
echo "Windows-Python nicht gefunden, installiere..."
echo ""
# Download Python installer
if [ ! -f "/tmp/$PYTHON_INSTALLER" ]; then
echo "Lade Python herunter: $PYTHON_URL"
echo "Größe: ~28MB"
wget -q --show-progress -O "/tmp/$PYTHON_INSTALLER" "$PYTHON_URL" || {
echo -e "${RED}FEHLER: Python-Download fehlgeschlagen!${NC}"
fail_with_alternatives
}
fi
# Installiere Python
echo ""
echo "Installiere Python in Wine..."
echo "Dies kann 5-10 Minuten dauern..."
echo ""
# Silent Installation mit Timeout
timeout 300 wine "/tmp/$PYTHON_INSTALLER" /quiet InstallAllUsers=0 PrependPath=1 Include_test=0 2>/dev/null || {
echo -e "${YELLOW}⚠ Python-Installation möglicherweise fehlgeschlagen oder Timeout${NC}"
}
sleep 5
# Prüfe Installation
if [ ! -f "$WINE_PYTHON" ]; then
echo ""
echo -e "${RED}FEHLER: Python-Installation fehlgeschlagen!${NC}"
echo ""
echo "Mögliche Ursachen:"
echo " • Headless-Umgebung ohne GUI"
echo " • Wine-Kompatibilitätsproblem"
echo " • Nicht genug Speicherplatz"
echo ""
# Cleanup Xvfb falls gestartet
[ -n "$XVFB_PID" ] && kill $XVFB_PID 2>/dev/null
fail_with_alternatives
fi
fi
echo -e "${GREEN}✓ Windows-Python installiert${NC}"
# PyInstaller installieren
echo -e "${BLUE}[6/7] Prüfe PyInstaller...${NC}"
if [ ! -f "$WINE_PYINSTALLER" ]; then
echo "Installiere PyInstaller..."
wine "$WINE_PIP" install pyinstaller 2>/dev/null || {
echo -e "${RED}FEHLER: PyInstaller-Installation fehlgeschlagen!${NC}"
fail_with_alternatives
}
fi
echo -e "${GREEN}✓ PyInstaller installiert${NC}"
# Aufräumen
echo -e "${BLUE}[7/7] Erstelle Windows .exe...${NC}"
rm -rf build/ dist/ *.spec 2>/dev/null || true
echo "Build läuft... (kann einige Minuten dauern)"
echo ""
# Führe PyInstaller aus
wine "$WINE_PYINSTALLER" \
--onefile \
--windowed \
--name "PointCab_Renamer" \
--add-data "cluster_cleanup.txt;." \
pointcab_renamer.py 2>&1 | grep -v "^fixme:" | grep -v "^err:" || true
# Cleanup Xvfb falls gestartet
[ -n "$XVFB_PID" ] && kill $XVFB_PID 2>/dev/null
# Prüfe Ergebnis
echo ""
if [ -f "dist/PointCab_Renamer.exe" ]; then
echo -e "${GREEN}╔════════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ BUILD ERFOLGREICH! ║${NC}"
echo -e "${GREEN}╚════════════════════════════════════════════════════════════════════╝${NC}"
# Kopiere zusätzliche Dateien
cp cluster_cleanup.txt dist/
cp BENUTZERHANDBUCH.md dist/ 2>/dev/null || true
echo ""
echo "Erstellte Dateien:"
ls -lh dist/
echo ""
echo "Die .exe befindet sich in: $SCRIPT_DIR/dist/"
echo ""
echo -e "${YELLOW}WICHTIG:${NC}"
echo " Die .exe sollte auf einem echten Windows-System"
echo " getestet werden, bevor sie verteilt wird!"
echo ""
else
fail_with_alternatives
fi

View File

@ -0,0 +1,16 @@
# Konfigurationsdatei für Clustername-Bereinigung
# Jede Zeile enthält einen String, der aus dem Stammverzeichnisnamen entfernt wird
# Leerzeilen und Zeilen die mit # beginnen werden ignoriert
#
# Beispiel: Stammverzeichnis "Am_Upstall_4_re" wird zu Clustername "Am_Upstall_4"
#
_re
_li
_mi
_mi-li
_mi-re
_part_1
_part_2
_part_3
_part_4
_part_5

View File

@ -0,0 +1,385 @@
# PointCab Renamer - Benutzerhandbuch
**Version 4.1** | Datum: 14. Januar 2026
---
## Inhaltsverzeichnis
1. [Einführung](#einführung)
2. [Installation](#installation)
3. [Programmstart](#programmstart)
4. [Die drei Modi](#die-drei-modi)
- [Einzelprojekt-Modus](#einzelprojekt-modus)
- [Batch-Modus](#batch-modus)
- [Projekt-Merger](#projekt-merger)
5. [Konfiguration](#konfiguration)
6. [Troubleshooting](#troubleshooting)
7. [FAQ](#faq)
---
## Einführung
### Was ist der PointCab Renamer?
Der **PointCab Renamer** ist ein Werkzeug zur automatischen Umbenennung von PointCab-Projektdateien. Es löst das Problem, dass PointCab-Scandateien oft kryptische Namen haben (z.B. `1.lsd`, `2.lsd`) und benennt diese nach einem einheitlichen Schema um:
**Format:** `[ClusterName]_[ScanName].[Erweiterung]`
**Beispiel:** `EG_Flur_scan001.lsd`
### Hauptfunktionen
- **Einzelprojekt-Modus**: Ein einzelnes PointCab-Projekt umbenennen
- **Batch-Modus**: Mehrere Projekte gleichzeitig verarbeiten
- **Projekt-Merger**: Mehrere Projekte in ein Zielprojekt zusammenführen
- **Cluster-Bereinigung**: Automatische Entfernung von Suffixen wie `_re`, `_li` aus Clusternamen
- **Detailliertes Logging**: Vollständige Protokollierung aller Änderungen
---
## Installation
### Windows
1. Laden Sie die Datei `pointcab_renamer.exe` herunter
2. Speichern Sie die Datei in einem beliebigen Ordner (z.B. `C:\Tools\`)
3. Kopieren Sie die `cluster_cleanup.txt` in denselben Ordner
4. Starten Sie das Programm mit Doppelklick auf die `.exe`
### Ubuntu/Linux
1. Laden Sie die Datei `pointcab_renamer` herunter
2. Speichern Sie die Datei in einem beliebigen Ordner (z.B. `/home/benutzer/tools/`)
3. Kopieren Sie die `cluster_cleanup.txt` in denselben Ordner
4. Machen Sie die Datei ausführbar:
```bash
chmod +x pointcab_renamer
```
5. Starten Sie das Programm:
```bash
./pointcab_renamer
```
### Aus dem Quellcode (für Entwickler)
1. Stellen Sie sicher, dass Python 3.8+ installiert ist
2. Laden Sie den Quellcode herunter
3. Starten Sie mit:
```bash
python pointcab_renamer.py
```
---
## Programmstart
### Hauptmenü
Nach dem Start erscheint das Hauptmenü mit drei Optionen:
```
╔═══════════════════════════════════════════╗
║ PointCab Renamer v4.1 ║
╠═══════════════════════════════════════════╣
║ ║
║ [Einzelprojekt umbenennen] ║
║ ║
║ [Batch-Verarbeitung] ║
║ ║
║ [Projekt Merger] ║
║ ║
╚═══════════════════════════════════════════╝
```
---
## Die drei Modi
### Einzelprojekt-Modus
**Verwendung:** Wenn Sie ein einzelnes PointCab-Projekt umbenennen möchten.
#### Schritt-für-Schritt-Anleitung
1. Klicken Sie auf **"Einzelprojekt umbenennen"**
2. Wählen Sie die **LSDX-Projektdatei** aus (z.B. `Am_Upstall_4.lsdx`)
3. Wählen Sie den **PointCloud-Ordner** aus (enthält die `.lsd` Dateien)
4. Das Programm zeigt eine **Vorschau** der Änderungen:
```
Vorschau der Umbenennung:
─────────────────────────
1.lsd → EG_Flur_scan001.lsd
2.lsd → EG_Flur_scan002.lsd
3.lsd → OG_Bad_scan001.lsd
...
```
5. Klicken Sie auf **"Umbenennen starten"**
6. Nach Abschluss wird ein Protokoll angezeigt
#### Dateistruktur (Vorher → Nachher)
**Vorher:**
```
Am_Upstall_4_PointCloud/
├── 1.lsd
├── 2.lsd
├── 3.lsd
└── ...
```
**Nachher:**
```
Am_Upstall_4_PointCloud/
├── EG_Flur_scan001.lsd
├── EG_Flur_scan002.lsd
├── OG_Bad_scan001.lsd
└── ...
```
---
### Batch-Modus
**Verwendung:** Wenn Sie mehrere PointCab-Projekte auf einmal verarbeiten möchten.
#### Schritt-für-Schritt-Anleitung
1. Klicken Sie auf **"Batch-Verarbeitung"**
2. Wählen Sie den **Basisordner** aus, der alle Projekte enthält
3. Das Programm erkennt automatisch alle PointCab-Projekte:
```
Gefundene Projekte:
─────────────────────
☑ Projekt_A (15 Scans)
☑ Projekt_B (22 Scans)
☑ Projekt_C (8 Scans)
```
4. Wählen Sie die gewünschten Projekte aus (oder behalten Sie alle ausgewählt)
5. Klicken Sie auf **"Batch-Verarbeitung starten"**
6. Der Fortschritt wird angezeigt:
```
Verarbeite Projekt 1/3: Projekt_A
[████████████░░░░░░░░] 60%
```
7. Nach Abschluss wird eine Zusammenfassung angezeigt
#### Erwartete Ordnerstruktur
```
Basisordner/
├── Projekt_A/
│ ├── Projekt_A.lsdx
│ └── Projekt_A_PointCloud/
│ ├── 1.lsd
│ └── ...
├── Projekt_B/
│ ├── Projekt_B.lsdx
│ └── Projekt_B_PointCloud/
└── Projekt_C/
├── Projekt_C.lsdx
└── Projekt_C_PointCloud/
```
---
### Projekt-Merger
**Verwendung:** Wenn Sie mehrere PointCab-Projekte in ein einziges Projekt zusammenführen möchten.
#### Schritt-für-Schritt-Anleitung
1. Klicken Sie auf **"Projekt Merger"**
2. Wählen Sie den **Modus**:
- **Einzelprojekt zusammenführen**: Ein Quellprojekt → Zielprojekt
- **Batch-Merge**: Mehrere Quellprojekte → Zielprojekt
3. Wählen Sie das **Zielprojekt** (in das zusammengeführt wird)
4. Wählen Sie das/die **Quellprojekt(e)**
5. Das Programm zeigt eine **Vorschau** mit Konfliktauflösung:
```
Merge-Vorschau:
─────────────────────
Zielprojekt: Haupt_Projekt (5 Cluster, 25 Scans)
Quellprojekt: Teil_A (2 Cluster, 10 Scans)
Zu übertragende Dateien:
- EG_Flur_scan001.lsd
- EG_Flur_scan002.lsd (Konflikt → EG_Flur_scan002_merged_1.lsd)
- ...
```
6. Klicken Sie auf **"Merge starten"**
7. Nach Abschluss werden die Statistiken angezeigt:
```
Merge abgeschlossen!
─────────────────────
Cluster vorher: 5 → nachher: 7
Scans vorher: 25 → nachher: 35
Dateien kopiert: 10
Konflikte gelöst: 1
```
#### Konfliktauflösung
Wenn eine Datei im Zielprojekt bereits existiert:
- Die neue Datei wird umbenannt: `dateiname_merged_1.lsd`
- Bei weiteren Konflikten: `dateiname_merged_2.lsd`, etc.
- Die LSDX-Datei wird entsprechend aktualisiert
#### Wichtige Hinweise
- **Backup**: Das Zielprojekt wird vor dem Merge gesichert (`.lsdx.backup`)
- **UUID-Regenerierung**: Alle übertragenen Elemente erhalten neue eindeutige IDs
- **Cluster-Duplikate**: Gleichnamige Cluster werden zusammengeführt
---
## Konfiguration
### Die Datei cluster_cleanup.txt
Diese Konfigurationsdatei definiert, welche Suffixe aus Clusternamen entfernt werden sollen.
#### Speicherort
- **Windows**: Im selben Ordner wie `pointcab_renamer.exe`
- **Linux**: Im selben Ordner wie `pointcab_renamer`
#### Format
```
# Dies ist ein Kommentar
_re
_li
_mi
_mi-li
_mi-re
```
- Jede Zeile = ein zu entfernender String
- Zeilen mit `#` am Anfang sind Kommentare
- Leere Zeilen werden ignoriert
#### Beispiel
Mit der obigen Konfiguration:
- `Flur_re``Flur`
- `Bad_mi-li``Bad`
- `Küche_li``Küche`
#### Konfiguration neu laden
Änderungen an `cluster_cleanup.txt` werden nach einem Neustart oder über den Button **"Konfiguration neu laden"** übernommen.
---
## Troubleshooting
### Häufige Fehler und Lösungen
#### "LSDX-Datei nicht gefunden"
**Problem**: Das Programm kann die Projektdatei nicht finden.
**Lösung**:
- Stellen Sie sicher, dass die `.lsdx`-Datei im Projektordner existiert
- Prüfen Sie, ob Sie Leserechte für die Datei haben
- Der Dateiname sollte mit `.lsdx` enden (nicht `.LSDX`)
#### "PointCloud-Ordner nicht gefunden"
**Problem**: Der Ordner mit den Scandaten fehlt.
**Lösung**:
- Der Ordner muss `_PointCloud` im Namen haben
- Beispiel: `Projekt_A_PointCloud`
- Prüfen Sie die Ordnerstruktur
#### "Keine Projekte gefunden" (Batch-Modus)
**Problem**: Im Basisordner werden keine Projekte erkannt.
**Lösung**:
- Jedes Projekt muss eine `.lsdx`-Datei und einen `_PointCloud`-Ordner haben
- Der Projektname in der LSDX muss mit dem Ordnernamen übereinstimmen
#### "Zugriff verweigert"
**Problem**: Dateien können nicht umbenannt werden.
**Lösung**:
- Schließen Sie PointCab
- Prüfen Sie, ob andere Programme die Dateien verwenden
- Unter Windows: Als Administrator ausführen
- Unter Linux: Prüfen Sie die Dateiberechtigungen
#### "GUI startet nicht" (Linux)
**Problem**: Keine grafische Oberfläche unter Linux.
**Lösung**:
- Installieren Sie tkinter: `sudo apt install python3-tk`
- Stellen Sie sicher, dass ein Display verfügbar ist
---
## FAQ
### Allgemeine Fragen
**F: Werden die Originaldateien gelöscht?**
A: Nein, die Dateien werden nur umbenannt. Es werden keine Daten gelöscht.
**F: Kann ich die Umbenennung rückgängig machen?**
A: Die ursprünglichen Namen werden im Log-Datei protokolliert. Eine automatische Rückgängig-Funktion gibt es nicht.
**F: Funktioniert das Tool auch mit älteren PointCab-Versionen?**
A: Das Tool wurde für PointCab-Projekte mit LSDX-Format entwickelt. Ältere Formate werden möglicherweise nicht unterstützt.
**F: Wie viele Projekte kann ich im Batch-Modus verarbeiten?**
A: Es gibt keine feste Grenze. Die Verarbeitungszeit hängt von der Anzahl der Scans ab.
### Technische Fragen
**F: Wo werden die Log-Dateien gespeichert?**
A: Im Projektordner, mit dem Format:
- Einzelprojekt: `rename_YYYYMMDD_HHMMSS.log`
- Batch: `batch_YYYYMMDD_HHMMSS.log`
- Merger: `merge_YYYYMMDD_HHMMSS.log`
**F: Was passiert bei einem Stromausfall während der Verarbeitung?**
A: Die bereits umbenannten Dateien bleiben umbenannt. Die LSDX-Datei wird erst nach erfolgreicher Umbenennung aktualisiert.
**F: Kann ich das Tool über die Kommandozeile nutzen?**
A: Aktuell nur mit grafischer Oberfläche. Kommandozeilen-Unterstützung ist für eine zukünftige Version geplant.
### Merger-Fragen
**F: Was passiert mit den Originalprojekten beim Merge?**
A: Die Quellprojekte werden nicht verändert. Dateien werden kopiert, nicht verschoben.
**F: Kann ich den Merge rückgängig machen?**
A: Die ursprüngliche LSDX wird als `.backup` gespeichert. Die kopierten Dateien müssen manuell gelöscht werden.
**F: Werden alle Unterordner (Previews, etc.) auch gemergt?**
A: Ja, alle relevanten Unterordner werden übertragen.
---
## Support
Bei Fragen oder Problemen wenden Sie sich an Ihren Administrator.
---
*PointCab Renamer v4.1 - © 2026*

View File

@ -0,0 +1,16 @@
# Konfigurationsdatei für Clustername-Bereinigung
# Jede Zeile enthält einen String, der aus dem Stammverzeichnisnamen entfernt wird
# Leerzeilen und Zeilen die mit # beginnen werden ignoriert
#
# Beispiel: Stammverzeichnis "Am_Upstall_4_re" wird zu Clustername "Am_Upstall_4"
#
_re
_li
_mi
_mi-li
_mi-re
_part_1
_part_2
_part_3
_part_4
_part_5

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,21 @@
# PointCab Renamer v4.1 - Python Dependencies
# ==========================================
#
# Diese Datei listet alle Python-Abhängigkeiten auf.
# Installation: pip install -r requirements.txt
#
# Hinweis: tkinter ist Teil der Python-Standardbibliothek
# und muss unter Ubuntu separat installiert werden:
# sudo apt install python3-tk
# Für Build/Deployment:
pyinstaller>=5.0
# Standardbibliotheken (keine Installation nötig):
# - tkinter (GUI)
# - xml.etree.ElementTree (LSDX-Parsing)
# - uuid (UUID-Generierung)
# - shutil (Dateioperationen)
# - os (Betriebssystemfunktionen)
# - datetime (Zeitstempel)
# - logging (Protokollierung)

21
requirements.txt Normal file
View File

@ -0,0 +1,21 @@
# PointCab Renamer v4.1 - Python Dependencies
# ==========================================
#
# Diese Datei listet alle Python-Abhängigkeiten auf.
# Installation: pip install -r requirements.txt
#
# Hinweis: tkinter ist Teil der Python-Standardbibliothek
# und muss unter Ubuntu separat installiert werden:
# sudo apt install python3-tk
# Für Build/Deployment:
pyinstaller>=5.0
# Standardbibliotheken (keine Installation nötig):
# - tkinter (GUI)
# - xml.etree.ElementTree (LSDX-Parsing)
# - uuid (UUID-Generierung)
# - shutil (Dateioperationen)
# - os (Betriebssystemfunktionen)
# - datetime (Zeitstempel)
# - logging (Protokollierung)