综合平台编程器项目的远程存储
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

103 lines
3.5 KiB

  1. #pragma once
  2. #include "domain/control_logic_model.h"
  3. #include <string>
  4. #include <vector>
  5. class ProjectService;
  6. enum class LogicEditorError
  7. {
  8. None,
  9. LogicNotFound,
  10. RungNotFound,
  11. ExpressionNotFound,
  12. NodeNotFound,
  13. InvalidNode,
  14. InvalidOperation,
  15. UnsupportedNodeChange,
  16. DuplicateName,
  17. LastLogicRequired
  18. };
  19. struct LogicEditorResult
  20. {
  21. bool succeeded = false;
  22. LogicEditorError error = LogicEditorError::None;
  23. std::string message;
  24. std::string id;
  25. };
  26. class LogicEditorService
  27. {
  28. public:
  29. explicit LogicEditorService(ProjectService &project_service);
  30. const ControlLogic *findLogic(const std::string &logic_id) const;
  31. const LadderRung *findRung(
  32. const std::string &logic_id, const std::string &rung_id) const;
  33. const LogicNode *findNode(
  34. const std::string &logic_id, const std::string &node_id) const;
  35. const ConditionExpression *findExpression(
  36. const std::string &logic_id,
  37. const std::string &rung_id,
  38. const std::string &expression_id) const;
  39. std::string firstLogicId() const;
  40. std::string firstRungId(const std::string &logic_id) const;
  41. std::string rungIdForNode(
  42. const std::string &logic_id, const std::string &node_id) const;
  43. LogicEditorResult ensureDefaultLogic();
  44. LogicEditorResult addLogic(const std::string &name);
  45. LogicEditorResult renameLogic(
  46. const std::string &logic_id, const std::string &name);
  47. LogicEditorResult removeLogic(const std::string &logic_id);
  48. LogicEditorResult moveLogic(const std::string &logic_id, int offset);
  49. LogicEditorResult setLogicEnabled(const std::string &logic_id, bool enabled);
  50. LogicEditorResult addRung(const std::string &logic_id);
  51. LogicEditorResult removeRung(
  52. const std::string &logic_id, const std::string &rung_id);
  53. LogicEditorResult appendCondition(
  54. const std::string &logic_id,
  55. const std::string &rung_id,
  56. const LogicNodeConfig &config);
  57. LogicEditorResult insertConditionAfter(
  58. const std::string &logic_id,
  59. const std::string &rung_id,
  60. const std::string &target_node_id,
  61. const LogicNodeConfig &config);
  62. LogicEditorResult addParallelBranch(
  63. const std::string &logic_id,
  64. const std::string &rung_id,
  65. const std::vector<std::string> &selected_node_ids,
  66. const LogicNodeConfig &config);
  67. LogicEditorResult setOutput(
  68. const std::string &logic_id,
  69. const std::string &rung_id,
  70. const LogicNodeConfig &config);
  71. LogicEditorResult updateNodeConfig(
  72. const std::string &logic_id,
  73. const std::string &node_id,
  74. const LogicNodeConfig &config);
  75. LogicEditorResult removeNode(
  76. const std::string &logic_id, const std::string &node_id);
  77. LogicEditorResult removeExpression(
  78. const std::string &logic_id,
  79. const std::string &rung_id,
  80. const std::string &expression_id);
  81. private:
  82. static bool isConditionConfig(const LogicNodeConfig &config);
  83. static bool isOutputConfig(const LogicNodeConfig &config);
  84. static std::string nodePrefix(const LogicNodeConfig &config);
  85. static std::string makeUniqueNodeId(
  86. const ControlLogic &logic, const std::string &prefix);
  87. static std::string makeUniqueExpressionId(const ControlLogic &logic);
  88. static std::string makeUniqueRungId(const ControlLogic &logic);
  89. static LogicEditorResult failure(
  90. LogicEditorError error, const std::string &message);
  91. ProjectService &project_service_;
  92. };