| | |
| | | import dikuai.Dikuaiguanli; |
| | | import dikuai.addzhangaiwu; |
| | | import gecaoji.Device; |
| | | import gecaoji.Gecaoji; |
| | | import gecaoji.MowerBoundaryChecker; |
| | | import set.Sets; |
| | | import set.debug; |
| | | import udpdell.UDPServer; |
| | |
| | | } |
| | | startButtonShowingPause = !startButtonShowingPause; |
| | | if (!startButtonShowingPause) { |
| | | // 检查割草机是否在作业地块边界范围内 |
| | | if (!checkMowerInBoundary()) { |
| | | startButtonShowingPause = true; |
| | | statusLabel.setText("待机"); |
| | | updateStartButtonAppearance(); |
| | | return; |
| | | } |
| | | |
| | | statusLabel.setText("作业中"); |
| | | if (stopButtonActive) { |
| | | stopButtonActive = false; |
| | |
| | | updateStartButtonAppearance(); |
| | | } |
| | | |
| | | /** |
| | | * 检查割草机是否在当前选中的作业地块边界范围内 |
| | | * @return 如果割草机在边界内返回true,否则返回false并显示提示 |
| | | */ |
| | | private boolean checkMowerInBoundary() { |
| | | if (mapRenderer == null) { |
| | | return true; // 如果没有地图渲染器,跳过检查 |
| | | } |
| | | |
| | | // 获取当前边界 |
| | | List<Point2D.Double> boundary = mapRenderer.getCurrentBoundary(); |
| | | if (boundary == null || boundary.size() < 3) { |
| | | return true; // 如果没有边界或边界点不足,跳过检查 |
| | | } |
| | | |
| | | // 获取割草机位置 |
| | | Gecaoji mower = mapRenderer.getMower(); |
| | | if (mower == null || !mower.hasValidPosition()) { |
| | | showCustomMessageDialog("无法获取割草机位置,请检查设备连接", "提示"); |
| | | return false; |
| | | } |
| | | |
| | | Point2D.Double mowerPosition = mower.getPosition(); |
| | | if (mowerPosition == null) { |
| | | showCustomMessageDialog("无法获取割草机位置,请检查设备连接", "提示"); |
| | | return false; |
| | | } |
| | | |
| | | // 使用 MowerBoundaryChecker 检查是否在边界内 |
| | | boolean isInside = MowerBoundaryChecker.isInsideBoundaryPoints( |
| | | boundary, |
| | | mowerPosition.x, |
| | | mowerPosition.y |
| | | ); |
| | | |
| | | if (!isInside) { |
| | | showCustomMessageDialog("请将割草机开到作业地块内然后点击开始作业", "提示"); |
| | | return false; |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | /** |
| | | * 显示自定义消息对话框,使用 buttonset 创建确定按钮 |
| | | * @param message 消息内容 |
| | | * @param title 对话框标题 |
| | | */ |
| | | private void showCustomMessageDialog(String message, String title) { |
| | | Window parentWindow = SwingUtilities.getWindowAncestor(this); |
| | | JDialog dialog = new JDialog(parentWindow, title, Dialog.ModalityType.APPLICATION_MODAL); |
| | | dialog.setLayout(new BorderLayout(20, 20)); |
| | | dialog.setResizable(false); |
| | | |
| | | // 内容面板 |
| | | JPanel contentPanel = new JPanel(new BorderLayout(0, 15)); |
| | | contentPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 10, 20)); |
| | | contentPanel.setBackground(Color.WHITE); |
| | | |
| | | // 消息标签 |
| | | JLabel messageLabel = new JLabel("<html><div style='text-align: center;'>" + message + "</div></html>"); |
| | | messageLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14)); |
| | | messageLabel.setHorizontalAlignment(SwingConstants.CENTER); |
| | | contentPanel.add(messageLabel, BorderLayout.CENTER); |
| | | |
| | | // 按钮面板 |
| | | JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 0)); |
| | | buttonPanel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); |
| | | buttonPanel.setOpaque(false); |
| | | |
| | | // 使用 buttonset 创建确定按钮 |
| | | JButton okButton = buttonset.createStyledButton("确定", THEME_COLOR); |
| | | okButton.addActionListener(e -> dialog.dispose()); |
| | | buttonPanel.add(okButton); |
| | | |
| | | contentPanel.add(buttonPanel, BorderLayout.SOUTH); |
| | | dialog.add(contentPanel, BorderLayout.CENTER); |
| | | |
| | | dialog.pack(); |
| | | dialog.setLocationRelativeTo(this); |
| | | dialog.setVisible(true); |
| | | } |
| | | |
| | | private void handleStopAction() { |
| | | if (handheldCaptureInlineUiActive) { |
| | | handleHandheldFinishAction(); |