Files
DTU-HMI/docs/绘图/HMI 图像绘制.drawio

833 lines
75 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<mxfile host="Electron" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/29.6.6 Chrome/144.0.7559.236 Electron/40.8.4 Safari/537.36" version="29.6.6" pages="10">
<diagram name="显示指定层级菜单项流程" id="etDREPkzm4HehLh3Wzss">
<mxGraphModel dx="752" dy="817" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="Dq_V7AeBsTtqcCJDGkD4-1" parent="1" style="swimlane;childLayout=stackLayout;horizontal=1;fillColor=none;horizontalStack=1;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;strokeColor=none;stackBorder=10;stackSpacing=-12;resizable=1;align=center;points=[];whiteSpace=wrap;html=1;" value="显示指定层级菜单项" vertex="1">
<mxGeometry height="100" width="610" x="100" y="560" as="geometry" />
</mxCell>
<mxCell id="Dq_V7AeBsTtqcCJDGkD4-2" parent="Dq_V7AeBsTtqcCJDGkD4-1" style="shape=step;perimeter=stepPerimeter;fixedSize=1;points=[];whiteSpace=wrap;html=1;" value="绘制该层级边框" vertex="1">
<mxGeometry height="57" width="160" x="10" y="33" as="geometry" />
</mxCell>
<mxCell id="Dq_V7AeBsTtqcCJDGkD4-3" parent="Dq_V7AeBsTtqcCJDGkD4-1" style="shape=step;perimeter=stepPerimeter;fixedSize=1;points=[];whiteSpace=wrap;html=1;" value="获取该层级选中菜单项" vertex="1">
<mxGeometry height="57" width="182" x="158" y="33" as="geometry" />
</mxCell>
<mxCell id="Dq_V7AeBsTtqcCJDGkD4-4" parent="Dq_V7AeBsTtqcCJDGkD4-1" style="shape=step;perimeter=stepPerimeter;fixedSize=1;points=[];whiteSpace=wrap;html=1;" value="绘制该层级下菜单项" vertex="1">
<mxGeometry height="57" width="162" x="328" y="33" as="geometry" />
</mxCell>
<mxCell id="Dq_V7AeBsTtqcCJDGkD4-5" parent="Dq_V7AeBsTtqcCJDGkD4-1" style="shape=step;perimeter=stepPerimeter;fixedSize=1;points=[];whiteSpace=wrap;html=1;" value="反显选中项" vertex="1">
<mxGeometry height="57" width="122" x="478" y="33" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="39Z0d1SsfJPrEY7NQ2dw" name="MVP 事件处理流程">
<mxGraphModel dx="1090" dy="1185" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="CHJpIxpMOG3BUcIp9TBN-1" edge="1" parent="1" source="CHJpIxpMOG3BUcIp9TBN-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" target="CHJpIxpMOG3BUcIp9TBN-3" value="">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="CHJpIxpMOG3BUcIp9TBN-2" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;外部事件&lt;/span&gt;" vertex="1">
<mxGeometry height="60" width="120" x="354" y="490" as="geometry" />
</mxCell>
<mxCell id="CHJpIxpMOG3BUcIp9TBN-3" parent="1" style="whiteSpace=wrap;html=1;rounded=0;" value="Presenter 协同层" vertex="1">
<mxGeometry height="60" width="120" x="354" y="570" as="geometry" />
</mxCell>
<mxCell id="CHJpIxpMOG3BUcIp9TBN-4" parent="1" style="whiteSpace=wrap;html=1;rounded=0;" value="View 视图层" vertex="1">
<mxGeometry height="60" width="120" x="284" y="680" as="geometry" />
</mxCell>
<mxCell id="CHJpIxpMOG3BUcIp9TBN-5" parent="1" style="whiteSpace=wrap;html=1;rounded=0;" value="Model 模型层&amp;nbsp;" vertex="1">
<mxGeometry height="60" width="120" x="424" y="680" as="geometry" />
</mxCell>
<mxCell id="CHJpIxpMOG3BUcIp9TBN-6" edge="1" parent="1" source="CHJpIxpMOG3BUcIp9TBN-5" style="endArrow=classic;html=1;rounded=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;edgeStyle=orthogonalEdgeStyle;jumpStyle=arc;startArrow=classic;startFill=1;" target="CHJpIxpMOG3BUcIp9TBN-3" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="594" y="630" as="sourcePoint" />
<mxPoint x="644" y="580" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="CHJpIxpMOG3BUcIp9TBN-7" edge="1" parent="1" source="CHJpIxpMOG3BUcIp9TBN-3" style="endArrow=classic;html=1;rounded=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" target="CHJpIxpMOG3BUcIp9TBN-4" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="374" y="670" as="sourcePoint" />
<mxPoint x="484" y="660" as="targetPoint" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="X0IBgYVqs8-xy_G4TQXO" name="MVP 架构示意图">
<mxGraphModel dx="1090" dy="1185" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="wkRVSMCZ4WoaQlwrK3vp-14" connectable="0" parent="1" style="group" value="" vertex="1">
<mxGeometry height="300" width="600" x="100" y="300" as="geometry" />
</mxCell>
<mxCell id="wkRVSMCZ4WoaQlwrK3vp-1" parent="wkRVSMCZ4WoaQlwrK3vp-14" style="rounded=1;whiteSpace=wrap;html=1;" value="&lt;font style=&quot;font-size: 21px;&quot;&gt;&lt;b&gt;MVP 架构示意图&lt;/b&gt;&lt;/font&gt;" vertex="1">
<mxGeometry height="50" width="600" as="geometry" />
</mxCell>
<mxCell id="wkRVSMCZ4WoaQlwrK3vp-2" parent="wkRVSMCZ4WoaQlwrK3vp-14" style="rounded=1;whiteSpace=wrap;html=1;" value="" vertex="1">
<mxGeometry height="240" width="180" y="60" as="geometry" />
</mxCell>
<mxCell id="wkRVSMCZ4WoaQlwrK3vp-3" parent="wkRVSMCZ4WoaQlwrK3vp-14" style="rounded=1;whiteSpace=wrap;html=1;" value="" vertex="1">
<mxGeometry height="240" width="185" x="207.5" y="60" as="geometry" />
</mxCell>
<mxCell id="wkRVSMCZ4WoaQlwrK3vp-4" parent="wkRVSMCZ4WoaQlwrK3vp-14" style="rounded=1;whiteSpace=wrap;html=1;" value="" vertex="1">
<mxGeometry height="240" width="185" x="415" y="60" as="geometry" />
</mxCell>
<mxCell id="wkRVSMCZ4WoaQlwrK3vp-5" parent="wkRVSMCZ4WoaQlwrK3vp-14" style="rounded=1;whiteSpace=wrap;html=1;" value="&lt;font style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;View (视图层)&lt;/b&gt;&lt;/font&gt;" vertex="1">
<mxGeometry height="40" width="160" x="10" y="70" as="geometry" />
</mxCell>
<mxCell id="wkRVSMCZ4WoaQlwrK3vp-6" parent="wkRVSMCZ4WoaQlwrK3vp-14" style="rounded=1;whiteSpace=wrap;html=1;" value="&lt;b style=&quot;font-size: 16px;&quot;&gt;Presenter (协调层)&lt;/b&gt;" vertex="1">
<mxGeometry height="40" width="160" x="220" y="70" as="geometry" />
</mxCell>
<mxCell id="wkRVSMCZ4WoaQlwrK3vp-7" parent="wkRVSMCZ4WoaQlwrK3vp-14" style="rounded=1;whiteSpace=wrap;html=1;" value="&lt;b style=&quot;font-size: 16px;&quot;&gt;Model (数据层)&lt;/b&gt;" vertex="1">
<mxGeometry height="40" width="160" x="430" y="70" as="geometry" />
</mxCell>
<mxCell id="wkRVSMCZ4WoaQlwrK3vp-8" parent="wkRVSMCZ4WoaQlwrK3vp-14" style="rounded=1;whiteSpace=wrap;html=1;" value="&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;负责显示内容&lt;/b&gt;&lt;/span&gt;" vertex="1">
<mxGeometry height="40" width="160" x="10" y="250" as="geometry" />
</mxCell>
<mxCell id="wkRVSMCZ4WoaQlwrK3vp-9" parent="wkRVSMCZ4WoaQlwrK3vp-14" style="rounded=1;whiteSpace=wrap;html=1;" value="&lt;font style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;负责流程协调&lt;/b&gt;&lt;/font&gt;" vertex="1">
<mxGeometry height="40" width="160" x="220" y="250" as="geometry" />
</mxCell>
<mxCell id="wkRVSMCZ4WoaQlwrK3vp-10" parent="wkRVSMCZ4WoaQlwrK3vp-14" style="rounded=1;whiteSpace=wrap;html=1;" value="&lt;font style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;负责数据和规则&lt;/b&gt;&lt;/font&gt;" vertex="1">
<mxGeometry height="40" width="160" x="430" y="250" as="geometry" />
</mxCell>
<mxCell id="wkRVSMCZ4WoaQlwrK3vp-11" parent="wkRVSMCZ4WoaQlwrK3vp-14" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;rounded=0;" value="&lt;b&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;LCD 显示&lt;/font&gt;&lt;/b&gt;&lt;div&gt;&lt;b&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;LED 指示&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;按键输入&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="60" width="80" x="20" y="150" as="geometry" />
</mxCell>
<mxCell id="wkRVSMCZ4WoaQlwrK3vp-12" parent="wkRVSMCZ4WoaQlwrK3vp-14" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;rounded=0;" value="&lt;b&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;接收外部事件&lt;/font&gt;&lt;/b&gt;&lt;div&gt;&lt;b&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;调用 Model 处理&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;b&gt;更新 View 状态&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="60" width="120" x="230" y="150" as="geometry" />
</mxCell>
<mxCell id="wkRVSMCZ4WoaQlwrK3vp-13" parent="wkRVSMCZ4WoaQlwrK3vp-14" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;rounded=0;" value="&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;b&gt;菜单逻辑计算&lt;/b&gt;&lt;/span&gt;&lt;br&gt;&lt;div&gt;&lt;b&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;参数边界检查&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;b&gt;传感器数据获取&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;b&gt;数据存储读写&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="60" width="120" x="440" y="150" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="HxDEZlLnL0qG7Ur4KydZ" name="页面管理器架构设计">
<mxGraphModel dx="1363" dy="1481" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="LuWILqjna9OgU5SQR-9t-1" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="&lt;font style=&quot;font-size: 29px;&quot;&gt;页面管理器(&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;Page Manager&lt;/span&gt;&lt;/font&gt;&lt;div&gt;&lt;span style=&quot;font-size: 29px;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 29px;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;div&gt;&lt;font style=&quot;font-size: 29px;&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 29px;&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="240" width="500" x="130" y="290" as="geometry" />
</mxCell>
<mxCell id="LuWILqjna9OgU5SQR-9t-2" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="&lt;div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 29px;&quot;&gt;页面栈 Page Stack&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 29px;&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 29px;&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="130" width="500" x="130" y="400" as="geometry" />
</mxCell>
<mxCell id="LuWILqjna9OgU5SQR-9t-3" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="&lt;span style=&quot;font-size: 23px;&quot;&gt;栈顶页面&lt;/span&gt;" vertex="1">
<mxGeometry height="60" width="240" x="140" y="460" as="geometry" />
</mxCell>
<mxCell id="LuWILqjna9OgU5SQR-9t-4" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="&lt;span style=&quot;font-size: 23px;&quot;&gt;后台页面1&lt;/span&gt;" vertex="1">
<mxGeometry height="60" width="240" x="380" y="460" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="R1sptnBL6Yvgqzv1JQT0" name="菜单页面架构设计">
<mxGraphModel dx="1090" dy="1185" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="_v9aWsQiSdQDmT4Fcf7S-1" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="&lt;font style=&quot;font-size: 29px;&quot;&gt;菜单页面&lt;/font&gt;&lt;div&gt;&lt;font style=&quot;font-size: 29px;&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 29px;&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="130" width="500" x="164" y="480" as="geometry" />
</mxCell>
<mxCell id="_v9aWsQiSdQDmT4Fcf7S-2" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="&lt;font style=&quot;font-size: 23px;&quot;&gt;page&lt;/font&gt;" vertex="1">
<mxGeometry height="60" width="120" x="174" y="540" as="geometry" />
</mxCell>
<mxCell id="_v9aWsQiSdQDmT4Fcf7S-3" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="&lt;span style=&quot;font-size: 23px;&quot;&gt;model&lt;/span&gt;" vertex="1">
<mxGeometry height="60" width="120" x="294" y="540" as="geometry" />
</mxCell>
<mxCell id="_v9aWsQiSdQDmT4Fcf7S-4" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="&lt;span style=&quot;font-size: 23px;&quot;&gt;view&lt;/span&gt;" vertex="1">
<mxGeometry height="60" width="120" x="414" y="540" as="geometry" />
</mxCell>
<mxCell id="_v9aWsQiSdQDmT4Fcf7S-5" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="&lt;span style=&quot;font-size: 23px;&quot;&gt;presenter&lt;/span&gt;" vertex="1">
<mxGeometry height="60" width="120" x="534" y="540" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="ae4TW034q6_u2rk01mG-" name="菜单树构建逻辑">
<mxGraphModel dx="1224" dy="1192" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="uTcgnOhw-1hiChn4308x-321" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="主菜单(class=0)" vertex="1">
<mxGeometry height="54" width="171" x="36" y="20" as="geometry" />
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-322" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="参数设置(class=1)" vertex="1">
<mxGeometry height="54" width="187" x="260" y="140" as="geometry" />
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-323" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="信息查看(class=1)" vertex="1">
<mxGeometry height="54" width="187" x="250" y="276" as="geometry" />
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-324" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="关于系统(class=1)" vertex="1">
<mxGeometry height="54" width="187" x="250" y="430" as="geometry" />
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-325" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="定值设置(class=2)" vertex="1">
<mxGeometry height="54" width="187" x="520" y="107" as="geometry" />
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-326" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="开关设置(class=2)" vertex="1">
<mxGeometry height="54" width="187" x="520" y="207" as="geometry" />
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-327" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="运行信息(class=2)" vertex="1">
<mxGeometry height="54" width="187" x="520" y="294" as="geometry" />
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-328" edge="1" parent="1" source="uTcgnOhw-1hiChn4308x-321" style="startArrow=none;endArrow=block;entryX=0.64;entryY=0;rounded=0;edgeStyle=orthogonalEdgeStyle;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" target="uTcgnOhw-1hiChn4308x-322" value="lower">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="380" y="47" />
</Array>
<mxPoint x="240" y="40" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-329" edge="1" parent="1" source="uTcgnOhw-1hiChn4308x-322" style="startArrow=none;endArrow=block;exitX=0.667;exitY=1.037;entryX=0.72;entryY=0;rounded=0;exitDx=0;exitDy=0;exitPerimeter=0;" target="uTcgnOhw-1hiChn4308x-323" value="behind">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-330" edge="1" parent="1" source="uTcgnOhw-1hiChn4308x-323" style="startArrow=none;endArrow=block;exitX=0.75;exitY=1;entryX=0.75;entryY=0;rounded=0;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" target="uTcgnOhw-1hiChn4308x-324" value="behind">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-331" edge="1" parent="1" source="uTcgnOhw-1hiChn4308x-324" style="startArrow=none;endArrow=block;exitX=0.75;exitY=1;entryX=-0.001;entryY=0.171;rounded=0;edgeStyle=orthogonalEdgeStyle;exitDx=0;exitDy=0;entryDx=0;entryDy=0;entryPerimeter=0;" target="uTcgnOhw-1hiChn4308x-322" value="behind 回环">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="390" y="520" />
<mxPoint x="110" y="520" />
<mxPoint x="110" y="149" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-332" edge="1" parent="1" source="uTcgnOhw-1hiChn4308x-322" style="startArrow=none;endArrow=block;exitX=0;exitY=0.75;entryX=0.25;entryY=1;rounded=0;edgeStyle=orthogonalEdgeStyle;entryDx=0;entryDy=0;exitDx=0;exitDy=0;" target="uTcgnOhw-1hiChn4308x-324" value="before 回环">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="180" y="180" />
<mxPoint x="180" y="500" />
<mxPoint x="297" y="500" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-333" edge="1" parent="1" source="uTcgnOhw-1hiChn4308x-323" style="startArrow=none;endArrow=block;exitX=0.269;exitY=0.012;entryX=0.33;entryY=1;rounded=0;exitDx=0;exitDy=0;exitPerimeter=0;" value="before">
<mxGeometry relative="1" as="geometry">
<mxPoint x="321.79" y="276" as="sourcePoint" />
<mxPoint x="300.00000000000006" y="194" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-334" edge="1" parent="1" source="uTcgnOhw-1hiChn4308x-324" style="startArrow=none;endArrow=block;exitX=0.4;exitY=0;entryX=0.399;entryY=0.986;rounded=0;entryDx=0;entryDy=0;entryPerimeter=0;" target="uTcgnOhw-1hiChn4308x-323" value="before">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-335" edge="1" parent="1" source="uTcgnOhw-1hiChn4308x-322" style="startArrow=none;endArrow=block;exitX=1;exitY=0.5;entryX=0;entryY=0.5;rounded=0;entryDx=0;entryDy=0;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" target="uTcgnOhw-1hiChn4308x-325" value="lower">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-336" edge="1" parent="1" source="uTcgnOhw-1hiChn4308x-325" style="startArrow=none;endArrow=block;exitX=0.912;exitY=0.975;entryX=0.91;entryY=0;rounded=0;edgeStyle=orthogonalEdgeStyle;exitDx=0;exitDy=0;exitPerimeter=0;" target="uTcgnOhw-1hiChn4308x-326" value="behind">
<mxGeometry relative="1" x="0.1907" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-337" edge="1" parent="1" source="uTcgnOhw-1hiChn4308x-326" style="startArrow=none;endArrow=block;exitX=0.332;exitY=-0.003;entryX=0.33;entryY=1;rounded=0;exitDx=0;exitDy=0;exitPerimeter=0;" target="uTcgnOhw-1hiChn4308x-325" value="behind 回环">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-338" edge="1" parent="1" source="uTcgnOhw-1hiChn4308x-325" style="startArrow=none;endArrow=block;exitX=0.669;exitY=0.986;rounded=0;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.673;entryY=-0.017;entryDx=0;entryDy=0;entryPerimeter=0;" target="uTcgnOhw-1hiChn4308x-326" value="before 回环">
<mxGeometry relative="1" x="0.1635" y="-6" as="geometry">
<mxPoint as="offset" />
<mxPoint x="647" y="167" as="sourcePoint" />
<mxPoint x="645" y="187" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-339" edge="1" parent="1" source="uTcgnOhw-1hiChn4308x-326" style="startArrow=none;endArrow=block;exitX=0.133;exitY=-0.013;entryX=0.13;entryY=1;rounded=0;exitDx=0;exitDy=0;exitPerimeter=0;" target="uTcgnOhw-1hiChn4308x-325" value="before">
<mxGeometry relative="1" x="0.0153" y="9" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-340" edge="1" parent="1" source="uTcgnOhw-1hiChn4308x-323" style="startArrow=none;endArrow=block;exitX=0.999;exitY=0.807;entryX=0;entryY=0.5;rounded=0;edgeStyle=orthogonalEdgeStyle;entryDx=0;entryDy=0;exitDx=0;exitDy=0;exitPerimeter=0;" target="uTcgnOhw-1hiChn4308x-327" value="lower">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-341" edge="1" parent="1" source="uTcgnOhw-1hiChn4308x-322" style="startArrow=none;endArrow=block;exitX=0.21;exitY=0;entryX=0.5;entryY=1;rounded=0;edgeStyle=orthogonalEdgeStyle;" target="uTcgnOhw-1hiChn4308x-321" value="higher">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-342" edge="1" parent="1" source="uTcgnOhw-1hiChn4308x-323" style="startArrow=none;endArrow=block;exitX=0;exitY=0.5;entryX=0.26;entryY=1;rounded=0;edgeStyle=orthogonalEdgeStyle;exitDx=0;exitDy=0;" target="uTcgnOhw-1hiChn4308x-321" value="higher">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="80" y="303" />
<mxPoint x="80" y="276" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-343" edge="1" parent="1" style="startArrow=none;endArrow=block;entryX=0;entryY=0.83;rounded=0;edgeStyle=orthogonalEdgeStyle;" value="higher">
<mxGeometry relative="1" x="0.4125" as="geometry">
<mxPoint as="offset" />
<Array as="points">
<mxPoint x="250" y="460" />
<mxPoint x="20" y="460" />
<mxPoint x="20" y="40" />
</Array>
<mxPoint x="250" y="460" as="sourcePoint" />
<mxPoint x="36" y="40.019999999999996" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-344" edge="1" parent="1" source="uTcgnOhw-1hiChn4308x-325" style="startArrow=none;endArrow=block;exitX=0.5;exitY=0;entryX=0.905;entryY=0.019;rounded=0;edgeStyle=orthogonalEdgeStyle;entryDx=0;entryDy=0;entryPerimeter=0;exitDx=0;exitDy=0;" target="uTcgnOhw-1hiChn4308x-322" value="higher">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="614" y="80" />
<mxPoint x="429" y="80" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-345" edge="1" parent="1" source="uTcgnOhw-1hiChn4308x-326" style="startArrow=none;endArrow=block;exitX=0;exitY=0.5;rounded=0;edgeStyle=orthogonalEdgeStyle;exitDx=0;exitDy=0;" value="higher">
<mxGeometry relative="1" x="-0.3947" as="geometry">
<mxPoint as="offset" />
<Array as="points">
<mxPoint x="420" y="234" />
</Array>
<mxPoint x="420" y="194" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-346" edge="1" parent="1" source="uTcgnOhw-1hiChn4308x-327" style="startArrow=none;endArrow=block;exitX=0.43;exitY=0;entryX=1.005;entryY=0.163;rounded=0;edgeStyle=orthogonalEdgeStyle;entryDx=0;entryDy=0;entryPerimeter=0;" target="uTcgnOhw-1hiChn4308x-323" value="higher">
<mxGeometry relative="1" x="0.4124" y="-3" as="geometry">
<mxPoint as="offset" />
<Array as="points">
<mxPoint x="600" y="285" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-347" edge="1" parent="1" source="uTcgnOhw-1hiChn4308x-327" style="endArrow=classic;html=1;rounded=0;exitX=0.677;exitY=0.972;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.709;entryY=0.015;entryDx=0;entryDy=0;entryPerimeter=0;curved=1;" target="uTcgnOhw-1hiChn4308x-327" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<Array as="points">
<mxPoint x="710" y="380" />
<mxPoint x="730" y="330" />
<mxPoint x="730" y="300" />
<mxPoint x="720" y="260" />
</Array>
<mxPoint x="657" y="460" as="sourcePoint" />
<mxPoint x="707" y="410" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-348" connectable="0" parent="uTcgnOhw-1hiChn4308x-347" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="before" vertex="1">
<mxGeometry relative="1" x="-0.0353" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-351" edge="1" parent="1" source="uTcgnOhw-1hiChn4308x-327" style="curved=1;endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" target="uTcgnOhw-1hiChn4308x-327" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<Array as="points">
<mxPoint x="750" y="230" />
<mxPoint x="750" y="400" />
<mxPoint x="590" y="390" />
</Array>
<mxPoint x="570" y="484" as="sourcePoint" />
<mxPoint x="620" y="434" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="uTcgnOhw-1hiChn4308x-352" connectable="0" parent="uTcgnOhw-1hiChn4308x-351" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="behind" vertex="1">
<mxGeometry relative="1" x="0.0226" y="-5" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="5RVJ2jwpCgCB7Hji9JxO" name="菜单树判断逻辑">
<mxGraphModel dx="2720" dy="2649" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-1" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="byCurClass &lt; byNextClass" vertex="1">
<mxGeometry height="54" width="241" x="250" y="380" as="geometry" />
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-2" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="进入子菜单" vertex="1">
<mxGeometry height="54" width="140" x="510" y="380" as="geometry" />
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-3" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="current.lower = next" vertex="1">
<mxGeometry height="54" width="190" x="670" y="380" as="geometry" />
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-4" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="next.higher = current" vertex="1">
<mxGeometry height="54" width="209" x="891" y="380" as="geometry" />
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-5" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="byCurClass == byNextClass" vertex="1">
<mxGeometry height="54" width="240" x="250" y="484" as="geometry" />
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-6" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="同层兄弟" vertex="1">
<mxGeometry height="54" width="140" x="511" y="484" as="geometry" />
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-7" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="current.behind = next" vertex="1">
<mxGeometry height="54" width="190" x="670" y="484" as="geometry" />
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-8" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="next.before = current" vertex="1">
<mxGeometry height="54" width="210" x="890" y="484" as="geometry" />
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-9" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="next.higher = current.higher" vertex="1">
<mxGeometry height="78" width="260" x="1140" y="472" as="geometry" />
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-10" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="byCurClass &gt; byNextClass" vertex="1">
<mxGeometry height="54" width="241" x="250" y="591" as="geometry" />
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-11" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="从深层回退" vertex="1">
<mxGeometry height="54" width="140" x="510" y="591" as="geometry" />
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-12" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="next.before = ptLast[nextClass]" vertex="1">
<mxGeometry height="54" width="190" x="670" y="591" as="geometry" />
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-27" edge="1" parent="1" source="HZ-q9eH6YA3dt1o5nvaf-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" target="HZ-q9eH6YA3dt1o5nvaf-26" value="">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-13" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="ptLast[nextClass].behind=next" vertex="1">
<mxGeometry height="54" width="190" x="1140" y="591" as="geometry" />
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-14" edge="1" parent="1" source="HZ-q9eH6YA3dt1o5nvaf-1" style="curved=1;startArrow=none;endArrow=block;exitX=1;exitY=0.5;entryX=0;entryY=0.5;rounded=0;" target="HZ-q9eH6YA3dt1o5nvaf-2" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-15" edge="1" parent="1" source="HZ-q9eH6YA3dt1o5nvaf-2" style="curved=1;startArrow=none;endArrow=block;exitX=1;exitY=0.5;entryX=0;entryY=0.5;rounded=0;" target="HZ-q9eH6YA3dt1o5nvaf-3" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-16" edge="1" parent="1" source="HZ-q9eH6YA3dt1o5nvaf-3" style="curved=1;startArrow=none;endArrow=block;exitX=1;exitY=0.5;entryX=0;entryY=0.5;rounded=0;" target="HZ-q9eH6YA3dt1o5nvaf-4" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-17" edge="1" parent="1" source="HZ-q9eH6YA3dt1o5nvaf-5" style="curved=1;startArrow=none;endArrow=block;exitX=1;exitY=0.5;entryX=0;entryY=0.5;rounded=0;" target="HZ-q9eH6YA3dt1o5nvaf-6" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-18" edge="1" parent="1" source="HZ-q9eH6YA3dt1o5nvaf-6" style="curved=1;startArrow=none;endArrow=block;exitX=1;exitY=0.5;entryX=0;entryY=0.5;rounded=0;" target="HZ-q9eH6YA3dt1o5nvaf-7" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-19" edge="1" parent="1" source="HZ-q9eH6YA3dt1o5nvaf-7" style="curved=1;startArrow=none;endArrow=block;exitX=1;exitY=0.5;entryX=0;entryY=0.5;rounded=0;" target="HZ-q9eH6YA3dt1o5nvaf-8" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-20" edge="1" parent="1" source="HZ-q9eH6YA3dt1o5nvaf-8" style="curved=1;startArrow=none;endArrow=block;exitX=1;exitY=0.5;entryX=0;entryY=0.5;rounded=0;" target="HZ-q9eH6YA3dt1o5nvaf-9" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-21" edge="1" parent="1" source="HZ-q9eH6YA3dt1o5nvaf-10" style="curved=1;startArrow=none;endArrow=block;exitX=1;exitY=0.5;entryX=0;entryY=0.5;rounded=0;" target="HZ-q9eH6YA3dt1o5nvaf-11" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-22" edge="1" parent="1" source="HZ-q9eH6YA3dt1o5nvaf-11" style="curved=1;startArrow=none;endArrow=block;exitX=1;exitY=0.5;entryX=0;entryY=0.5;rounded=0;" target="HZ-q9eH6YA3dt1o5nvaf-12" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-23" edge="1" parent="1" source="HZ-q9eH6YA3dt1o5nvaf-12" style="curved=1;startArrow=none;endArrow=block;exitX=1;exitY=0.5;rounded=0;exitDx=0;exitDy=0;" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
<mxPoint x="890" y="618" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-25" edge="1" parent="1" source="HZ-q9eH6YA3dt1o5nvaf-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" target="HZ-q9eH6YA3dt1o5nvaf-13" value="">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-24" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="next.behind=ptLast[nextClass].higher" vertex="1">
<mxGeometry height="54" width="209" x="891" y="591" as="geometry" />
</mxCell>
<mxCell id="HZ-q9eH6YA3dt1o5nvaf-26" parent="1" style="whiteSpace=wrap;html=1;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);strokeWidth=2;" value="形成回环" vertex="1">
<mxGeometry height="55" width="69" x="1351" y="591" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="zG06bic9s9vmrHAmIL5z" name="模型层初始化顺序">
<mxGraphModel dx="628" dy="611" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="4pC_cjyCFYns3d6entyY-21" edge="1" parent="1" source="4pC_cjyCFYns3d6entyY-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="4pC_cjyCFYns3d6entyY-3">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="4pC_cjyCFYns3d6entyY-1" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);rounded=1;" value="开始" vertex="1">
<mxGeometry height="24" width="210" x="320" y="120" as="geometry" />
</mxCell>
<mxCell id="4pC_cjyCFYns3d6entyY-3" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="计算菜单个数 maxItem " vertex="1">
<mxGeometry height="30" width="210" x="320" y="171" as="geometry" />
</mxCell>
<mxCell id="4pC_cjyCFYns3d6entyY-5" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="统计 0 级菜单数量 by0LevelNum " vertex="1">
<mxGeometry height="30" width="210" x="320" y="225" as="geometry" />
</mxCell>
<mxCell id="4pC_cjyCFYns3d6entyY-6" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="构建菜单树链路" vertex="1">
<mxGeometry height="30" width="210" x="320" y="279" as="geometry" />
</mxCell>
<mxCell id="4pC_cjyCFYns3d6entyY-7" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="补充带子菜单项的右侧箭头》" vertex="1">
<mxGeometry height="40" width="210" x="320" y="328" as="geometry" />
</mxCell>
<mxCell id="4pC_cjyCFYns3d6entyY-8" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="计算各节点 wPos 与 wNum" vertex="1">
<mxGeometry height="30" width="210" x="320" y="387" as="geometry" />
</mxCell>
<mxCell id="4pC_cjyCFYns3d6entyY-9" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="计算整棵菜单树的显示位置" vertex="1">
<mxGeometry height="30" width="210" x="320" y="441" as="geometry" />
</mxCell>
<mxCell id="4pC_cjyCFYns3d6entyY-10" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);rounded=1;" value="函数结束" vertex="1">
<mxGeometry height="20" width="210" x="320" y="500" as="geometry" />
</mxCell>
<mxCell id="4pC_cjyCFYns3d6entyY-13" edge="1" parent="1" source="4pC_cjyCFYns3d6entyY-3" style="curved=1;startArrow=none;endArrow=block;exitX=0.5;exitY=1;entryX=0.5;entryY=0;rounded=0;entryDx=0;entryDy=0;" target="4pC_cjyCFYns3d6entyY-5" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
<mxPoint x="426" y="470" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="4pC_cjyCFYns3d6entyY-15" edge="1" parent="1" source="4pC_cjyCFYns3d6entyY-5" style="curved=1;startArrow=none;endArrow=block;exitX=0.5;exitY=1;entryX=0.5;entryY=0;rounded=0;" target="4pC_cjyCFYns3d6entyY-6" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="4pC_cjyCFYns3d6entyY-16" edge="1" parent="1" source="4pC_cjyCFYns3d6entyY-6" style="curved=1;startArrow=none;endArrow=block;exitX=0.5;exitY=1;entryX=0.5;entryY=0;rounded=0;" target="4pC_cjyCFYns3d6entyY-7" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="4pC_cjyCFYns3d6entyY-17" edge="1" parent="1" source="4pC_cjyCFYns3d6entyY-7" style="curved=1;startArrow=none;endArrow=block;exitX=0.5;exitY=1;entryX=0.5;entryY=0;rounded=0;" target="4pC_cjyCFYns3d6entyY-8" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="4pC_cjyCFYns3d6entyY-18" edge="1" parent="1" source="4pC_cjyCFYns3d6entyY-8" style="curved=1;startArrow=none;endArrow=block;exitX=0.5;exitY=1;entryX=0.5;entryY=0;rounded=0;" target="4pC_cjyCFYns3d6entyY-9" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="4pC_cjyCFYns3d6entyY-19" edge="1" parent="1" source="4pC_cjyCFYns3d6entyY-9" style="curved=1;startArrow=none;endArrow=block;exitX=0.5;exitY=1;entryX=0.5;entryY=0;rounded=0;" target="4pC_cjyCFYns3d6entyY-10" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="GAiekOzPbh1v7V_syctI" name="按键处理逻辑">
<mxGraphModel dx="1440" dy="2571" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="stTsyAOdvTomNQkrpvn1-84" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="开始" vertex="1">
<mxGeometry height="54" width="92" x="1003" y="-180" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-85" parent="1" style="rhombus;strokeWidth=2;whiteSpace=wrap;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="按下哪个键?" vertex="1">
<mxGeometry height="140" width="140" x="979" y="-76" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-86" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="KEY_U" vertex="1">
<mxGeometry height="54" width="106" x="840" y="-80" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-87" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="KEY_D" vertex="1">
<mxGeometry height="54" width="105" x="840" y="-10" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-88" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="KEY_L" vertex="1">
<mxGeometry height="54" width="103" x="840" y="64" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-89" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="KEY_R / KEY_ENT" vertex="1">
<mxGeometry height="54" width="186" x="1080" y="70" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-90" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="KEY_ESC" vertex="1">
<mxGeometry height="54" width="121" x="1153" y="-26" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-91" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="其他按键" vertex="1">
<mxGeometry height="48" width="124" x="1150" y="-110" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-92" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="焦点移动到上一项" vertex="1">
<mxGeometry height="54" width="126" x="690" y="-80" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-93" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="焦点移动到下一项" vertex="1">
<mxGeometry height="54" width="126" x="690" y="-10" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-94" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="先退回上一级" vertex="1">
<mxGeometry height="54" width="126" x="690" y="64" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-95" parent="1" style="rhombus;strokeWidth=2;whiteSpace=wrap;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="是否退回到 0 级菜单?" vertex="1">
<mxGeometry height="100" width="190" x="650" y="150" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-96" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="重新定位到某个 0 级入口的子菜单" vertex="1">
<mxGeometry height="54" width="210" x="700" y="300" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-97" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="停留在上一级菜单项" vertex="1">
<mxGeometry height="56" width="204" x="856" y="150" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-98" parent="1" style="rhombus;strokeWidth=2;whiteSpace=wrap;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="当前项有子菜单?" vertex="1">
<mxGeometry height="100" width="172" x="1087" y="150" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-99" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="进入子菜单" vertex="1">
<mxGeometry height="54" width="140" x="930" y="300" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-100" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="若有回调则执行回调" vertex="1">
<mxGeometry height="54" width="130" x="1080" y="300" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-101" parent="1" style="rhombus;strokeWidth=2;whiteSpace=wrap;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="当前是否在 1 级菜单?" vertex="1">
<mxGeometry height="130" width="206" x="1290" y="28" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-102" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="快速回到初始菜单状态" vertex="1">
<mxGeometry height="54" width="141" x="1220" y="300" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-103" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="退回上一级" vertex="1">
<mxGeometry height="54" width="80" x="1370" y="300" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-104" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="不处理" vertex="1">
<mxGeometry height="50" width="108" x="1310" y="-112" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-106" edge="1" parent="1" source="stTsyAOdvTomNQkrpvn1-84" style="curved=1;startArrow=none;endArrow=block;exitX=0.5;exitY=1;entryX=0.5;entryY=0;rounded=0;" target="stTsyAOdvTomNQkrpvn1-85" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-107" edge="1" parent="1" source="stTsyAOdvTomNQkrpvn1-85" style="startArrow=none;endArrow=block;exitX=0;exitY=0.5;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitDx=0;exitDy=0;" target="stTsyAOdvTomNQkrpvn1-86" value="">
<mxGeometry relative="1" as="geometry">
<mxPoint x="820" y="-30" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-108" edge="1" parent="1" source="stTsyAOdvTomNQkrpvn1-85" style="startArrow=none;endArrow=block;exitX=0;exitY=0.57;entryX=1;entryY=0.5;rounded=0;entryDx=0;entryDy=0;" target="stTsyAOdvTomNQkrpvn1-87" value="">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-109" edge="1" parent="1" source="stTsyAOdvTomNQkrpvn1-85" style="startArrow=none;endArrow=block;exitX=0;exitY=0.71;entryX=1;entryY=0.5;rounded=0;entryDx=0;entryDy=0;" target="stTsyAOdvTomNQkrpvn1-88" value="">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-110" edge="1" parent="1" source="stTsyAOdvTomNQkrpvn1-85" style="startArrow=none;endArrow=block;exitX=1;exitY=0.69;entryX=0.5;entryY=0;rounded=0;" target="stTsyAOdvTomNQkrpvn1-89" value="">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-111" edge="1" parent="1" source="stTsyAOdvTomNQkrpvn1-85" style="startArrow=none;endArrow=block;exitX=1;exitY=0.56;entryX=0;entryY=0.5;rounded=0;entryDx=0;entryDy=0;" target="stTsyAOdvTomNQkrpvn1-90" value="">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-112" edge="1" parent="1" source="stTsyAOdvTomNQkrpvn1-85" style="startArrow=none;endArrow=block;exitX=1;exitY=0.54;entryX=0;entryY=0.5;rounded=0;entryDx=0;entryDy=0;" target="stTsyAOdvTomNQkrpvn1-91" value="">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-113" edge="1" parent="1" source="stTsyAOdvTomNQkrpvn1-86" style="curved=1;startArrow=none;endArrow=block;exitX=0;exitY=0.5;entryX=1;entryY=0.5;rounded=0;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" target="stTsyAOdvTomNQkrpvn1-92" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-114" edge="1" parent="1" source="stTsyAOdvTomNQkrpvn1-87" style="curved=1;startArrow=none;endArrow=block;exitX=0;exitY=0.5;entryX=1;entryY=0.5;rounded=0;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" target="stTsyAOdvTomNQkrpvn1-93" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-115" edge="1" parent="1" source="stTsyAOdvTomNQkrpvn1-88" style="curved=1;startArrow=none;endArrow=block;exitX=0;exitY=0.5;entryX=1;entryY=0.5;rounded=0;entryDx=0;entryDy=0;exitDx=0;exitDy=0;" target="stTsyAOdvTomNQkrpvn1-94" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-116" edge="1" parent="1" source="stTsyAOdvTomNQkrpvn1-94" style="curved=1;startArrow=none;endArrow=block;exitX=0.5;exitY=1;entryX=0.5;entryY=0;rounded=0;" target="stTsyAOdvTomNQkrpvn1-95" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-117" edge="1" parent="1" source="stTsyAOdvTomNQkrpvn1-95" style="startArrow=none;endArrow=block;exitX=0.5;exitY=1;entryX=0.5;entryY=0;rounded=0;exitDx=0;exitDy=0;" target="stTsyAOdvTomNQkrpvn1-96" value="是">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-118" edge="1" parent="1" source="stTsyAOdvTomNQkrpvn1-95" style="startArrow=none;endArrow=block;exitX=0.743;exitY=0.238;entryX=0;entryY=0.5;rounded=0;entryDx=0;entryDy=0;exitDx=0;exitDy=0;exitPerimeter=0;" target="stTsyAOdvTomNQkrpvn1-97" value="否">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-119" edge="1" parent="1" source="stTsyAOdvTomNQkrpvn1-89" style="curved=1;startArrow=none;endArrow=block;exitX=0.5;exitY=1;entryX=0.5;entryY=0;rounded=0;" target="stTsyAOdvTomNQkrpvn1-98" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-120" edge="1" parent="1" source="stTsyAOdvTomNQkrpvn1-98" style="startArrow=none;endArrow=block;exitX=0.1;exitY=1;entryX=0.5;entryY=0;rounded=0;" target="stTsyAOdvTomNQkrpvn1-99" value="是">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-121" edge="1" parent="1" source="stTsyAOdvTomNQkrpvn1-98" style="startArrow=none;endArrow=block;exitX=0.5;exitY=1;entryX=0.5;entryY=0;rounded=0;exitDx=0;exitDy=0;" target="stTsyAOdvTomNQkrpvn1-100" value="否">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-122" edge="1" parent="1" source="stTsyAOdvTomNQkrpvn1-90" style="curved=1;startArrow=none;endArrow=block;exitX=0.5;exitY=1;entryX=0.301;entryY=0.223;rounded=0;entryDx=0;entryDy=0;entryPerimeter=0;" target="stTsyAOdvTomNQkrpvn1-101" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-123" edge="1" parent="1" source="stTsyAOdvTomNQkrpvn1-101" style="startArrow=none;endArrow=block;exitX=0.09;exitY=1;entryX=0.5;entryY=0;rounded=0;" target="stTsyAOdvTomNQkrpvn1-102" value="是">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-124" edge="1" parent="1" source="stTsyAOdvTomNQkrpvn1-101" style="startArrow=none;endArrow=block;exitX=0.91;exitY=1;entryX=0.5;entryY=0;rounded=0;" target="stTsyAOdvTomNQkrpvn1-103" value="否">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="stTsyAOdvTomNQkrpvn1-125" edge="1" parent="1" source="stTsyAOdvTomNQkrpvn1-91" style="curved=1;startArrow=none;endArrow=block;exitX=1;exitY=0.5;entryX=0;entryY=0.5;rounded=0;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" target="stTsyAOdvTomNQkrpvn1-104" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="dIhOnUq7jFqkhXTXlf7A" name="系统架构">
<mxGraphModel dx="237" dy="1037" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="SKzmmjIQc6qRBKoh8kct-1" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=#e1d5e7;strokeColor=#9673a6;fontSize=15;" value="🏗️ 底层基础设施 (Infrastructure)&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;" vertex="1">
<mxGeometry height="150" width="640" x="900" y="849" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-2" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=#d5e8d4;strokeColor=#82b366;" value="🔧 驱动抽象层 (Driver Abstraction)&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;" vertex="1">
<mxGeometry height="152" width="640" x="900" y="686" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-3" parent="1" style="whiteSpace=wrap;strokeWidth=2;" value="⚙️ MVP 业务层 (MVP Business Layer)&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;" vertex="1">
<mxGeometry height="392" width="640" x="900" y="282" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-4" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=#f8cecc;strokeColor=#b85450;" value="⚙️ YC Page&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;" vertex="1">
<mxGeometry height="347" width="170" x="1351" y="307" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-5" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=#fff2cc;strokeColor=#d6b656;" value=" AppInfo Page&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;" vertex="1">
<mxGeometry height="347" width="190" x="1140" y="307" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-6" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=#ffe6cc;strokeColor=#d79b00;" value="📋 Menu Page&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;" vertex="1">
<mxGeometry height="347" width="200" x="916" y="307" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-7" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;" value="🔄 多页面管理层 (Page Management)&#xa;&#xa;&#xa;&#xa;&#xa;" vertex="1">
<mxGeometry height="110" width="640" x="900" y="160" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-8" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=18;" value="📱 应用层 (Application Layer)&#xa;&#xa;&#xa;" vertex="1">
<mxGeometry height="102" width="640" x="900" y="50" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-9" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=#60a917;strokeColor=#2D7600;fontColor=#ffffff;" value="main.c&#xa;系统初始化 / 主循环调度&#xa;/ 生命周期管理" vertex="1">
<mxGeometry height="62" width="420" x="1037" y="80" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-10" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="📦 Page Manager&#xa;栈式调度&#xa;事件分发器" vertex="1">
<mxGeometry height="63" width="185" x="983" y="197" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-11" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="🌍 Global Model&#xa;跨页面共享数据&#xa;持久化配置&#xa;观察者通知" vertex="1">
<mxGeometry height="62" width="180" x="1305" y="197" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-12" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="Model&#xa;菜单数据与状态" vertex="1">
<mxGeometry height="78" width="170" x="933" y="341" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-13" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="Presenter&#xa;事件处理/导航逻辑" vertex="1">
<mxGeometry height="78" width="170" x="933" y="454" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-14" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="View&#xa;菜单渲染绘制" vertex="1">
<mxGeometry height="78" width="170" x="933" y="564" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-15" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="Model&#xa;应用信息数据" vertex="1">
<mxGeometry height="78" width="156" x="1161" y="341" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-16" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="Presenter&#xa;信息展示逻辑" vertex="1">
<mxGeometry height="78" width="156" x="1156" y="454" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-17" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="View&#xa;信息页面渲染" vertex="1">
<mxGeometry height="78" width="156" x="1156" y="564" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-18" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="Model&#xa;YC 配置数据" vertex="1">
<mxGeometry height="78" width="148" x="1363" y="341" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-19" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="Presenter&#xa;YC 控制逻辑" vertex="1">
<mxGeometry height="78" width="148" x="1363" y="454" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-20" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=light-dark(#eeeeee,#1f2020);strokeColor=light-dark(#999999,#cccccc);fontColor=light-dark(#333333,#cccccc);" value="View&#xa;YC 页面渲染" vertex="1">
<mxGeometry height="78" width="148" x="1363" y="564" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-21" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=#f0a30a;strokeColor=#BD7000;fontColor=#000000;flipH=1;legacyAnchorPoints=0;" value="🖥️ LCD 驱动&#xa;显存操作&#xa;图形/文字绘制" vertex="1">
<mxGeometry height="100" width="160" x="1153" y="726" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-22" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=#fa6800;strokeColor=#C73500;fontColor=#000000;flipH=1;legacyAnchorPoints=0;" value="⌨️ 按键驱动&#xa;输入抽象&#xa;本地/远程注入" vertex="1">
<mxGeometry height="100" width="160" x="956" y="726" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-24" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=#e3c800;strokeColor=#B09500;fontColor=#000000;flipH=1;legacyAnchorPoints=0;" value="🎨 渲染端口&#xa;底层绘制接口" vertex="1">
<mxGeometry height="100" width="160" x="1346" y="726" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-25" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=#6d8764;strokeColor=#3A5431;fontColor=#ffffff;" value="🌐 TCP/Socket&#xa;网络通信封装&#xa;跨平台适配" vertex="1">
<mxGeometry height="102" width="150" x="959" y="879" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-26" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=#647687;strokeColor=#314354;fontColor=#ffffff;" value="⚡ 线程工具&#xa;线程管理&#xa;同步机制" vertex="1">
<mxGeometry height="102" width="151" x="1141" y="879" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-27" parent="1" style="whiteSpace=wrap;strokeWidth=2;fillColor=#a0522d;strokeColor=#6D1F00;fontColor=#ffffff;" value="🔤 UTF-8 处理&#xa;编码转换&#xa;字符解析" vertex="1">
<mxGeometry height="102" width="155" x="1351.5" y="879" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-28" edge="1" parent="1" source="SKzmmjIQc6qRBKoh8kct-9" style="startArrow=none;endArrow=block;exitX=0.09;exitY=1;entryX=0.5;entryY=0;rounded=0;" target="SKzmmjIQc6qRBKoh8kct-10" value="">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-29" edge="1" parent="1" source="SKzmmjIQc6qRBKoh8kct-9" style="startArrow=none;endArrow=block;exitX=0.85;exitY=1;entryX=0.5;entryY=0;rounded=0;" target="SKzmmjIQc6qRBKoh8kct-11" value="">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-30" edge="1" parent="1" source="SKzmmjIQc6qRBKoh8kct-12" style="startArrow=block;endArrow=block;exitX=0.5;exitY=1;entryX=0.5;entryY=0;rounded=0;exitDx=0;exitDy=0;" target="SKzmmjIQc6qRBKoh8kct-13" value="">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-31" edge="1" parent="1" source="SKzmmjIQc6qRBKoh8kct-13" style="curved=1;startArrow=block;endArrow=block;exitX=0.5;exitY=1;entryX=0.5;entryY=0;rounded=0;" target="SKzmmjIQc6qRBKoh8kct-14" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-32" edge="1" parent="1" source="SKzmmjIQc6qRBKoh8kct-15" style="startArrow=block;endArrow=block;exitX=0.46;exitY=1;entryX=0.5;entryY=0;rounded=0;" target="SKzmmjIQc6qRBKoh8kct-16" value="">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-33" edge="1" parent="1" source="SKzmmjIQc6qRBKoh8kct-16" style="curved=1;startArrow=block;endArrow=block;exitX=0.5;exitY=1;entryX=0.5;entryY=0;rounded=0;" target="SKzmmjIQc6qRBKoh8kct-17" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-34" edge="1" parent="1" source="SKzmmjIQc6qRBKoh8kct-18" style="startArrow=block;endArrow=block;entryX=0.5;entryY=0;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="SKzmmjIQc6qRBKoh8kct-19" value="">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-35" edge="1" parent="1" source="SKzmmjIQc6qRBKoh8kct-19" style="curved=1;startArrow=block;endArrow=block;exitX=0.5;exitY=1;entryX=0.5;entryY=0;rounded=0;" target="SKzmmjIQc6qRBKoh8kct-20" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-36" edge="1" parent="1" source="SKzmmjIQc6qRBKoh8kct-22" style="curved=1;startArrow=none;endArrow=block;exitX=0.5;exitY=1;entryX=0.5;entryY=0;rounded=0;" target="SKzmmjIQc6qRBKoh8kct-25" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-37" edge="1" parent="1" source="SKzmmjIQc6qRBKoh8kct-25" style="curved=1;startArrow=none;endArrow=block;exitX=1;exitY=0.5;entryX=0;entryY=0.5;rounded=0;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" target="SKzmmjIQc6qRBKoh8kct-26" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-38" edge="1" parent="1" source="SKzmmjIQc6qRBKoh8kct-21" style="curved=1;startArrow=none;endArrow=block;exitX=0.5;exitY=1;entryX=0.5;entryY=0;rounded=0;" target="SKzmmjIQc6qRBKoh8kct-27" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-39" edge="1" parent="1" source="SKzmmjIQc6qRBKoh8kct-11" style="dashed=1;dashPattern=2 3;startArrow=none;endArrow=block;entryX=0.5;entryY=0;rounded=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="SKzmmjIQc6qRBKoh8kct-12" value="">
<mxGeometry relative="1" as="geometry">
<mxPoint x="1403" y="280" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-40" edge="1" parent="1" source="SKzmmjIQc6qRBKoh8kct-11" style="dashed=1;dashPattern=2 3;startArrow=none;endArrow=block;exitX=0.49;exitY=1;entryX=0.5;entryY=0;rounded=0;entryDx=0;entryDy=0;" target="SKzmmjIQc6qRBKoh8kct-15" value="">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-41" edge="1" parent="1" source="SKzmmjIQc6qRBKoh8kct-11" style="dashed=1;dashPattern=2 3;startArrow=none;endArrow=block;exitX=0.5;exitY=1;entryX=0.5;entryY=0;rounded=0;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" target="SKzmmjIQc6qRBKoh8kct-18" value="">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-42" edge="1" parent="1" source="SKzmmjIQc6qRBKoh8kct-10" style="curved=1;startArrow=none;endArrow=block;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="SKzmmjIQc6qRBKoh8kct-6" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-43" edge="1" parent="1" source="SKzmmjIQc6qRBKoh8kct-10" style="curved=1;startArrow=none;endArrow=block;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="SKzmmjIQc6qRBKoh8kct-5" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-44" edge="1" parent="1" source="SKzmmjIQc6qRBKoh8kct-10" style="curved=1;startArrow=none;endArrow=block;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="SKzmmjIQc6qRBKoh8kct-4" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-45" edge="1" parent="1" source="SKzmmjIQc6qRBKoh8kct-14" style="curved=1;startArrow=none;endArrow=block;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="SKzmmjIQc6qRBKoh8kct-21" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-46" edge="1" parent="1" source="SKzmmjIQc6qRBKoh8kct-6" style="curved=1;startArrow=none;endArrow=block;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="SKzmmjIQc6qRBKoh8kct-22" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-48" edge="1" parent="1" source="SKzmmjIQc6qRBKoh8kct-17" style="curved=1;startArrow=none;endArrow=block;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="SKzmmjIQc6qRBKoh8kct-21" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="SKzmmjIQc6qRBKoh8kct-49" edge="1" parent="1" source="SKzmmjIQc6qRBKoh8kct-20" style="curved=1;startArrow=none;endArrow=block;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="SKzmmjIQc6qRBKoh8kct-21" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>