From aedb3b85fed48cb2cf0abb5fafa8e7591644c9f4 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期一, 02 十二月 2024 08:53:06 +0800
Subject: [PATCH] Merge branch 'liuyang' into clh

---
 SourceCode/Bond/BondEq/FileManager/RecipeManager.cpp |  213 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 213 insertions(+), 0 deletions(-)

diff --git a/SourceCode/Bond/BondEq/FileManager/RecipeManager.cpp b/SourceCode/Bond/BondEq/FileManager/RecipeManager.cpp
new file mode 100644
index 0000000..406156a
--- /dev/null
+++ b/SourceCode/Bond/BondEq/FileManager/RecipeManager.cpp
@@ -0,0 +1,213 @@
+#include "stdafx.h"
+#include <sstream>
+#include <fstream>
+#include <iostream>
+
+// 单例获取
+RecipeManager& RecipeManager::getInstance() {
+    static RecipeManager instance;
+    return instance;
+}
+
+// 构造函数
+RecipeManager::RecipeManager() : m_recipeFolder("Recipe") {}
+
+// 设置配方文件夹
+void RecipeManager::setRecipeFolder(const std::string& folderPath) {
+    m_recipeFolder = folderPath;
+}
+
+// 加载配方(如果文件不存在,加载默认数据)
+bool RecipeManager::loadRecipe(const std::string& recipeName) {
+    std::string filePath = m_recipeFolder + "/" + recipeName + ".xml";
+    pugi::xml_document doc;
+
+    if (!doc.load_file(filePath.c_str())) {
+        std::cerr << "Recipe file not found: " << filePath << ". Loading default recipe." << std::endl;
+        generateDefaultRecipe();
+        return false; // 文件不存在,但加载了默认数据
+    }
+
+    m_axes.clear();
+
+    auto recipe = doc.child("Recipe");
+    for (auto axisNode : recipe.child("Axes").children("Axis")) {
+        AxisInfo axisInfo;
+        axisInfo.id = axisNode.attribute("id").as_int();
+		axisInfo.number = axisNode.attribute("number").value();
+        axisInfo.description = axisNode.attribute("description").value();
+        axisInfo.startAddress = axisNode.attribute("start_address").value();
+        axisInfo.jogDistance = axisNode.attribute("jog_distance").as_double();
+        axisInfo.manualSpeed = axisNode.attribute("manual_speed").as_double();
+        axisInfo.autoSpeed = axisNode.attribute("auto_speed").as_double();
+        axisInfo.accelerationTime = axisNode.attribute("acceleration_time").as_double();
+        axisInfo.decelerationTime = axisNode.attribute("deceleration_time").as_double();
+
+        for (auto positionNode : axisNode.child("Positions").children("Position")) {
+            std::string description = positionNode.attribute("description").value();
+            double positionValue = positionNode.attribute("value").as_double();
+            axisInfo.positions.emplace_back(description, positionValue);
+        }
+
+        m_axes[axisInfo.id] = axisInfo;
+    }
+
+    return true;
+}
+
+// 保存配方
+bool RecipeManager::saveRecipe(const std::string& recipeName) {
+    // 生成文件路径
+    std::string filePath = m_recipeFolder + "/" + recipeName + ".xml";
+
+    // 创建 XML 文档对象
+    pugi::xml_document doc;
+
+    // 如果轴数据为空,生成默认配方
+    if (m_axes.empty()) {
+        generateDefaultRecipe();
+    }
+
+    // 添加配方根节点
+    auto recipe = doc.append_child("Recipe");
+
+    // 添加轴列表节点
+    auto axesNode = recipe.append_child("Axes");
+
+    // 遍历所有轴数据并写入 XML
+    for (const auto& axisEntry : m_axes) {
+        const AxisInfo& axisInfo = axisEntry.second;
+
+        auto axisNode = axesNode.append_child("Axis");
+        axisNode.append_attribute("id") = axisInfo.id;
+        axisNode.append_attribute("number") = axisInfo.number.c_str();
+        axisNode.append_attribute("description") = axisInfo.description.c_str();
+        axisNode.append_attribute("start_address") = axisInfo.startAddress.c_str();
+        axisNode.append_attribute("jog_distance") = axisInfo.jogDistance;
+        axisNode.append_attribute("manual_speed") = axisInfo.manualSpeed;
+        axisNode.append_attribute("auto_speed") = axisInfo.autoSpeed;
+        axisNode.append_attribute("acceleration_time") = axisInfo.accelerationTime;
+        axisNode.append_attribute("deceleration_time") = axisInfo.decelerationTime;
+
+        // 添加定位点列表
+        auto positionsNode = axisNode.append_child("Positions");
+        for (const auto& position : axisInfo.positions) {
+            auto positionNode = positionsNode.append_child("Position");
+            positionNode.append_attribute("description") = position.first.c_str();
+            positionNode.append_attribute("value") = position.second;
+        }
+    }
+
+    // 保存 XML 文件
+    return doc.save_file(filePath.c_str());
+}
+
+// 生成默认配方
+void RecipeManager::generateDefaultRecipe() {
+    m_axes.clear();
+
+    for (int axisId = 1; axisId <= 12; ++axisId) {
+        AxisInfo axisInfo;
+        axisInfo.id = axisId;
+		axisInfo.number = "M100-M" + std::to_string(axisId);
+        axisInfo.description = "Default_Axis" + std::to_string(axisId);
+        axisInfo.startAddress = "D" + std::to_string(5000 + axisId * 10);
+        axisInfo.jogDistance = 0.5;
+        axisInfo.manualSpeed = 10.0;
+        axisInfo.autoSpeed = 15.0;
+        axisInfo.accelerationTime = 0.2;
+        axisInfo.decelerationTime = 0.3;
+
+        for (int posId = 1; posId <= 25; ++posId) {
+            axisInfo.positions.emplace_back("Position " + std::to_string(posId), posId * 10.0);
+        }
+
+        m_axes[axisId] = axisInfo;
+    }
+}
+
+// 获取所有轴信息
+const std::map<int, AxisInfo>& RecipeManager::getAxes() const {
+    return m_axes;
+}
+
+// 获取单个轴信息
+AxisInfo RecipeManager::getAxis(int axisId) const {
+    auto it = m_axes.find(axisId);
+    if (it != m_axes.end()) {
+        return it->second;
+    }
+
+    // 返回一个无效的 AxisInfo
+    return AxisInfo{ -1, "", "", "", 0.0, 0.0, 0.0, 0.0, 0.0, {}};
+}
+
+// 更新轴信息
+bool RecipeManager::updateAxis(const AxisInfo& axisInfo) {
+    if (m_axes.find(axisInfo.id) == m_axes.end()) {
+        return false; // 轴不存在
+    }
+    m_axes[axisInfo.id] = axisInfo;
+    return true;
+}
+
+// 添加新的轴信息
+bool RecipeManager::addAxis(const AxisInfo& axisInfo) {
+    if (m_axes.find(axisInfo.id) != m_axes.end()) {
+        return false; // 轴已存在
+    }
+    m_axes[axisInfo.id] = axisInfo;
+    return true;
+}
+
+// 删除轴信息
+bool RecipeManager::deleteAxis(int axisId) {
+    return m_axes.erase(axisId) > 0;
+}
+
+// 获取所有轴编号
+std::vector<int> RecipeManager::getAllAxisID() const {
+    std::vector<int> axisNumbers;
+    for (const auto& axis : m_axes) {
+        int axisId = axis.first;
+        axisNumbers.push_back(axisId);
+    }
+
+    return axisNumbers;
+}
+
+// 获取指定页的定位点
+std::vector<std::pair<std::string, double>> RecipeManager::getPositions(int axisId, int pageNumber, int pageSize) const {
+    std::vector<std::pair<std::string, double>> result;
+
+    // 检查轴是否存在
+    auto it = m_axes.find(axisId);
+    if (it == m_axes.end()) {
+        return result; // 如果轴 ID 不存在,返回空结果
+    }
+
+    // 获取指定轴的所有定位点
+    const auto& positions = it->second.positions;
+
+    // 确定分页范围
+    int startIndex = (pageNumber - 1) * pageSize;
+    int endIndex = startIndex + pageSize;
+
+    // 遍历定位点,按分页提取数据
+    int index = 0;
+    for (const auto& pos : positions) {
+        const std::string& description = pos.first; // 键:描述
+        double value = pos.second;                  // 值:位置值
+
+        if (index >= startIndex && index < endIndex) {
+            result.emplace_back(description, value);
+        }
+
+        ++index;
+        if (index >= endIndex) {
+            break; // 达到分页结束点
+        }
+    }
+
+    return result;
+}

--
Gitblit v1.9.3