From 1175f5fbe8fd832943880bfc37c0e2a451a0688a Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期四, 25 十二月 2025 19:34:38 +0800
Subject: [PATCH] 删除了几个类优化了路径生成的逻辑

---
 src/lujing/MowingPathGenerationPage.java |  193 +++++++++++++++++++-----------------------------
 1 files changed, 76 insertions(+), 117 deletions(-)

diff --git a/src/lujing/MowingPathGenerationPage.java b/src/lujing/MowingPathGenerationPage.java
index 853c9ce..8bd2ba9 100644
--- a/src/lujing/MowingPathGenerationPage.java
+++ b/src/lujing/MowingPathGenerationPage.java
@@ -1,25 +1,12 @@
 package lujing;
-
 import javax.swing.*;
 import javax.swing.SwingUtilities;
 import java.awt.*;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.ArrayList;
 import java.util.List;
-
 import dikuai.Dikuai;
-import lujing.Lunjingguihua;
-import lujing.ObstaclePathPlanner;
-import lujing.Qufenxingzhuang;
-import lujing.AoxinglujingNoObstacle;
-import lujing.YixinglujingNoObstacle;
 import publicway.Fuzhibutton;
-import lujing.AoxinglujingHaveObstacel;
-import lujing.YixinglujingHaveObstacel;
-import org.locationtech.jts.geom.Coordinate;
 import gecaoji.Device;
 import java.util.Locale;
 
@@ -49,6 +36,7 @@
         boolean saveObstacleCoordinates(Dikuai dikuai, String baseStationValue, String obstacleValue);
         boolean saveMowingWidth(Dikuai dikuai, String value);
         boolean savePlannedPath(Dikuai dikuai, String value);
+        boolean saveMowingSafetyDistance(Dikuai dikuai, String value);
     }
     
     private final Dikuai dikuai;
@@ -262,30 +250,35 @@
      * 棰勮璺緞
      */
     private void previewPath() {
-        // 鍏堜繚瀛樺綋鍓嶈矾寰勫埌鍦板潡锛堜复鏃朵繚瀛橈紝鐢ㄤ簬棰勮锛�
-        String pathNormalized = normalizeCoordinateInput(pathArea.getText());
+        // 鐩存帴浠庢枃鏈煙鑾峰彇璺緞鏁版嵁
+        String rawPath = pathArea.getText();
+        String pathNormalized = normalizeCoordinateInput(rawPath);
+        
         if (!"-1".equals(pathNormalized)) {
+            // 瑙勮寖鍖栬矾寰勬暟鎹細鏀寔鎹㈣銆佺┖鏍肩瓑鍒嗛殧绗�
             pathNormalized = pathNormalized
                 .replace("\r\n", ";")
                 .replace('\r', ';')
                 .replace('\n', ';')
-                .replaceAll(";+", ";")
-                .replaceAll("\\s*;\\s*", ";")
-                .trim();
+                .replaceAll("\\s+", ";") // 灏嗘墍鏈夌┖鐧藉瓧绗︽浛鎹负鍒嗗彿
+                .replaceAll(";+", ";");  // 鍚堝苟杩炵画鍒嗗彿
+            
+            // 鍘婚櫎棣栧熬鍒嗗彿
+            if (pathNormalized.startsWith(";")) pathNormalized = pathNormalized.substring(1);
+            if (pathNormalized.endsWith(";")) pathNormalized = pathNormalized.substring(0, pathNormalized.length() - 1);
+            
             if (pathNormalized.isEmpty()) {
                 pathNormalized = "-1";
             }
         }
         
         if ("-1".equals(pathNormalized)) {
-            JOptionPane.showMessageDialog(this, "璇峰厛鐢熸垚鍓茶崏璺緞", "鎻愮ず", JOptionPane.INFORMATION_MESSAGE);
+            JOptionPane.showMessageDialog(this, "璇峰厛鐢熸垚鍓茶崏璺緞鎴栧湪鏂囨湰妗嗕腑杈撳叆鏈夋晥鍧愭爣", "鎻愮ず", JOptionPane.INFORMATION_MESSAGE);
             return;
         }
         
-        // 涓存椂淇濆瓨璺緞鍒板湴鍧楀璞★紙涓嶆寔涔呭寲锛�
-        if (saveCallback != null) {
-            saveCallback.savePlannedPath(dikuai, pathNormalized);
-        }
+        // 娉ㄦ剰锛氶瑙堟椂涓嶈嚜鍔ㄤ繚瀛樿矾寰勫埌鍦板潡锛屼粎浣跨敤鏂囨湰鍩熶腑鐨勬暟鎹繘琛岄瑙�
+        // 鍙湁鐐瑰嚮"淇濆瓨璺緞"鎸夐挳鏃舵墠鎸佷箙鍖栨暟鎹�
         
         // 淇濆瓨褰撳墠椤甸潰鐘舵�侊紝鐢ㄤ簬杩斿洖鏃舵仮澶�
         String currentBaseStation = baseStationField.getText();
@@ -302,12 +295,16 @@
         String boundaryInput = normalizeCoordinateInput(boundaryArea.getText());
         final String boundary;
         if (!"-1".equals(boundaryInput)) {
-            String processed = boundaryInput.replace("\r\n", ";")
+            String processed = boundaryInput
+                .replace("\r\n", ";")
                 .replace('\r', ';')
                 .replace('\n', ';')
-                .replaceAll(";+", ";")
-                .replaceAll("\\s*;\\s*", ";")
-                .trim();
+                .replaceAll("\\s+", ";")
+                .replaceAll(";+", ";");
+            
+            if (processed.startsWith(";")) processed = processed.substring(1);
+            if (processed.endsWith(";")) processed = processed.substring(0, processed.length() - 1);
+
             if (processed.isEmpty()) {
                 boundary = dikuai.getBoundaryCoordinates();
             } else {
@@ -457,6 +454,12 @@
             dikuai.setMowingWidth(widthNormalized);
             dikuai.setPlannedPath(pathNormalized);
             dikuai.setObstacleCoordinates(obstacleNormalized);
+            
+            // 鑾峰彇骞舵洿鏂板畨鍏ㄨ窛绂�
+            String safetyDistance = getSafetyDistanceString();
+            if (safetyDistance != null) {
+                dikuai.setMowingSafetyDistance(safetyDistance);
+            }
         }
         
         // 璋冪敤鍥炶皟淇濆瓨鏁版嵁
@@ -481,6 +484,15 @@
                 JOptionPane.showMessageDialog(this, "鏃犳硶淇濆瓨鍓茶崏璺緞", "閿欒", JOptionPane.ERROR_MESSAGE);
                 return;
             }
+            
+            // 淇濆瓨瀹夊叏璺濈
+            String safetyDistance = getSafetyDistanceString();
+            if (safetyDistance != null) {
+                if (!saveCallback.saveMowingSafetyDistance(dikuai, safetyDistance)) {
+                    JOptionPane.showMessageDialog(this, "鏃犳硶淇濆瓨鍓茶崏瀹夊叏璺濈", "閿欒", JOptionPane.ERROR_MESSAGE);
+                    return;
+                }
+            }
         }
         
         JOptionPane.showMessageDialog(this, "鍓茶崏璺緞宸蹭繚瀛�", "鎴愬姛", JOptionPane.INFORMATION_MESSAGE);
@@ -543,7 +555,20 @@
         
         String obstacles = sanitizeValueOrNull(obstacleInput);
         if (obstacles != null) {
-            obstacles = obstacles.replace("\r\n", " ").replace('\r', ' ').replace('\n', ' ');
+            // 鎸夌収鐢ㄦ埛瑕佹眰锛屽涓殰纰嶇墿涔嬮棿鐢� $ 绗﹀彿鍒嗛殧
+            // 濡傛灉杈撳叆涓寘鍚� $锛屽垯淇濈暀 $锛屽惁鍒欏皢鎹㈣绗︽浛鎹负 $
+            if (obstacles.contains("$")) {
+                // 宸茬粡鏄� $ 鍒嗛殧鐨勬牸寮忥紝鍙渶娓呯悊鎹㈣绗�
+                obstacles = obstacles.replace("\r\n", "").replace('\r', ' ').replace('\n', ' ');
+            } else {
+                // 灏濊瘯灏嗘崲琛岀杞崲涓� $锛屾垨鑰呭鏋滄槸涓�琛屽垯淇濇寔鍘熸牱
+                // 杩欓噷鍋囪鐢ㄦ埛鍙兘鐢ㄦ崲琛屽垎闅斿涓殰纰嶇墿
+                // 浣嗘牴鎹渶姹傛弿杩帮紝浼间箮杈撳叆鏈韩灏卞簲璇ユ槸 $ 鍒嗛殧鐨勶紝鎴栬�呮垜浠渶瑕佸鐞嗘垚 $ 鍒嗛殧
+                // 涓轰簡鍏煎鎬э紝濡傛灉鐢ㄦ埛杈撳叆鐨勬槸鎹㈣鍒嗛殧鐨勫涓殰纰嶇墿锛屾垜浠皢鍏惰浆鎹负 $ 鍒嗛殧
+                // 浣嗛�氬父闅滅鐗╁潗鏍囨槸涓�涓插潗鏍囩偣锛屽鏋滅敤鎴锋病鏈夋樉寮忕敤 $ 鍒嗛殧锛屾垜浠緢闅惧尯鍒嗘槸鍚屼竴涓殰纰嶇墿鐨勭偣杩樻槸澶氫釜闅滅鐗�
+                // 鍥犳锛岃繖閲屼富瑕佸鐞嗘竻鐞嗗伐浣滐紝鍏蜂綋鐨勮В鏋愰�昏緫鍦ㄥ悇瀹炵幇绫讳腑澶勭悊
+                obstacles = obstacles.replace("\r\n", " ").replace('\r', ' ').replace('\n', ' ');
+            }
         }
 
         // 鑾峰彇瀹夊叏璺濈
@@ -564,19 +589,10 @@
             int grassType = shapeJudger.judgeGrassType(boundary);
             // grassType: 0=鏃犳硶鍒ゆ柇, 1=鍑稿舰, 2=寮傚舰
             
-            // 瑙f瀽闅滅鐗╁垪琛�
-            List<List<Coordinate>> obstacleList = Lunjingguihua.parseObstacles(obstacles);
-            if (obstacleList == null) {
-                obstacleList = new ArrayList<>();
-            }
-
-            // 鍒ゆ柇鏄惁鏈夋湁鏁堢殑闅滅鐗╋細鍙湁褰撹В鏋愭垚鍔熶笖鍒楄〃涓嶄负绌烘椂锛屾墠璁や负鏈夐殰纰嶇墿
-            boolean hasValidObstacles = !obstacleList.isEmpty();
-            
             String generated = null;
             
             // 2. 鏍规嵁鍦板潡绫诲瀷鍜屾槸鍚︽湁闅滅鐗╋紝璋冪敤涓嶅悓鐨勮矾寰勭敓鎴愮被
-            if (!hasValidObstacles) {
+            if (!hasObstacleInput) {
                 // 鏃犻殰纰嶇墿鐨勬儏鍐�
                 if (grassType == 1) {
                     // 鍑稿舰鍦板潡锛屾棤闅滅鐗� -> 璋冪敤 AoxinglujingNoObstacle
@@ -585,100 +601,43 @@
                     generated = formatAoxingPathSegments(segments);
                 } else if (grassType == 2) {
                     // 寮傚舰鍦板潡锛屾棤闅滅鐗� -> 璋冪敤 YixinglujingNoObstacle
-                    // 娉ㄦ剰锛氬鏋滆绫昏繕娌℃湁瀹炵幇锛岃繖閲屼細鎶涘嚭寮傚父鎴栬繑鍥瀗ull
-                    try {
-                        // 璋冪敤 YixinglujingNoObstacle.planPath 鑾峰彇璺緞娈靛垪琛�
-                        List<YixinglujingNoObstacle.PathSegment> segments = 
-                            YixinglujingNoObstacle.planPath(boundary, plannerWidth, safetyMarginStr);
-                        // 鏍煎紡鍖栬矾寰勬鍒楄〃涓哄瓧绗︿覆
-                        generated = formatYixingPathSegments(segments);
-                    } catch (Exception e) {
-                        // 濡傛灉绫昏繕娌℃湁瀹炵幇锛屼娇鐢ㄥ師鏉ョ殑鏂规硶浣滀负鍚庡
-                        if (showMessages) {
-                            System.err.println("YixinglujingNoObstacle 灏氭湭瀹炵幇锛屼娇鐢ㄩ粯璁ゆ柟娉�: " + e.getMessage());
-                        }
-                        generated = Lunjingguihua.generatePathFromStrings(
-                            boundary, obstacles != null ? obstacles : "", plannerWidth, safetyMarginStr, mode);
-                    }
+                    // 璋冪敤 YixinglujingNoObstacle.planPath 鑾峰彇璺緞娈靛垪琛�
+                    List<YixinglujingNoObstacle.PathSegment> segments = 
+                        YixinglujingNoObstacle.planPath(boundary, plannerWidth, safetyMarginStr);
+                    // 鏍煎紡鍖栬矾寰勬鍒楄〃涓哄瓧绗︿覆
+                    generated = formatYixingPathSegments(segments);
                 } else {
-                    // 鏃犳硶鍒ゆ柇鍦板潡绫诲瀷锛屼娇鐢ㄥ師鏉ョ殑鏂规硶浣滀负鍚庡
+                    // 鏃犳硶鍒ゆ柇鍦板潡绫诲瀷锛岄粯璁ゆ寜鍑稿舰澶勭悊鎴栨彁绀�
                     if (showMessages) {
-                        JOptionPane.showMessageDialog(parentComponent, "鏃犳硶鍒ゆ柇鍦板潡绫诲瀷锛屼娇鐢ㄩ粯璁よ矾寰勭敓鎴愭柟娉�", 
+                        JOptionPane.showMessageDialog(parentComponent, "鏃犳硶鍒ゆ柇鍦板潡绫诲瀷锛屽皾璇曟寜鍑稿舰鍦板潡澶勭悊", 
                             "鎻愮ず", JOptionPane.WARNING_MESSAGE);
                     }
-                    generated = Lunjingguihua.generatePathFromStrings(
-                        boundary, obstacles != null ? obstacles : "", plannerWidth, safetyMarginStr, mode);
+                    List<AoxinglujingNoObstacle.PathSegment> segments = 
+                        AoxinglujingNoObstacle.planPath(boundary, plannerWidth, safetyMarginStr);
+                    generated = formatAoxingPathSegments(segments);
                 }
             } else {
                 // 鏈夐殰纰嶇墿鐨勬儏鍐�
                 if (grassType == 1) {
                     // 鍑稿舰鍦板潡锛屾湁闅滅鐗� -> 璋冪敤 AoxinglujingHaveObstacel
-                    try {
-                        // 鍋囪 AoxinglujingHaveObstacel 鏈夌被浼肩殑鏂规硶绛惧悕
-                        List<AoxinglujingHaveObstacel.PathSegment> segments = AoxinglujingHaveObstacel.planPath(boundary, obstacles, plannerWidth, safetyMarginStr);
-                        generated = formatAoxingHaveObstaclePathSegments(segments);
-                    } catch (Exception e) {
-                        // 濡傛灉绫昏繕娌℃湁瀹炵幇锛屼娇鐢ㄥ師鏉ョ殑鏂规硶浣滀负鍚庡
-                        if (showMessages) {
-                            System.err.println("AoxinglujingHaveObstacel 灏氭湭瀹炵幇锛屼娇鐢ㄩ粯璁ゆ柟娉�: " + e.getMessage());
-                        }
-                        List<Coordinate> polygon = Lunjingguihua.parseCoordinates(boundary);
-                        if (polygon.size() < 4) {
-                            if (showMessages) {
-                                JOptionPane.showMessageDialog(parentComponent, "澶氳竟褰㈠潗鏍囨暟閲忎笉瓒筹紝鑷冲皯闇�瑕佷笁涓偣",
-                                    "閿欒", JOptionPane.ERROR_MESSAGE);
-                            }
-                            return null;
-                        }
-                        double safetyDistance = Double.parseDouble(safetyMarginStr);
-                        ObstaclePathPlanner pathPlanner = new ObstaclePathPlanner(
-                            polygon, widthMeters, mode, obstacleList, safetyDistance);
-                        List<Lunjingguihua.PathSegment> segments = pathPlanner.generate();
-                        generated = Lunjingguihua.formatPathSegments(segments);
-                    }
+                    // 浼犲叆鍙傛暟锛歜oundary(A), obstacles(B), plannerWidth(C), safetyMarginStr(D)
+                    List<AoxinglujingHaveObstacel.PathSegment> segments = 
+                        AoxinglujingHaveObstacel.planPath(boundary, obstacles, plannerWidth, safetyMarginStr);
+                    generated = formatAoxingHaveObstaclePathSegments(segments);
                 } else if (grassType == 2) {
                     // 寮傚舰鍦板潡锛屾湁闅滅鐗� -> 璋冪敤 YixinglujingHaveObstacel
-                    try {
-                        // 鍋囪 YixinglujingHaveObstacel 鏈夌被浼肩殑鏂规硶绛惧悕
-                        generated = YixinglujingHaveObstacel.planPath(boundary, obstacles, plannerWidth, safetyMarginStr);
-                    } catch (Exception e) {
-                        // 濡傛灉绫昏繕娌℃湁瀹炵幇锛屼娇鐢ㄥ師鏉ョ殑鏂规硶浣滀负鍚庡
-                        if (showMessages) {
-                            System.err.println("YixinglujingHaveObstacel 灏氭湭瀹炵幇锛屼娇鐢ㄩ粯璁ゆ柟娉�: " + e.getMessage());
-                        }
-                        List<Coordinate> polygon = Lunjingguihua.parseCoordinates(boundary);
-                        if (polygon.size() < 4) {
-                            if (showMessages) {
-                                JOptionPane.showMessageDialog(parentComponent, "澶氳竟褰㈠潗鏍囨暟閲忎笉瓒筹紝鑷冲皯闇�瑕佷笁涓偣",
-                                    "閿欒", JOptionPane.ERROR_MESSAGE);
-                            }
-                            return null;
-                        }
-                        double safetyDistance = Double.parseDouble(safetyMarginStr);
-                        ObstaclePathPlanner pathPlanner = new ObstaclePathPlanner(
-                            polygon, widthMeters, mode, obstacleList, safetyDistance);
-                        List<Lunjingguihua.PathSegment> segments = pathPlanner.generate();
-                        generated = Lunjingguihua.formatPathSegments(segments);
-                    }
+                    // 浼犲叆鍙傛暟锛歜oundary(A), obstacles(B), plannerWidth(C), safetyMarginStr(D)
+                    // 娉ㄦ剰锛歒ixinglujingHaveObstacel.planPath 杩斿洖 String
+                    generated = YixinglujingHaveObstacel.planPath(boundary, obstacles, plannerWidth, safetyMarginStr);
                 } else {
-                    // 鏃犳硶鍒ゆ柇鍦板潡绫诲瀷锛屼娇鐢ㄥ師鏉ョ殑鏂规硶浣滀负鍚庡
+                    // 鏃犳硶鍒ゆ柇鍦板潡绫诲瀷锛岄粯璁ゆ寜鍑稿舰澶勭悊鎴栨彁绀�
                     if (showMessages) {
-                        JOptionPane.showMessageDialog(parentComponent, "鏃犳硶鍒ゆ柇鍦板潡绫诲瀷锛屼娇鐢ㄩ粯璁よ矾寰勭敓鎴愭柟娉�", 
+                        JOptionPane.showMessageDialog(parentComponent, "鏃犳硶鍒ゆ柇鍦板潡绫诲瀷锛屽皾璇曟寜鍑稿舰鍦板潡澶勭悊", 
                             "鎻愮ず", JOptionPane.WARNING_MESSAGE);
                     }
-                    List<Coordinate> polygon = Lunjingguihua.parseCoordinates(boundary);
-                    if (polygon.size() < 4) {
-                        if (showMessages) {
-                            JOptionPane.showMessageDialog(parentComponent, "澶氳竟褰㈠潗鏍囨暟閲忎笉瓒筹紝鑷冲皯闇�瑕佷笁涓偣",
-                                "閿欒", JOptionPane.ERROR_MESSAGE);
-                        }
-                        return null;
-                    }
-                    double safetyDistance = Double.parseDouble(safetyMarginStr);
-                    ObstaclePathPlanner pathPlanner = new ObstaclePathPlanner(
-                        polygon, widthMeters, mode, obstacleList, safetyDistance);
-                    List<Lunjingguihua.PathSegment> segments = pathPlanner.generate();
-                    generated = Lunjingguihua.formatPathSegments(segments);
+                    List<AoxinglujingHaveObstacel.PathSegment> segments = 
+                        AoxinglujingHaveObstacel.planPath(boundary, obstacles, plannerWidth, safetyMarginStr);
+                    generated = formatAoxingHaveObstaclePathSegments(segments);
                 }
             }
             

--
Gitblit v1.10.0