From df006129448b6f0653b67caed7c061b84af8e1df Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期五, 19 十二月 2025 13:01:28 +0800
Subject: [PATCH] 新增了割草安全距离信息复制功能

---
 src/lujing/MowingPathGenerationPage.java |  140 ++++++++++++++++++++++++++++++++++++++++++++++
 set.properties                           |    6 +-
 image/fuzhisucc.png                      |    0 
 src/dikuai/Dikuaiguanli.java             |   23 +++++++
 4 files changed, 164 insertions(+), 5 deletions(-)

diff --git a/image/fuzhisucc.png b/image/fuzhisucc.png
new file mode 100644
index 0000000..c3098ec
--- /dev/null
+++ b/image/fuzhisucc.png
Binary files differ
diff --git a/set.properties b/set.properties
index 13c296d..61e0310 100644
--- a/set.properties
+++ b/set.properties
@@ -1,5 +1,5 @@
-#Current work land selection updated
-#Fri Dec 19 12:08:28 CST 2025
+#Mower Configuration Properties - Updated
+#Fri Dec 19 13:00:28 CST 2025
 appVersion=-1
 boundaryLengthVisible=false
 currentWorkLandNumber=LAND1
@@ -7,7 +7,7 @@
 firmwareVersion=-1
 handheldMarkerId=1872
 idleTrailDurationSeconds=60
-mapScale=5.63
+mapScale=8.11
 measurementModeEnabled=false
 mowerId=860
 serialAutoConnect=true
diff --git a/src/dikuai/Dikuaiguanli.java b/src/dikuai/Dikuaiguanli.java
index edd81bb..2c6f253 100644
--- a/src/dikuai/Dikuaiguanli.java
+++ b/src/dikuai/Dikuaiguanli.java
@@ -30,6 +30,7 @@
 import zhuye.MapRenderer;
 import zhuye.Shouye;
 import zhuye.Coordinate;
+import gecaoji.Device;
 
 /**
  * 鍦板潡绠$悊闈㈡澘 - 鍗$墖寮忓竷灞�璁捐
@@ -346,6 +347,28 @@
 		contentPanel.add(mowingWidthPanel);
 		contentPanel.add(Box.createRigidArea(new Dimension(0, 15)));
 
+		// 鍓茶崏瀹夊叏璺濈
+		String displaySafetyDistance = "鏈缃�";
+		Device device = Device.getActiveDevice();
+		if (device != null) {
+			String safetyDistanceValue = device.getMowingSafetyDistance();
+			if (safetyDistanceValue != null && !"-1".equals(safetyDistanceValue) && !safetyDistanceValue.trim().isEmpty()) {
+				try {
+					double distanceMeters = Double.parseDouble(safetyDistanceValue.trim());
+					// 濡傛灉鍊煎ぇ浜�100锛岃涓烘槸鍘樼背锛岄渶瑕佽浆鎹负绫�
+					if (distanceMeters > 100) {
+						distanceMeters = distanceMeters / 100.0;
+					}
+					displaySafetyDistance = String.format("%.2f绫�", distanceMeters);
+				} catch (NumberFormatException e) {
+					displaySafetyDistance = "鏈缃�";
+				}
+			}
+		}
+		JPanel mowingSafetyDistancePanel = createCardInfoItem("鍓茶崏瀹夊叏璺濈:", displaySafetyDistance);
+		contentPanel.add(mowingSafetyDistancePanel);
+		contentPanel.add(Box.createRigidArea(new Dimension(0, 15)));
+
 		JPanel completedTrackPanel = createCardInfoItemWithButton("宸插畬鎴愬壊鑽夎矾寰�:",
 			getTruncatedValue(dikuai.getMowingTrack(), 12, "鏈褰�"),
 			"鏌ョ湅", e -> showCompletedMowingTrackDialog(dikuai));
diff --git a/src/lujing/MowingPathGenerationPage.java b/src/lujing/MowingPathGenerationPage.java
index 3e0cd48..4bc81b4 100644
--- a/src/lujing/MowingPathGenerationPage.java
+++ b/src/lujing/MowingPathGenerationPage.java
@@ -3,6 +3,10 @@
 import javax.swing.*;
 import javax.swing.SwingUtilities;
 import java.awt.*;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.StringSelection;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.ArrayList;
@@ -12,6 +16,7 @@
 import lujing.Lunjingguihua;
 import lujing.ObstaclePathPlanner;
 import org.locationtech.jts.geom.Coordinate;
+import gecaoji.Device;
 
 /**
  * 鐢熸垚鍓茶崏璺緞椤甸潰
@@ -125,6 +130,26 @@
         widthField = createInfoTextField(widthValue != null ? widthValue : "", true);
         contentPanel.add(createTextFieldSection("鍓茶崏瀹藉害 (鍘樼背)", widthField));
         
+        // 鍓茶崏瀹夊叏璺濈锛堝彧璇绘樉绀猴級
+        String displaySafetyDistance = "鏈缃�";
+        Device device = Device.getActiveDevice();
+        if (device != null) {
+            String safetyDistanceValue = device.getMowingSafetyDistance();
+            if (safetyDistanceValue != null && !"-1".equals(safetyDistanceValue) && !safetyDistanceValue.trim().isEmpty()) {
+                try {
+                    double distanceMeters = Double.parseDouble(safetyDistanceValue.trim());
+                    // 濡傛灉鍊煎ぇ浜�100锛岃涓烘槸鍘樼背锛岄渶瑕佽浆鎹负绫�
+                    if (distanceMeters > 100) {
+                        distanceMeters = distanceMeters / 100.0;
+                    }
+                    displaySafetyDistance = String.format("%.2f绫�", distanceMeters);
+                } catch (NumberFormatException e) {
+                    displaySafetyDistance = "鏈缃�";
+                }
+            }
+        }
+        contentPanel.add(createInfoValueSection("鍓茶崏瀹夊叏璺濈", displaySafetyDistance));
+        
         // 鍓茶崏妯″紡锛堝彧璇绘樉绀猴級
         contentPanel.add(createInfoValueSection("鍓茶崏妯″紡", formatMowingPatternForDialog(modeValue)));
         
@@ -559,10 +584,28 @@
         section.setBackground(BACKGROUND_COLOR);
         section.setAlignmentX(Component.LEFT_ALIGNMENT);
         
+        // 鍒涘缓鏍囬闈㈡澘锛屽寘鍚爣棰樺拰澶嶅埗鍥炬爣
+        JPanel titlePanel = new JPanel(new BorderLayout());
+        titlePanel.setBackground(BACKGROUND_COLOR);
+        titlePanel.setOpaque(false);
+        
         JLabel titleLabel = new JLabel(title);
         titleLabel.setFont(new Font("寰蒋闆呴粦", Font.BOLD, 14));
         titleLabel.setForeground(TEXT_COLOR);
-        section.add(titleLabel, BorderLayout.NORTH);
+        titlePanel.add(titleLabel, BorderLayout.WEST);
+        
+        // 鍒涘缓澶嶅埗鎸夐挳
+        JButton copyButton = createCopyButton(title, () -> {
+            String text = textArea.getText();
+            if (text == null || text.trim().isEmpty()) {
+                JOptionPane.showMessageDialog(this, title + " 鏈缃�", "鎻愮ず", JOptionPane.INFORMATION_MESSAGE);
+                return;
+            }
+            copyToClipboard(text, title);
+        });
+        titlePanel.add(copyButton, BorderLayout.EAST);
+        
+        section.add(titlePanel, BorderLayout.NORTH);
         
         JScrollPane scrollPane = new JScrollPane(textArea);
         scrollPane.setBorder(BorderFactory.createLineBorder(BORDER_COLOR));
@@ -591,10 +634,28 @@
         section.setBackground(BACKGROUND_COLOR);
         section.setAlignmentX(Component.LEFT_ALIGNMENT);
         
+        // 鍒涘缓鏍囬闈㈡澘锛屽寘鍚爣棰樺拰澶嶅埗鍥炬爣
+        JPanel titlePanel = new JPanel(new BorderLayout());
+        titlePanel.setBackground(BACKGROUND_COLOR);
+        titlePanel.setOpaque(false);
+        
         JLabel titleLabel = new JLabel(title);
         titleLabel.setFont(new Font("寰蒋闆呴粦", Font.BOLD, 14));
         titleLabel.setForeground(TEXT_COLOR);
-        section.add(titleLabel, BorderLayout.NORTH);
+        titlePanel.add(titleLabel, BorderLayout.WEST);
+        
+        // 鍒涘缓澶嶅埗鎸夐挳
+        JButton copyButton = createCopyButton(title, () -> {
+            String text = textField.getText();
+            if (text == null || text.trim().isEmpty()) {
+                JOptionPane.showMessageDialog(this, title + " 鏈缃�", "鎻愮ず", JOptionPane.INFORMATION_MESSAGE);
+                return;
+            }
+            copyToClipboard(text, title);
+        });
+        titlePanel.add(copyButton, BorderLayout.EAST);
+        
+        section.add(titlePanel, BorderLayout.NORTH);
         
         JPanel fieldWrapper = new JPanel(new BorderLayout());
         fieldWrapper.setBackground(textField.isEditable() ? WHITE : new Color(245, 245, 245));
@@ -732,6 +793,81 @@
         }
         return "parallel";
     }
+    
+    /**
+     * 鍒涘缓澶嶅埗鎸夐挳
+     */
+    private JButton createCopyButton(String title, Runnable copyAction) {
+        JButton copyButton = new JButton();
+        Font titleFont = new Font("寰蒋闆呴粦", Font.BOLD, 14);
+        FontMetrics metrics = getFontMetrics(titleFont);
+        int iconSize = metrics.getHeight(); // 浣跨敤鏍囬瀛椾綋楂樺害浣滀负鍥炬爣澶у皬
+        
+        // 鍔犺浇澶嶅埗鍥炬爣
+        ImageIcon copyIcon = null;
+        ImageIcon successIcon = null;
+        try {
+            ImageIcon originalCopyIcon = new ImageIcon("image/fuzhi.png");
+            Image scaledCopyImage = originalCopyIcon.getImage().getScaledInstance(iconSize, iconSize, Image.SCALE_SMOOTH);
+            copyIcon = new ImageIcon(scaledCopyImage);
+            
+            // 鍔犺浇鎴愬姛鍥炬爣
+            ImageIcon originalSuccessIcon = new ImageIcon("image/fuzhisucc.png");
+            Image scaledSuccessImage = originalSuccessIcon.getImage().getScaledInstance(iconSize, iconSize, Image.SCALE_SMOOTH);
+            successIcon = new ImageIcon(scaledSuccessImage);
+        } catch (Exception e) {
+            // 濡傛灉鍥剧墖鍔犺浇澶辫触锛屼娇鐢ㄦ枃鏈�
+            copyButton.setText("澶嶅埗");
+            copyButton.setFont(new Font("寰蒋闆呴粦", Font.PLAIN, 12));
+            System.err.println("鏃犳硶鍔犺浇澶嶅埗鍥炬爣: " + e.getMessage());
+        }
+        
+        final ImageIcon finalCopyIcon = copyIcon;
+        final ImageIcon finalSuccessIcon = successIcon;
+        
+        copyButton.setIcon(finalCopyIcon);
+        copyButton.setContentAreaFilled(false);
+        copyButton.setBorder(null);
+        copyButton.setFocusPainted(false);
+        copyButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
+        copyButton.setToolTipText("澶嶅埗" + title);
+        
+        // 娣诲姞鐐瑰嚮浜嬩欢
+        copyButton.addActionListener(e -> {
+            copyAction.run();
+            // 澶嶅埗鎴愬姛鍚庡垏鎹㈠浘鏍�
+            if (finalSuccessIcon != null) {
+                copyButton.setIcon(finalSuccessIcon);
+                // 1绉掑悗鎭㈠鍘熷浘鏍�
+                Timer timer = new Timer(1000, evt -> {
+                    copyButton.setIcon(finalCopyIcon);
+                });
+                timer.setRepeats(false);
+                timer.start();
+            }
+        });
+        
+        return copyButton;
+    }
+    
+    /**
+     * 澶嶅埗鏂囨湰鍒板壀璐存澘
+     */
+    private void copyToClipboard(String text, String title) {
+        if (text == null || text.trim().isEmpty()) {
+            JOptionPane.showMessageDialog(this, title + " 鏈缃�", "鎻愮ず", JOptionPane.INFORMATION_MESSAGE);
+            return;
+        }
+        
+        try {
+            StringSelection selection = new StringSelection(text);
+            Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
+            clipboard.setContents(selection, selection);
+            // 鍘绘帀鎴愬姛鎻愮ず寮圭獥
+        } catch (Exception ex) {
+            JOptionPane.showMessageDialog(this, "澶嶅埗澶辫触: " + ex.getMessage(), "閿欒", JOptionPane.ERROR_MESSAGE);
+        }
+    }
 }
 
 

--
Gitblit v1.10.0