From f784463ab019c1113cf0b31a249e8802b07a57fa Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期二, 16 十二月 2025 15:26:15 +0800
Subject: [PATCH] 保存地图最后位置

---
 src/set/Sets.java          |   43 +++++++++++++++++++++
 src/zhuye/MapRenderer.java |   45 +++++++++++++++++-----
 set.properties             |    6 ++-
 src/zhuye/Shouye.java      |    9 +++-
 4 files changed, 89 insertions(+), 14 deletions(-)

diff --git a/set.properties b/set.properties
index b32ece6..c47ccb3 100644
--- a/set.properties
+++ b/set.properties
@@ -1,14 +1,16 @@
 #Mower Configuration Properties - Updated
-#Mon Dec 15 19:36:26 CST 2025
+#Tue Dec 16 15:12:34 CST 2025
 appVersion=-1
 currentWorkLandNumber=LAND1
 cuttingWidth=200
 firmwareVersion=-1
 handheldMarkerId=
 idleTrailDurationSeconds=60
-mapScale=41.66666666666667
+mapScale=34.71
 mowerId=1234
 serialAutoConnect=true
 serialBaudRate=115200
 serialPortName=COM15
 simCardNumber=-1
+viewCenterX=-3.49
+viewCenterY=6.93
diff --git a/src/set/Sets.java b/src/set/Sets.java
index 39db2d6..1529e53 100644
--- a/src/set/Sets.java
+++ b/src/set/Sets.java
@@ -5,6 +5,7 @@
 import zhuye.MapRenderer;
 import zhuye.Shouye;
 import zhuye.buttonset;
+import set.Setsys;
 
 import javax.swing.*;
 import javax.swing.filechooser.FileNameExtensionFilter;
@@ -333,6 +334,48 @@
         setData.initializeFromProperties();
         baseStation.load();
         updateDisplay();
+        // 鍔犺浇骞跺簲鐢ㄤ笂娆′繚瀛樼殑瑙嗗浘涓績鍧愭爣
+        loadViewCenterFromProperties();
+    }
+    
+    /**
+     * 浠庨厤缃枃浠跺姞杞借鍥句腑蹇冨潗鏍囧苟搴旂敤鍒癕apRenderer
+     */
+    private void loadViewCenterFromProperties() {
+        Shouye shouye = Shouye.getInstance();
+        if (shouye == null) {
+            return;
+        }
+        MapRenderer renderer = shouye.getMapRenderer();
+        if (renderer == null) {
+            return;
+        }
+        
+        // 浠庨厤缃枃浠惰鍙栬鍥句腑蹇冨潗鏍�
+        String viewCenterXValue = Setsys.getPropertyValue("viewCenterX");
+        String viewCenterYValue = Setsys.getPropertyValue("viewCenterY");
+        
+        double savedTranslateX = 0.0;
+        double savedTranslateY = 0.0;
+        
+        if (viewCenterXValue != null && !viewCenterXValue.trim().isEmpty()) {
+            try {
+                savedTranslateX = Double.parseDouble(viewCenterXValue.trim());
+            } catch (NumberFormatException e) {
+                savedTranslateX = 0.0;
+            }
+        }
+        if (viewCenterYValue != null && !viewCenterYValue.trim().isEmpty()) {
+            try {
+                savedTranslateY = Double.parseDouble(viewCenterYValue.trim());
+            } catch (NumberFormatException e) {
+                savedTranslateY = 0.0;
+            }
+        }
+        
+        // 搴旂敤瑙嗗浘涓績鍧愭爣锛堜繚鎸佸綋鍓嶇缉鏀炬瘮渚嬶級
+        double currentScale = renderer.getScale();
+        renderer.setViewTransform(currentScale, savedTranslateX, savedTranslateY);
     }
     
     private void updateDisplay() {
diff --git a/src/zhuye/MapRenderer.java b/src/zhuye/MapRenderer.java
index 8083749..8406d2b 100644
--- a/src/zhuye/MapRenderer.java
+++ b/src/zhuye/MapRenderer.java
@@ -114,14 +114,15 @@
         this.mowerUpdateTimer = createMowerTimer();
         this.mowerInfoManager = new GecaojiMeg(visualizationPanel, mower);
         setupMouseListeners();
-        // 浠庨厤缃枃浠惰鍙栦笂娆′繚瀛樼殑缂╂斁姣斾緥
-        loadScaleFromProperties();
+        // 浠庨厤缃枃浠惰鍙栦笂娆′繚瀛樼殑缂╂斁姣斾緥鍜岃鍥句腑蹇冨潗鏍�
+        loadViewSettingsFromProperties();
     }
     
     /**
-     * 浠庨厤缃枃浠惰鍙栫缉鏀炬瘮渚�
+     * 浠庨厤缃枃浠惰鍙栫缉鏀炬瘮渚嬪拰瑙嗗浘涓績鍧愭爣
      */
-    private void loadScaleFromProperties() {
+    private void loadViewSettingsFromProperties() {
+        // 鍔犺浇缂╂斁姣斾緥
         String scaleValue = Setsys.getPropertyValue(MAP_SCALE_PROPERTY);
         if (scaleValue != null && !scaleValue.trim().isEmpty()) {
             try {
@@ -140,6 +141,28 @@
             // 濡傛灉娌℃湁淇濆瓨鐨勫�硷紝浣跨敤榛樿鍊�
             scale = DEFAULT_SCALE;
         }
+        
+        // 鍔犺浇瑙嗗浘涓績鍧愭爣
+        String viewCenterXValue = Setsys.getPropertyValue("viewCenterX");
+        String viewCenterYValue = Setsys.getPropertyValue("viewCenterY");
+        if (viewCenterXValue != null && !viewCenterXValue.trim().isEmpty()) {
+            try {
+                translateX = Double.parseDouble(viewCenterXValue.trim());
+            } catch (NumberFormatException e) {
+                translateX = 0.0;
+            }
+        } else {
+            translateX = 0.0;
+        }
+        if (viewCenterYValue != null && !viewCenterYValue.trim().isEmpty()) {
+            try {
+                translateY = Double.parseDouble(viewCenterYValue.trim());
+            } catch (NumberFormatException e) {
+                translateY = 0.0;
+            }
+        } else {
+            translateY = 0.0;
+        }
     }
     
     /**
@@ -147,7 +170,8 @@
      */
     private void saveScaleToProperties() {
         Setsys setsys = new Setsys();
-        setsys.updateProperty(MAP_SCALE_PROPERTY, String.valueOf(scale));
+        // 淇濈暀2浣嶅皬鏁�
+        setsys.updateProperty(MAP_SCALE_PROPERTY, String.format("%.2f", scale));
     }
     
     /**
@@ -1328,7 +1352,7 @@
     
     /**
      * 鍒ゆ柇瀹氫綅鐘舵�佹槸鍚︽湁鏁堬紝鍙敤浜庢樉绀烘嫋灏�
-     * 鎺ュ彈鐘舵��1锛堝崟鐐瑰畾浣嶏級鍜�4锛堝浐瀹氳В锛�
+     * 鎺ュ彈鐘舵��1锛堝崟鐐瑰畾浣嶏級銆�2锛堢爜宸垎锛夈��3锛堟棤鏁圥PS锛夈��4锛堝浐瀹氳В锛夈��5锛堟诞鐐硅В锛�
      */
     private boolean isValidFixForTrail(String fixQuality) {
         if (fixQuality == null) {
@@ -1338,14 +1362,15 @@
         if (trimmed.isEmpty()) {
             return false;
         }
-        // 鎺ュ彈鐘舵��1锛堝崟鐐瑰畾浣嶏級鍜�4锛堝浐瀹氳В锛�
-        if ("1".equals(trimmed) || "4".equals(trimmed)) {
+        // 鎺ュ彈鐘舵��1,2,3,4,5锛堝彧瑕佷笉鏄�0鎴栨棤鏁堢姸鎬侊級
+        if ("1".equals(trimmed) || "2".equals(trimmed) || "3".equals(trimmed) || 
+            "4".equals(trimmed) || "5".equals(trimmed)) {
             return true;
         }
         try {
             double value = Double.parseDouble(trimmed);
-            // 鎺ュ彈1.0鎴�4.0
-            return Math.abs(value - 1.0d) < 1e-6 || Math.abs(value - 4.0d) < 1e-6;
+            // 鎺ュ彈1.0, 2.0, 3.0, 4.0, 5.0锛堝彧瑕佷笉鏄�0锛�
+            return value >= 1.0 && value <= 5.0;
         } catch (NumberFormatException ex) {
             return false;
         }
diff --git a/src/zhuye/Shouye.java b/src/zhuye/Shouye.java
index 7d78ab2..c462a83 100644
--- a/src/zhuye/Shouye.java
+++ b/src/zhuye/Shouye.java
@@ -245,13 +245,18 @@
 	}
 	
 	/**
-	 * 淇濆瓨褰撳墠鍦板浘缂╂斁姣斾緥鍒伴厤缃枃浠�
+	 * 淇濆瓨褰撳墠鍦板浘缂╂斁姣斾緥鍜岃鍥句腑蹇冨潗鏍囧埌閰嶇疆鏂囦欢
 	 */
 	public void saveCurrentScale() {
 		if (mapRenderer != null) {
 			double currentScale = mapRenderer.getScale();
+			double translateX = mapRenderer.getTranslateX();
+			double translateY = mapRenderer.getTranslateY();
 			Setsys setsys = new Setsys();
-			setsys.updateProperty("mapScale", String.valueOf(currentScale));
+			// 淇濈暀2浣嶅皬鏁�
+			setsys.updateProperty("mapScale", String.format("%.2f", currentScale));
+			setsys.updateProperty("viewCenterX", String.format("%.2f", translateX));
+			setsys.updateProperty("viewCenterY", String.format("%.2f", translateY));
 		}
 	}
 

--
Gitblit v1.10.0