From 87d7cf316e983b0398b270de03a8092412af8487 Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期五, 19 十二月 2025 16:56:30 +0800
Subject: [PATCH] 新增了收到绘制边界模式

---
 src/zhuye/Shouye.java |  253 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 253 insertions(+), 0 deletions(-)

diff --git a/src/zhuye/Shouye.java b/src/zhuye/Shouye.java
index b588d83..c661ee5 100644
--- a/src/zhuye/Shouye.java
+++ b/src/zhuye/Shouye.java
@@ -127,6 +127,8 @@
 	private JButton pathPreviewReturnButton;
 	private boolean pathPreviewActive;
 	private Runnable pathPreviewReturnAction;
+	private JButton settingsReturnButton;  // 杩斿洖绯荤粺璁剧疆椤甸潰鐨勬偓娴寜閽�
+	private JButton saveManualBoundaryButton;  // 淇濆瓨鎵嬪姩缁樺埗杈圭晫鐨勬寜閽�
 	private String previewRestoreLandNumber;
 	private String previewRestoreLandName;
 	private boolean drawingPaused;
@@ -467,6 +469,238 @@
 		} else {
 			celiangmoshi.stop();
 		}
+		// 鍒濆鍖栨墜鍔ㄧ粯鍒惰竟鐣屾ā寮�
+		boolean manualBoundaryDrawingEnabled = setsys.isManualBoundaryDrawingMode();
+		if (mapRenderer != null) {
+			mapRenderer.setManualBoundaryDrawingMode(manualBoundaryDrawingEnabled);
+		}
+		// 鏇存柊杩斿洖璁剧疆鎸夐挳鐨勬樉绀虹姸鎬�
+		updateSettingsReturnButtonVisibility();
+	}
+	
+	/**
+	 * 鏇存柊杩斿洖绯荤粺璁剧疆鎸夐挳鐨勬樉绀虹姸鎬�
+	 * 褰撴墜鍔ㄧ粯鍒惰竟鐣屾ā寮忋�佹樉绀鸿竟鐣岃窛绂绘垨寮�鍚祴閲忔ā寮忎换涓�寮�鍚椂鏄剧ず
+	 */
+	public void updateSettingsReturnButtonVisibility() {
+		Setsys setsys = new Setsys();
+		setsys.initializeFromProperties();
+		
+		boolean manualBoundaryDrawingEnabled = setsys.isManualBoundaryDrawingMode();
+		boolean shouldShow = manualBoundaryDrawingEnabled
+			|| setsys.isBoundaryLengthVisible() 
+			|| setsys.isMeasurementModeEnabled();
+		
+		if (shouldShow) {
+			showSettingsReturnButton();
+			// 濡傛灉鎵嬪姩缁樺埗杈圭晫妯″紡寮�鍚紝鏄剧ず淇濆瓨鎸夐挳
+			if (manualBoundaryDrawingEnabled) {
+				showSaveManualBoundaryButton();
+			} else {
+				hideSaveManualBoundaryButton();
+			}
+		} else {
+			hideSettingsReturnButton();
+			hideSaveManualBoundaryButton();
+		}
+	}
+	
+	/**
+	 * 鏄剧ず杩斿洖绯荤粺璁剧疆鎸夐挳
+	 */
+	private void showSettingsReturnButton() {
+		ensureFloatingButtonInfrastructure();
+		if (settingsReturnButton == null) {
+			settingsReturnButton = createFloatingTextButton("杩斿洖");
+			settingsReturnButton.setToolTipText("杩斿洖绯荤粺璁剧疆");
+			settingsReturnButton.addActionListener(e -> {
+				// 鍏抽棴鎵�鏈夌浉鍏虫ā寮�
+				Setsys setsys = new Setsys();
+				setsys.initializeFromProperties();
+				
+				boolean modeChanged = false;
+				
+				// 鍏抽棴鎵嬪姩缁樺埗杈圭晫妯″紡
+				if (setsys.isManualBoundaryDrawingMode()) {
+					setsys.setManualBoundaryDrawingMode(false);
+					setsys.updateProperty("manualBoundaryDrawingMode", "false");
+					// 娓呯┖鎵嬪姩缁樺埗鐨勮竟鐣岀偣
+					if (mapRenderer != null) {
+						mapRenderer.clearManualBoundaryPoints();
+					}
+					modeChanged = true;
+				}
+				
+				// 鍏抽棴鏄剧ず杈圭晫璺濈
+				if (setsys.isBoundaryLengthVisible()) {
+					setsys.setBoundaryLengthVisible(false);
+					setsys.updateProperty("boundaryLengthVisible", "false");
+					if (mapRenderer != null) {
+						mapRenderer.setBoundaryLengthVisible(false);
+					}
+					modeChanged = true;
+				}
+				
+				// 鍏抽棴娴嬮噺妯″紡
+				if (setsys.isMeasurementModeEnabled()) {
+					setsys.setMeasurementModeEnabled(false);
+					setsys.updateProperty("measurementModeEnabled", "false");
+					if (mapRenderer != null) {
+						mapRenderer.setMeasurementMode(false);
+					}
+					celiangmoshi.stop();
+					modeChanged = true;
+				}
+				
+				// 濡傛灉鍏抽棴浜嗕换浣曟ā寮忥紝绔嬪嵆闅愯棌杩斿洖鎸夐挳骞跺埛鏂扮晫闈�
+				if (modeChanged) {
+					// 绔嬪嵆闅愯棌杩斿洖鎸夐挳
+					if (settingsReturnButton != null) {
+						settingsReturnButton.setVisible(false);
+					}
+					// 鏇存柊鎸夐挳鍒楋紙绉婚櫎杩斿洖鎸夐挳锛�
+					rebuildFloatingButtonColumn();
+					// 濡傛灉鎵�鏈夋寜閽兘闅愯棌浜嗭紝闅愯棌鎮诞鎸夐挳闈㈡澘
+					if (floatingButtonPanel != null && floatingButtonColumn != null
+							&& floatingButtonColumn.getComponentCount() == 0) {
+						floatingButtonPanel.setVisible(false);
+					}
+					// 鍒锋柊鐣岄潰
+					if (visualizationPanel != null) {
+						visualizationPanel.revalidate();
+						visualizationPanel.repaint();
+					}
+				}
+				
+				// 鏇存柊杩斿洖鎸夐挳鏄剧ず鐘舵�侊紙纭繚鐘舵�佸悓姝ワ級
+				updateSettingsReturnButtonVisibility();
+				
+				// 鎵撳紑绯荤粺璁剧疆椤甸潰
+				showSettingsDialog();
+			});
+		}
+		settingsReturnButton.setVisible(true);
+		// 闅愯棌缁樺埗鐩稿叧鐨勬寜閽紙鏆傚仠銆佺粨鏉熺粯鍒讹級
+		if (drawingPauseButton != null) {
+			drawingPauseButton.setVisible(false);
+		}
+		if (endDrawingButton != null) {
+			endDrawingButton.setVisible(false);
+		}
+		if (floatingButtonPanel != null) {
+			floatingButtonPanel.setVisible(true);
+			if (floatingButtonPanel.getParent() != visualizationPanel) {
+				visualizationPanel.add(floatingButtonPanel, BorderLayout.SOUTH);
+			}
+		}
+		rebuildFloatingButtonColumn();
+	}
+	
+	/**
+	 * 闅愯棌杩斿洖绯荤粺璁剧疆鎸夐挳
+	 */
+	private void hideSettingsReturnButton() {
+		if (settingsReturnButton != null) {
+			settingsReturnButton.setVisible(false);
+		}
+		rebuildFloatingButtonColumn();
+		if (floatingButtonPanel != null && floatingButtonColumn != null
+				&& floatingButtonColumn.getComponentCount() == 0) {
+			floatingButtonPanel.setVisible(false);
+		}
+	}
+	
+	/**
+	 * 鏄剧ず淇濆瓨鎵嬪姩缁樺埗杈圭晫鎸夐挳
+	 */
+	private void showSaveManualBoundaryButton() {
+		ensureFloatingButtonInfrastructure();
+		if (saveManualBoundaryButton == null) {
+			saveManualBoundaryButton = createFloatingTextButton("淇濆瓨");
+			saveManualBoundaryButton.setToolTipText("淇濆瓨鎵嬪姩缁樺埗鐨勮竟鐣�");
+			saveManualBoundaryButton.addActionListener(e -> saveManualBoundary());
+		}
+		saveManualBoundaryButton.setVisible(true);
+		if (floatingButtonPanel != null) {
+			floatingButtonPanel.setVisible(true);
+			if (floatingButtonPanel.getParent() != visualizationPanel) {
+				visualizationPanel.add(floatingButtonPanel, BorderLayout.SOUTH);
+			}
+		}
+		rebuildFloatingButtonColumn();
+	}
+	
+	/**
+	 * 闅愯棌淇濆瓨鎵嬪姩缁樺埗杈圭晫鎸夐挳
+	 */
+	private void hideSaveManualBoundaryButton() {
+		if (saveManualBoundaryButton != null) {
+			saveManualBoundaryButton.setVisible(false);
+		}
+		rebuildFloatingButtonColumn();
+		if (floatingButtonPanel != null && floatingButtonColumn != null
+				&& floatingButtonColumn.getComponentCount() == 0) {
+			floatingButtonPanel.setVisible(false);
+		}
+	}
+	
+	/**
+	 * 淇濆瓨鎵嬪姩缁樺埗鐨勮竟鐣屽埌鏂囦欢
+	 */
+	private void saveManualBoundary() {
+		if (mapRenderer == null) {
+			JOptionPane.showMessageDialog(this, "鍦板浘娓叉煋鍣ㄦ湭鍒濆鍖�", "閿欒", JOptionPane.ERROR_MESSAGE);
+			return;
+		}
+		
+		List<Point2D.Double> points = mapRenderer.getManualBoundaryPoints();
+		if (points == null || points.isEmpty()) {
+			JOptionPane.showMessageDialog(this, "娌℃湁鍙繚瀛樼殑杈圭晫鐐癸紝璇峰厛鍦ㄥ湴鍥句笂鐐瑰嚮缁樺埗杈圭晫", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+			return;
+		}
+		
+		// 鏋勫缓鍧愭爣瀛楃涓诧細x1,y1;x2,y2;...;xn,yn锛堝崟浣嶏細绫筹紝绮剧‘鍒板皬鏁扮偣鍚�2浣嶏級
+		StringBuilder coordinates = new StringBuilder();
+		for (int i = 0; i < points.size(); i++) {
+			Point2D.Double point = points.get(i);
+			if (i > 0) {
+				coordinates.append(";");
+			}
+			coordinates.append(String.format(Locale.US, "%.2f,%.2f", point.x, point.y));
+		}
+		
+		// 淇濆瓨鍒� properties 鏂囦欢
+		try {
+			java.util.Properties props = new java.util.Properties();
+			java.io.File file = new java.io.File("shoudongbianjie.properties");
+			
+			// 濡傛灉鏂囦欢瀛樺湪锛屽厛鍔犺浇鐜版湁鍐呭
+			if (file.exists()) {
+				try (java.io.FileInputStream input = new java.io.FileInputStream(file)) {
+					props.load(input);
+				}
+			}
+			
+			// 淇濆瓨鍧愭爣
+			props.setProperty("boundaryCoordinates", coordinates.toString());
+			props.setProperty("pointCount", String.valueOf(points.size()));
+			
+			// 鍐欏洖鏂囦欢
+			try (java.io.FileOutputStream output = new java.io.FileOutputStream(file)) {
+				props.store(output, "鎵嬪姩缁樺埗杈圭晫鍧愭爣 - 鏍煎紡: x1,y1;x2,y2;...;xn,yn (鍗曚綅:绫�,绮剧‘鍒板皬鏁扮偣鍚�2浣�)");
+			}
+			
+			JOptionPane.showMessageDialog(this, 
+				String.format("杈圭晫宸蹭繚瀛樻垚鍔燂紒\n鍏� %d 涓偣", points.size()), 
+				"淇濆瓨鎴愬姛", 
+				JOptionPane.INFORMATION_MESSAGE);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			JOptionPane.showMessageDialog(this, 
+				"淇濆瓨澶辫触: " + ex.getMessage(), 
+				"閿欒", 
+				JOptionPane.ERROR_MESSAGE);
+		}
 	}
 
 	private void createHeaderPanel() {
@@ -2810,6 +3044,11 @@
 		hideCircleGuidancePanel();
 		enterDrawingControlMode();
 		
+		// 闅愯棌杩斿洖璁剧疆鎸夐挳锛堝鏋滄樉绀虹粯鍒舵寜閽紝鍒欎笉搴旇鏄剧ず杩斿洖鎸夐挳锛�
+		if (settingsReturnButton != null) {
+			settingsReturnButton.setVisible(false);
+		}
+		
 		// 鏄剧ず"姝e湪缁樺埗杈圭晫"鎻愮ず
 		if (drawingBoundaryLabel != null) {
 			drawingBoundaryLabel.setVisible(true);
@@ -2923,6 +3162,20 @@
 			floatingButtonColumn.add(pathPreviewReturnButton);
 			added = true;
 		}
+		if (saveManualBoundaryButton != null && saveManualBoundaryButton.isVisible()) {
+			if (added) {
+				floatingButtonColumn.add(Box.createRigidArea(new Dimension(0, 10)));
+			}
+			floatingButtonColumn.add(saveManualBoundaryButton);
+			added = true;
+		}
+		if (settingsReturnButton != null && settingsReturnButton.isVisible()) {
+			if (added) {
+				floatingButtonColumn.add(Box.createRigidArea(new Dimension(0, 10)));
+			}
+			floatingButtonColumn.add(settingsReturnButton);
+			added = true;
+		}
 		floatingButtonColumn.revalidate();
 		floatingButtonColumn.repaint();
 	}

--
Gitblit v1.10.0