当前位置: 首页 > news >正文

Convert2ModuleNameTreeNode讲解

先看问题:为什么需要这个东西?

程序里有一个ModuleList,它是一份平铺的、顺序的模块清单。比如用户拖出来的流程可能是这样的:

[拍照] [如果 检测到瑕疵] [打标模块] [否则] [忽略模块] [结束] [保存结果]

但在代码里,这个ModuleList存的是一维数组,没有父子关系:

索引0: "拍照" 索引1: "如果 检测到瑕疵" 索引2: "打标模块" 索引3: "否则" 索引4: "忽略模块" 索引5: "结束" 索引6: "保存结果"

如果只是从头到尾跑一遍,那很简单。但问题来了——执行时需要根据结果跳转。比如"如果 检测到瑕疵"结果是 false,就要跳过"打标模块"和"否则"和"忽略模块",直接跳到"结束"后面的"保存结果"。这时候系统需要知道:

  • "打标模块"的父级是谁?(“如果”)
  • "打标模块"的同级兄弟有哪些?(“打标模块”、"否则"等)
  • “结束"之后是什么?(跳到父级的兄弟"保存结果”)

Convert2ModuleNameTreeNode()就是把平铺列表变成一棵树,让程序能回答上面这些问题。


核心数据结构

就两个东西:

Stack<ModuleNameTreeNode>— 一个栈,栈顶永远指向"当前我属于哪个父级"

ModuleNameTreeNode— 每个节点只存三样:名字、父节点引用、子节点列表


算法:一步步模拟

假设输入(一维列表)是:

[拍照] [如果瑕疵] [标记] [否则] [忽略] [结束] [保存]

栈初始为空[]。逐个遍历:

步骤当前模块栈(之前)操作栈(之后)
1拍照[]不是"开始"类型,栈不变。父级=BaseTreeNode(根)[]
2如果瑕疵[]是"如果"→压栈。父级=BaseTreeNode[如果]
3标记[如果]不是开始类型。父级=栈顶即"如果"[如果]
4否则[如果]是"否则"→先弹栈(结束"如果"分支),再压栈。父级=[]即根[否则]
5忽略[否则]不是开始类型。父级=栈顶即"否则"[否则]
6结束[否则]是"结束"→弹栈。父级=[]即根[]
7保存[]不是开始类型。父级=根[]

最终构建出的树结构:

(根 BaseTreeNode) ├── 拍照 (Parent=根) ├── 如果瑕疵 (Parent=根, ChildList=[标记]) │ └── 标记 (Parent=如果) ├── 否则 (Parent=根, ChildList=[忽略]) │ └── 忽略 (Parent=否则) ├── 结束 (Parent=根) └── 保存 (Parent=根)

这东西实际怎么被使用的

在项目执行的主循环中,ModuleTreeNodeMap被频繁查询:

条件分支跳转— [Project.cs:595](/D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0604-2\VM\01Main\VM.Start\Services\Project.cs:595)

ModuleTreeNodeMap["打标模块"].Parent.ChildList → 得到 ["标记", "否则", "忽略", "结束"]

条件失败时,遍历这个列表跳过所有兄弟,找到"结束"之后继续。

循环跳转— [Project.cs:620](/D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0604-2\VM\01Main\VM.Start\Services\Project.cs:620)

同理,停止循环模块通过ModuleTreeNodeMap[name].Parent.Parent.ChildList找到"循环结束"的位置然后跳出。

一句话总结:把用户可视化的嵌套流程(如果/否则/循环/文件夹),翻译成代码能理解的树结构,让执行引擎知道谁是谁的孩子、谁是谁的兄弟,从而正确跳转。

http://www.rkmt.cn/news/1506959.html

相关文章:

  • Java毕设选题推荐:基于springboot和vue的高校学生二手书交易校园二手书交易系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Trumbowyg:终极轻量级WYSIWYG编辑器解决方案
  • 终极网盘下载解决方案:免费油猴脚本一键获取六大云盘直链
  • 暗黑2存档编辑器终极指南:专业玩家的存档管理神器
  • AI 开发 App 工具有哪些?2026 年主流平台全面盘点
  • 深入解析PowerPC G4 MPC7457:经典RISC处理器的微架构与硬件设计
  • 从原理图到PCB的Altium Designer 20高效操作链:我的私藏快捷键组合
  • 船舶振动分析与数据可视化
  • FitNets:从“中间层提示”到“深度瘦身”的蒸馏实战
  • 深度强化学习中的后门攻击原理与防御
  • Adobe-GenP 3.0破解工具:一键激活Adobe Creative Cloud的终极指南
  • 告别ImageNet偏差:手把手教你用PatchCore+ResNet50搭建工业缺陷检测模型(附代码)
  • 软考系统规划与管理师到底是干嘛的?用“大厂物业经理”的逻辑带你了解软考系规
  • AI Agent的产品化思考:用户体验、价值主张与GTM策略
  • VM-UNet 在 ARCADE 数据集上的医学图像分割完整复现指南
  • MPC8347EA硬件设计深度解析:电源时序、DDR接口与调试实战
  • 3分钟掌握手机号码精准定位:location-to-phone-number完全指南
  • MPC8641硬件设计实战:阻抗匹配、配置引脚与JTAG接口的深度解析
  • 别再手动拼接字节了!用Python的modbus_tk库优雅处理32位浮点数传输
  • 10个实用技巧:Buzz离线音频转写工具提升工作效率的完整指南
  • 郑州配眼镜推荐,功能性镜片不是智商税,郑州五种功能镜片全解析 - 配眼镜新资讯
  • 告别手动调参!用DnCNN在Python/Keras中实现地震信号一键去噪(附完整代码)
  • 彻底解决Umi-OCR中PaddleOCR模型识别异常的3个步骤
  • 通过动态规划优化插电式混合动力电动汽车 (PHEV) 能源管理附Matlab、Simulink代码
  • 告别鼠标手!用这些Altium Designer 20隐藏快捷键,把你的PCB设计速度提上来
  • 基于multisim的温度测量与控制电路设计
  • 动手实现‘诚实但好奇’云环境下的安全最近邻搜索(Python示例)
  • 2026上海GEO优化公司推荐榜:基于真实客户回访数据的深度选型指南 - 资讯纵览
  • 保姆级教程:用Node.js复现拼多多anti_content加密(附完整可运行代码)
  • 用STC89C52+DS1302+LCD1602做个桌面电子钟,附串口调试和闹钟设置完整代码