Initial commit
This commit is contained in:
commit
73e365d217
File diff suppressed because one or more lines are too long
|
|
@ -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*
|
||||||
|
|
@ -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/).*
|
||||||
|
|
@ -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*
|
||||||
Binary file not shown.
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
=====================================================
|
||||||
|
|
@ -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.
|
||||||
|
|
@ -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
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
4.2.1
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -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')
|
||||||
|
|
@ -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.
|
|
@ -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.
Binary file not shown.
|
|
@ -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
|
|
@ -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 ""
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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*
|
||||||
|
|
@ -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
|
|
@ -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.
|
|
@ -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*
|
||||||
|
|
@ -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/).*
|
||||||
|
|
@ -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*
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
=====================================================
|
||||||
|
|
@ -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.
|
||||||
|
|
@ -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
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
4.2.1
|
||||||
|
|
@ -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 ""
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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*
|
||||||
|
|
@ -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
|
|
@ -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)
|
||||||
|
|
@ -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)
|
||||||
Loading…
Reference in New Issue