WindowAppPouScene.h 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. #pragma once
  2. #include "Common.h"
  3. #include "CommonDraw.h"
  4. #include "Pou.h"
  5. #include "VPCommand.h"
  6. class WindowAppBlockPort;
  7. class WindowAppBlockStandard;
  8. class WindowAppBlockGoto;
  9. class WindowAppItemInterface;
  10. class WindowAppItemLink;
  11. class WindowAppPouFrame;
  12. class WindowAppBlockComment;
  13. class WindowAppBlockParallel;
  14. class WindowAppBlockForloop;
  15. class WindowAppBlockWait;
  16. /// <summary>
  17. /// 核心类,用于管理所有的绘图功能块
  18. /// </summary>
  19. class WindowAppPouScene : public QGraphicsScene
  20. {
  21. Q_OBJECT
  22. public:
  23. explicit WindowAppPouScene(const QString& strTitle, QObject* parent = nullptr, QWidget* parentparent = nullptr);
  24. // 生成新的运行时工具信息(拖拽方式)
  25. WindowAppBlockBase* addToolItem(const STATIC_TOOL* pNewTool, QPointF pos);
  26. // 生成新的运行时工具信息(反序列化方式)
  27. WindowAppBlockBase* addToolItem(TOOL* pNewTool, QPointF pos, bool bFromDoc = false);
  28. // 移除一个ToolItem
  29. void delToolItem(WindowAppBlockBase* pBlock);
  30. // 直接增加一个Port,并且连接
  31. void addPortAndAutolink(WindowAppItemInterface* pLinkInf, const QLineF infRealLine);
  32. // 建立link
  33. void addLink(
  34. WindowAppItemInterface* pStartInf,
  35. WindowAppItemInterface* pEndInf,
  36. LINK_MODE linkMode = LINK_MODE::LINK_NORMAL,
  37. QVector<QLineF> linePoints = QVector<QLineF>()
  38. );
  39. // 建立Link(根据接口全名)
  40. void addLink(
  41. const QString& strStartInf,
  42. const QString& strEndInf,
  43. LINK_MODE linkMode = LINK_MODE::LINK_NORMAL,
  44. QVector<QLineF> linePoints = QVector<QLineF>()
  45. );
  46. // 删除指定link连线
  47. void delLink(WindowAppItemLink* pLinkItem);
  48. // 根据接口删除link连线
  49. void delLink(WindowAppItemInterface* pInf);
  50. // 根据接口名字删除link连线
  51. void delLink(const QString& strInf);
  52. // 执行SmartLink
  53. void smartLink(WindowAppItemInterface* pInf);
  54. // 建立Goto到Tool的Link
  55. void addGotoLink(_INTERFACE* pGotoInf, const TOOL* pTool);
  56. // 建立Parallel到Tool的Link
  57. void addParallelLink(_INTERFACE* pParaInf, const TOOL* pTool);
  58. // 功能块序号 减 1
  59. void BlockMoveUp();
  60. // 功能块序号 加 1
  61. void BlockMoveDown();
  62. // 功能块序号 置1
  63. void BlockMoveFirst();
  64. // 功能块序号 置底
  65. void BlockMoveLast();
  66. // 功能块左对齐
  67. void BlockAlignLeft();
  68. // 功能块顶对齐
  69. void BlockAlignTop();
  70. // 功能块右对齐
  71. void BlockAlignRight();
  72. // 功能块底对齐
  73. void BlockAlignBottom();
  74. // 根据接口查询对应的Link连线
  75. QList<WindowAppItemLink*> getLinkItemsByInfItem(WindowAppItemInterface* pInfItem)
  76. {
  77. return this->m_itemInfLinks.values(pInfItem);
  78. }
  79. public:
  80. // 获得本Scene所在的PouFrame(目前主要用于PouFrame的序列化)
  81. WindowAppPouFrame* parentFrame()
  82. {
  83. return m_pPouFrame;
  84. }
  85. // 本Scene所有的Pou管理单元
  86. POU m_Pou;
  87. // 2022-10-5,本Scene的Undo管理单元
  88. VPCommandManager m_CommandManager;
  89. // 当前的模式
  90. SCENE_MODE m_sceneMode;
  91. public slots:
  92. // 鼠标双击
  93. // void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event) override;
  94. void mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent) override;
  95. void mouseMoveEvent(QGraphicsSceneMouseEvent* mouseEvent) override;
  96. void mouseReleaseEvent(QGraphicsSceneMouseEvent* mouseEvent) override;
  97. // block被移动时
  98. void onBlockMove(QGraphicsItem* item);
  99. // 移除内容为空的注释控件
  100. void removeEmptyBlockComment(WindowAppBlockComment* item);
  101. // 接收来自Dll端的动态端口同步消息
  102. virtual void customEvent(QEvent* event) override;
  103. // 接收键盘消息
  104. void keyPressEvent(QKeyEvent* event)override;
  105. // 接收键盘释放消息
  106. void keyReleaseEvent(QKeyEvent* event)override;
  107. signals:
  108. // 某个item被选中时
  109. void itemSelected(QGraphicsItem* item);
  110. protected:
  111. // 添加一个标准工具
  112. WindowAppBlockStandard* addStandardItem(TOOL* pNewTool, QPointF pos, bool bFromDoc = false);
  113. // 添加一个Port工具
  114. WindowAppBlockPort* addPortItem(TOOL* pNewPort, QPointF pos, bool bFromDoc = false);
  115. // 添加一个Goto工具
  116. WindowAppBlockGoto* addGotoItem(TOOL* pNewTool, QPointF pos, bool bFromDoc = false);
  117. // 添加一个Comment工具
  118. WindowAppBlockComment* addCommentItem(TOOL* pNewTool, QPointF pos, bool bFromDoc = false);
  119. // 添加一个Parallel工具
  120. WindowAppBlockParallel* addParallelItem(TOOL* pNewTool, QPointF pos, bool bFromDoc = false);
  121. // 添加一个ForLoop工具
  122. WindowAppBlockForloop* addForloopItem(TOOL* pNewTool, QPointF pos, bool bFromDoc = false);
  123. // 添加一个Wait工具
  124. WindowAppBlockWait* addWaitItem(TOOL* pNewTool, QPointF pos, bool bFromDoc = false);
  125. // 创建功能块
  126. WindowAppBlockBase* createBlock(TOOL* pTool, const QPointF& pos, TOOL_TYPE toolType);
  127. // 开始执行Link动作
  128. void startLink(WindowAppItemInterface* pStartInf, QPointF ptMouse);
  129. // 移动Link连接
  130. void moveLink(QPointF ptMouse, bool blink );
  131. // 结束Link动作
  132. void endLink(QPointF ptMouse);
  133. // 进行连接预检查
  134. int preLinkCheck(QPointF ptMouse, WindowAppItemInterface*& startItem, WindowAppItemInterface*& endItem);
  135. // 检查所有的接口连线是否需要刷新
  136. void updateLinkItemsByBlock(QGraphicsItem* item);
  137. // 2022-5-8,检查并行母线是否需要刷新
  138. void updateParallelLineByBlock(QGraphicsItem* item);
  139. // 2022-6-20,检查是否正在是多选之后的批量移动操作
  140. bool checkBatchMove();
  141. // 2022-8-26,添加完功能块Item后,初始化对应参数(Index、InstanceName、ToolInterface Name等)
  142. void initBlockItem(TOOL*& pNewTool, bool bInitIndex, bool bInitInstName, bool bInitToolInfName);
  143. private:
  144. // 所属的组名
  145. QString m_strPouName;
  146. // 用于Link预览的连接线
  147. QGraphicsLineItem* m_tmpLinkLine;
  148. // 内部使用结构体,用于存储LinkItem相关的详细信息
  149. typedef struct _tagItemLinkInfo
  150. {
  151. bool bStart; // 是否位于Link的起点位置
  152. WindowAppItemLink* pLink; // Link的指针
  153. _tagItemLinkInfo()
  154. {
  155. bStart = false;
  156. pLink = nullptr;
  157. }
  158. bool operator==(const _tagItemLinkInfo& info)const
  159. {
  160. return this->bStart == info.bStart
  161. && this->pLink == info.pLink;
  162. }
  163. } ITEM_LINK_INFO;
  164. // block和对应的link信息(用于接口随着block随动)
  165. // 每个link会存储两条记录,起点和终点分别保存
  166. // 同一个block会有多条记录
  167. QMultiHash<QGraphicsItem*, ITEM_LINK_INFO> m_itemBlockLinks;
  168. // 接口和Link的对应信息
  169. // 同一个接口可能会有多条记录
  170. QMultiHash<WindowAppItemInterface*, WindowAppItemLink*> m_itemInfLinks;
  171. // 记录批量移动的LinkItem,用于进行批量移动使用
  172. QList<WindowAppItemLink*> m_batchMoveLinks;
  173. // 键盘移动功能块的步长(动态步长)
  174. int m_nMoveBlockSleep;
  175. // 2022-1-8增加,PouFrame的指针(父亲的父亲)
  176. WindowAppPouFrame* m_pPouFrame;
  177. };