Thinking.txt 5.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. 【Thinking】
  2. 1. 关于并行工具的设计【需要提前创建线程,而不是在运行过程中临时创建线程】
  3. (1)将并行工具与Pou中其他工具,以及加入并行工具集的子工具都视为平级处理;
  4. (2)这样在绑定的场景中,直接跳过并行类型的工具即可;
  5. (3)在link的场景中,其他工具和并行子工具之间由于是平级关系,link不会被影响到,让goto连接到并行容器的Top接口即可;
  6. (4)加入并行工具集的子工具,由于是平级关系,所以要保留原始序号,Pou执行时同样还是按照序号来执行,
  7. 如果执行到子工具则跳过,执行到并行工具则将其下所有子工具并行启动;
  8. (5)将并行母线设计为并行工具的输出Top接口,这样就可以从输出接口连接线出去连接别的Tool了
  9. 2. 关于并行母线的缩放策略【已完成】
  10. (1)并行母线的缩放的核心代码是写在了 WindowAppItemInterface::updateParallelPosition() 函数中;
  11. (2)因为并行母线本质上是Parallel功能块的一个输出接口(Top类型,用于下联功能块),只是采用了不同于普通接口的特殊绘制方式
  12. 就类似于Goto功能块的输出接口(是一个三角形)类型
  13. (3)并行母线的缩放机制就是遍历其下联的所有link连线,选出其中最左侧和最右侧的连线,如果两者的位置
  14. 超出了并行母线的左右两侧的最小位置,则将并行母线按照这两个参照位置进行调整大小,需要左右各延长出 PARARREL_LINE_EX_LEN 个长度
  15. 3. 关于接口的同步机制【已完成】
  16. (1)普通工具的接口同步:是在工具Execute的时候进行批量同步的,不需要在dll的代码中增加任何操作,
  17. 在 POU::ToolPostExecute()函数中,会自动识别被连接的工具接口,自动加入到同步通知列表中,
  18. 然后通过 POU::syncValuesToUi() 函数向UIManager发送消息,完成到UI界面的同步
  19. (2)硬件工具的接口同步:由于硬件工具没有Execute的动作,所以接口需要更新的话,需要单独发送变量消息通知
  20. 在硬件工具的dll中,调用 syncHdValueToUi() 函数即可方便的完成硬件工具dll接口向exe中的UI的同步
  21. (本质上是通过发送 SyncHdValueEvent 消息到UiManager中统一进行处理,HDVALUE_EVENT_TYPEID类型 )
  22. 4. 关于硬件组态配置与项目工程文件的结合【已完成】
  23. (1)初次创建硬件组态的时候,自动生成一个硬件组态的方案ID,此ID 可通过用户手动修改
  24. (2)使用一个全局变量,来存储这个ID
  25. (2)在保存工程文件的时候,需要将硬件组态的文件打包进去(加入压缩包)
  26. (3)软件每次打开会自动加载 default.hw,加载的硬件组态,会读取到方案ID,来标识当前这个硬件组态方案
  27. (4)在软件加载工程文件的时候,需要首先检测当前方案依赖的硬件组态ID,如果匹配,则继续后续的加载
  28. (5)如果检测到当前工程文件与依赖的硬件组态不匹配(ID对比失败),则提示,让用户选择是释放工程里备份的硬件组态(覆盖 default.hw)重新加载,还是退出加载当前工程
  29. (6)用户在备份工程文件(*.vpp)时候,vpp中自动包含了硬件组态的(*.hw),省去了让用户自己匹配的麻烦
  30. (7)硬件组态与vpp分离的初衷。(硬件加载慢,在有频繁的工程文件切换场景下,可提高工程文件加载速度。避免硬件加载导致的意想不到的结果)
  31. 5. 关于Link连线的拖动以及其他线段的联动【已完成】
  32. (1) 这里用了比较巧妙的简化方法,对于普通link连线,所有都是固定的5段线,从link起点开始编号0 1 2 3 4
  33. (2) 其中0号和4号线段由于分别连接了功能块的输入与输出接口,所以是不允许拖动的;
  34. (3) 而1和3号线段又只能左右拖动,2号线段只能上下拖动,这样就大幅简化了算法了设计;
  35. (4) 并且在线段生成的时候,让每一个线段都保持固定的方向,例如从左到右,从上到下等;
  36. (5) 所以只需要根据具体的拖动线段编号,把相邻的两个的坐标设置一下即可。
  37. 6. 关于功能块拖动时,Link线段的联动【已完成】
  38. (1)此处参考的是visio中的效果,如果是起点功能块拖动,那么只调整0号线和1号线;
  39. (2)如果是终点功能块拖动,那么只调整4号线和3号线;
  40. (3)如果起点功能块拖动时,0号线小于了最小长度,那么所有线条重置;
  41. (4)如果终点功能块拖动时,4号线小于了最小长度,那么所有线条重置
  42. 7. 关于Task等待变量变化时的触发执行机制【已完成】
  43. (1)首先为Interface类型(也就是VARIABLE类型)添加一个用于执行触发动作的ToolEvent结构;
  44. (2)在创建DB类型变量时,增加是否触发的选项,如果选择了需要触发,则默认为此变量初始化一个ToolEvent;
  45. (3)然后在创建Task的界面,可以选择此DB类型的ToolEvent作为Task的触发事件,建立绑定关系;
  46. (4)然后在表格中的变量数值变化时,会自动调用 GvlManager::updateValue() 进行变量数值的更新
  47. 在数值更新的同时向TaskManager发送此ToolEvent,触发到对应的Task进行执行
  48. 8. 关于Tool等待变量变化时的触发执行机制【已完成】
  49. (1)首先专门创建一个内置的Wait工具,专用用于等待变量触发;
  50. (2)为TOOL数据结构增加 QWaitCondition(ToolActivator)结构,用于Wait工具或者其他工具等待变量触发使用
  51. (3)然后还是以TaskManager为统一的变量触发Event接收处,在CustomEvent()中统一进行处理
  52. (4)每一个Wait工具选定了需要绑定的变量Event之后,都需要把 Event-Tool 的触发对应关系,到TaskManager中注册一下
  53. (5)然后TaskManager收到了变量触发的Event之后,首先到Task列表中去查是否有对应的Task需要激活,然后再继续到Tool
  54. 列表中查是否有对应的Tool需要激活,如果有的话则激活这个Tool,使得Wait工具继续执行
  55. (6)在系统退出的时候,需要把所有处于等待状态的Task和Tool都激活一遍,然后再停止执行,防止卡住
  56. 9. 关于UI控件的等宽线绘制机制【已完成】
  57. (1)首先等宽线只有在控件拖动尺寸的时候才会出现,而移动控件的过程中不会出现,所以需要在控件拖动的时候进行判断;
  58. (2)需要注意的是,除了被拖动的主控件之外,其他参考控件的等宽线只会固定出现在右侧和下侧;
  59. (3)而主控件的等宽线是根据拖动位置的不同,需要绘制到不同位置的,优先会出现在右侧和下侧,但是右侧和下侧如果正处于
  60. 拖动变动的过程中,会改到左侧和上侧出现;
  61. (4)设计 WindowAppIsometricLineManager 类来统一管理所有的等宽线,在UiScene收到控件被拖动的消息时,WindowAppIsometricLineManager
  62. 就会启动检查所有的控件是否有宽度相同的控件需要绘制等宽线,而在鼠标抬起时,无论当前处于什么情况,都需要清空所有
  63. 等宽线;
  64. (5)WindowAppItemIsometricLine 类是用来完成单条等宽线数据结构的存储与线条显示;
  65. (6)等宽线的判断逻辑:比较主控件和其他参考控件的右侧和下侧长度,如果有相同的,则绘制对应不同的线条,参考控件直接在右侧或者下侧绘制,
  66. 主控件需要根据拖动的位置计算对应的等宽线绘制位置。