当前位置: 首页 > 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.jsqmd.com/news/995193/

相关文章:

  • 2026实力之选:观光小火车制造厂综览与选型要点 - 企业推荐官【官方】
  • Java毕设选题推荐:基于springboot和vue的高校学生二手书交易校园二手书交易系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • MPC8272时钟配置与AC时序设计实战指南
  • 告别裸写寄存器:用英飞凌SDL库高效开发Traveo II多核MCU(IAR/GHS双环境指南)
  • LogicMethod讲解
  • c++之ffmpeg+sdl视频播放器
  • 3步终极指南:免费解锁LXMusic全网音乐资源,告别版权限制!
  • 终极网盘下载解决方案:免费油猴脚本一键获取六大云盘直链
  • Trumbowyg:终极轻量级WYSIWYG编辑器解决方案
  • 别再为Kmeans聚类结果不稳定发愁了!用Matlab手把手教你实现Kmeans++(附完整代码与可视化)
  • Python批量生成图片与视频系统——完整开发指南
  • 用STC89C52单片机解码家里遥控器:从NEC协议到电机调速的保姆级实战
  • HFSS场覆盖图实战:从静态分析到动态可视化
  • 嵌入式开发实战:从UDS协议到代码实现,一步步构建安全的ECU Flash Driver
  • 深入解析PowerPC G4 MPC7457:经典RISC处理器的微架构与硬件设计
  • Pimitespib匹米替比治胃肠间质瘤,常见腹泻疲乏,严重肝损患者禁用
  • 暗黑2存档编辑器终极指南:专业玩家的存档管理神器
  • 零基础跨专业求职网安处处碰壁?这些入行必备常识,帮你扫清方向困惑
  • HTML转Figma技术实现:构建从网页到设计系统的自动化桥梁
  • AI 开发 App 工具有哪些?2026 年主流平台全面盘点
  • MPC8548E硬件设计实战:引脚配置、电源规划与高速接口布线详解
  • 从原理图到PCB的Altium Designer 20高效操作链:我的私藏快捷键组合
  • 163MusicLyrics:高效歌词下载工具,轻松获取网易云和QQ音乐歌词
  • FitNets:从“中间层提示”到“深度瘦身”的蒸馏实战
  • 深度强化学习中的后门攻击原理与防御
  • 别再手动点CO01了!SAP BAPI批量创建生产订单的保姆级教程(含长文本处理和状态管理)
  • ShawzinBot终极指南:如何将MIDI音乐转换为Warframe游戏内演奏
  • 船舶振动分析与数据可视化
  • MCprep:终极Blender插件如何让Minecraft动画制作效率提升85%
  • 2026无锡网站建设技术实力测评:本土服务商怎么选不踩坑 - wxxwlm