darker
2025-01-16 393f5685448eab573f2c1f15f0725e49ffea8d4b
1. 添加机械臂水平移动功能
已添加2个文件
已修改5个文件
91 ■■■■■ 文件已修改
SourceCode/Bond/Servo/ServoDlg.cpp 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ServoDlg.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ServoGraph.cpp 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ServoGraph.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/x64/Debug/Res/Robot001.bmp 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/x64/Debug/Res/Servo001.bmp 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/x64/Debug/Res/Servo002.bmp 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ServoDlg.cpp
@@ -9,12 +9,16 @@
#include "Common.h"
#include "Log.h"
#include "SecsTestDlg.h"
#include <chrono>
#include <thread>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// Image
#define IMAGE_ROBOT                2
#define INDICATE_BONDER1        1
#define INDICATE_BONDER2        2
@@ -108,6 +112,7 @@
    ON_UPDATE_COMMAND_UI(ID_MENU_WND_LOG, &CServoDlg::OnUpdateMenuWndLog)
    ON_COMMAND(ID_MENU_HELP_ABOUT, &CServoDlg::OnMenuHelpAbout)
    ON_WM_INITMENUPOPUP()
    ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
@@ -156,6 +161,8 @@
    strPath.Format(_T("%s\\res\\Servo001.bmp"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir);
    m_pGraph->AddImage(1, (LPTSTR)(LPCTSTR)strPath, 0, 0);
    strPath.Format(_T("%s\\res\\Robot001.bmp"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir);
    m_pGraph->AddImage(IMAGE_ROBOT, (LPTSTR)(LPCTSTR)strPath, 170, 270);
    // 添加指示器
    // Bonder
@@ -204,10 +211,10 @@
    // Robot
    m_pGraph->AddIndicateBox(INDICATE_ROBOT_ARM1, 620, 294, 48, RGB(22, 22, 22),
    m_pGraph->AddIndicateBox(INDICATE_ROBOT_ARM1, 190, 294, 48, RGB(22, 22, 22),
        RGB(255, 127, 39), RGB(0, 176, 80));
    m_pGraph->SetBoxText(INDICATE_ROBOT_ARM1, "5", "Robot");
    m_pGraph->AddIndicateBox(INDICATE_ROBOT_ARM2, 673, 294, 48, RGB(22, 22, 22),
    m_pGraph->AddIndicateBox(INDICATE_ROBOT_ARM2, 243, 294, 48, RGB(22, 22, 22),
        RGB(255, 127, 39), RGB(0, 176, 80));
    m_pGraph->SetBoxText(INDICATE_ROBOT_ARM2, "6", "Robot");
@@ -486,6 +493,55 @@
    m_btnLog.Invalidate();
}
void CServoDlg::UpdateRobotPosition(float percentage)
{
    // 限制百分比范围在 [0, 1] 之间
    if (percentage < 0.0f) percentage = 0.0f;
    if (percentage > 1.0f) percentage = 1.0f;
    // 根据百分比计算目标 X 坐标
    int startX = m_pGraph->GetImage(IMAGE_ROBOT)->x;
    int endX = static_cast<int>(170 + percentage * (700 - 170));
    int arm1Offset = 20;  // 从图片到ARM1的偏移
    int arm2Offset = 73;  // 从图片到ARM2的偏移
    // 计算移动所需的时间
    int distance = abs(endX - startX);
    int duration = static_cast<int>((distance / 100.0) * 1000);
    auto startTime = std::chrono::steady_clock::now();
    auto endTime = startTime + std::chrono::milliseconds(duration);
    // 开始平滑移动
    while (std::chrono::steady_clock::now() < endTime) {
        auto currentTime = std::chrono::steady_clock::now();
        float progress = std::chrono::duration<float, std::milli>(currentTime - startTime).count() / duration;
        progress = min(progress, 1.0f);
        // 根据进度计算当前位置
        int currentX = static_cast<int>(startX + progress * (endX - startX));
        m_pGraph->UpdateImageCoordinates(IMAGE_ROBOT, currentX, 270);
        m_pGraph->UpdateIndicateBoxCoordinates(INDICATE_ROBOT_ARM1, currentX + arm1Offset, 294);
        m_pGraph->UpdateIndicateBoxCoordinates(INDICATE_ROBOT_ARM2, currentX + arm2Offset, 294);
        // 刷新界面
        Invalidate();
        UpdateWindow();
        // 控制帧率约为 60 FPS
        std::this_thread::sleep_for(std::chrono::milliseconds(16));
    }
    // 确保最后位置精确到目标位置
    m_pGraph->UpdateImageCoordinates(IMAGE_ROBOT, endX, 270);
    m_pGraph->UpdateIndicateBoxCoordinates(INDICATE_ROBOT_ARM1, endX + arm1Offset, 294);
    m_pGraph->UpdateIndicateBoxCoordinates(INDICATE_ROBOT_ARM2, endX + arm2Offset, 294);
    // 界面重绘
    Invalidate();
}
void CServoDlg::OnSize(UINT nType, int cx, int cy)
{
    CDialogEx::OnSize(nType, cx, cy);
@@ -544,3 +600,12 @@
    CDialogEx::OnMove(x, y);
}
BOOL CServoDlg::OnEraseBkgnd(CDC* pDC)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    //return CDialogEx::OnEraseBkgnd(pDC);
    return TRUE;
}
SourceCode/Bond/Servo/ServoDlg.h
@@ -19,6 +19,7 @@
private:
    void Resize();
    void UpdateLogBtn();
    void UpdateRobotPosition(float percentage);
// 对话框数据
@@ -70,4 +71,5 @@
    afx_msg void OnMenuFileExit();
    afx_msg void OnUpdateMenuFileExit(CCmdUI* pCmdUI);
    afx_msg void OnMenuHelpAbout();
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);
};
SourceCode/Bond/Servo/ServoGraph.cpp
@@ -627,3 +627,21 @@
        SendMessage(m_hWndTooltip, TTM_ADDTOOL, 0, (LPARAM)(LPTOOLINFO)&tti);
    }
}
void CServoGraph::UpdateImageCoordinates(int id, int newX, int newY)
{
    IMAGE* pImage = GetImage(id);
    if (pImage != nullptr) {
        pImage->x = newX;
        pImage->y = newY;
    }
}
void CServoGraph::UpdateIndicateBoxCoordinates(int id, int newX, int newY)
{
    INDICATEBOX* pIndicateBox = GetIndicateBox(id);
    if (pIndicateBox != nullptr) {
        pIndicateBox->x = newX;
        pIndicateBox->y = newY;
    }
}
SourceCode/Bond/Servo/ServoGraph.h
@@ -166,6 +166,8 @@
    BOOL GetIndicateBoxRect(int id, LPRECT lprcBox);
    void SetBoxText(int id, const char* pszText, const char* pszTooltip);
    HWND GetSafeWnd();
    void UpdateImageCoordinates(int id, int newX, int newY);
    void UpdateIndicateBoxCoordinates(int id, int newX, int newY);
private:
    HWND        m_hWnd;
SourceCode/Bond/x64/Debug/Res/Robot001.bmp
SourceCode/Bond/x64/Debug/Res/Servo001.bmp

SourceCode/Bond/x64/Debug/Res/Servo002.bmp