From f66407df7e4971a7a85e4b281cc199a05ec84987 Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期二, 23 十二月 2025 16:25:58 +0800
Subject: [PATCH] 优化了功能
---
dikuai.properties | 2
.classpath | 1
src/zhangaiwu/AddDikuai.java | 380 +++++++++++++++++++++++++++++++++++++++++
set.properties | 8
src/udpdell/Mqttserver.java | 145 ++++++++++++++++
lib/MQTT-1.0-SNAPSHOT.jar | 0
6 files changed, 525 insertions(+), 11 deletions(-)
diff --git a/.classpath b/.classpath
index 6d3f076..c950b57 100644
--- a/.classpath
+++ b/.classpath
@@ -10,5 +10,6 @@
<classpathentry kind="lib" path="E:/Users/hxzk/eclipse-workspace/GeCaoAPP/lib/jts-core-1.19.0.jar"/>
<classpathentry kind="lib" path="E:/Users/hxzk/eclipse-workspace/GeCaoAPP/lib/slf4j-api-1.7.30.jar"/>
<classpathentry kind="lib" path="E:/Users/hxzk/eclipse-workspace/GeCaoAPP/lib/slf4j-simple-1.7.30.jar"/>
+ <classpathentry kind="lib" path="E:/Users/hxzk/eclipse-workspace/GeCaoAPP/lib/MQTT-1.0-SNAPSHOT.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/dikuai.properties b/dikuai.properties
index 747fa34..c58b35e 100644
--- a/dikuai.properties
+++ b/dikuai.properties
@@ -1,2 +1,2 @@
#Dikuai Properties
-#Tue Dec 23 13:52:20 CST 2025
+#Tue Dec 23 16:12:08 CST 2025
diff --git a/lib/MQTT-1.0-SNAPSHOT.jar b/lib/MQTT-1.0-SNAPSHOT.jar
new file mode 100644
index 0000000..ab5e3e6
--- /dev/null
+++ b/lib/MQTT-1.0-SNAPSHOT.jar
Binary files differ
diff --git a/set.properties b/set.properties
index 5b5c1b8..4b9dfc1 100644
--- a/set.properties
+++ b/set.properties
@@ -1,5 +1,5 @@
#Mower Configuration Properties - Updated
-#Tue Dec 23 14:54:31 CST 2025
+#Tue Dec 23 16:12:22 CST 2025
appVersion=-1
boundaryLengthVisible=false
currentWorkLandNumber=-1
@@ -8,12 +8,12 @@
handheldMarkerId=1872
idleTrailDurationSeconds=60
manualBoundaryDrawingMode=false
-mapScale=20.00
+mapScale=15.41
measurementModeEnabled=false
mowerId=860
serialAutoConnect=true
serialBaudRate=115200
serialPortName=COM15
simCardNumber=-1
-viewCenterX=0.00
-viewCenterY=0.00
+viewCenterX=-14.71
+viewCenterY=5.21
diff --git a/src/udpdell/Mqttserver.java b/src/udpdell/Mqttserver.java
new file mode 100644
index 0000000..a393604
--- /dev/null
+++ b/src/udpdell/Mqttserver.java
@@ -0,0 +1,145 @@
+package udpdell;
+import Util.DeviceMessageParser;
+import Util.LawnMowerCommandJsonGenerator;
+import Util.MowerPathMessageGenerator;
+import Util.Entity.*;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import java.util.Arrays;
+import java.util.List;
+
+public class Mqttserver {
+// public static void main(String[] args) {
+// GPSData();//瑙f瀽璁惧涓婁紶GPS鏁版嵁绀轰緥
+// responseData();//瑙f瀽璁惧鍥炲鐨勫搷搴旀暟鎹ず渚�
+// outputData();//璁惧鎺у埗鎸囦护鐢熸垚绀轰緥
+// //String s = generateExampleMessage();//璺緞瑙勫垝鏁版嵁鐢熸垚绀轰緥
+// //System.out.println(s);
+// }
+
+ private static void responseData(){
+ // 瑙f瀽鍝嶅簲娑堟伅
+ String responseJson = "{ \"msg_id\": \"hxzkresponse_20151105\", \"timestamp\": 1621234568300, \"device_id\": \"MOWER_001\", \"original_msg_id\": \"msg_123456793\", \"response\": { \"status\": \"success\", \"command\": \"start\", \"error_code\": 0, \"error_message\": \"\", \"additional_info\": { \"current_status\": \"running\", \"battery_level\": 84, \"current_position\": { \"lat\": \"3949.91202005,N\", \"lon\": \"11616.85440851,E\" } } } }";
+
+ ResponseData responseData = null;
+ try {
+ responseData = DeviceMessageParser.parseResponseData(responseJson);
+ System.out.println("鍘熷娑堟伅ID: " + responseData.getOriginalMsgId());
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ } catch (IllegalArgumentException e) {
+ System.err.println("瑙f瀽閿欒: " + e.getMessage());
+ }
+
+ }
+
+
+
+
+ private static void GPSData() {
+ // GPS鏁版嵁绀轰緥锛堟柊鍗忚鏍煎紡锛屽寘鍚獹PS銆両MU鍜岀姸鎬佹暟鎹級
+ String gpsJsonStr = "{\n" +
+ " \"msg_id\": \"hxzkgps_20151101\",\n" +
+ " \"timestamp\": 1621234567890,\n" +
+ " \"device_id\": \"MOWER_001\",\n" +
+ " \"data_type\": \"gps\",\n" +
+ " \"gps_raw\": \"$GNGGA,024830.90,3949.91202005,N,11616.85440851,E,4,26,0.7,49.6405,M,-8.7435,M,0.9,409*4A,2976,28,0,0,2,0\",\n" +
+ " \"imu_data\": {\n" +
+ " \"roll\": 1.2,\n" +
+ " \"pitch\": 0.5,\n" +
+ " \"yaw\": 185.5\n" +
+ " },\n" +
+ " \"status\": {\n" +
+ " \"battery_level\": 85,\n" +
+ " \"battery_voltage\": 24.5,\n" +
+ " \"operation_mode\": \"auto\",\n" +
+ " \"motor_status\": \"running\",\n" +
+ " \"blade_status\": \"rotating\",\n" +
+ " \"blade_height\": 10,\n" +
+ " \"self_check_status\": 1,\n" +
+ " \"error_code\": 0,\n" +
+ " \"error_message\": \"\"\n" +
+ " }\n" +
+ "}";
+ try {
+ System.out.println("=== GPS鏁版嵁瑙f瀽绀轰緥锛堟柊鍗忚鏍煎紡锛� ===");
+ GPSData gpsData2 = DeviceMessageParser.parseGPSData(gpsJsonStr);
+ String string2 = gpsData2.toString();
+ System.out.println(string2);
+
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ } catch (IllegalArgumentException e) {
+ System.err.println("瑙f瀽閿欒: " + e.getMessage());
+ }
+ }
+
+
+ public static void outputData() {
+ // 绀轰緥锛氫娇鐢ㄤ究鎹锋柟娉曠敓鎴愯浆鍚戝懡浠�
+ String json2 = LawnMowerCommandJsonGenerator.generateTurnCommandJson(
+ "hxzkcontrol_20151105",
+ null,
+ "USER_001",
+ "MOWER_001",
+ 180.0, // 杞悜180搴�
+ 0.5, // 閫熷害0.5绫�/绉�
+ 10 // 鎸佺画10绉�
+ );
+ System.out.println(json2);
+ }
+
+
+
+ public static String generateExampleMessage(int value) {
+ // 鍒涘缓杈圭晫鐐癸紙浣跨敤XY鍧愭爣锛�
+ HxzkPathMessage message = getmessage(value);
+
+ return MowerPathMessageGenerator.toJson(message);
+ }
+
+ private static HxzkPathMessage getmessage(int value) {
+ List<CoordinatePoint> boundaryPoints = Arrays.asList(
+ MowerPathMessageGenerator.createCoordinatePoint("100.5", "200.3"),
+ MowerPathMessageGenerator.createCoordinatePoint("150.8", "200.5"),
+ MowerPathMessageGenerator.createCoordinatePoint("150.9", "250.7")
+ );
+
+ // 鍒涘缓瀵艰埅鐐癸紙浣跨敤XY鍧愭爣锛�
+ List<CoordinatePoint> navigationPoints = Arrays.asList(
+ MowerPathMessageGenerator.createCoordinatePoint("100.5", "200.3"),
+ MowerPathMessageGenerator.createCoordinatePoint("150.8", "200.5"),
+ MowerPathMessageGenerator.createCoordinatePoint("150.9", "250.7")
+ );
+
+
+ // 鍒涘缓鍩哄噯绔欐暟鎹�
+ BasestationData basestationData = MowerPathMessageGenerator.createBasestationData(
+ "3949.84110064", "N",
+ "11616.74587312", "E",
+ 45.2
+ );
+
+ // 鍒涘缓璺緞鏁版嵁
+ PathData pathData = MowerPathMessageGenerator.createPathData(
+ "path_20230724_"+value,
+ "WGS84_DM",
+ boundaryPoints,
+ navigationPoints,
+ "parallel",
+ boundaryPoints.size(), // 杈圭晫鐐规暟閲�
+ navigationPoints.size() // 瀵艰埅鐐规暟閲�
+ );
+
+ // 鍒涘缓瀹屾暣娑堟伅
+ HxzkPathMessage message = MowerPathMessageGenerator.createMessage(
+ "hxzkpath_"+value,
+ System.currentTimeMillis(),
+ "USER_"+value,
+ "6528",
+ "set_path",
+ basestationData,
+ pathData
+ );
+ return message;
+ }
+}
\ No newline at end of file
diff --git a/src/zhangaiwu/AddDikuai.java b/src/zhangaiwu/AddDikuai.java
index 07d238c..52de9ce 100644
--- a/src/zhangaiwu/AddDikuai.java
+++ b/src/zhangaiwu/AddDikuai.java
@@ -73,7 +73,8 @@
private JButton prevButton;
private JButton nextButton;
private JButton createButton;
- private JButton previewButton;
+ private JButton previewButton; // 姝ラ3鐨勯瑙堟寜閽紙棰勮鍓茶崏璺緞锛�
+ private JButton boundaryPreviewButton; // 姝ラ2鐨勯瑙堟寜閽紙棰勮杈圭晫锛�
private Component previewButtonSpacer;
private JLabel boundaryCountLabel;
private JTextArea boundaryXYTextArea; // 鏄剧ず杈圭晫XY鍧愭爣鐨勬枃鏈煙
@@ -260,7 +261,7 @@
));
areaNameField.setAlignmentX(Component.LEFT_ALIGNMENT);
- // 娣诲姞杈撳叆妗嗙劍鐐规晥鏋�
+ // 娣诲姞杈撳叆妗嗙劍鐐规晥鏋滃拰鏂囨湰鍙樺寲鐩戝惉
areaNameField.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
@@ -276,6 +277,16 @@
BorderFactory.createLineBorder(BORDER_COLOR, 2),
BorderFactory.createEmptyBorder(12, 15, 12, 15)
));
+ // 鏇存柊涓嬩竴姝ユ寜閽姸鎬�
+ updateStep1ButtonState();
+ }
+ });
+
+ // 娣诲姞鏂囨湰鍙樺寲鐩戝惉锛屽疄鏃舵洿鏂版寜閽姸鎬�
+ areaNameField.addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyReleased(KeyEvent e) {
+ updateStep1ButtonState();
}
});
@@ -654,6 +665,7 @@
startEndDrawingBtn.setAlignmentX(Component.LEFT_ALIGNMENT);
startEndDrawingBtn.setMaximumSize(new Dimension(400, 55));
startEndDrawingBtn.setEnabled(false); // 鍒濆涓嶅彲鐢�
+ startEndDrawingBtn.setBackground(MEDIUM_GRAY); // 鍒濆鐏拌壊鑳屾櫙
startEndDrawingBtn.addActionListener(e -> toggleDrawing());
@@ -773,7 +785,7 @@
return;
}
if (selectDrawingOption(optionPanel, type, true)) {
- startEndDrawingBtn.setEnabled(true); // 閫夋嫨鍚庡惎鐢ㄦ寜閽�
+ updateStartDrawingButtonState(); // 閫夋嫨鍚庢洿鏂版寜閽姸鎬�
}
}
@@ -866,6 +878,8 @@
JOptionPane.showMessageDialog(this, "杈圭晫缁樺埗宸插畬鎴�", "鎻愮ず", JOptionPane.INFORMATION_MESSAGE);
showBoundaryPointSummary();
updateBoundaryXYDisplay();
+ // 鏇存柊棰勮鍜屼笅涓�姝ユ寜閽姸鎬侊紙鑳屾櫙棰滆壊鍙樼豢鑹诧紝鍙偣鍑伙級
+ updateStep2ButtonsAfterDrawing();
}
}
@@ -1515,6 +1529,11 @@
JOptionPane.showMessageDialog(this, "鏃犳硶鍚姩棰勮锛岃绋嶅悗鍐嶈瘯", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
return;
}
+
+ // 鍦ㄦ楠�3棰勮鏃讹紝涓嶆樉绀鸿竟鐣岀偣鍦嗗湀
+ if (shouye.getMapRenderer() != null) {
+ shouye.getMapRenderer().setBoundaryPointsVisible(false);
+ }
closePreviewAndDispose();
}
@@ -1575,14 +1594,23 @@
@Override
public void mouseEntered(MouseEvent e) {
if (button.isEnabled()) {
- button.setBackground(PRIMARY_DARK);
+ // 濡傛灉鎸夐挳鍙敤锛岄紶鏍囨偓鍋滄椂鏄剧ず娣辩豢鑹�
+ if (button.getBackground().equals(PRIMARY_COLOR)) {
+ button.setBackground(PRIMARY_DARK);
+ }
}
}
@Override
public void mouseExited(MouseEvent e) {
if (button.isEnabled()) {
- button.setBackground(PRIMARY_COLOR);
+ // 濡傛灉鎸夐挳鍙敤锛岄紶鏍囩寮�鏃舵仮澶嶇豢鑹�
+ if (!button.getBackground().equals(MEDIUM_GRAY)) {
+ button.setBackground(PRIMARY_COLOR);
+ }
+ } else {
+ // 濡傛灉鎸夐挳涓嶅彲鐢紝淇濇寔鐏拌壊
+ button.setBackground(MEDIUM_GRAY);
}
}
});
@@ -1643,7 +1671,15 @@
));
prevButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
+ boundaryPreviewButton = createPrimaryButton("棰勮", 16);
+ boundaryPreviewButton.setVisible(false);
+ boundaryPreviewButton.setEnabled(false);
+ boundaryPreviewButton.addActionListener(e -> previewBoundary());
+
nextButton = createPrimaryButton("涓嬩竴姝�", 16);
+ nextButton.setBackground(MEDIUM_GRAY); // 鍒濆鐏拌壊鑳屾櫙
+ nextButton.setEnabled(false); // 鍒濆涓嶅彲鐢�
+
createButton = createPrimaryButton("淇濆瓨", 16);
createButton.setVisible(false);
createButton.setEnabled(false);
@@ -1657,6 +1693,8 @@
buttonPanel.add(prevButton);
buttonPanel.add(Box.createHorizontalGlue());
+ buttonPanel.add(boundaryPreviewButton);
+ buttonPanel.add(Box.createHorizontalStrut(15));
buttonPanel.add(nextButton);
buttonPanel.add(previewButtonSpacer);
buttonPanel.add(previewButton);
@@ -1704,6 +1742,11 @@
dikuai.setLandArea(snapshot.areaSqMeters);
dikuai.setBaseStationCoordinates(snapshot.baseStationCoordinates);
dikuai.setUpdateTime(getCurrentTime());
+ // 璁$畻骞惰缃師濮嬭竟鐣孹Y鍧愭爣
+ String originalBoundaryXY = convertOriginalBoundaryToXY(snapshot.originalBoundary, snapshot.baseStationCoordinates);
+ if (originalBoundaryXY != null && !originalBoundaryXY.isEmpty()) {
+ dikuai.setBoundaryOriginalXY(originalBoundaryXY);
+ }
Dikuai.putDikuai(landNumber, dikuai);
}
@@ -1810,6 +1853,144 @@
}
return dikuai;
}
+
+ /**
+ * 灏嗗師濮嬭竟鐣屽潗鏍囷紙缁忕含搴︽牸寮忥級杞崲涓篨Y鍧愭爣
+ * @param originalBoundary 鍘熷杈圭晫鍧愭爣瀛楃涓诧紝鏍煎紡锛�"lat1,lon1,alt1;lat2,lon2,alt2;..."
+ * @param baseStationCoordinates 鍩哄噯绔欏潗鏍囷紝鏍煎紡锛�"lat,N/S,lon,E/W"
+ * @return XY鍧愭爣瀛楃涓诧紝鏍煎紡锛�"X0,Y0;X1,Y1;X2,Y2;..." 濡傛灉杞崲澶辫触杩斿洖null
+ */
+ private static String convertOriginalBoundaryToXY(String originalBoundary, String baseStationCoordinates) {
+ if (originalBoundary == null || originalBoundary.trim().isEmpty() || "-1".equals(originalBoundary.trim())) {
+ return null;
+ }
+ if (baseStationCoordinates == null || baseStationCoordinates.trim().isEmpty()) {
+ return null;
+ }
+
+ try {
+ // 瑙f瀽鍩哄噯绔欏潗鏍�
+ String[] baseParts = baseStationCoordinates.trim().split(",");
+ if (baseParts.length != 4) {
+ return null;
+ }
+ double baseLat = convertToDecimalDegree(baseParts[0], baseParts[1]);
+ double baseLon = convertToDecimalDegree(baseParts[2], baseParts[3]);
+
+ // 瑙f瀽鍘熷杈圭晫鍧愭爣
+ String[] points = originalBoundary.split(";");
+ StringBuilder xyStr = new StringBuilder();
+
+ for (int i = 0; i < points.length; i++) {
+ String point = points[i].trim();
+ if (point.isEmpty()) {
+ continue;
+ }
+
+ String[] coords = point.split(",");
+ if (coords.length >= 2) {
+ try {
+ double lat = Double.parseDouble(coords[0].trim());
+ double lon = Double.parseDouble(coords[1].trim());
+
+ // 杞崲涓篨Y鍧愭爣
+ double[] xy = publicway.Gpstoxuzuobiao.convertLatLonToLocal(lat, lon, baseLat, baseLon);
+ if (xy != null && xy.length >= 2) {
+ if (xyStr.length() > 0) {
+ xyStr.append(";");
+ }
+ xyStr.append(String.format(Locale.US, "%.3f,%.3f", xy[0], xy[1]));
+ }
+ } catch (NumberFormatException e) {
+ // 璺宠繃鏃犳晥鐨勫潗鏍囩偣
+ continue;
+ }
+ }
+ }
+
+ return xyStr.length() > 0 ? xyStr.toString() : null;
+ } catch (Exception e) {
+ System.err.println("杞崲鍘熷杈圭晫鍧愭爣鍒癤Y澶辫触: " + e.getMessage());
+ return null;
+ }
+ }
+
+ /**
+ * 棰勮杈圭晫
+ */
+ private void previewBoundary() {
+ if (!dikuaiData.containsKey("boundaryDrawn")) {
+ JOptionPane.showMessageDialog(this, "璇峰厛瀹屾垚杈圭晫缁樺埗鍚庡啀棰勮", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+ return;
+ }
+
+ // 鑾峰彇鎴栧垱寤哄湴鍧楀璞�
+ String landNumber = getPendingLandNumber();
+ Dikuai dikuai = getOrCreatePendingDikuai();
+ if (dikuai == null) {
+ JOptionPane.showMessageDialog(this, "鏃犳硶鑾峰彇鍦板潡淇℃伅", "閿欒", JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+
+ // 纭繚鍦板潡鏁版嵁鏄渶鏂扮殑
+ String optimizedBoundaryXY = dikuaiData.get("optimizedBoundaryXY");
+ if (optimizedBoundaryXY == null || optimizedBoundaryXY.isEmpty() || optimizedBoundaryXY.startsWith("ERROR")) {
+ // 濡傛灉娌℃湁浼樺寲鍚庣殑杈圭晫锛屽皾璇曚粠boundaryCoordinates鑾峰彇
+ String boundaryCoords = dikuaiData.get("boundaryCoordinates");
+ if (boundaryCoords != null && !boundaryCoords.isEmpty() && !"-1".equals(boundaryCoords)) {
+ optimizedBoundaryXY = boundaryCoords;
+ } else {
+ // 灏濊瘯浠庡湴鍧楀璞¤幏鍙�
+ optimizedBoundaryXY = dikuai.getBoundaryCoordinates();
+ }
+ }
+
+ if (optimizedBoundaryXY == null || optimizedBoundaryXY.isEmpty() || "-1".equals(optimizedBoundaryXY)) {
+ JOptionPane.showMessageDialog(this, "鏈壘鍒版湁鏁堢殑杈圭晫鍧愭爣锛屾棤娉曢瑙�", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+ return;
+ }
+
+ // 纭繚鍘熷杈圭晫XY鍧愭爣宸茶绠�
+ String originalBoundaryXY = dikuai.getBoundaryOriginalXY();
+ if (originalBoundaryXY == null || originalBoundaryXY.isEmpty() || "-1".equals(originalBoundaryXY)) {
+ // 璁$畻鍘熷杈圭晫XY鍧愭爣
+ String originalBoundary = dikuaiData.get("boundaryOriginalCoordinates");
+ String baseStationCoordinates = dikuaiData.get("baseStationCoordinates");
+ if (originalBoundary != null && baseStationCoordinates != null) {
+ originalBoundaryXY = convertOriginalBoundaryToXY(originalBoundary, baseStationCoordinates);
+ if (originalBoundaryXY != null && !originalBoundaryXY.isEmpty()) {
+ dikuai.setBoundaryOriginalXY(originalBoundaryXY);
+ Dikuai.putDikuai(landNumber, dikuai);
+ }
+ }
+ }
+
+ // 淇濆瓨浼氳瘽蹇収
+ captureSessionSnapshot();
+
+ // 鍒涘缓final鍙橀噺渚沴ambda浣跨敤
+ final String finalOptimizedBoundaryXY = optimizedBoundaryXY;
+ final Dikuai finalDikuai = dikuai;
+
+ // 鍏抽棴瀵硅瘽妗�
+ setVisible(false);
+ dispose();
+
+ // 璋冪敤棣栭〉鏄剧ず棰勮锛堜笌杈圭晫绠$悊椤甸潰閫昏緫涓�鑷达級
+ SwingUtilities.invokeLater(() -> {
+ Shouye.showBoundaryPreview(finalDikuai, finalOptimizedBoundaryXY, () -> {
+ // 杩斿洖鍥炶皟锛氶噸鏂版墦寮�鏂板鍦板潡瀵硅瘽妗嗭紝骞舵樉绀烘楠�2
+ Component parent = Shouye.getInstance();
+ if (parent != null) {
+ // 纭繚浼氳瘽鐘舵�佹纭紝浠ヤ究杩斿洖鏃舵樉绀烘楠�2
+ if (activeSession != null && activeSession.drawingCompleted) {
+ resumeRequested = true;
+ }
+ showAddDikuaiDialog(parent);
+ }
+ });
+ });
+ }
private void hideBoundaryPointSummary() {
if (boundaryCountLabel != null) {
@@ -2010,6 +2191,8 @@
if (step == 1) {
updateObstacleSummary();
+ // 姝ラ1鏄剧ず鏃讹紝绔嬪嵆鏇存柊鎸夐挳鐘舵��
+ SwingUtilities.invokeLater(() -> updateStep1ButtonState());
}
// 鏇存柊鎸夐挳鐘舵��
@@ -2030,6 +2213,39 @@
if (previewButtonSpacer != null) {
previewButtonSpacer.setVisible(false);
}
+ // 姝ラ1锛氭牴鎹獙璇佺粨鏋滄洿鏂颁笅涓�姝ユ寜閽姸鎬�
+ if (step == 1) {
+ updateStep1ButtonState();
+ }
+ // 姝ラ2鏄剧ず杈圭晫棰勮鎸夐挳
+ if (step == 2) {
+ if (boundaryPreviewButton != null) {
+ boundaryPreviewButton.setVisible(true);
+ // 鏍规嵁鏄惁瀹屾垚杈圭晫缁樺埗鏉ヨ缃寜閽姸鎬佸拰鑳屾櫙棰滆壊
+ boolean boundaryDrawn = dikuaiData.containsKey("boundaryDrawn");
+ boundaryPreviewButton.setEnabled(boundaryDrawn);
+ if (boundaryDrawn) {
+ boundaryPreviewButton.setBackground(PRIMARY_COLOR); // 缁胯壊鑳屾櫙
+ } else {
+ boundaryPreviewButton.setBackground(MEDIUM_GRAY); // 鐏拌壊鑳屾櫙
+ }
+ }
+ // 鏇存柊涓嬩竴姝ユ寜閽姸鎬侊紙鏍规嵁鏄惁瀹屾垚杈圭晫缁樺埗锛�
+ boolean boundaryDrawn = dikuaiData.containsKey("boundaryDrawn");
+ nextButton.setEnabled(boundaryDrawn);
+ if (boundaryDrawn) {
+ nextButton.setBackground(PRIMARY_COLOR); // 缁胯壊鑳屾櫙
+ } else {
+ nextButton.setBackground(MEDIUM_GRAY); // 鐏拌壊鑳屾櫙
+ }
+ // 鏇存柊寮�濮嬬粯鍒舵寜閽姸鎬�
+ updateStartDrawingButtonState();
+ } else {
+ if (boundaryPreviewButton != null) {
+ boundaryPreviewButton.setVisible(false);
+ boundaryPreviewButton.setEnabled(false);
+ }
+ }
} else {
nextButton.setVisible(false);
createButton.setVisible(true);
@@ -2039,6 +2255,10 @@
if (previewButtonSpacer != null) {
previewButtonSpacer.setVisible(true);
}
+ if (boundaryPreviewButton != null) {
+ boundaryPreviewButton.setVisible(false);
+ boundaryPreviewButton.setEnabled(false);
+ }
setPathAvailability(hasGeneratedPath());
}
@@ -2049,6 +2269,85 @@
}
}
+ /**
+ * 鏇存柊姝ラ1鐨勪笅涓�姝ユ寜閽姸鎬�
+ * 鏍规嵁鍦板潡鍚嶇О鏄惁濉啓鏉ヨ缃寜閽殑鍚敤鐘舵�佸拰鑳屾櫙棰滆壊
+ */
+ private void updateStep1ButtonState() {
+ if (nextButton == null || currentStep != 1) {
+ return;
+ }
+
+ String name = areaNameField.getText().trim();
+ boolean canProceed = !name.isEmpty();
+
+ nextButton.setEnabled(canProceed);
+ if (canProceed) {
+ // 鍙偣鍑绘椂锛氱豢鑹茶儗鏅�
+ nextButton.setBackground(PRIMARY_COLOR);
+ } else {
+ // 涓嶅彲鐐瑰嚮鏃讹細鐏拌壊鑳屾櫙
+ nextButton.setBackground(MEDIUM_GRAY);
+ }
+ }
+
+ /**
+ * 鏇存柊姝ラ2鐨勫紑濮嬬粯鍒舵寜閽姸鎬�
+ * 鏍规嵁鏄惁閫夋嫨浜嗙粯鍒舵柟寮忔潵璁剧疆鎸夐挳鐨勫惎鐢ㄧ姸鎬佸拰鑳屾櫙棰滆壊
+ */
+ private void updateStartDrawingButtonState() {
+ if (startEndDrawingBtn == null || currentStep != 2) {
+ return;
+ }
+
+ boolean hasSelectedMethod = dikuaiData.containsKey("drawingMethod");
+ boolean isDrawingActive = isDrawing;
+
+ // 濡傛灉姝e湪缁樺埗锛屾寜閽姸鎬佺敱toggleDrawing鏂规硶鎺у埗
+ if (isDrawingActive) {
+ return;
+ }
+
+ // 濡傛灉宸茬粡瀹屾垚缁樺埗锛屾寜閽樉绀�"宸插畬鎴�"涓斾笉鍙敤
+ boolean boundaryDrawn = dikuaiData.containsKey("boundaryDrawn");
+ if (boundaryDrawn) {
+ startEndDrawingBtn.setEnabled(false);
+ startEndDrawingBtn.setBackground(MEDIUM_GRAY);
+ return;
+ }
+
+ startEndDrawingBtn.setEnabled(hasSelectedMethod);
+ if (hasSelectedMethod) {
+ // 宸查�夋嫨缁樺埗鏂瑰紡锛氱豢鑹茶儗鏅紝鍙偣鍑�
+ startEndDrawingBtn.setBackground(PRIMARY_COLOR);
+ } else {
+ // 鏈�夋嫨缁樺埗鏂瑰紡锛氱伆鑹茶儗鏅紝涓嶅彲鐐瑰嚮
+ startEndDrawingBtn.setBackground(MEDIUM_GRAY);
+ }
+ }
+
+ /**
+ * 鏇存柊姝ラ2鐨勯瑙堝拰涓嬩竴姝ユ寜閽姸鎬侊紙鍦ㄥ畬鎴愯竟鐣岀粯鍒跺悗璋冪敤锛�
+ * 灏嗘寜閽儗鏅鑹茶缃负缁胯壊锛岃〃绀哄彲浠ョ偣鍑绘搷浣�
+ */
+ private void updateStep2ButtonsAfterDrawing() {
+ if (currentStep != 2) {
+ return;
+ }
+
+ // 鏇存柊棰勮鎸夐挳
+ if (boundaryPreviewButton != null) {
+ boundaryPreviewButton.setEnabled(true);
+ boundaryPreviewButton.setBackground(PRIMARY_COLOR); // 缁胯壊鑳屾櫙
+ }
+
+ // 鏇存柊涓嬩竴姝ユ寜閽�
+ if (nextButton != null) {
+ nextButton.setEnabled(true);
+ nextButton.setBackground(PRIMARY_COLOR); // 缁胯壊鑳屾櫙
+ }
+ }
+
private boolean validateCurrentStep() {
switch (currentStep) {
case 1:
@@ -2340,6 +2639,8 @@
showStep(2);
showBoundaryPointSummary();
updateBoundaryXYDisplay();
+ // 鏇存柊棰勮鍜屼笅涓�姝ユ寜閽姸鎬侊紙鑳屾櫙棰滆壊鍙樼豢鑹诧紝鍙偣鍑伙級
+ updateStep2ButtonsAfterDrawing();
} else {
if (startEndDrawingBtn != null) {
startEndDrawingBtn.setText("寮�濮嬬粯鍒�");
@@ -2511,10 +2812,70 @@
if (dikuaiData.containsKey("mowingPattern")) {
dikuai.setMowingPattern(dikuaiData.get("mowingPattern"));
}
- if (dikuaiData.containsKey("mowingWidth")) {
+
+ // 淇濆瓨鍓茶崏瀹藉害锛堜粠鏂囨湰妗嗚幏鍙栵紝鍗曚綅锛氱背锛岃浆鎹负鍘樼背淇濆瓨锛�
+ if (mowingWidthField != null) {
+ String mowingWidthStr = mowingWidthField.getText().trim();
+ if (mowingWidthStr != null && !mowingWidthStr.isEmpty()) {
+ try {
+ double mowingWidthMeters = Double.parseDouble(mowingWidthStr);
+ // 杞崲涓哄帢绫充繚瀛�
+ double mowingWidthCm = mowingWidthMeters * 100.0;
+ dikuai.setMowingWidth(String.format(Locale.US, "%.2f", mowingWidthCm));
+ } catch (NumberFormatException e) {
+ // 濡傛灉瑙f瀽澶辫触锛屽皾璇曚娇鐢╠ikuaiData涓殑鍊�
+ if (dikuaiData.containsKey("mowingWidth")) {
+ dikuai.setMowingWidth(dikuaiData.get("mowingWidth"));
+ }
+ }
+ } else if (dikuaiData.containsKey("mowingWidth")) {
+ dikuai.setMowingWidth(dikuaiData.get("mowingWidth"));
+ }
+ } else if (dikuaiData.containsKey("mowingWidth")) {
dikuai.setMowingWidth(dikuaiData.get("mowingWidth"));
}
+
+ // 淇濆瓨鍓茶崏鏈哄壊鍒�瀹藉害锛堜粠鏂囨湰妗嗚幏鍙栵紝鍗曚綅锛氱背锛�
+ if (bladeWidthField != null) {
+ String bladeWidthStr = bladeWidthField.getText().trim();
+ if (bladeWidthStr != null && !bladeWidthStr.isEmpty()) {
+ try {
+ double bladeWidthMeters = Double.parseDouble(bladeWidthStr);
+ // 淇濆瓨涓虹背锛屼繚鐣�2浣嶅皬鏁�
+ dikuai.setMowingBladeWidth(String.format(Locale.US, "%.2f", bladeWidthMeters));
+ } catch (NumberFormatException e) {
+ // 瑙f瀽澶辫触鏃讹紝淇濆瓨鍘熷瀛楃涓�
+ dikuai.setMowingBladeWidth(bladeWidthStr);
+ }
+ }
+ }
+
+ // 淇濆瓨鍓茶崏瀹夊叏璺濈锛堜粠鏂囨湰妗嗚幏鍙栵紝鍗曚綅锛氱背锛�
+ if (safetyDistanceField != null) {
+ String safetyDistanceStr = safetyDistanceField.getText().trim();
+ if (safetyDistanceStr != null && !safetyDistanceStr.isEmpty()) {
+ try {
+ double safetyDistanceMeters = Double.parseDouble(safetyDistanceStr);
+ // 淇濆瓨涓虹背锛屼繚鐣�2浣嶅皬鏁�
+ String formattedValue = String.format(Locale.US, "%.2f", safetyDistanceMeters);
+ dikuai.setMowingSafetyDistance(formattedValue);
+ // 鍚屾椂淇濆瓨鍒癲ikuaiData涓紝浠ヤ究鍚庣画浣跨敤
+ dikuaiData.put("mowingSafetyDistance", formattedValue);
+ } catch (NumberFormatException e) {
+ // 瑙f瀽澶辫触鏃讹紝淇濆瓨鍘熷瀛楃涓�
+ dikuai.setMowingSafetyDistance(safetyDistanceStr);
+ dikuaiData.put("mowingSafetyDistance", safetyDistanceStr);
+ }
+ } else if (dikuaiData.containsKey("mowingSafetyDistance")) {
+ // 濡傛灉鏂囨湰妗嗕负绌猴紝灏濊瘯浠巇ikuaiData鑾峰彇
+ dikuai.setMowingSafetyDistance(dikuaiData.get("mowingSafetyDistance"));
+ }
+ } else if (dikuaiData.containsKey("mowingSafetyDistance")) {
+ // 濡傛灉safetyDistanceField涓簄ull锛屼粠dikuaiData鑾峰彇
+ dikuai.setMowingSafetyDistance(dikuaiData.get("mowingSafetyDistance"));
+ }
+ // 淇濆瓨鍓茶崏璺緞鍧愭爣
String plannedPath = dikuaiData.get("plannedPath");
if (isMeaningfulValue(plannedPath)) {
dikuai.setPlannedPath(plannedPath);
@@ -2569,6 +2930,13 @@
if (resumeRequested && activeSession != null) {
dialog.applySessionData(activeSession);
resumeRequested = false;
+ // 濡傛灉浼氳瘽宸茬敓鎴愯矾寰勶紝浼樺厛鏄剧ず姝ラ3
+ if (activeSession.data != null && isMeaningfulValue(activeSession.data.get("plannedPath"))) {
+ dialog.showStep(3);
+ } else if (activeSession.drawingCompleted) {
+ // 濡傛灉浼氳瘽宸插畬鎴愮粯鍒讹紝鏄剧ず姝ラ2
+ dialog.showStep(2);
+ }
}
dialog.setVisible(true);
--
Gitblit v1.10.0