From 7881cef5c3dcea8e6037101db2c3eeb2fd3ba5da Mon Sep 17 00:00:00 2001
From: 826220679@qq.com <826220679@qq.com>
Date: 星期六, 27 十二月 2025 23:42:36 +0800
Subject: [PATCH] 1211

---
 src/lujing/MowingPathGenerationPage.java |  174 ++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 127 insertions(+), 47 deletions(-)

diff --git a/src/lujing/MowingPathGenerationPage.java b/src/lujing/MowingPathGenerationPage.java
index 8bd2ba9..d30bc1f 100644
--- a/src/lujing/MowingPathGenerationPage.java
+++ b/src/lujing/MowingPathGenerationPage.java
@@ -140,8 +140,21 @@
         contentPanel.add(createTextAreaSection(obstacleTitle, obstacleArea));
         
         // 鍓茶崏瀹藉害
-        widthField = createInfoTextField(widthValue != null ? widthValue : "", true);
-        contentPanel.add(createTextFieldSection("鍓茶崏瀹藉害 (cm)", widthField));
+        String displayWidth = "";
+        if (widthValue != null && !widthValue.trim().isEmpty() && !"-1".equals(widthValue.trim())) {
+            try {
+                double val = Double.parseDouble(widthValue.trim());
+                // 绠�鍗曠殑鍚彂寮忚浆鎹細濡傛灉鍊煎ぇ浜�5锛屽亣璁炬槸鍘樼背锛岃浆鎹负绫�
+                if (val > 5) {
+                    val = val / 100.0;
+                }
+                displayWidth = String.format(Locale.US, "%.2f", val);
+            } catch (NumberFormatException e) {
+                displayWidth = widthValue;
+            }
+        }
+        widthField = createInfoTextField(displayWidth, true);
+        contentPanel.add(createTextFieldSection("鍓茶崏瀹藉害 (m)", widthField));
         
         // 鍓茶崏瀹夊叏璺濈锛堝彧璇绘樉绀猴級
         // 浼樺厛浠嶥ikuai瀵硅薄鑾峰彇锛屽鏋淒ikuai涓病鏈夛紝鍐嶄粠Device鑾峰彇
@@ -223,9 +236,9 @@
         String sanitizedWidth = sanitizeWidthString(widthField.getText());
         if (sanitizedWidth != null) {
             try {
-                double widthCm = Double.parseDouble(sanitizedWidth);
-                widthField.setText(formatWidthForStorage(widthCm));
-                sanitizedWidth = formatWidthForStorage(widthCm);
+                double widthMeters = Double.parseDouble(sanitizedWidth);
+                widthField.setText(formatWidthForStorage(widthMeters));
+                sanitizedWidth = formatWidthForStorage(widthMeters);
             } catch (NumberFormatException ex) {
                 widthField.setText(sanitizedWidth);
             }
@@ -407,25 +420,25 @@
         String rawWidthInput = widthField.getText() != null ? widthField.getText().trim() : "";
         String widthSanitized = sanitizeWidthString(widthField.getText());
         if (widthSanitized == null) {
-                String message = rawWidthInput.isEmpty() ? "璇峰厛璁剧疆鍓茶崏瀹藉害(cm)" : "鍓茶崏瀹藉害鏍煎紡涓嶆纭�";
+                String message = rawWidthInput.isEmpty() ? "璇峰厛璁剧疆鍓茶崏瀹藉害(m)" : "鍓茶崏瀹藉害鏍煎紡涓嶆纭�";
             JOptionPane.showMessageDialog(this, message, "鎻愮ず", JOptionPane.WARNING_MESSAGE);
             return;
         }
         
-        double widthCm;
+        double widthMeters;
         try {
-            widthCm = Double.parseDouble(widthSanitized);
+            widthMeters = Double.parseDouble(widthSanitized);
         } catch (NumberFormatException ex) {
             JOptionPane.showMessageDialog(this, "鍓茶崏瀹藉害鏍煎紡涓嶆纭�", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
             return;
         }
         
-        if (widthCm <= 0) {
+        if (widthMeters <= 0) {
             JOptionPane.showMessageDialog(this, "鍓茶崏瀹藉害蹇呴』澶т簬0", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
             return;
         }
         
-        String widthNormalized = formatWidthForStorage(widthCm);
+        String widthNormalized = formatWidthForStorage(widthMeters);
         widthField.setText(widthNormalized);
         
         String pathNormalized = normalizeCoordinateInput(pathArea.getText());
@@ -518,15 +531,15 @@
         String widthStr = sanitizeWidthString(widthCmInput);
         if (widthStr == null) {
             if (showMessages) {
-                String message = rawWidth.isEmpty() ? "璇峰厛璁剧疆鍓茶崏瀹藉害(cm)" : "鍓茶崏瀹藉害鏍煎紡涓嶆纭�";
+                String message = rawWidth.isEmpty() ? "璇峰厛璁剧疆鍓茶崏瀹藉害(m)" : "鍓茶崏瀹藉害鏍煎紡涓嶆纭�";
                 JOptionPane.showMessageDialog(parentComponent, message, "鎻愮ず", JOptionPane.WARNING_MESSAGE);
             }
             return null;
         }
         
-        double widthCm;
+        double widthVal;
         try {
-            widthCm = Double.parseDouble(widthStr);
+            widthVal = Double.parseDouble(widthStr);
         } catch (NumberFormatException ex) {
             if (showMessages) {
                 JOptionPane.showMessageDialog(parentComponent, "鍓茶崏瀹藉害鏍煎紡涓嶆纭�", 
@@ -535,7 +548,7 @@
             return null;
         }
         
-        if (widthCm <= 0) {
+        if (widthVal <= 0) {
             if (showMessages) {
                 JOptionPane.showMessageDialog(parentComponent, "鍓茶崏瀹藉害蹇呴』澶т簬0", 
                     "鎻愮ず", JOptionPane.WARNING_MESSAGE);
@@ -543,7 +556,7 @@
             return null;
         }
         
-        double widthMeters = widthCm / 100.0d;
+        double widthMeters = widthVal;
         String plannerWidth = BigDecimal.valueOf(widthMeters)
             .setScale(3, RoundingMode.HALF_UP)
             .stripTrailingZeros()
@@ -596,12 +609,14 @@
                 // 鏃犻殰纰嶇墿鐨勬儏鍐�
                 if (grassType == 1) {
                     // 鍑稿舰鍦板潡锛屾棤闅滅鐗� -> 璋冪敤 AoxinglujingNoObstacle
+                    System.out.println("璋冪敤绠楁硶: 鍑稿舰鏃犻殰纰嶇墿, 绫诲悕: AoxinglujingNoObstacle");
                     List<AoxinglujingNoObstacle.PathSegment> segments = 
                         AoxinglujingNoObstacle.planPath(boundary, plannerWidth, safetyMarginStr);
                     generated = formatAoxingPathSegments(segments);
                 } else if (grassType == 2) {
                     // 寮傚舰鍦板潡锛屾棤闅滅鐗� -> 璋冪敤 YixinglujingNoObstacle
                     // 璋冪敤 YixinglujingNoObstacle.planPath 鑾峰彇璺緞娈靛垪琛�
+                    System.out.println("璋冪敤绠楁硶: 寮傚舰鏃犻殰纰嶇墿, 绫诲悕: YixinglujingNoObstacle");
                     List<YixinglujingNoObstacle.PathSegment> segments = 
                         YixinglujingNoObstacle.planPath(boundary, plannerWidth, safetyMarginStr);
                     // 鏍煎紡鍖栬矾寰勬鍒楄〃涓哄瓧绗︿覆
@@ -612,6 +627,7 @@
                         JOptionPane.showMessageDialog(parentComponent, "鏃犳硶鍒ゆ柇鍦板潡绫诲瀷锛屽皾璇曟寜鍑稿舰鍦板潡澶勭悊", 
                             "鎻愮ず", JOptionPane.WARNING_MESSAGE);
                     }
+                    System.out.println("璋冪敤绠楁硶: 鏃犳硶鍒ゆ柇绫诲瀷(榛樿鍑稿舰鏃犻殰纰嶇墿), 绫诲悕: AoxinglujingNoObstacle");
                     List<AoxinglujingNoObstacle.PathSegment> segments = 
                         AoxinglujingNoObstacle.planPath(boundary, plannerWidth, safetyMarginStr);
                     generated = formatAoxingPathSegments(segments);
@@ -621,20 +637,24 @@
                 if (grassType == 1) {
                     // 鍑稿舰鍦板潡锛屾湁闅滅鐗� -> 璋冪敤 AoxinglujingHaveObstacel
                     // 浼犲叆鍙傛暟锛歜oundary(A), obstacles(B), plannerWidth(C), safetyMarginStr(D)
+                    System.out.println("璋冪敤绠楁硶: 鍑稿舰鏈夐殰纰嶇墿, 绫诲悕: AoxinglujingHaveObstacel");
                     List<AoxinglujingHaveObstacel.PathSegment> segments = 
                         AoxinglujingHaveObstacel.planPath(boundary, obstacles, plannerWidth, safetyMarginStr);
                     generated = formatAoxingHaveObstaclePathSegments(segments);
                 } else if (grassType == 2) {
                     // 寮傚舰鍦板潡锛屾湁闅滅鐗� -> 璋冪敤 YixinglujingHaveObstacel
                     // 浼犲叆鍙傛暟锛歜oundary(A), obstacles(B), plannerWidth(C), safetyMarginStr(D)
-                    // 娉ㄦ剰锛歒ixinglujingHaveObstacel.planPath 杩斿洖 String
-                    generated = YixinglujingHaveObstacel.planPath(boundary, obstacles, plannerWidth, safetyMarginStr);
+                    System.out.println("璋冪敤绠楁硶: 寮傚舰鏈夐殰纰嶇墿, 绫诲悕: YixinglujingHaveObstacel");
+                    List<YixinglujingHaveObstacel.PathSegment> segments = 
+                        YixinglujingHaveObstacel.planPath(boundary, obstacles, plannerWidth, safetyMarginStr);
+                    generated = formatYixingHaveObstaclePathSegments(segments);
                 } else {
                     // 鏃犳硶鍒ゆ柇鍦板潡绫诲瀷锛岄粯璁ゆ寜鍑稿舰澶勭悊鎴栨彁绀�
                     if (showMessages) {
                         JOptionPane.showMessageDialog(parentComponent, "鏃犳硶鍒ゆ柇鍦板潡绫诲瀷锛屽皾璇曟寜鍑稿舰鍦板潡澶勭悊", 
                             "鎻愮ず", JOptionPane.WARNING_MESSAGE);
                     }
+                    System.out.println("璋冪敤绠楁硶: 鏃犳硶鍒ゆ柇绫诲瀷(榛樿鍑稿舰鏈夐殰纰嶇墿), 绫诲悕: AoxinglujingHaveObstacel");
                     List<AoxinglujingHaveObstacel.PathSegment> segments = 
                         AoxinglujingHaveObstacel.planPath(boundary, obstacles, plannerWidth, safetyMarginStr);
                     generated = formatAoxingHaveObstaclePathSegments(segments);
@@ -716,18 +736,20 @@
             return "";
         }
         StringBuilder sb = new StringBuilder();
-        AoxinglujingNoObstacle.Point last = null;
-        for (AoxinglujingNoObstacle.PathSegment segment : segments) {
-            // 鍙坊鍔犲壊鑽夊伐浣滄锛岃烦杩囪繃娓℃
-            if (segment.isMowing) {
-                // 濡傛灉璧风偣涓庝笂涓�涓粓鐐逛笉鍚岋紝娣诲姞璧风偣
-                if (last == null || !equals2D(last, segment.start)) {
-                    appendPoint(sb, segment.start);
-                }
-                // 娣诲姞缁堢偣
-                appendPoint(sb, segment.end);
-                last = segment.end;
+        AoxinglujingNoObstacle.Point lastEnd = null;
+        boolean firstWritten = false;
+        for (AoxinglujingNoObstacle.PathSegment s : segments) {
+            if (!firstWritten) {
+                appendPoint(sb, s.start);
+                firstWritten = true;
+                lastEnd = s.start;
+            } else if (lastEnd == null || !equals2D(lastEnd, s.start)) {
+                // 闈炶繛缁锛屽紑濮嬫柊鐨勫瓙璺緞
+                appendPoint(sb, s.start);
+                lastEnd = s.start;
             }
+            appendPointWithType(sb, s.end, s.isMowing);
+            lastEnd = s.end;
         }
         return sb.toString();
     }
@@ -740,18 +762,20 @@
             return "";
         }
         StringBuilder sb = new StringBuilder();
-        YixinglujingNoObstacle.Point last = null;
-        for (YixinglujingNoObstacle.PathSegment segment : segments) {
-            // 鍙坊鍔犲壊鑽夊伐浣滄锛岃烦杩囪繃娓℃
-            if (segment.isMowing) {
-                // 濡傛灉璧风偣涓庝笂涓�涓粓鐐逛笉鍚岋紝娣诲姞璧风偣
-                if (last == null || !equalsYixingPoint(last, segment.start)) {
-                    appendYixingPoint(sb, segment.start);
-                }
-                // 娣诲姞缁堢偣
-                appendYixingPoint(sb, segment.end);
-                last = segment.end;
+        YixinglujingNoObstacle.Point lastEnd = null;
+        boolean firstWritten = false;
+        for (YixinglujingNoObstacle.PathSegment s : segments) {
+            if (!firstWritten) {
+                appendYixingPoint(sb, s.start);
+                firstWritten = true;
+                lastEnd = s.start;
+            } else if (lastEnd == null || !equalsYixingPoint(lastEnd, s.start)) {
+                // 闈炶繛缁锛屽紑濮嬫柊鐨勫瓙璺緞
+                appendYixingPoint(sb, s.start);
+                lastEnd = s.start;
             }
+            appendYixingPointWithType(sb, s.end, s.isMowing);
+            lastEnd = s.end;
         }
         return sb.toString();
     }
@@ -781,6 +805,51 @@
     }
 
     /**
+     * 鏍煎紡鍖� YixinglujingHaveObstacel.PathSegment 鍒楄〃涓哄潗鏍囧瓧绗︿覆
+     */
+    private String formatYixingHaveObstaclePathSegments(List<YixinglujingHaveObstacel.PathSegment> segments) {
+        if (segments == null || segments.isEmpty()) {
+            return "";
+        }
+        StringBuilder sb = new StringBuilder();
+        YixinglujingHaveObstacel.Point lastEnd = null;
+        boolean firstWritten = false;
+        for (YixinglujingHaveObstacel.PathSegment s : segments) {
+            if (!firstWritten) {
+                appendYixingHaveObstaclePoint(sb, s.start);
+                firstWritten = true;
+                lastEnd = s.start;
+            } else if (lastEnd == null || !equalsYixingHaveObstaclePoint(lastEnd, s.start)) {
+                appendYixingHaveObstaclePoint(sb, s.start);
+                lastEnd = s.start;
+            }
+            appendYixingHaveObstaclePointWithType(sb, s.end, s.isMowing);
+            lastEnd = s.end;
+        }
+        return sb.toString();
+    }
+
+    private boolean equalsYixingHaveObstaclePoint(YixinglujingHaveObstacel.Point p1, YixinglujingHaveObstacel.Point p2) {
+        if (p1 == null || p2 == null) return false;
+        double tolerance = 1e-6;
+        return Math.abs(p1.x - p2.x) < tolerance && Math.abs(p1.y - p2.y) < tolerance;
+    }
+
+    private void appendYixingHaveObstaclePoint(StringBuilder sb, YixinglujingHaveObstacel.Point point) {
+        if (sb.length() > 0) {
+            sb.append(";");
+        }
+        sb.append(String.format(Locale.US, "%.2f,%.2f", point.x, point.y));
+    }
+
+    private void appendYixingHaveObstaclePointWithType(StringBuilder sb, YixinglujingHaveObstacel.Point point, boolean isMowing) {
+        if (sb.length() > 0) {
+            sb.append(";");
+        }
+        sb.append(String.format(Locale.US, "%.2f,%.2f,%s", point.x, point.y, isMowing ? "M" : "T"));
+    }
+
+    /**
      * 姣旇緝涓や釜鐐规槸鍚︾浉鍚岋紙浣跨敤灏忕殑瀹瑰樊锛�
      */
     private boolean equals2D(AoxinglujingNoObstacle.Point p1, AoxinglujingNoObstacle.Point p2) {
@@ -798,7 +867,14 @@
         if (sb.length() > 0) {
             sb.append(";");
         }
-        sb.append(String.format(Locale.US, "%.6f,%.6f", point.x, point.y));
+        sb.append(String.format(Locale.US, "%.2f,%.2f", point.x, point.y));
+    }
+
+    private void appendPointWithType(StringBuilder sb, AoxinglujingNoObstacle.Point point, boolean isMowing) {
+        if (sb.length() > 0) {
+            sb.append(";");
+        }
+        sb.append(String.format(Locale.US, "%.2f,%.2f,%s", point.x, point.y, isMowing ? "M" : "T"));
     }
     
     /**
@@ -819,7 +895,14 @@
         if (sb.length() > 0) {
             sb.append(";");
         }
-        sb.append(String.format(Locale.US, "%.6f,%.6f", point.x, point.y));
+        sb.append(String.format(Locale.US, "%.2f,%.2f", point.x, point.y));
+    }
+
+    private void appendYixingPointWithType(StringBuilder sb, YixinglujingNoObstacle.Point point, boolean isMowing) {
+        if (sb.length() > 0) {
+            sb.append(";");
+        }
+        sb.append(String.format(Locale.US, "%.2f,%.2f,%s", point.x, point.y, isMowing ? "M" : "T"));
     }
 
     /**
@@ -840,7 +923,7 @@
         if (sb.length() > 0) {
             sb.append(";");
         }
-        sb.append(String.format(Locale.US, "%.6f,%.6f", point.x, point.y));
+        sb.append(String.format(Locale.US, "%.2f,%.2f", point.x, point.y));
     }
     
     // ========== UI杈呭姪鏂规硶 ==========
@@ -1046,11 +1129,8 @@
         return cleaned.isEmpty() ? null : cleaned;
     }
     
-    private String formatWidthForStorage(double widthCm) {
-        return BigDecimal.valueOf(widthCm)
-            .setScale(2, RoundingMode.HALF_UP)
-            .stripTrailingZeros()
-            .toPlainString();
+    private String formatWidthForStorage(double widthVal) {
+        return String.format(Locale.US, "%.2f", widthVal);
     }
     
     private String formatMowingPatternForDialog(String patternValue) {

--
Gitblit v1.10.0