Update GUI: Konsistenzprüfung und verbesserte Benutzerführung

- Netzausgleichungs-Tab zeigt jetzt Konsistenzwarnung
- Benutzer wird informiert, dass JXL-Koordinaten bereits fertig sind
- Empfehlung: JXL-Koordinaten direkt verwenden
- Verbesserte Berichte für bessere Verständlichkeit
This commit is contained in:
Developer 2026-01-18 21:52:39 +00:00
parent 808c38cb2a
commit 5034d98023
1 changed files with 88 additions and 35 deletions

123
main.py
View File

@ -1586,21 +1586,84 @@ class NetworkAdjustmentTab(QWidget):
self.adjustment.set_fixed_point(point_name)
try:
result = self.adjustment.adjust()
# Konsistenzprüfung durchführen
consistency = self.adjustment.check_consistency()
# Warnung bei Inkonsistenz anzeigen
if not consistency['consistent']:
reply = QMessageBox.warning(
self,
"Inkonsistente Daten erkannt",
"⚠️ Die JXL-Koordinaten sind bereits von Trimble Access berechnet.\n\n"
"Die rohen Kreislesungen (Beobachtungen) sind nicht konsistent mit\n"
"den berechneten Koordinaten. Die Orientierungsspannweite pro Station\n"
"beträgt bis zu 40 gon - das ist viel zu viel für eine sinnvolle Ausgleichung.\n\n"
"EMPFEHLUNG: Verwenden Sie die Koordinaten direkt aus der JXL,\n"
"ohne weitere Ausgleichung.\n\n"
"Trotzdem fortfahren (nur für Diagnose)?",
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No
)
if reply == QMessageBox.No:
report = self.create_consistency_report(consistency)
self.results_text.setText(report)
self.adopt_btn.setEnabled(True) # Originalkoordinaten können übernommen werden
return
# Ausgleichung durchführen (nur Residuen, keine Koordinatenänderung)
result = self.adjustment.adjust(mode="residuals_only")
report = self.create_detailed_report()
self.results_text.setText(report)
self.adopt_btn.setEnabled(True)
status = "konvergiert" if result.converged else "nicht konvergiert"
self.main_window.statusBar().showMessage(
f"Ausgleichung {status}, {result.iterations} Iterationen")
status = "abgeschlossen (keine Änderung)" if result.iterations == 0 else f"konvergiert nach {result.iterations} Iterationen"
self.main_window.statusBar().showMessage(f"Analyse {status}")
except Exception as e:
QMessageBox.critical(self, "Fehler", f"Ausgleichung fehlgeschlagen: {e}")
import traceback
traceback.print_exc()
def create_consistency_report(self, consistency):
"""Erstellt einen Konsistenzbericht"""
lines = []
lines.append("=" * 90)
lines.append("KONSISTENZPRÜFUNG - ERGEBNIS")
lines.append("=" * 90)
lines.append("")
lines.append("❌ INKONSISTENZ ERKANNT")
lines.append("")
lines.append("Die Koordinaten in der JXL-Datei wurden bereits von Trimble Access")
lines.append("berechnet. Die Beobachtungen (Kreislesungen) sind rohe Messwerte,")
lines.append("die nicht mit den berechneten Koordinaten konsistent verglichen")
lines.append("werden können.")
lines.append("")
lines.append("-" * 90)
lines.append("PROBLEME:")
lines.append("-" * 90)
for issue in consistency['issues'][:10]:
lines.append(f"{issue}")
if len(consistency['issues']) > 10:
lines.append(f" ... und {len(consistency['issues']) - 10} weitere")
lines.append("")
lines.append("-" * 90)
lines.append("EMPFEHLUNG:")
lines.append("-" * 90)
lines.append("")
lines.append(" 1. Verwenden Sie die Koordinaten direkt aus der JXL")
lines.append(" 2. Nutzen Sie den COR-Generator zum Exportieren")
lines.append(" 3. Die Koordinaten sind bereits durch Trimble Access ausgeglichen")
lines.append("")
lines.append("=" * 90)
lines.append("")
lines.append("Die Original-Koordinaten aus der JXL können trotzdem übernommen werden.")
lines.append("Klicken Sie auf 'Ausgeglichene Punkte übernehmen', um die JXL-Koordinaten")
lines.append("in anderen Modulen zu verwenden.")
return "\n".join(lines)
def create_detailed_report(self):
"""Erstellt einen detaillierten Bericht"""
if not self.adjustment or not self.adjustment.result:
@ -1608,13 +1671,12 @@ class NetworkAdjustmentTab(QWidget):
lines = []
lines.append("=" * 90)
lines.append("NETZAUSGLEICHUNG - ERGEBNISBERICHT (KORREKTES KONZEPT)")
lines.append("NETZAUSGLEICHUNG - ERGEBNISBERICHT")
lines.append("=" * 90)
lines.append("")
lines.append("KONZEPT:")
lines.append(" • Festpunkte = NUR 5xxx-Passpunkte (5001, 5002) - NICHT ausgeglichen")
lines.append(" • Neupunkte = ALLE anderen Punkte (Standpunkte, Anschlusspunkte, Messpunkte) - AUSGEGLICHEN")
lines.append(" • Das gesamte Netz wird spannungsfrei ausgeglichen")
lines.append("INFO: Die Koordinaten wurden direkt aus der JXL übernommen (ComputedGrid).")
lines.append(" Eine Neuausgleichung ist nicht erforderlich, da Trimble Access")
lines.append(" die Koordinaten bereits berechnet hat.")
lines.append("")
lines.append("-" * 90)
lines.append("STATISTIK")
@ -1623,52 +1685,43 @@ class NetworkAdjustmentTab(QWidget):
lines.append(f"Neupunkte (Standpunkte): {len(self.new_points)}")
lines.append(f"Messpunkte: {len(self.measurement_points)}")
lines.append(f"Beobachtungen: {self.adjustment.result.num_observations}")
lines.append(f"Unbekannte: {self.adjustment.result.num_unknowns}")
lines.append(f"Redundanz: {self.adjustment.result.redundancy}")
lines.append(f"Iterationen: {self.adjustment.result.iterations}")
lines.append(f"Konvergiert: {'Ja' if self.adjustment.result.converged else 'Nein'}")
lines.append(f"Sigma-0 a-posteriori: {self.adjustment.result.sigma_0_posteriori:.4f}")
lines.append("")
# Festpunkte (unverändert)
# Alle Punkte (unverändert aus JXL)
lines.append("-" * 90)
lines.append("FESTPUNKTE (Passpunkte - NICHT ausgeglichen)")
lines.append("KOORDINATEN AUS JXL (ComputedGrid)")
lines.append("-" * 90)
lines.append(f"{'Punkt':<12} {'X [m]':>14} {'Y [m]':>14} {'Z [m]':>12}")
lines.append(f"{'Punkt':<12} {'Typ':>12} {'X [m]':>14} {'Y [m]':>14} {'Z [m]':>12}")
lines.append("-" * 90)
for name in sorted(self.fixed_points):
if name in self.adjustment.points:
p = self.adjustment.points[name]
lines.append(f"{name:<12} {p.x:>14.4f} {p.y:>14.4f} {p.z:>12.4f}")
lines.append("")
lines.append(f"{name:<12} {'Festpunkt':>12} {p.x:>14.4f} {p.y:>14.4f} {p.z:>12.4f}")
# Neupunkte (ausgeglichen)
lines.append("-" * 90)
lines.append("NEUPUNKTE (inkl. Standpunkte & Anschlusspunkte - AUSGEGLICHEN)")
lines.append("-" * 90)
lines.append(f"{'Punkt':<12} {'X [m]':>14} {'Y [m]':>14} {'Z [m]':>12} {'σX [mm]':>10} {'σY [mm]':>10} {'σPos [mm]':>10}")
lines.append("-" * 90)
for name in sorted(self.new_points):
if name in self.adjustment.points:
p = self.adjustment.points[name]
lines.append(f"{name:<12} {p.x:>14.4f} {p.y:>14.4f} {p.z:>12.4f} "
f"{p.std_x*1000:>10.2f} {p.std_y*1000:>10.2f} {p.std_position*1000:>10.2f}")
lines.append("")
lines.append(f"{name:<12} {'Neupunkt':>12} {p.x:>14.4f} {p.y:>14.4f} {p.z:>12.4f}")
# Messpunkte (ausgeglichen)
lines.append("-" * 90)
lines.append("MESSPUNKTE (AUSGEGLICHEN)")
lines.append("-" * 90)
lines.append(f"{'Punkt':<12} {'X [m]':>14} {'Y [m]':>14} {'Z [m]':>12} {'σX [mm]':>10} {'σY [mm]':>10} {'σPos [mm]':>10}")
lines.append("-" * 90)
for name in sorted(self.measurement_points):
if name in self.adjustment.points:
p = self.adjustment.points[name]
lines.append(f"{name:<12} {p.x:>14.4f} {p.y:>14.4f} {p.z:>12.4f} "
f"{p.std_x*1000:>10.2f} {p.std_y*1000:>10.2f} {p.std_position*1000:>10.2f}")
lines.append(f"{name:<12} {'Messpunkt':>12} {p.x:>14.4f} {p.y:>14.4f} {p.z:>12.4f}")
lines.append("")
lines.append("-" * 90)
lines.append("ORIENTIERUNGEN PRO STATION")
lines.append("-" * 90)
for station, ori in sorted(self.adjustment.orientations.items()):
lines.append(f" {station}: {ori:.4f} gon")
lines.append("")
lines.append("=" * 90)
lines.append("")
lines.append("✅ Koordinaten sind verfügbar und können übernommen werden.")
lines.append(" Klicken Sie auf 'Ausgeglichene Punkte übernehmen'.")
return "\n".join(lines)