From 13d032241e1a2938a8be4f64c9171e1240e9ea1e Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期一, 22 十二月 2025 18:50:42 +0800
Subject: [PATCH] 新增了边界管理页面和首页边界虚线功能

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

diff --git a/src/zhangaiwu/AddDikuai.java b/src/zhangaiwu/AddDikuai.java
index b80b9ec..8f53100 100644
--- a/src/zhangaiwu/AddDikuai.java
+++ b/src/zhangaiwu/AddDikuai.java
@@ -27,12 +27,13 @@
 import dikuai.Dikuaiguanli;
 import bianjie.bianjieguihua2;
 import lujing.Lunjingguihua;
+import publicway.buttonset;
 import set.Setsys;
 import ui.UIConfig;
 import zhuye.MowerLocationData;
 import zhuye.Shouye;
 import zhuye.Coordinate;
-import zhuye.buttonset;
+import gecaoji.Device;
 
 /**
  * 鏂板鍦板潡瀵硅瘽妗� - 澶氭楠よ〃鍗曡璁�
@@ -67,6 +68,7 @@
     private JComboBox<String> mowingPatternCombo;
     private JTextField mowingWidthField; // 鍓茶崏鏈哄壊鍒�瀹藉害
     private JTextField overlapDistanceField; // 鐩搁偦琛岄噸鍙犺窛绂�
+    private JTextField mowingSafetyDistanceField; // 鍓茶崏瀹夊叏璺濈
     private JLabel calculatedMowingWidthLabel; // 璁$畻鍚庣殑鍓茶崏瀹藉害鏄剧ず
     private JPanel previewPanel;
     private Map<String, JPanel> drawingOptionPanels = new HashMap<>();
@@ -101,6 +103,7 @@
         final boolean success;
         final String errorMessage;
         final String originalBoundary;
+        final String originalBoundaryXY;
         final String optimizedBoundary;
         final String areaSqMeters;
         final String baseStationCoordinates;
@@ -109,6 +112,7 @@
         private BoundarySnapshotResult(boolean success,
                                        String errorMessage,
                                        String originalBoundary,
+                                       String originalBoundaryXY,
                                        String optimizedBoundary,
                                        String areaSqMeters,
                                        String baseStationCoordinates,
@@ -116,18 +120,19 @@
             this.success = success;
             this.errorMessage = errorMessage;
             this.originalBoundary = originalBoundary;
+            this.originalBoundaryXY = originalBoundaryXY;
             this.optimizedBoundary = optimizedBoundary;
             this.areaSqMeters = areaSqMeters;
             this.baseStationCoordinates = baseStationCoordinates;
             this.messageType = messageType;
         }
 
-        static BoundarySnapshotResult success(String original, String optimized, String area, String baseStation) {
-            return new BoundarySnapshotResult(true, null, original, optimized, area, baseStation, JOptionPane.INFORMATION_MESSAGE);
+        static BoundarySnapshotResult success(String original, String originalXY, String optimized, String area, String baseStation) {
+            return new BoundarySnapshotResult(true, null, original, originalXY, optimized, area, baseStation, JOptionPane.INFORMATION_MESSAGE);
         }
 
         static BoundarySnapshotResult failure(String message, int messageType) {
-            return new BoundarySnapshotResult(false, message, null, null, null, null, messageType);
+            return new BoundarySnapshotResult(false, message, null, null, null, null, null, messageType);
         }
     }
 
@@ -1044,6 +1049,65 @@
         
         calculatedWidthPanel.add(calculatedWidthDisplayPanel);
         settingsPanel.add(calculatedWidthPanel);
+        settingsPanel.add(Box.createRigidArea(new Dimension(0, 10)));
+        
+        // 鍓茶崏瀹夊叏璺濈
+        JPanel safetyDistancePanel = createFormGroupWithoutHint("鍓茶崏瀹夊叏璺濈");
+        JPanel safetyDistanceInputPanel = new JPanel(new BorderLayout());
+        safetyDistanceInputPanel.setBackground(WHITE);
+        safetyDistanceInputPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, 48));
+        safetyDistanceInputPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
+        
+        // 鑾峰彇榛樿鍊�
+        String defaultSafetyDistance = "0.5"; // 榛樿鍊�
+        try {
+            Device device = Device.getGecaoji();
+            if (device != null) {
+                String safetyDistance = device.getMowingSafetyDistance();
+                if (safetyDistance != null && !safetyDistance.trim().isEmpty() && !"-1".equals(safetyDistance.trim())) {
+                    defaultSafetyDistance = safetyDistance.trim();
+                }
+            }
+        } catch (Exception e) {
+            // 濡傛灉鑾峰彇澶辫触锛屼娇鐢ㄩ粯璁ゅ��
+        }
+        
+        mowingSafetyDistanceField = new JTextField(defaultSafetyDistance);
+        mowingSafetyDistanceField.setFont(new Font("寰蒋闆呴粦", Font.PLAIN, 16));
+        mowingSafetyDistanceField.setBorder(BorderFactory.createCompoundBorder(
+            BorderFactory.createLineBorder(BORDER_COLOR, 2),
+            BorderFactory.createEmptyBorder(10, 12, 10, 12)
+        ));
+        
+        // 娣诲姞鏂囨湰妗嗙劍鐐规晥鏋�
+        mowingSafetyDistanceField.addFocusListener(new FocusAdapter() {
+            @Override
+            public void focusGained(FocusEvent e) {
+                mowingSafetyDistanceField.setBorder(BorderFactory.createCompoundBorder(
+                    BorderFactory.createLineBorder(PRIMARY_COLOR, 2),
+                    BorderFactory.createEmptyBorder(10, 12, 10, 12)
+                ));
+            }
+            
+            @Override
+            public void focusLost(FocusEvent e) {
+                mowingSafetyDistanceField.setBorder(BorderFactory.createCompoundBorder(
+                    BorderFactory.createLineBorder(BORDER_COLOR, 2),
+                    BorderFactory.createEmptyBorder(10, 12, 10, 12)
+                ));
+            }
+        });
+        
+        JLabel safetyDistanceUnitLabel = new JLabel("绫�");
+        safetyDistanceUnitLabel.setFont(new Font("寰蒋闆呴粦", Font.PLAIN, 14));
+        safetyDistanceUnitLabel.setForeground(LIGHT_TEXT);
+        safetyDistanceUnitLabel.setBorder(BorderFactory.createEmptyBorder(0, 15, 0, 0));
+        
+        safetyDistanceInputPanel.add(mowingSafetyDistanceField, BorderLayout.CENTER);
+        safetyDistanceInputPanel.add(safetyDistanceUnitLabel, BorderLayout.EAST);
+        
+        safetyDistancePanel.add(safetyDistanceInputPanel);
+        settingsPanel.add(safetyDistancePanel);
         settingsPanel.add(Box.createRigidArea(new Dimension(0, 25)));
         
         stepPanel.add(settingsPanel);
@@ -1614,6 +1678,7 @@
         Dikuai dikuai = getOrCreatePendingDikuai();
         if (dikuai != null) {
             dikuai.setBoundaryOriginalCoordinates(snapshot.originalBoundary);
+            dikuai.setBoundaryOriginalXY(snapshot.originalBoundaryXY);
             dikuai.setBoundaryCoordinates(snapshot.optimizedBoundary);
             dikuai.setLandArea(snapshot.areaSqMeters);
             dikuai.setBaseStationCoordinates(snapshot.baseStationCoordinates);
@@ -1622,11 +1687,13 @@
         }
 
         dikuaiData.put("boundaryOriginalCoordinates", snapshot.originalBoundary);
+        dikuaiData.put("boundaryOriginalXY", snapshot.originalBoundaryXY);
         dikuaiData.put("boundaryCoordinates", snapshot.optimizedBoundary);
         dikuaiData.put("landArea", snapshot.areaSqMeters);
         dikuaiData.put("baseStationCoordinates", snapshot.baseStationCoordinates);
         if (activeSession != null) {
             activeSession.data.put("boundaryOriginalCoordinates", snapshot.originalBoundary);
+            activeSession.data.put("boundaryOriginalXY", snapshot.originalBoundaryXY);
             activeSession.data.put("boundaryCoordinates", snapshot.optimizedBoundary);
             activeSession.data.put("landArea", snapshot.areaSqMeters);
             activeSession.data.put("baseStationCoordinates", snapshot.baseStationCoordinates);
@@ -1682,6 +1749,47 @@
         }
         return sb.toString();
     }
+    
+    /**
+     * 鏋勫缓鍘熷杈圭晫XY鍧愭爣瀛楃涓诧紙鐩稿浜庡熀鍑嗙珯鐨刋Y鍧愭爣锛�
+     */
+    private static String buildOriginalBoundaryXYString(List<Coordinate> coordinates, String baseStationCoordinates) {
+        if (coordinates == null || coordinates.isEmpty()) {
+            return "-1";
+        }
+        if (baseStationCoordinates == null || baseStationCoordinates.trim().isEmpty() || "-1".equals(baseStationCoordinates.trim())) {
+            return "-1";
+        }
+        
+        try {
+            // 瑙f瀽鍩哄噯绔欏潗鏍�
+            String[] baseParts = baseStationCoordinates.split(",");
+            if (baseParts.length < 4) {
+                return "-1";
+            }
+            double baseLat = publicway.Gpstoxuzuobiao.parseDMToDecimal(baseParts[0], baseParts[1]);
+            double baseLon = publicway.Gpstoxuzuobiao.parseDMToDecimal(baseParts[2], baseParts[3]);
+            
+            StringBuilder sb = new StringBuilder();
+            DecimalFormat xyFormat = new DecimalFormat("0.00");
+            for (Coordinate coord : coordinates) {
+                double lat = convertToDecimalDegree(coord.getLatitude(), coord.getLatDirection());
+                double lon = convertToDecimalDegree(coord.getLongitude(), coord.getLonDirection());
+                
+                // 杞崲涓篨Y鍧愭爣
+                double[] xy = publicway.Gpstoxuzuobiao.convertLatLonToLocal(lat, lon, baseLat, baseLon);
+                
+                if (sb.length() > 0) {
+                    sb.append(";");
+                }
+                sb.append(xyFormat.format(xy[0])).append(",").append(xyFormat.format(xy[1]));
+            }
+            return sb.toString();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "-1";
+        }
+    }
 
     private static double convertToDecimalDegree(String dmm, String direction) {
         if (dmm == null || dmm.isEmpty()) {
@@ -1804,10 +1912,11 @@
         }
 
     String originalBoundary = buildOriginalBoundaryString(uniqueCoordinates);
+        String originalBoundaryXY = buildOriginalBoundaryXYString(uniqueCoordinates, baseStationCoordinates);
         DecimalFormat areaFormat = new DecimalFormat("0.00");
         String areaString = areaFormat.format(area);
 
-        return BoundarySnapshotResult.success(originalBoundary, optimizedBoundary, areaString, baseStationCoordinates);
+        return BoundarySnapshotResult.success(originalBoundary, originalBoundaryXY, optimizedBoundary, areaString, baseStationCoordinates);
     }
 
     private String resolvePlannerMode(String patternDisplay) {
@@ -2346,6 +2455,7 @@
         BoundarySnapshotResult snapshot = computeBoundarySnapshot();
         if (snapshot.success && activeSession != null) {
             activeSession.data.put("boundaryOriginalCoordinates", snapshot.originalBoundary);
+            activeSession.data.put("boundaryOriginalXY", snapshot.originalBoundaryXY);
             activeSession.data.put("boundaryCoordinates", snapshot.optimizedBoundary);
             activeSession.data.put("landArea", snapshot.areaSqMeters);
             activeSession.data.put("baseStationCoordinates", snapshot.baseStationCoordinates);
@@ -2405,6 +2515,9 @@
         if (dikuaiData.containsKey("boundaryOriginalCoordinates")) {
             dikuai.setBoundaryOriginalCoordinates(dikuaiData.get("boundaryOriginalCoordinates"));
         }
+        if (dikuaiData.containsKey("boundaryOriginalXY")) {
+            dikuai.setBoundaryOriginalXY(dikuaiData.get("boundaryOriginalXY"));
+        }
         if (dikuaiData.containsKey("boundaryCoordinates")) {
             dikuai.setBoundaryCoordinates(dikuaiData.get("boundaryCoordinates"));
         }
@@ -2478,6 +2591,21 @@
         if (isMeaningfulValue(plannedPath)) {
             dikuai.setPlannedPath(plannedPath);
         }
+        
+        // 淇濆瓨鍓茶崏瀹夊叏璺濈锛堜紭鍏堜粠dikuaiData鑾峰彇锛屽惁鍒欎粠TextField鑾峰彇锛�
+        if (dikuaiData.containsKey("mowingSafetyDistance")) {
+            dikuai.setMowingSafetyDistance(dikuaiData.get("mowingSafetyDistance"));
+        } else if (mowingSafetyDistanceField != null) {
+            String safetyDistanceText = mowingSafetyDistanceField.getText().trim();
+            if (!safetyDistanceText.isEmpty()) {
+                try {
+                    double safetyDistanceMeters = Double.parseDouble(safetyDistanceText);
+                    dikuai.setMowingSafetyDistance(String.format(Locale.US, "%.2f", safetyDistanceMeters));
+                } catch (NumberFormatException e) {
+                    dikuai.setMowingSafetyDistance(safetyDistanceText);
+                }
+            }
+        }
 
         Dikuai.putDikuai(landNumber, dikuai);
         Dikuai.saveToProperties();

--
Gitblit v1.10.0