From 8ce07ce9a4034fdc959d280dd38ecb3e05cbe6e1 Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期三, 17 十二月 2025 16:40:11 +0800
Subject: [PATCH] 重新设计了障碍物的绘制逻辑

---
 src/dikuai/ObstacleManagementPage.java |  156 ++++++++++++++-
 dikuai.properties                      |    4 
 src/dikuai/addzhangaiwu.java           |  379 +++++++++++++++++++++++++++++++++++++
 src/zhangaiwu/AddDikuai.java           |    8 
 set.properties                         |   10 
 Obstacledge.properties                 |    8 
 6 files changed, 528 insertions(+), 37 deletions(-)

diff --git a/Obstacledge.properties b/Obstacledge.properties
index 91afaf5..ba3a24f 100644
--- a/Obstacledge.properties
+++ b/Obstacledge.properties
@@ -1,5 +1,5 @@
 # 鍓茶崏鏈哄湴鍧楅殰纰嶇墿閰嶇疆鏂囦欢
-# 鐢熸垚鏃堕棿锛�2025-12-17T13:28:00.386604500
+# 鐢熸垚鏃堕棿锛�2025-12-17T16:39:03.715543100
 # 鍧愭爣绯伙細WGS84锛堝害鍒嗘牸寮忥級
 
 # ============ 鍦板潡鍩哄噯绔欓厤缃� ============
@@ -13,7 +13,7 @@
 # 鏍煎紡锛歱lot.[鍦板潡缂栧彿].obstacle.[闅滅鐗╁悕绉癩.xyCoords=[鍧愭爣涓瞉
 
 # --- 鍦板潡LAND1鐨勯殰纰嶇墿 ---
-plot.LAND1.obstacle.闅滅鐗�1.shape=1
-plot.LAND1.obstacle.闅滅鐗�1.originalCoords=0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E;0.000000,N;0.000000,E
-plot.LAND1.obstacle.闅滅鐗�1.xyCoords=81.22,-22.17;81.21,-22.17;81.19,-22.18;81.20,-22.19;81.18,-22.21;81.07,-22.54;80.94,-23.05;80.44,-23.54;79.84,-23.83;79.27,-24.19;78.63,-24.52;78.11,-24.79;77.69,-25.22;77.43,-25.75;77.15,-26.45;77.08,-27.23;77.10,-27.92;77.08,-28.67;77.08,-29.32;77.15,-29.97;77.27,-30.57;77.53,-31.19;77.92,-31.45;78.22,-31.73;78.92,-31.87;79.65,-31.77;80.35,-31.60;80.90,-31.17;81.27,-30.63;81.70,-30.11;81.90,-29.48;81.95,-28.92;81.90,-28.38;81.73,-27.83;81.73,-27.30;81.52,-26.81;81.42,-26.24;81.26,-25.76;81.27,-25.25;81.04,-25.07;81.11,-24.98;81.11,-25.00;81.12,-25.00
+plot.LAND1.obstacle.姘寸數璐笹V.shape=1
+plot.LAND1.obstacle.姘寸數璐笹V.originalCoords=3949.899067,N;11616.760758,E;3949.899164,N;11616.760704,E;3949.899295,N;11616.760673,E;3949.899424,N;11616.760648,E;3949.899535,N;11616.760607,E;3949.899673,N;11616.760584,E;3949.899800,N;11616.760543,E;3949.899910,N;11616.760515,E;3949.900044,N;11616.760481,E;3949.900174,N;11616.760435,E;3949.900305,N;11616.760412,E;3949.900433,N;11616.760361,E;3949.900555,N;11616.760306,E;3949.900651,N;11616.760245,E;3949.900732,N;11616.760161,E;3949.900806,N;11616.760057,E;3949.900889,N;11616.759945,E;3949.900967,N;11616.759856,E;3949.901066,N;11616.759724,E;3949.901142,N;11616.759616,E;3949.901243,N;11616.759498,E;3949.901321,N;11616.759402,E;3949.901443,N;11616.759329,E;3949.901554,N;11616.759243,E;3949.901652,N;11616.759203,E;3949.901783,N;11616.759170,E;3949.901921,N;11616.759142,E;3949.902031,N;11616.759109,E;3949.902162,N;11616.759081,E;3949.902289,N;11616.759050,E;3949.902394,N;11616.759018,E;3949.902532,N;11616.758989,E;3949.902654,N;11616.758975,E;3949.902768,N;11616.758947,E;3949.902759,N;11616.758921,E;3949.902765,N;11616.758830,E;3949.902775,N;11616.758725,E;3949.902781,N;11616.758571,E;3949.902764,N;11616.758404,E;3949.902711,N;11616.758280,E;3949.902679,N;11616.758163,E;3949.902639,N;11616.758002,E;3949.902610,N;11616.757869,E;3949.902580,N;11616.757678,E;3949.902542,N;11616.757505,E;3949.902533,N;11616.757411,E;3949.902502,N;11616.757243,E;3949.902473,N;11616.757063,E;3949.902460,N;11616.756947,E;3949.902438,N;11616.756821,E;3949.902430,N;11616.756804,E;3949.902408,N;11616.756828,E;3949.902392,N;11616.756884,E;3949.902388,N;11616.756920,E;3949.902389,N;11616.756920,E;3949.902387,N;11616.756920,E;3949.902388,N;11616.756919,E;3949.902388,N;11616.756922,E;3949.902388,N;11616.756922,E;3949.902388,N;11616.756922,E;3949.902389,N;11616.756923,E;3949.902389,N;11616.756920,E;3949.901649,N;11616.757013,E;3949.901650,N;11616.757016,E;3949.901650,N;11616.757014,E;3949.901650,N;11616.757013,E;3949.901650,N;11616.757014,E;3949.901650,N;11616.757013,E;3949.901651,N;11616.757015,E;3949.901649,N;11616.757012,E;3949.901650,N;11616.757012,E;3949.901650,N;11616.757012,E;3949.901651,N;11616.757011,E;3949.901652,N;11616.757010,E
+plot.LAND1.obstacle.姘寸數璐笹V.xyCoords=5.46,-6.16;2.88,0.70;-0.16,0.08;0.13,-1.37;1.46,-2.56;2.79,-3.76;4.13,-4.96;5.46,-6.16
 
diff --git a/dikuai.properties b/dikuai.properties
index 69f66e5..83b0ec9 100644
--- a/dikuai.properties
+++ b/dikuai.properties
@@ -1,5 +1,5 @@
 #Dikuai Properties
-#Wed Dec 17 13:50:43 CST 2025
+#Wed Dec 17 16:39:03 CST 2025
 LAND1.angleThreshold=-1
 LAND1.baseStationCoordinates=3949.90238860,N,11616.75692000,E
 LAND1.boundaryCoordinates=77.19,-32.68;80.71,-54.97;80.99,-55.90;83.54,-56.46;85.04,-55.55;85.94,-53.74;83.24,-35.82;84.55,-34.54;94.02,-31.92;94.10,-31.11;90.88,-20.39;90.35,-19.53;88.33,-19.00;84.12,-19.47;78.92,-22.36;76.63,-25.55;76.93,-29.84;77.06,-31.26;77.19,-32.68
@@ -15,5 +15,5 @@
 LAND1.mowingWidth=40
 LAND1.plannedPath=77.45,-31.44;81.28,-55.71;81.70,-55.80;77.91,-31.78;78.05,-31.91;78.17,-31.98;78.35,-32.01;82.12,-55.89;82.54,-55.98;78.77,-32.09;78.95,-32.12;79.17,-32.09;82.96,-56.08;83.38,-56.17;79.57,-32.03;79.96,-31.95;83.76,-56.03;84.13,-55.81;80.35,-31.86;80.50,-31.80;80.72,-31.63;84.50,-55.58;84.87,-55.33;81.08,-31.34;81.41,-30.87;85.18,-54.72;85.48,-54.10;81.75,-30.45;81.89,-30.27;81.94,-30.19;82.05,-29.82;83.00,-35.83;83.34,-35.38;81.43,-23.31;81.47,-22.18;81.43,-22.04;81.32,-21.94;81.21,-21.92;81.13,-21.42;81.50,-21.21;83.69,-35.03;84.04,-34.69;81.88,-21.00;82.25,-20.80;84.39,-34.35;84.77,-34.22;82.62,-20.59;82.99,-20.38;85.16,-34.11;85.55,-34.00;83.37,-20.18;83.74,-19.97;85.94,-33.90;86.32,-33.79;84.11,-19.76;84.50,-19.68;86.71,-33.68;87.10,-33.57;84.90,-19.63;85.30,-19.59;87.49,-33.47;87.88,-33.36;85.70,-19.55;86.09,-19.50;88.26,-33.25;88.65,-33.15;86.49,-19.46;86.89,-19.41;89.04,-33.04;89.43,-32.93;87.29,-19.37;87.69,-19.32;89.82,-32.82;90.20,-32.72;88.08,-19.28;88.49,-19.30;90.59,-32.61;90.98,-32.50;88.91,-19.41;89.34,-19.52;91.37,-32.39;91.76,-32.29;89.76,-19.63;90.18,-19.74;92.14,-32.18;92.53,-32.07;90.76,-20.88;91.62,-23.72;92.92,-31.96;93.31,-31.86;92.47,-26.56;93.33,-29.40;93.70,-31.75;81.40,-22.00;81.27,-21.93;81.21,-21.92;81.08,-21.96;80.98,-22.05;79.85,-23.55;79.64,-22.24;80.01,-22.04;80.22,-23.37;80.58,-23.05;80.39,-21.83;80.76,-21.62;80.87,-22.34;77.96,-24.59;77.63,-24.92;77.59,-24.64;77.92,-24.18;77.99,-24.57;78.36,-24.38;78.25,-23.72;78.59,-23.25;78.73,-24.19;79.11,-23.99;78.92,-22.79;79.27,-22.45;79.48,-23.76;77.99,-24.57;77.93,-24.62;77.51,-25.05;77.47,-25.11;77.20,-25.66;77.01,-26.12;76.93,-25.57;77.26,-25.10;77.31,-25.43
 LAND1.returnPointCoordinates=-1
-LAND1.updateTime=2025-12-17 13\:50\:43
+LAND1.updateTime=2025-12-17 16\:39\:03
 LAND1.userId=-1
diff --git a/set.properties b/set.properties
index 9dbf3e5..b09d665 100644
--- a/set.properties
+++ b/set.properties
@@ -1,16 +1,16 @@
 #Mower Configuration Properties - Updated
-#Wed Dec 17 15:26:06 CST 2025
+#Wed Dec 17 16:39:38 CST 2025
 appVersion=-1
 currentWorkLandNumber=LAND1
 cuttingWidth=200
 firmwareVersion=-1
 handheldMarkerId=
 idleTrailDurationSeconds=60
-mapScale=28.94
-mowerId=1234
+mapScale=4.96
+mowerId=1872
 serialAutoConnect=true
 serialBaudRate=115200
 serialPortName=COM15
 simCardNumber=-1
-viewCenterX=-81.30
-viewCenterY=30.28
+viewCenterX=-30.79
+viewCenterY=22.28
diff --git a/src/dikuai/ObstacleManagementPage.java b/src/dikuai/ObstacleManagementPage.java
index 6c26817..963b0c7 100644
--- a/src/dikuai/ObstacleManagementPage.java
+++ b/src/dikuai/ObstacleManagementPage.java
@@ -14,6 +14,8 @@
 
 import zhangaiwu.Obstacledge;
 import zhuye.Shouye;
+import zhuye.Coordinate;
+import bianjie.bianjieguihua2;
 
 /**
  * 闅滅鐗╃鐞嗛〉闈� - UI浼樺寲鐗�
@@ -618,23 +620,23 @@
                 return;
             }
             
-            double baseLat = parseDMToDecimal(baseParts[0].trim(), baseParts[1].trim());
-            double baseLon = parseDMToDecimal(baseParts[2].trim(), baseParts[3].trim());
+            Obstacledge.ObstacleShape shape = obstacle.getShape();
+            List<Obstacledge.XYCoordinate> xyCoords;
             
-            List<Obstacledge.XYCoordinate> xyCoords = new ArrayList<>();
-            for (int i = 0; i < originalCoordsList.size(); i += 2) {
-                if (i + 1 >= originalCoordsList.size()) break;
-                double lat = originalCoordsList.get(i).toDecimalDegree();
-                double lon = originalCoordsList.get(i + 1).toDecimalDegree();
-                
-                if (Double.isFinite(lat) && Double.isFinite(lon)) {
-                    double[] localXY = convertLatLonToLocal(lat, lon, baseLat, baseLon);
-                    xyCoords.add(new Obstacledge.XYCoordinate(localXY[0], localXY[1]));
-                }
+            // 鏍规嵁闅滅鐗╁舰鐘惰皟鐢ㄤ笉鍚岀殑绠楁硶
+            if (shape == Obstacledge.ObstacleShape.POLYGON) {
+                // 澶氳竟褰細浣跨敤 bianjieguihua2 绠楁硶
+                xyCoords = generatePolygonCoordinates(originalCoordsList, baseStation);
+            } else if (shape == Obstacledge.ObstacleShape.CIRCLE) {
+                // 鍦嗗舰锛氫娇鐢ㄧ畝鍗曠殑鍧愭爣杞崲锛堜繚鎸佸師鏈夐�昏緫锛�
+                xyCoords = generateCircleCoordinates(originalCoordsList, baseStation);
+            } else {
+                JOptionPane.showMessageDialog(this, "鏈煡鐨勯殰纰嶇墿褰㈢姸", "閿欒", JOptionPane.ERROR_MESSAGE);
+                return;
             }
             
-            if (xyCoords.isEmpty()) {
-                JOptionPane.showMessageDialog(this, "鍧愭爣杞崲澶辫触", "閿欒", JOptionPane.ERROR_MESSAGE);
+            if (xyCoords == null || xyCoords.isEmpty()) {
+                JOptionPane.showMessageDialog(this, "鍧愭爣鐢熸垚澶辫触", "閿欒", JOptionPane.ERROR_MESSAGE);
                 return;
             }
             
@@ -647,6 +649,132 @@
         }
     }
     
+    /**
+     * 浣跨敤 bianjieguihua2 绠楁硶鐢熸垚澶氳竟褰㈠潗鏍�
+     */
+    private List<Obstacledge.XYCoordinate> generatePolygonCoordinates(
+            List<Obstacledge.DMCoordinate> originalCoordsList, String baseStation) {
+        
+        // 淇濆瓨褰撳墠鐨� Coordinate.coordinates
+        List<Coordinate> savedCoordinates = new ArrayList<>(Coordinate.coordinates);
+        
+        try {
+            // 灏嗛殰纰嶇墿鐨勫師濮嬪潗鏍囪浆鎹负 Coordinate 瀵硅薄鍒楄〃
+            List<Coordinate> coordinateList = new ArrayList<>();
+            for (int i = 0; i < originalCoordsList.size(); i += 2) {
+                if (i + 1 >= originalCoordsList.size()) break;
+                
+                Obstacledge.DMCoordinate latCoord = originalCoordsList.get(i);
+                Obstacledge.DMCoordinate lonCoord = originalCoordsList.get(i + 1);
+                
+                // 杞崲涓� Coordinate 瀵硅薄
+                // DMCoordinate 鐨� degreeMinute 鏄害鍒嗘牸寮忥紙濡� 2324.200273 琛ㄧず 23搴�24.200273鍒嗭級
+                // 闇�瑕佹牸寮忓寲涓哄瓧绗︿覆锛屼繚鎸佸害鍒嗘牸寮�
+                double latDM = latCoord.getDegreeMinute();
+                double lonDM = lonCoord.getDegreeMinute();
+                
+                // 鏍煎紡鍖栧害鍒嗘牸寮忥細纭繚鏁存暟閮ㄥ垎鑷冲皯2浣嶏紙搴︼級锛屽皬鏁伴儴鍒嗘槸鍒�
+                String latStr = formatDegreeMinute(latDM);
+                String lonStr = formatDegreeMinute(lonDM);
+                char latDir = latCoord.getDirection();
+                char lonDir = lonCoord.getDirection();
+                
+                Coordinate coord = new Coordinate(
+                    latStr, 
+                    String.valueOf(latDir), 
+                    lonStr, 
+                    String.valueOf(lonDir),
+                    0.0 // 楂樼▼鏁版嵁锛岄殰纰嶇墿鍙兘娌℃湁锛岃涓�0
+                );
+                coordinateList.add(coord);
+            }
+            
+            if (coordinateList.isEmpty()) {
+                return null;
+            }
+            
+            // 璁剧疆鍒板叏灞�鍧愭爣鍒楄〃
+            Coordinate.coordinates.clear();
+            Coordinate.coordinates.addAll(coordinateList);
+            
+            // 璋冪敤 bianjieguihua2 绠楁硶鐢熸垚浼樺寲鍚庣殑澶氳竟褰㈠潗鏍�
+            String optimizedCoordsStr = bianjieguihua2.processCoordinateListAuto(baseStation);
+            
+            if (optimizedCoordsStr == null || optimizedCoordsStr.trim().isEmpty()) {
+                return null;
+            }
+            
+            // 瑙f瀽杩斿洖鐨勫潗鏍囧瓧绗︿覆锛屾牸寮忥細"X0,Y0;X1,Y1;X2,Y2;..."
+            List<Obstacledge.XYCoordinate> xyCoords = new ArrayList<>();
+            String[] pointStrings = optimizedCoordsStr.split(";");
+            for (String pointStr : pointStrings) {
+                pointStr = pointStr.trim();
+                if (pointStr.isEmpty()) continue;
+                
+                String[] parts = pointStr.split(",");
+                if (parts.length >= 2) {
+                    try {
+                        double x = Double.parseDouble(parts[0].trim());
+                        double y = Double.parseDouble(parts[1].trim());
+                        if (Double.isFinite(x) && Double.isFinite(y)) {
+                            xyCoords.add(new Obstacledge.XYCoordinate(x, y));
+                        }
+                    } catch (NumberFormatException e) {
+                        // 璺宠繃鏃犳晥鐨勫潗鏍囩偣
+                        continue;
+                    }
+                }
+            }
+            
+            return xyCoords;
+            
+        } finally {
+            // 鎭㈠鍘熸潵鐨勫潗鏍囧垪琛�
+            Coordinate.coordinates.clear();
+            Coordinate.coordinates.addAll(savedCoordinates);
+        }
+    }
+    
+    /**
+     * 鏍煎紡鍖栧害鍒嗘牸寮忓潗鏍�
+     * @param degreeMinute 搴﹀垎鍊硷紝濡� 2324.200273 琛ㄧず 23搴�24.200273鍒�
+     * @return 鏍煎紡鍖栫殑瀛楃涓�
+     */
+    private String formatDegreeMinute(double degreeMinute) {
+        // 搴﹀垎鏍煎紡锛氭暣鏁伴儴鍒嗘槸搴︼紝灏忔暟閮ㄥ垎鏄垎
+        // 渚嬪 2324.200273 -> "2324.200273"
+        return String.format("%.6f", degreeMinute);
+    }
+    
+    /**
+     * 鐢熸垚鍦嗗舰鍧愭爣锛堜繚鎸佸師鏈夌畝鍗曡浆鎹㈤�昏緫锛�
+     */
+    private List<Obstacledge.XYCoordinate> generateCircleCoordinates(
+            List<Obstacledge.DMCoordinate> originalCoordsList, String baseStation) {
+        
+        String[] baseParts = baseStation.split(",");
+        if (baseParts.length < 4) {
+            return null;
+        }
+        
+        double baseLat = parseDMToDecimal(baseParts[0].trim(), baseParts[1].trim());
+        double baseLon = parseDMToDecimal(baseParts[2].trim(), baseParts[3].trim());
+        
+        List<Obstacledge.XYCoordinate> xyCoords = new ArrayList<>();
+        for (int i = 0; i < originalCoordsList.size(); i += 2) {
+            if (i + 1 >= originalCoordsList.size()) break;
+            double lat = originalCoordsList.get(i).toDecimalDegree();
+            double lon = originalCoordsList.get(i + 1).toDecimalDegree();
+            
+            if (Double.isFinite(lat) && Double.isFinite(lon)) {
+                double[] localXY = convertLatLonToLocal(lat, lon, baseLat, baseLon);
+                xyCoords.add(new Obstacledge.XYCoordinate(localXY[0], localXY[1]));
+            }
+        }
+        
+        return xyCoords;
+    }
+    
     private void saveObstacleUpdate(Obstacledge.Obstacle obstacle, JTextArea coordArea) {
         String landNumber = dikuai.getLandNumber();
         try {
diff --git a/src/dikuai/addzhangaiwu.java b/src/dikuai/addzhangaiwu.java
index 5f31288..098de63 100644
--- a/src/dikuai/addzhangaiwu.java
+++ b/src/dikuai/addzhangaiwu.java
@@ -10,8 +10,11 @@
 import java.awt.Font;
 import java.awt.Image;
 import java.awt.Window;
+import java.awt.Container;
+import java.awt.event.ActionListener;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.io.File;
@@ -52,6 +55,7 @@
 import zhangaiwu.Obstacledge;
 import zhangaiwu.yulanzhangaiwu;
 import zhuye.buttonset;
+import bianjie.bianjieguihua2;
 
 /**
  * 闅滅鐗╂柊澧�/缂栬緫瀵硅瘽妗嗐�傝璁¤瑷�鍙傝�� {@link AddDikuai}锛屾敮鎸侀�氳繃瀹炲湴缁樺埗閲囬泦闅滅鐗╁潗鏍囥��
@@ -88,7 +92,10 @@
     private JPanel selectedMethodPanel;
     private JPanel selectedShapePanel;
     private JButton drawButton;
+    private JButton generateBoundaryButton;  // 鐢熸垚闅滅鐗╄竟鐣屾寜閽�
+    private JButton previewButton;  // 棰勮鎸夐挳
     private JLabel drawingStatusLabel;
+    private JLabel boundaryStatusLabel;  // 鐢熸垚闅滅鐗╄竟鐣岀姸鎬佹爣绛�
     private JTextField obstacleNameField;
     private JPanel existingObstacleListPanel;
     private JPanel step1NextButtonRow;
@@ -490,6 +497,7 @@
             formData.remove("editingObstacleName");
             formData.remove("obstacleCoordinates");
             formData.remove("obstacleOriginalCoordinates");
+            formData.remove("generatedBoundaryCoordinates");  // 娓呴櫎鐢熸垚鐨勮竟鐣屽潗鏍�
             if (obstacleNameField != null) {
                 obstacleNameField.setText("");
             } else {
@@ -497,6 +505,7 @@
             }
             updateDrawingStatus();
             updateSaveButtonState();
+            updatePreviewButtonState();
         }
     }
 
@@ -539,10 +548,24 @@
 
         stepPanel.add(Box.createRigidArea(new Dimension(0, 24)));
 
+        // 鎸夐挳瀹瑰櫒锛氶噸鏂扮粯鍒� + 鐢熸垚闅滅鐗╄竟鐣�
+        JPanel buttonRow = new JPanel();
+        buttonRow.setLayout(new BoxLayout(buttonRow, BoxLayout.X_AXIS));
+        buttonRow.setOpaque(false);
+        buttonRow.setAlignmentX(Component.LEFT_ALIGNMENT);
+        
         drawButton = createPrimaryButton("寮�濮嬬粯鍒�", 16);
-        drawButton.setAlignmentX(Component.LEFT_ALIGNMENT);
         drawButton.addActionListener(e -> startDrawingWorkflow());
-        stepPanel.add(drawButton);
+        buttonRow.add(drawButton);
+        
+        buttonRow.add(Box.createRigidArea(new Dimension(10, 0)));
+        
+        generateBoundaryButton = createPrimaryButton("鐢熸垚闅滅鐗╄竟鐣�", 16);
+        generateBoundaryButton.setVisible(false);  // 鍒濆闅愯棌锛岀粯鍒跺畬鎴愬悗鏄剧ず
+        generateBoundaryButton.addActionListener(e -> generateObstacleBoundary());
+        buttonRow.add(generateBoundaryButton);
+        
+        stepPanel.add(buttonRow);
 
         stepPanel.add(Box.createRigidArea(new Dimension(0, 12)));
 
@@ -551,6 +574,15 @@
         drawingStatusLabel.setForeground(LIGHT_TEXT);
         drawingStatusLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
         stepPanel.add(drawingStatusLabel);
+        
+        // 娣诲姞鐢熸垚闅滅鐗╄竟鐣岀姸鎬佹爣绛�
+        stepPanel.add(Box.createRigidArea(new Dimension(0, 8)));
+        boundaryStatusLabel = new JLabel("");
+        boundaryStatusLabel.setFont(new Font("寰蒋闆呴粦", Font.PLAIN, 13));
+        boundaryStatusLabel.setForeground(LIGHT_TEXT);
+        boundaryStatusLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
+        boundaryStatusLabel.setVisible(false);  // 鍒濆闅愯棌
+        stepPanel.add(boundaryStatusLabel);
 
         stepPanel.add(Box.createVerticalGlue());
         return stepPanel;
@@ -567,12 +599,21 @@
         // 璁剧疆涓嬩竴姝ユ寜閽搴︿负300鍍忕礌
         nextButton.setPreferredSize(new Dimension(300, nextButton.getPreferredSize().height));
         nextButton.setMaximumSize(new Dimension(300, nextButton.getPreferredSize().height));
+        
+        previewButton = createSecondaryButton("棰勮");
+        previewButton.setVisible(false);  // 鍒濆闅愯棌锛岀敓鎴愯竟鐣屽悗鏄剧ず
+        previewButton.setOpaque(true);
+        previewButton.setContentAreaFilled(true);
+        previewButton.addActionListener(e -> previewObstacleBoundary());
+        
         saveButton = createPrimaryButton("淇濆瓨", 16);
         saveButton.setVisible(false);
 
         buttonPanel.add(prevButton);
         buttonPanel.add(Box.createHorizontalGlue());
         buttonPanel.add(Box.createRigidArea(new Dimension(12, 0)));
+        buttonPanel.add(previewButton);
+        buttonPanel.add(Box.createRigidArea(new Dimension(10, 0)));
         buttonPanel.add(saveButton);
 
         attachNextButtonToStep1Row();
@@ -869,6 +910,17 @@
         }
 
         activeDrawingShape = null;
+        
+        // 閲嶆柊缁樺埗鏃舵竻闄や箣鍓嶇敓鎴愮殑杈圭晫鍧愭爣
+        formData.remove("generatedBoundaryCoordinates");
+        if (previewButton != null) {
+            previewButton.setVisible(false);
+        }
+        // 娓呴櫎杈圭晫鐘舵�佹爣绛�
+        if (boundaryStatusLabel != null) {
+            boundaryStatusLabel.setVisible(false);
+            boundaryStatusLabel.setText("");
+        }
 
         String method = formData.get("drawingMethod");
         if (!isMeaningfulValue(method)) {
@@ -1368,8 +1420,15 @@
     private void preloadData() {
         formData.remove("obstacleCoordinates");
         formData.remove("obstacleOriginalCoordinates");
+        formData.remove("generatedBoundaryCoordinates");  // 娓呴櫎鐢熸垚鐨勮竟鐣屽潗鏍�
         formData.remove("editingObstacleName");
         updateDrawingStatus();
+        updatePreviewButtonState();
+        // 娓呴櫎杈圭晫鐘舵�佹爣绛�
+        if (boundaryStatusLabel != null) {
+            boundaryStatusLabel.setVisible(false);
+            boundaryStatusLabel.setText("");
+        }
     }
 
     private void updateDrawingStatus() {
@@ -1384,14 +1443,113 @@
                 drawButton.setText("閲嶆柊缁樺埗");
                 drawButton.setEnabled(true);
             }
+            // 缁樺埗瀹屾垚鍚庢樉绀�"鐢熸垚闅滅鐗╄竟鐣�"鎸夐挳
+            if (generateBoundaryButton != null) {
+                generateBoundaryButton.setVisible(true);
+            }
         } else {
             drawingStatusLabel.setText("灏氭湭閲囬泦闅滅鐗╁潗鏍�");
             if (!drawingInProgress && drawButton != null) {
                 drawButton.setText("寮�濮嬬粯鍒�");
                 drawButton.setEnabled(true);
             }
+            // 鏈粯鍒舵椂闅愯棌"鐢熸垚闅滅鐗╄竟鐣�"鎸夐挳
+            if (generateBoundaryButton != null) {
+                generateBoundaryButton.setVisible(false);
+            }
+            // 鏈敓鎴愯竟鐣屾椂闅愯棌棰勮鎸夐挳
+            if (previewButton != null) {
+                previewButton.setVisible(false);
+            }
+            // 闅愯棌杈圭晫鐘舵�佹爣绛�
+            if (boundaryStatusLabel != null) {
+                boundaryStatusLabel.setVisible(false);
+            }
         }
         updateSaveButtonState();
+        updatePreviewButtonState();
+    }
+    
+    /**
+     * 鏇存柊杈圭晫鐘舵�佹爣绛�
+     */
+    private void updateBoundaryStatusLabel(int pointCount) {
+        if (boundaryStatusLabel == null) {
+            return;
+        }
+        if (pointCount > 0) {
+            boundaryStatusLabel.setText("鐢熸垚闅滅鐗╄竟鐣岀偣鏁帮細" + pointCount);
+            boundaryStatusLabel.setVisible(true);
+        } else {
+            boundaryStatusLabel.setText("");
+            boundaryStatusLabel.setVisible(false);
+        }
+    }
+    
+    /**
+     * 鏇存柊棰勮鎸夐挳鐨勬樉绀虹姸鎬�
+     */
+    private void updatePreviewButtonState() {
+        if (previewButton == null) {
+            return;
+        }
+        // 鍙湁鍦ㄧ敓鎴愯竟鐣屽悗鎵嶆樉绀洪瑙堟寜閽�
+        String generatedBoundary = formData.get("generatedBoundaryCoordinates");
+        boolean hasGeneratedBoundary = isMeaningfulValue(generatedBoundary);
+        
+        if (hasGeneratedBoundary) {
+            // 鐢熸垚杈圭晫鍚庯紝閲嶆柊鍒涘缓缁胯壊鐨勯瑙堟寜閽�
+            // 鑾峰彇鎸夐挳鐨勭埗瀹瑰櫒鍜屼綅缃�
+            Container parent = previewButton.getParent();
+            if (parent != null) {
+                // 淇濆瓨鍘熸湁鐨凙ctionListener
+                ActionListener[] listeners = previewButton.getActionListeners();
+                
+                // 绉婚櫎鏃ф寜閽�
+                parent.remove(previewButton);
+                
+                // 鍒涘缓鏂扮殑缁胯壊棰勮鎸夐挳锛堜娇鐢ㄤ富鎸夐挳鏍峰紡锛�
+                previewButton = createPrimaryButton("棰勮", 16);
+                previewButton.setVisible(true);
+                previewButton.setEnabled(true);
+                
+                // 鎭㈠ActionListener
+                for (ActionListener listener : listeners) {
+                    previewButton.addActionListener(listener);
+                }
+                
+                // 娣诲姞鍒扮埗瀹瑰櫒锛堝湪淇濆瓨鎸夐挳涔嬪墠锛�
+                int previewIndex = -1;
+                Component[] components = parent.getComponents();
+                for (int i = 0; i < components.length; i++) {
+                    if (components[i] instanceof JButton) {
+                        JButton btn = (JButton) components[i];
+                        if ("淇濆瓨".equals(btn.getText())) {
+                            previewIndex = i;
+                            break;
+                        }
+                    }
+                }
+                
+                if (previewIndex >= 0) {
+                    parent.add(previewButton, previewIndex);
+                    parent.add(Box.createRigidArea(new Dimension(10, 0)), previewIndex + 1);
+                } else {
+                    // 濡傛灉鎵句笉鍒颁繚瀛樻寜閽紝娣诲姞鍒版湯灏�
+                    parent.add(Box.createRigidArea(new Dimension(12, 0)));
+                    parent.add(previewButton);
+                    parent.add(Box.createRigidArea(new Dimension(10, 0)));
+                }
+                
+                // 鍒锋柊甯冨眬
+                parent.revalidate();
+                parent.repaint();
+            }
+        } else {
+            // 鏈敓鎴愯竟鐣屾椂锛岄殣钘忔寜閽�
+            previewButton.setVisible(false);
+            previewButton.setEnabled(false);
+        }
     }
 
     private int countCoordinatePairs(String coords) {
@@ -1419,16 +1577,32 @@
         if (saveButton != null) {
             boolean hasCoords = isMeaningfulValue(formData.get("obstacleCoordinates"));
             boolean hasName = isMeaningfulValue(formData.get("obstacleName"));
-            boolean enabled = hasCoords && hasName;
+            
+            // 妫�鏌ユ槸鍚︾敓鎴愪簡闅滅鐗╄竟鐣屽潗鏍�
+            String shapeKey = formData.get("obstacleShape");
+            boolean hasGeneratedBoundary = isMeaningfulValue(formData.get("generatedBoundaryCoordinates"));
+            
+            // 濡傛灉鏄杈瑰舰闅滅鐗╋紝蹇呴』鐢熸垚杈圭晫鍧愭爣鎵嶈兘淇濆瓨
+            // 濡傛灉鏄渾褰㈤殰纰嶇墿鎴栧叾浠栧舰鐘讹紝涓嶉渶瑕佺敓鎴愯竟鐣屽氨鑳戒繚瀛�
+            boolean boundaryRequirementMet = true;
+            if ("polygon".equals(shapeKey)) {
+                boundaryRequirementMet = hasGeneratedBoundary;
+            }
+            
+            boolean enabled = hasCoords && hasName && boundaryRequirementMet;
             saveButton.setEnabled(enabled);
             if (enabled) {
                 saveButton.setBackground(PRIMARY_COLOR);
                 saveButton.setForeground(WHITE);
                 saveButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+                saveButton.setOpaque(true);
+                saveButton.setContentAreaFilled(true);
             } else {
                 saveButton.setBackground(MEDIUM_GRAY);
                 saveButton.setForeground(TEXT_COLOR);
                 saveButton.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+                saveButton.setOpaque(true);
+                saveButton.setContentAreaFilled(true);
             }
         }
     }
@@ -1466,6 +1640,7 @@
         String obstacleName = formData.get("obstacleName");
         String coordsValue = formData.get("obstacleCoordinates");
         String originalValue = formData.get("obstacleOriginalCoordinates");
+        String generatedBoundaryValue = formData.get("generatedBoundaryCoordinates");  // 鐢熸垚鐨勮竟鐣屽潗鏍�
         String shapeKey = formData.get("obstacleShape");
         String previousName = formData.get("editingObstacleName");
 
@@ -1476,6 +1651,8 @@
 
         String coords = coordsValue.trim();
         String originalCoords = isMeaningfulValue(originalValue) ? originalValue.trim() : null;
+        // 濡傛灉鏈夌敓鎴愮殑杈圭晫鍧愭爣锛屼娇鐢ㄧ敓鎴愮殑杈圭晫鍧愭爣锛涘惁鍒欎娇鐢ㄥ師濮嬪潗鏍�
+        String finalCoords = isMeaningfulValue(generatedBoundaryValue) ? generatedBoundaryValue.trim() : coords;
         String trimmedName = isMeaningfulValue(obstacleName) ? obstacleName.trim() : null;
         if (!isMeaningfulValue(trimmedName)) {
             JOptionPane.showMessageDialog(this, "闅滅鐗╁悕绉版棤鏁�", "閿欒", JOptionPane.ERROR_MESSAGE);
@@ -1487,7 +1664,7 @@
             formData.put("editingObstacleName", trimmedName);
         }
 
-        if (!persistObstacleToConfig(landNumber, previousName, trimmedName, shapeKey, coords, originalCoords)) {
+        if (!persistObstacleToConfig(landNumber, previousName, trimmedName, shapeKey, finalCoords, originalCoords)) {
             JOptionPane.showMessageDialog(this, "鍐欏叆闅滅鐗╅厤缃け璐ワ紝璇烽噸璇�", "閿欒", JOptionPane.ERROR_MESSAGE);
             return;
         }
@@ -1499,6 +1676,171 @@
         activeSession = null;
         dispose();
     }
+    
+    /**
+     * 鐢熸垚闅滅鐗╄竟鐣屽潗鏍�
+     */
+    private void generateObstacleBoundary() {
+        String originalCoords = formData.get("obstacleOriginalCoordinates");
+        if (!isMeaningfulValue(originalCoords)) {
+            JOptionPane.showMessageDialog(this, "鏃犲師濮嬪潗鏍囨暟鎹紝鏃犳硶鐢熸垚杈圭晫", "鎻愮ず", JOptionPane.INFORMATION_MESSAGE);
+            return;
+        }
+        
+        String baseStation = targetDikuai.getBaseStationCoordinates();
+        if (!isMeaningfulValue(baseStation)) {
+            JOptionPane.showMessageDialog(this, "鍦板潡鏈缃熀绔欏潗鏍�", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+            return;
+        }
+        
+        String shapeKey = formData.get("obstacleShape");
+        if (!"polygon".equals(shapeKey)) {
+            JOptionPane.showMessageDialog(this, "鍙湁澶氳竟褰㈤殰纰嶇墿鎵嶉渶瑕佺敓鎴愯竟鐣屽潗鏍�", "鎻愮ず", JOptionPane.INFORMATION_MESSAGE);
+            return;
+        }
+        
+        try {
+            // 妫�鏌ョ粯鍒舵柟寮忥紝鍙湁鍓茶崏鏈虹粯鍒剁殑澶氳竟褰㈡墠璋冪敤bianjieguihua2
+            String method = formData.get("drawingMethod");
+            if (!"mower".equals(method)) {
+                JOptionPane.showMessageDialog(this, "鍙湁鍓茶崏鏈虹粯鍒剁殑澶氳竟褰㈡墠鏀寔鐢熸垚杈圭晫鍧愭爣", "鎻愮ず", JOptionPane.INFORMATION_MESSAGE);
+                return;
+            }
+            
+            // 灏嗗師濮嬪潗鏍囪浆鎹负Coordinate瀵硅薄鍒楄〃
+            List<Coordinate> coordinateList = parseOriginalCoordinatesToCoordinateList(originalCoords);
+            if (coordinateList.isEmpty()) {
+                JOptionPane.showMessageDialog(this, "鍘熷鍧愭爣鏁版嵁鏃犳晥", "閿欒", JOptionPane.ERROR_MESSAGE);
+                return;
+            }
+            
+            // 淇濆瓨褰撳墠鐨凜oordinate.coordinates
+            List<Coordinate> savedCoordinates = new ArrayList<>(Coordinate.coordinates);
+            
+            try {
+                // 璁剧疆鍒板叏灞�鍧愭爣鍒楄〃
+                Coordinate.coordinates.clear();
+                Coordinate.coordinates.addAll(coordinateList);
+                
+                // 璋冪敤bianjieguihua2绠楁硶鐢熸垚浼樺寲鍚庣殑澶氳竟褰㈣竟鐣屽潗鏍�
+                String optimizedCoordsStr = bianjieguihua2.processCoordinateListAuto(baseStation);
+                
+                if (optimizedCoordsStr == null || optimizedCoordsStr.trim().isEmpty()) {
+                    JOptionPane.showMessageDialog(this, "鐢熸垚杈圭晫鍧愭爣澶辫触", "閿欒", JOptionPane.ERROR_MESSAGE);
+                    return;
+                }
+                
+                // 淇濆瓨鐢熸垚鐨勮竟鐣屽潗鏍�
+                formData.put("generatedBoundaryCoordinates", optimizedCoordsStr.trim());
+                
+                // 璁$畻鐢熸垚鐨勮竟鐣岀偣鏁�
+                int boundaryPointCount = countCoordinatePairs(optimizedCoordsStr.trim());
+                
+                // 鏇存柊杈圭晫鐘舵�佹爣绛炬樉绀�
+                updateBoundaryStatusLabel(boundaryPointCount);
+                
+                // 鏇存柊棰勮鎸夐挳鏄剧ず锛堝彉鎴愮豢鑹插彲鐐瑰嚮锛�
+                updatePreviewButtonState();
+                
+                // 鏇存柊淇濆瓨鎸夐挳鐘舵�侊紙鍙樻垚鍙偣鍑伙級
+                updateSaveButtonState();
+                
+                // 寮哄埗鍒锋柊UI
+                SwingUtilities.invokeLater(() -> {
+                    if (previewButton != null) {
+                        previewButton.revalidate();
+                        previewButton.repaint();
+                    }
+                });
+                
+                JOptionPane.showMessageDialog(this, "闅滅鐗╄竟鐣屽潗鏍囧凡鐢熸垚", "鎴愬姛", JOptionPane.INFORMATION_MESSAGE);
+                
+            } finally {
+                // 鎭㈠鍘熸潵鐨勫潗鏍囧垪琛�
+                Coordinate.coordinates.clear();
+                Coordinate.coordinates.addAll(savedCoordinates);
+            }
+            
+        } catch (Exception ex) {
+            ex.printStackTrace();
+            JOptionPane.showMessageDialog(this, "鐢熸垚杈圭晫鍧愭爣鏃跺彂鐢熼敊璇�: " + ex.getMessage(), "閿欒", JOptionPane.ERROR_MESSAGE);
+        }
+    }
+    
+    /**
+     * 灏嗗師濮嬪潗鏍囧瓧绗︿覆瑙f瀽涓篊oordinate瀵硅薄鍒楄〃
+     */
+    private List<Coordinate> parseOriginalCoordinatesToCoordinateList(String originalCoords) {
+        List<Coordinate> coordinateList = new ArrayList<>();
+        if (!isMeaningfulValue(originalCoords)) {
+            return coordinateList;
+        }
+        
+        // 鍘熷鍧愭爣鏍煎紡锛氱含搴�1,鏂瑰悜1,缁忓害1,鏂瑰悜1;绾害2,鏂瑰悜2,缁忓害2,鏂瑰悜2;...
+        String[] pointStrings = originalCoords.split(";");
+        for (String pointStr : pointStrings) {
+            pointStr = pointStr.trim();
+            if (pointStr.isEmpty()) continue;
+            
+            String[] parts = pointStr.split(",");
+            if (parts.length >= 4) {
+                try {
+                    String lat = parts[0].trim();
+                    String latDir = parts[1].trim();
+                    String lon = parts[2].trim();
+                    String lonDir = parts[3].trim();
+                    
+                    Coordinate coord = new Coordinate(lat, latDir, lon, lonDir, 0.0);
+                    coordinateList.add(coord);
+                } catch (Exception e) {
+                    // 璺宠繃鏃犳晥鐨勫潗鏍囩偣
+                    continue;
+                }
+            }
+        }
+        
+        return coordinateList;
+    }
+    
+    /**
+     * 棰勮闅滅鐗╄竟鐣�
+     */
+    private void previewObstacleBoundary() {
+        String generatedBoundary = formData.get("generatedBoundaryCoordinates");
+        if (!isMeaningfulValue(generatedBoundary)) {
+            JOptionPane.showMessageDialog(this, "璇峰厛鐢熸垚闅滅鐗╄竟鐣屽潗鏍�", "鎻愮ず", JOptionPane.INFORMATION_MESSAGE);
+            return;
+        }
+        
+        String landNumber = targetDikuai.getLandNumber();
+        String landName = targetDikuai.getLandName();
+        String boundary = targetDikuai.getBoundaryCoordinates();
+        
+        // 鍏抽棴褰撳墠瀵硅瘽妗�
+        setVisible(false);
+        
+        SwingUtilities.invokeLater(() -> {
+            Shouye shouye = Shouye.getInstance();
+            if (shouye != null) {
+                // 浼犻�掑洖璋冧互閲嶆柊鎵撳紑鏂板闅滅鐗╂楠�2椤甸潰
+                shouye.startMowingPathPreview(
+                    landNumber,
+                    landName,
+                    boundary,
+                    generatedBoundary,  // 浣跨敤鐢熸垚鐨勮竟鐣屽潗鏍囦綔涓洪殰纰嶇墿鍧愭爣
+                    null,
+                    () -> SwingUtilities.invokeLater(() -> {
+                        // 閲嶆柊鎵撳紑鏂板闅滅鐗╂楠�2椤甸潰
+                        Window owner = SwingUtilities.getWindowAncestor(shouye);
+                        setVisible(true);
+                    })
+                );
+            } else {
+                JOptionPane.showMessageDialog(null, "鏃犳硶鎵撳紑涓婚〉闈㈣繘琛岄瑙�", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+                setVisible(true);
+            }
+        });
+    }
 
     private boolean persistObstacleToConfig(String landNumber, String previousName, String obstacleName,
                                             String shapeKey, String xyCoords, String originalCoords) {
@@ -1706,10 +2048,14 @@
         if (step < 2) {
             nextButton.setVisible(true);
             saveButton.setVisible(false);
+            if (previewButton != null) {
+                previewButton.setVisible(false);
+            }
         } else {
             nextButton.setVisible(false);
             saveButton.setVisible(true);
             updateDrawingStatus();
+            updatePreviewButtonState();
         }
         updateSaveButtonState();
         revalidate();
@@ -1753,6 +2099,24 @@
         }
 
         updateDrawingStatus();
+        
+        // 濡傛灉宸叉湁鐢熸垚鐨勮竟鐣屽潗鏍囷紝鏇存柊杈圭晫鐘舵�佹爣绛�
+        String generatedBoundary = session.data.get("generatedBoundaryCoordinates");
+        if (isMeaningfulValue(generatedBoundary)) {
+            int boundaryPointCount = countCoordinatePairs(generatedBoundary);
+            updateBoundaryStatusLabel(boundaryPointCount);
+        } else {
+            // 濡傛灉娌℃湁鐢熸垚鐨勮竟鐣屽潗鏍囷紝闅愯棌杈圭晫鐘舵�佹爣绛�
+            if (boundaryStatusLabel != null) {
+                boundaryStatusLabel.setVisible(false);
+                boundaryStatusLabel.setText("");
+            }
+        }
+        
+        // 鏇存柊鎸夐挳鐘舵��
+        updatePreviewButtonState();
+        updateSaveButtonState();
+        
         currentStep = 2;
         showStep(2);
     }
@@ -1882,6 +2246,8 @@
                 BorderFactory.createLineBorder(PRIMARY_DARK, 2),
                 BorderFactory.createEmptyBorder(10, 22, 10, 22)));
         button.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+        button.setOpaque(true);
+        button.setContentAreaFilled(true);
         button.addMouseListener(new MouseAdapter() {
             @Override
             public void mouseEntered(MouseEvent e) {
@@ -1894,6 +2260,9 @@
             public void mouseExited(MouseEvent e) {
                 if (button.isEnabled()) {
                     button.setBackground(PRIMARY_COLOR);
+                } else {
+                    // 绂佺敤鏃朵繚鎸佺伆鑹茶儗鏅�
+                    button.setBackground(MEDIUM_GRAY);
                 }
             }
         });
@@ -1908,6 +2277,8 @@
                 BorderFactory.createLineBorder(BORDER_COLOR, 2),
                 BorderFactory.createEmptyBorder(10, 22, 10, 22)));
         button.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+        button.setOpaque(true);
+        button.setContentAreaFilled(true);
         return button;
     }
 
diff --git a/src/zhangaiwu/AddDikuai.java b/src/zhangaiwu/AddDikuai.java
index eff3e45..02ac96d 100644
--- a/src/zhangaiwu/AddDikuai.java
+++ b/src/zhangaiwu/AddDikuai.java
@@ -292,10 +292,6 @@
         formGroup.add(areaNameField);
         formGroup.add(Box.createRigidArea(new Dimension(0, 8)));
         formGroup.add(hintLabel);
-
-    formGroup.add(Box.createRigidArea(new Dimension(0, 20)));
-    JPanel obstacleSection = createObstacleSummarySection();
-    formGroup.add(obstacleSection);
         
         stepPanel.add(formGroup);
         stepPanel.add(Box.createVerticalGlue());
@@ -1658,10 +1654,6 @@
     private void showStep(int step) {
         currentStep = step;
         cardLayout.show(stepsPanel, "step" + step);
-        
-        if (step == 1) {
-            updateObstacleSummary();
-        }
 
         // 鏇存柊鎸夐挳鐘舵��
         updateButtonState(step);

--
Gitblit v1.10.0