# 当前开发交接 > 更新日期:2026-08-26。本文件只保留当前工作区、本轮验证和下一步。 ## 当前状态 - 梯形图使用连续网格模型:每行固定 10 个 `LadderCell`,输出槽独立保存,竖线使用相邻行之间的 `VerticalConnection` - 工程 JSON 固定为严格 `2.0`;旧 `1.0` 工程直接拒绝,不实现兼容迁移 - 软件逻辑执行器按列传播电源并处理竖线连通分量;离线仿真和真机本地推算的边界保持不变 - `当前窗口需求.md` 的第 1~6 项均已完成:连续网格渲染、统一布局、批量选择删除、编辑后光标前进、内嵌连续输入和逐段运行轨迹均已落地 - 本轮已修复运行轨迹快照重复投影、空行直接输出不补横线、断路输出仍可进入运行三项回归问题 - 梯形图复制粘贴已改为统一片段模型:单横线不再丢失或误复制整行,普通对象片段和明确整行片段使用不同选择语义 - 信捷式语法检查已经落地:`Ctrl+G` 会自动规整当前梯形图的无效横竖线,断路输出保留现场并定位到第 11 列;离线、真机和导出前检查全部已启用逻辑 ## 画布渲染与布局 - `LogicEditorWidget` 已将网格、梯形图内容和选择覆盖层拆开,选择框统一位于 `z=100`,不再被相邻网格覆盖右边或下边 - 网格层按整行一次填充统一画布底色,触点、横线、`Gap` 和输出槽不再使用不同语义底色 - 条件区按常开、常闭、上升沿、下降沿和比较块绘制;输出区按普通/SET/RST 线圈及 MOV/ADD/SUB 指令块绘制,数据块显示完整操作数 - 输出区位于条件网格和右母线之间;左右母线使用同一画笔,并严格止于第一行顶部和最后一行底部 - 画布先生成统一 `RowLayout`;网络分组由相邻行之间是否存在竖线动态推导,绘制和命中测试共同使用布局表 - 左侧只显示三位视觉行号;每个网络首行上方预留独立注释带并使用绿色文字,支路行注释不重复显示 ## 选择与删除 - 选择模式支持左键橡皮筋框选,触点、横线、输出块和竖线可跨行混选 - 普通拖动替换选择,`Ctrl+拖动`追加选择,`Ctrl+单击`切换单个对象;空格只作为编辑光标,不进入删除请求 - `LogicSelectionDeleteRequest` 将条件/横线网格、输出行和竖线 ID 一次提交给 `LogicEditorService::deleteSelection` - 服务会先校验完整请求,再一次清空网格、输出和竖线;结构校验失败会恢复模型及工程修改状态 - 一次批量删除只生成一条撤销记录,单次撤销/重做恢复或重删全部对象 - 普通 `Delete` 删除选择集,整行删除快捷键为 `Shift+Delete` ## 复制和粘贴 - `LogicClipboardFragment` 统一保存网格对象片段或整行片段,主窗口不再分别维护条件、输出和行三套剪贴板 - 单击或框选横线、条件、输出和竖线时保存相对行列;未选位置透明,普通复制不把 `Gap` 作为覆盖内容 - 当前光标行和明确整行选择已经拆开;只有点击左侧行号才复制整行,多行整行选择要求视觉连续 - 整行片段保存完整 10 格、输出、网络注释和选中行内部的竖线,粘贴到当前行之后 - 单输出可明确替换输出槽;混合输出冲突、节点冲突、越过第 10 列、跨行不足、末行竖线和行数上限都会在修改前整次拒绝 - 所有新节点、行和竖线重新分配 ID;一次粘贴只生成一条撤销记录,失败不改变模型、修改状态或历史,成功后新对象保持选中 ## 连续输入与光标前进 - `LogicEditorService` 统一提供“应用指令并返回下一光标”的编辑结果,工具栏、快捷键和命令语输入共享同一套业务规则 - 空逻辑上插入横线或触点时,服务在一个事务内创建首行并写入第 1 格;成功后逐格右移,第 10 格完成后进入输出槽 - 输出成功后跳到当前网络分组后面的第一个网格;当前分组已经位于末尾时,输出和追加完整空行在一个事务内完成,只生成一条撤销记录 - 完全空行直接写输出时自动生成 10 格 `Wire`;已有内容时只补最右有效内容后的尾部 `Gap`,中间的明确断点保持不变 - 输出事务会在修改前检查行数等边界;追加失败时不会留下已写输出、半行数据或额外撤销记录 - 画布内嵌 `QLineEdit` 和指令补全已恢复;双击网格或输出槽可连续输入,`Enter` 提交、`Escape` 取消,输入错误时保留编辑框并显示错误状态 - 连续输入提交条件后右移,走完第 10 列进入输出槽,输出确认后继续停在下一网络首格;滚动和窗口尺寸变化时输入框跟随目标位置 ## 运行轨迹 - 运行态不再使用整格绿色背景;横线、触点左端、触点符号及右端、比较块输入输出线、输出连接线、输出符号和竖线分别读取对应轨迹值着色 - 未导通线路统一使用普通深色,导通线路统一使用监控绿色,故障红色优先;选择覆盖层继续位于最上层 - 竖线只在 `verticalConnectionValues` 明确导通时变绿,缺少轨迹值时保持深色;左右母线使用同一普通颜色 - 控制器和运行监控传递完整 `LogicTraceSnapshot`,只有最终画布按当前逻辑 ID 投影一次;不再因连续调用 `forLogic()` 清空轨迹 - 离线执行器回归覆盖正反转启动、自锁、互锁和停止状态,并校验触点左右端及右侧竖线的真实电源传播 ## 语法检查与运行前校验 - `LogicEditorService::checkSyntax()` 同时执行线路规整和语法检查;只删除 `Wire` 和 `VerticalConnection`,不会删除触点、指令或输出 - 已有完整输出路径的网络只保留参与左母线到输出完整路径的线路;没有输出的悬空线路全部删除,一次规整只生成一条撤销记录 - 输出网络已经断路时保留整个网络现场,返回控制逻辑、网络、视觉行、第 11 列输出槽以及实际断开列;未配置指令返回自身行列 - 主窗口输出栏保存结构化错误位置,双击错误可切换控制逻辑、选中对应网格或输出槽并滚动到可见区域 - `ControlLogic::validateForRunning()` 按列传播结构可达性,并在每个边界合并 `VerticalConnection` 支路 - 带输出的行必须存在一条从左母线到输出槽的完整路径;不可达时错误包含控制逻辑、视觉行和断开列 - 没有输出的自动追加空行允许保留;并联网络中的单条 `Gap` 断路支路也允许保留,只要输出仍能从其他支路到达 - 离线入口、完成 PLC 首读后的真机入口和用户运行程序导出先共用服务层规整和语法检查,再执行领域运行校验;真机未首读时仍优先返回首读未完成 - “双线圈检查”是单独菜单动作,定位第二个重复 M 线圈输出;不混入普通语法检查,也不会在运行前自动阻断 ## 最近验证 - `domain_tests` Release 通过,覆盖断路输出拒绝和竖线并联支路绕过断点 - `logic_editor_service_tests` Release 通过,除既有编辑、复制和输出事务外,覆盖无效横竖线规整、有效并联旁路保留、断路网络保留、一次撤销及独立双线圈检查 - `runtime_mode_service_tests` Release 通过,覆盖运行前先规整独立残线、同一断路详情阻止离线和完成首读后的真机运行 - `runtime_panel_controller_tests` Release 通过,覆盖完整执行器轨迹、画布布局、框选、连续输入、复制粘贴,以及语法错误的条件格和第 11 列输出槽定位 - 网格背景像素回归通过,触点、横线、`Gap` 和输出槽的非线路区域采样颜色完全一致 - `offline_simulation_service_tests` Release 通过,覆盖正反转启动、自锁、互锁、停止及分段电源轨迹 - 13 个 Release Functional 测试目标全量通过 - 主程序已重新构建到 `build/release/release/integrated_platform.exe`,离屏启动 3 秒正常保持 Qt 事件循环 - `git diff --check` 通过;只有工作区既有 `runtime_mode_service_tests.cpp` 的 CRLF/LF 转换提示,没有空白错误 - 尚未连接真实 PLC;本轮修改的是编辑事务、运行前静态校验和离线/本地轨迹投影,不涉及设备写入,因此未做 COM3 真机验证 - 真机模式仍只读取 PLC 缓存并在本地推算梯形图轨迹,不生成、下载或写入 PLC 程序 ## 下一步 - 人工桌面检查常开/常闭/沿触点、SET/RST、比较、MOV/ADD/SUB 的视觉比例,以及不同系统缩放下的框选边框和内嵌输入框位置 - 有真实接线和已确认寄存器地址后,再单独验证真机读回轨迹;验证过程仍不得向 PLC 下载本地梯形图