From 2144172c7b961d4112850692ed77b46f1ae5d373 Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期五, 05 十二月 2025 19:34:53 +0800
Subject: [PATCH] 20251205

---
 src/zhangaiwu/AddDikuai.java |  214 ++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 138 insertions(+), 76 deletions(-)

diff --git a/src/zhangaiwu/AddDikuai.java b/src/zhangaiwu/AddDikuai.java
index 4feafe5..ee81258 100644
--- a/src/zhangaiwu/AddDikuai.java
+++ b/src/zhangaiwu/AddDikuai.java
@@ -17,6 +17,7 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Comparator;
 import java.awt.geom.Point2D;
 
 import bianjie.jisuanmianjie;
@@ -362,93 +363,105 @@
 
     private List<ObstacleSummary> loadExistingObstacles() {
         List<ObstacleSummary> summaries = new ArrayList<>();
+        List<ExistingObstacle> obstacles = fetchExistingObstacleDetails();
 
-        String landNumber = getPendingLandNumber();
-        String raw = null;
-        if (landNumber != null) {
-            Dikuai dikuai = Dikuai.getDikuai(landNumber);
-            if (dikuai != null) {
-                raw = normalizeCoordinateValue(dikuai.getObstacleCoordinates());
-            }
-        }
-        if (raw == null) {
-            raw = normalizeCoordinateValue(dikuaiData.get("obstacleCoordinates"));
-        }
-        if (!isMeaningfulValue(raw)) {
+        if (obstacles.isEmpty()) {
             return summaries;
         }
 
-        String normalized = stripInlineComment(raw);
-        if (normalized.isEmpty()) {
-            return summaries;
-        }
-
-        List<String> entries = splitObstacleEntries(normalized);
-        int defaultIndex = 1;
-
-        for (String entry : entries) {
-            String trimmedEntry = stripInlineComment(entry);
-            if (trimmedEntry.isEmpty()) {
+        for (ExistingObstacle obstacle : obstacles) {
+            if (obstacle == null) {
                 continue;
             }
-
-            String nameToken = null;
-            String shapeToken = null;
-            String coordsSection = trimmedEntry;
-
-            if (trimmedEntry.contains("::")) {
-                String[] parts = trimmedEntry.split("::", 3);
-                if (parts.length == 3) {
-                    nameToken = parts[0].trim();
-                    shapeToken = parts[1].trim();
-                    coordsSection = parts[2].trim();
-                }
-            } else if (trimmedEntry.contains("@")) {
-                String[] parts = trimmedEntry.split("@", 3);
-                if (parts.length == 3) {
-                    nameToken = parts[0].trim();
-                    shapeToken = parts[1].trim();
-                    coordsSection = parts[2].trim();
-                } else if (parts.length == 2) {
-                    shapeToken = parts[0].trim();
-                    coordsSection = parts[1].trim();
-                }
-            } else if (trimmedEntry.contains(":")) {
-                String[] parts = trimmedEntry.split(":", 3);
-                if (parts.length == 3) {
-                    nameToken = parts[0].trim();
-                    shapeToken = parts[1].trim();
-                    coordsSection = parts[2].trim();
-                } else if (parts.length == 2) {
-                    if (looksLikeShapeToken(parts[0])) {
-                        shapeToken = parts[0].trim();
-                        coordsSection = parts[1].trim();
-                    } else {
-                        nameToken = parts[0].trim();
-                        coordsSection = parts[1].trim();
-                    }
-                }
-            }
-
-            String sanitizedCoords = sanitizeCoordinateString(coordsSection);
-            if (!isMeaningfulValue(sanitizedCoords)) {
+            String name = obstacle.getName();
+            if (!isMeaningfulValue(name)) {
                 continue;
             }
-
-            String resolvedName;
-            if (nameToken != null && !nameToken.isEmpty()) {
-                resolvedName = nameToken;
-            } else {
-                resolvedName = "闅滅鐗�" + defaultIndex++;
-            }
-
-            String displayCoords = truncateCoordinateForDisplay(sanitizedCoords, 12);
-            summaries.add(new ObstacleSummary(resolvedName, sanitizedCoords, displayCoords));
+            String coords = obstacle.getDisplayCoordinates();
+            String fullCoords = isMeaningfulValue(coords) ? coords.trim() : "";
+            String preview = buildCoordinatePreview(fullCoords, 20);
+            summaries.add(new ObstacleSummary(name.trim(), fullCoords, preview));
         }
 
         return summaries;
     }
 
+    private List<ExistingObstacle> fetchExistingObstacleDetails() {
+        File configFile = new File("Obstacledge.properties");
+        if (!configFile.exists()) {
+            return Collections.emptyList();
+        }
+
+        List<ExistingObstacle> result = new ArrayList<>();
+        try {
+            Obstacledge.ConfigManager manager = new Obstacledge.ConfigManager();
+            if (!manager.loadFromFile(configFile.getAbsolutePath())) {
+                return Collections.emptyList();
+            }
+
+            for (Obstacledge.Plot plot : manager.getPlots()) {
+                if (plot == null) {
+                    continue;
+                }
+                String landNumber = isMeaningfulValue(plot.getPlotId()) ? plot.getPlotId().trim() : "";
+                List<Obstacledge.Obstacle> plotObstacles = plot.getObstacles();
+                if (plotObstacles == null || plotObstacles.isEmpty()) {
+                    continue;
+                }
+                for (Obstacledge.Obstacle obstacle : plotObstacles) {
+                    if (obstacle == null) {
+                        continue;
+                    }
+                    String name = obstacle.getObstacleName();
+                    if (!isMeaningfulValue(name)) {
+                        continue;
+                    }
+                    String coords = extractObstacleCoordinates(obstacle);
+                    result.add(new ExistingObstacle(landNumber, name.trim(), coords));
+                }
+            }
+        } catch (Exception ex) {
+            System.err.println("鍔犺浇宸叉湁闅滅鐗╁け璐�: " + ex.getMessage());
+            return Collections.emptyList();
+        }
+
+        if (result.isEmpty()) {
+            return Collections.emptyList();
+        }
+
+        result.sort(Comparator.comparing(ExistingObstacle::getName, String.CASE_INSENSITIVE_ORDER));
+        return result;
+    }
+
+    private String extractObstacleCoordinates(Obstacledge.Obstacle obstacle) {
+        if (obstacle == null) {
+            return "";
+        }
+        String xy = obstacle.getXyCoordsString();
+        if (isMeaningfulValue(xy)) {
+            return xy.trim();
+        }
+        String original = obstacle.getOriginalCoordsString();
+        if (isMeaningfulValue(original)) {
+            return original.trim();
+        }
+        return "";
+    }
+
+    private String buildCoordinatePreview(String coords, int keepLength) {
+        if (!isMeaningfulValue(coords)) {
+            return "鏃犲潗鏍�";
+        }
+        String sanitized = sanitizeCoordinateString(coords);
+        if (sanitized.length() <= keepLength) {
+            return sanitized;
+        }
+        if (keepLength <= 0) {
+            return "...";
+        }
+        return sanitized.substring(0, keepLength) + "...";
+    }
+
     private List<String> splitObstacleEntries(String data) {
         List<String> entries = new ArrayList<>();
         if (data.indexOf('|') >= 0) {
@@ -543,6 +556,30 @@
             return displayCoords;
         }
     }
+
+    private static final class ExistingObstacle {
+        private final String landNumber;
+        private final String name;
+        private final String coordinates;
+
+        ExistingObstacle(String landNumber, String name, String coordinates) {
+            this.landNumber = landNumber != null ? landNumber : "";
+            this.name = name != null ? name : "";
+            this.coordinates = coordinates != null ? coordinates : "";
+        }
+
+        String getLandNumber() {
+            return landNumber;
+        }
+
+        String getName() {
+            return name;
+        }
+
+        String getDisplayCoordinates() {
+            return coordinates;
+        }
+    }
     
     private JPanel createStep2Panel() {
         JPanel stepPanel = new JPanel();
@@ -1009,8 +1046,9 @@
         }
 
         String obstacleCoords = null;
-        if (dikuai != null) {
-            obstacleCoords = normalizeCoordinateValue(dikuai.getObstacleCoordinates());
+        String landNumber = getPendingLandNumber();
+        if (isMeaningfulValue(landNumber)) {
+            obstacleCoords = normalizeCoordinateValue(resolveObstaclePayloadFromConfig(landNumber));
         }
         if (obstacleCoords == null) {
             obstacleCoords = normalizeCoordinateValue(dikuaiData.get("obstacleCoordinates"));
@@ -1259,6 +1297,30 @@
         return isMeaningfulValue(dikuaiData.get("plannedPath"));
     }
 
+    private String resolveObstaclePayloadFromConfig(String landNumber) {
+        if (!isMeaningfulValue(landNumber)) {
+            return null;
+        }
+        try {
+            File configFile = new File("Obstacledge.properties");
+            if (!configFile.exists()) {
+                return null;
+            }
+            Obstacledge.ConfigManager manager = new Obstacledge.ConfigManager();
+            if (!manager.loadFromFile(configFile.getAbsolutePath())) {
+                return null;
+            }
+            Obstacledge.Plot plot = manager.getPlotById(landNumber.trim());
+            if (plot == null) {
+                return null;
+            }
+            return Obstacledge.buildPlannerPayload(plot.getObstacles());
+        } catch (Exception ex) {
+            System.err.println("鍔犺浇闅滅鐗╅厤缃け璐�: " + ex.getMessage());
+            return null;
+        }
+    }
+
     private static String normalizeCoordinateValue(String value) {
         return isMeaningfulValue(value) ? value.trim() : null;
     }

--
Gitblit v1.10.0