From c498385fb7e372d13e2ee76d7b54ae2381728082 Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期三, 17 十二月 2025 19:35:57 +0800
Subject: [PATCH] 新增了测量模式

---
 src/dikuai/ObstacleManagementPage.java |  184 ++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 162 insertions(+), 22 deletions(-)

diff --git a/src/dikuai/ObstacleManagementPage.java b/src/dikuai/ObstacleManagementPage.java
index 43cd9e4..9dc7c5d 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浼樺寲鐗�
@@ -307,15 +309,21 @@
         actionPanel.setLayout(new BoxLayout(actionPanel, BoxLayout.X_AXIS));
         actionPanel.setOpaque(false);
         
-        JButton generateBtn = createStyledButton("閲嶆柊鐢熸垚鍧愭爣", PRIMARY_COLOR, true);
-        generateBtn.addActionListener(e -> generateObstacleCoordinates(obstacle, xyArea));
+        // 瀵逛簬鍦嗗舰闅滅鐗╋紝涓嶆樉绀�"閲嶆柊鐢熸垚鍧愭爣"鎸夐挳锛屽彧鏄剧ず棰勮鎸夐挳
+        Obstacledge.ObstacleShape shape = obstacle.getShape();
+        boolean isCircle = (shape == Obstacledge.ObstacleShape.CIRCLE);
+        
+        if (!isCircle) {
+            // 鍙湁闈炲渾褰㈤殰纰嶇墿鎵嶆樉绀�"閲嶆柊鐢熸垚鍧愭爣"鎸夐挳
+            JButton generateBtn = createStyledButton("閲嶆柊鐢熸垚鍧愭爣", PRIMARY_COLOR, true);
+            generateBtn.addActionListener(e -> generateObstacleCoordinates(obstacle, xyArea));
+            actionPanel.add(generateBtn);
+            actionPanel.add(Box.createHorizontalStrut(10));
+        }
         
         JButton previewBtn = createStyledButton("棰勮", TEXT_SECONDARY, false);
         previewBtn.setPreferredSize(new Dimension(70, 36)); // 绋嶅井绐勪竴鐐�
         previewBtn.addActionListener(e -> previewObstacle(obstacle));
-        
-        actionPanel.add(generateBtn);
-        actionPanel.add(Box.createHorizontalStrut(10));
         actionPanel.add(previewBtn);
         
         card.add(actionPanel);
@@ -540,22 +548,28 @@
         List<Obstacledge.Obstacle> allObstacles = loadObstacles();
         String allObstaclesCoords = buildAllObstaclesCoordinates(allObstacles);
         
-        setVisible(false);
+        // 鍏抽棴闅滅鐗╃鐞嗛〉闈�
+        dispose();
         
         SwingUtilities.invokeLater(() -> {
             Shouye shouye = Shouye.getInstance();
             if (shouye != null) {
+                // 浼犻�掑洖璋冧互閲嶆柊鎵撳紑闅滅鐗╃鐞嗛〉闈�
                 shouye.startMowingPathPreview(
                     landNumber,
                     landName,
                     boundary,
                     allObstaclesCoords,
                     null,
-                    () -> SwingUtilities.invokeLater(() -> setVisible(true))
+                    () -> SwingUtilities.invokeLater(() -> {
+                        // 閲嶆柊鎵撳紑闅滅鐗╃鐞嗛〉闈�
+                        Window owner = SwingUtilities.getWindowAncestor(shouye);
+                        ObstacleManagementPage newPage = new ObstacleManagementPage(owner, dikuai);
+                        newPage.setVisible(true);
+                    })
                 );
             } else {
                 JOptionPane.showMessageDialog(null, "鏃犳硶鎵撳紑涓婚〉闈㈣繘琛岄瑙�", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
-                setVisible(true);
             }
         });
     }
@@ -612,23 +626,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;
             }
             
@@ -641,6 +655,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 {

--
Gitblit v1.10.0