From 700ca509ba853d1615ea3e5c470d2532006f0e1e Mon Sep 17 00:00:00 2001
From: darker <mr.darker@163.com>
Date: 星期五, 17 一月 2025 15:21:34 +0800
Subject: [PATCH] 1. 添加报警管理器,新增设备名称

---
 SourceCode/Bond/Servo/ServoDlg.cpp |   63 ++++++++++++++++++++++++++++++-
 1 files changed, 60 insertions(+), 3 deletions(-)

diff --git a/SourceCode/Bond/Servo/ServoDlg.cpp b/SourceCode/Bond/Servo/ServoDlg.cpp
index e0156b3..f349071 100644
--- a/SourceCode/Bond/Servo/ServoDlg.cpp
+++ b/SourceCode/Bond/Servo/ServoDlg.cpp
@@ -9,8 +9,10 @@
 #include "Common.h"
 #include "Log.h"
 #include "SecsTestDlg.h"
+#include "AlarmManager.h"
 #include <chrono>
 #include <thread>
+#include <cmath>
 
 
 #ifdef _DEBUG
@@ -79,6 +81,7 @@
 	m_crBkgnd = APPDLG_BACKGROUND_COLOR;
 	m_hbrBkgnd = nullptr;
 	m_bShowLogWnd = FALSE;
+	m_bIsRobotMoving = FALSE;
 	m_pLogDlg = nullptr;
 }
 
@@ -513,6 +516,9 @@
 	auto startTime = std::chrono::steady_clock::now();
 	auto endTime = startTime + std::chrono::milliseconds(duration);
 
+	// 开始移动,设置标记
+	m_bIsRobotMoving = TRUE;
+
 	// 开始平滑移动
 	while (std::chrono::steady_clock::now() < endTime) {
 		auto currentTime = std::chrono::steady_clock::now();
@@ -539,6 +545,54 @@
 	m_pGraph->UpdateIndicateBoxCoordinates(INDICATE_ROBOT_ARM2, endX + arm2Offset, 294);
 
 	// 界面重绘
+	Invalidate();
+
+	// 动画结束,设置标记
+	m_bIsRobotMoving = FALSE;
+}
+
+void CServoDlg::RotateRobot(float angleInDegrees)
+{
+	// 将角度转换为弧度
+	float angleInRadians = static_cast<float>(std::acos(-1)) / 180.0f * angleInDegrees;
+
+	// 获取机器人图片的当前坐标和中心
+	auto* pImage = m_pGraph->GetImage(IMAGE_ROBOT);
+	if (!pImage) return;
+
+	// 更新 Rotate 图片的角度,确保角度保持在 [0, 360) 范围内
+	m_pGraph->UpdateImageAngle(IMAGE_ROBOT, static_cast<float>(fmod(pImage->angle + angleInDegrees + 360, 360)));
+
+	int cx = pImage->x + pImage->bmWidth / 2;  // 图片中心 X
+	int cy = pImage->y + pImage->bmHeight / 2; // 图片中心 Y
+
+	// 旋转指示框的坐标
+	auto* pRobot1 = m_pGraph->GetIndicateBox(INDICATE_ROBOT_ARM1);
+	auto* pRobot2 = m_pGraph->GetIndicateBox(INDICATE_ROBOT_ARM2);
+
+	if (pRobot1 && pRobot2) {
+		int newArmX1 = pImage->x + 20;
+		int newArmY1 = 294;
+
+		int newArmX2 = pImage->x + 73;
+		int newArmY2 = 294;
+
+		if (angleInDegrees != 0.0f) {
+			// 计算指示框1的新坐标
+			newArmX1 = static_cast<int>(cx + (pRobot1->x - cx) * cos(angleInRadians) - (pRobot1->y - cy) * sin(angleInRadians));
+			newArmY1 = static_cast<int>(cy + (pRobot1->x - cx) * sin(angleInRadians) + (pRobot1->y - cy) * cos(angleInRadians));
+
+			// 计算指示框2的新坐标
+			newArmX2 = static_cast<int>(cx + (pRobot2->x - cx) * cos(angleInRadians) - (pRobot2->y - cy) * sin(angleInRadians));
+			newArmY2 = static_cast<int>(cy + (pRobot2->x - cx) * sin(angleInRadians) + (pRobot2->y - cy) * cos(angleInRadians));
+		}
+
+		// 更新指示框的位置
+		m_pGraph->UpdateIndicateBoxCoordinates(INDICATE_ROBOT_ARM1, newArmX1, newArmY1);
+		m_pGraph->UpdateIndicateBoxCoordinates(INDICATE_ROBOT_ARM2, newArmX2, newArmY2);
+	}
+
+	// 强制重绘界面
 	Invalidate();
 }
 
@@ -605,7 +659,10 @@
 BOOL CServoDlg::OnEraseBkgnd(CDC* pDC)
 {
 	// TODO: 在此添加消息处理程序代码和/或调用默认值
-
-	//return CDialogEx::OnEraseBkgnd(pDC);
-	return TRUE;
+	if (m_bIsRobotMoving) {
+		// 禁止刷新背景,避免闪烁
+		return TRUE;
+	}
+	
+	return CDialogEx::OnEraseBkgnd(pDC);
 }

--
Gitblit v1.9.3