From 5034d98023f601643c129149c445055080d4a0a8 Mon Sep 17 00:00:00 2001 From: Developer Date: Sun, 18 Jan 2026 21:52:39 +0000 Subject: [PATCH] =?UTF-8?q?Update=20GUI:=20Konsistenzpr=C3=BCfung=20und=20?= =?UTF-8?q?verbesserte=20Benutzerf=C3=BChrung?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- main.py | 123 ++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 88 insertions(+), 35 deletions(-) diff --git a/main.py b/main.py index 294bfe9..66beff7 100644 --- a/main.py +++ b/main.py @@ -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)