#pragma once #include "ServoGraph.h" #include "ServoCommo.h" namespace SERVO { class CEquipment; class CGlass; } enum DeviceStatus { ONLINE, // 在线 OFFLINE, // 离线 OCCUPIED // 有片(占用) }; struct RobotPositionMapping { SERVO::ROBOT_POSITION position; float percentage; float angle; int arm; // 0 表示 ARM1,1 表示 ARM2 }; // CPageGraph1 对话框 class CPageGraph1 : public CDialogEx { DECLARE_DYNAMIC(CPageGraph1) public: CPageGraph1(CWnd* pParent = nullptr); // 标准构造函数 virtual ~CPageGraph1(); public: std::string GetConfigPath(); void InitRxWindows(); void UpdateDeviceStatus(int id, DeviceStatus status); void UpdateRobotPosition(float percentage); void RotateRobot(float angleInDegrees); void BindEquipmentToGraph(); void MoveRobotToPosition(SERVO::ROBOT_POSITION position); void StartRobotMoveToPosition(SERVO::ROBOT_POSITION position); POINT LoadArmOffset(const std::string& armName); void SaveArmOffset(const std::string& armName, const POINT& pt); void UpdateSlotBars(); void BuildSlotColors(SERVO::CEquipment* pEq, std::vector& colors); COLORREF GetSlotColor(SERVO::CGlass* pGlass, BOOL isProcessing); void ApplySlotBarTestPattern(int mode); void UpdateLegendPosition(); private: IObserver* m_pObserver; CServoGraph* m_pGraph; BOOL m_bIsRobotMoving; COLORREF m_crBkgnd; HBRUSH m_hbrBkgnd; int m_slotBarTestMode; // ===== 机器人动画相关成员变量 ===== // 动画目标位置(机器人目标位置枚举) SERVO::ROBOT_POSITION m_targetRobotPosition; // 动画起始和目标 X 坐标(水平位移) int m_nRobotMoveStartX; int m_nRobotMoveEndX; // 动画步数控制(总步数 & 当前步) int m_nRobotMoveSteps; // 动画总步数(控制动画速度) int m_nRobotMoveCurrentStep; // 当前动画步数进度 // 动画起始和目标角度(旋转角度,单位:度) float m_nRobotMoveStartAngle; // 起始角度 float m_nRobotMoveEndAngle; // 目标角度(旋转角度) // ===== 机器人状态相关成员变量 ===== // 上一次已完成的位置(用于判断是否需要移动) SERVO::ROBOT_POSITION m_lastRobotPosition; // 上一次已更新的机器人 ARM 占用状态(两个机械臂) BOOL m_lastArmState[2]; // 两个机械臂相对于机器人中心的偏移(像素坐标) POINT m_arm1Offset; POINT m_arm2Offset; // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_PAGE_GRAPH1 }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() public: virtual BOOL OnInitDialog(); afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); afx_msg void OnDestroy(); afx_msg void OnSize(UINT nType, int cx, int cy); afx_msg void OnGraphItemClicked(NMHDR* pNMHDR, LRESULT* pResult); afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg void OnTimer(UINT_PTR nIDEvent); };