336210d612
feat: 批处理多实例并行执行(ProcessQueueAsync 改造)
...
- ProcessQueueAsync 并行化:SemaphoreSlim 限并发(默认 3,TRANSPORTPLUGIN_MAX_PARALLEL 可调 1-20)
- F1 项(副实例检测)天然并行;非 F1 项(主 NW 检测)mainDetectionGate 串行保护(共享动画/渲染状态)
- 统计用 Interlocked/lock 线程安全;进度条后台更新
- 修复 InstanceManager LaunchInstance 并发 PID 定位错位(启动+定位加 _launchLock 串行,3 实例 PID 独立)
验证:3 个 Ground 项并行(3 副实例 18778/18779/18780),全部 Completed,PID 独立
2026-08-05 13:13:53 +08:00
2fae6028d1
fix: 多实例并行前的单实例假设清理
...
- LogManager 按端口隔离日志文件(TRANSPORTPLUGIN_TEST_PORT → debug-{port}.log):副实例启动的 ClearLog 不再清空主实例日志,跨进程写不冲突
- SectionBoxBatchDetector 工作文件名加 instanceId 唯一标识(model-{id}.nwd/route-{id}.json/secondary-{id}.db):并行/重试同目录不冲突
- NavisworksInstanceManager.LaunchInstance 前清理 AutoSave(副实例不弹恢复框)
- BatchQueueManager 传 instanceId
验证:F1 正常(28 碰撞 + F2 4/4),副实例日志隔离生效(debug-18778.log)
2026-08-05 13:07:32 +08:00
1cc348d271
refactor: NavisworksInstanceManager 独立模块(多实例管理),SectionBoxBatchDetector 委托
...
- 新增 NavisworksInstanceManager(src/Core/Services/):端口池分配(18778-18797,20 个并行实例)、
LaunchInstance(环境变量注入+进程定位)、WaitReadyAsync(ping+数据库+进程监控)、
CloseInstance/CloseAll(优雅退出→强杀→释放端口)
- NavisworksInstanceHandle:实例句柄(端口+进程+HTTP),Dispose 自动关闭并释放端口
- SectionBoxBatchDetector 重构:启动/就绪/关闭委托 InstanceManager,业务逻辑(导出/导入/检测/映射)保留
- 设计:独立模块,批处理只是调用方;将来其他模块(映射/批量并行/其他功能)可复用
验证:F1 重构后正常(28 碰撞 + F2 4/4,实例管理日志生效)
2026-08-05 13:01:51 +08:00
fcd4b34983
feat: F1 可靠性——总 deadline + 副实例进程存活监控(防止批处理无限等待)
...
- 整个 F1 流程 6 分钟硬超时(OverallTimeout),超时强制关闭副实例并失败
- 各阶段(ping/db就绪/导入/解析)传副实例进程:进程退出(HasExited)立即失败,不等待 HTTP 超时
- run 检测请求:CancellationTokenSource 联动总 deadline + 进程监控(进程退出 → cts.Cancel → 立即失败)
- 异常分类:进程退出 vs 总超时 vs HTTP 错误,明确错误信息
解决:副程序已结束但批处理干等(TCP 挂起)的无限等待问题
2026-08-05 12:52:11 +08:00
9cc9c56362
feat: F3 清理与恢复(副实例退出等待+工作目录清理重试)+ 计划文档更新
...
- CloseSecondaryInstance:Kill 后 WaitForExit(释放模型文件句柄)
- 工作目录清理带重试(3 次×1.5s,兼容副实例文件锁未释放)
- 计划文档 F1/F2/F3 勾选完成,F4 待大模型实测
2026-08-05 12:46:17 +08:00
98d01595c3
feat: F2 碰撞对象映射回主模型(层级链为桥)+ F1 稳定性修复
...
F2:
- 副实例 report collidedObjects 升级为对象详情(name + 副 PathId + ancestorChain)
- 主 NW 导出时构建盒内对象映射(chain去根 → 主 PathId)
- 碰撞对象按层级链(去根一致)映射回主模型 PathId,报告可定位(实测 4/4 映射成功)
稳定性修复(F1 间歇失败根因):
- UnitsConverter 缓存 NaN 兜底:无参因子方法 NaN 时用显式 ActiveDocument.Units(副实例导出 NWD 单位不稳定,两缓存因子不同步)
- 副实例数据库就绪等待:PathPlanningManager.IsDatabaseReady + status 端点暴露 + F1 导入前轮询(修复'路径先导入、库后创建'导致路径丢失→检测记录外键失败)
- 修复 UnitsConverter 编辑事故(无参/显式 GetMetersToUnitsConversionFactor 重复)
验证:F1 Ground + Chair Lounge Couch Double,碰撞 28/28,F2 映射 4/4
2026-08-05 12:33:41 +08:00
832caaffef
feat: F1 剖面盒自动检测完整链路跑通(真实物体)
...
- SectionBoxBatchDetector:路径剖面盒(复用 SectionClipHelper.CalculatePathClipBox 产品语义)→ 导出局部 NWD → 副实例检测 → 报告回传
- 移动物体跨实例解析:导出剖面盒保留节点树结构,去掉根后主/副层级链一致,按 ancestorChain 匹配(用户验证结论)
- 副实例临时库:TRANSPORTPLUGIN_TEST_DB_PATH 环境变量显式指定,createIfMissing 时强制创建(解决检测记录无法落库→报告失败)
- 副实例进程定位:cmd start detach 后按新 Roamer PID 定位并关闭
- batch-queue-add:真实物体写入 ModelItemReferences(MovingObject),F1 从引用读移动物体名/PathId/层级链
- batch-queue-process:改后台执行立即返回(模态进度条不阻塞 HTTP),调用方轮询数据库状态
- 集成测试标准场景:自动测试_Ground 更新(用户修改)+ Ground 真实物体改 Chair Lounge Couch Double
验证:F1 Ground + Chair Lounge Couch Double,碰撞 28/28,链路完整
2026-08-05 12:11:37 +08:00
d99cbd8b5f
feat: E4 剖面盒自动检测链路实验完成(分支验证)
...
- E4-1 端口隔离:TestAutomationHttpService 端口读环境变量 TRANSPORTPLUGIN_TEST_PORT(多实例并行)
- E4-2 副实例无头检测:导出模型无 .db 时 PathPlanningManager 仍可用,import+动画+检测链路通
- E4-3 run-virtual-collision-test report 扩展 collidedObjects(碰撞对象名字列表)
- E4-4 端到端:主实例导出 NWD→副实例(18778)检测→报告 JSON 回传闭环验证
- 文档更新 E4 实验结论(全部通过,进入 F1-F4 正式实施)
2026-08-05 10:59:47 +08:00
aa8e9e55c5
docs: 剖面盒导出+批处理自动检测方案评估与实施计划
...
- 可行性结论:可行(E4 实验验证多实例+加载小模型)
- 架构:主 NW 批处理 + 副 NW 无头检测 worker + HTTP 驱动 + 报告 JSON 回传
- E4 实验新发现:副实例无 .db 跳过数据库连接、HTTP 端口冲突需隔离
- 实施清单:E4 完整链路实验 → 批处理状态机 → 映射表/清理/大模型实测
2026-08-05 10:51:40 +08:00
3b31c0c92d
chore: 版本 0.17.0 — 集成测试体系完整化(T01-T16,25/25 通过)
...
- CHANGELOG 记录 0.17.0:集成测试体系(真实物体/逐帧/Free/报告/绕障/多策略/网格诊断/持久化/路径编辑导出/播放控制/批量队列/路径分析/剖面盒导出)
- 测试服务端点 24 个、标准路径自动导入、动画 15fps/5s 加速
- Bug 修复:报告残留/并发污染/InstanceGuid/ModelPath 动态解析/CollisionResults 废弃表/删点链路/PathPoints 主键
- 脚本改进:AutoSave 清理根治恢复弹窗、文件关联打开模型、启动 4.4s
- VERSION.md 0.16.1 → 0.17.0
2026-08-04 18:48:40 +08:00
ac454196f1
feat: 集成测试补 T16 剖面盒导出(25/25 通过)
...
- 服务端新增 export-section-box 端点:mode=bbox(指定包围盒,测试可控)/ mode=activeView(UI 剖面盒)
- 新增 SectionBoxExportAutomationTests:导出 NWD 文件存在/对象数/文件大小/隐藏节点断言
- 客户端 ExportSectionBoxAsync 方法
2026-08-04 18:44:01 +08:00
8e5d9e845f
feat: 集成测试补 T11-T15(P0+P1+P2 全部完成,24/24 通过)
...
- T11 路径编辑(PathEditingAutomationTests):删除点/更新位置/正交化/去环
- T12 路径导出(ExportImportRoundTripAutomationTests):XML/JSON 导出→导入回环
- T13 播放控制(AnimationPlaybackControlAutomationTests):pause 验证帧停止/resume 前进
- T14 批量队列(BatchQueueAutomationTests):队列添加/计数递增
- T15 路径分析(PathAnalysisAutomationTests):评分结构验证
- 服务端新增 5 端点:export-route-file/edit-route/animation-playback-control/batch-queue-add/analyze-path
- 产品 bug 修复:PathDatabase.CollisionResults 表已废弃→GetCollisionCount 改查 CollisionReports、
SaveCollisions 异常保护;路径编辑真删点走 PathRoute.RemovePoint(RemovePathPoint 仅 3D 标记)
验证:集成测试 24/24 通过,完整集 74.6s(15fps/5s 动画)
2026-08-04 18:39:16 +08:00
59e323f9bb
feat: 集成测试补 T07-T10(P0+P1 全部完成,18/18 通过)
...
- T07 障碍绕行(AutoPathObstacleDetourAutomationTests):跨模型起终点直线 11.0m→规划 11.57m 绕行,blocked=0
- T08 多策略(同测试类):Shortest/Straightest 参数回传 + 均规划有效路径
- T09 网格诊断(RouteGridDiagnosticsAutomationTests):网格参数/路径点覆盖/段一致性
- T10 持久化(DetectionRecordPersistenceAutomationTests):检测记录重载验证(动画参数 15fps/5s 落库)
- 服务端:PathPlanningManager.GetDetectionRecordById + /api/test/detection-record 端点
- 客户端:RunAutoPathAsync 支持 strategy、GetRouteGridDiagnosticsAsync、GetDetectionRecordAsync
验证:集成测试 18/18 通过,完整集 65.8s
2026-08-04 18:21:18 +08:00
44214baa00
feat: 集成测试补 T05/T06 + 动画加速与多项基础设施修复
...
测试新增:
- T05 Free 自由路径(FreePathAutomationTests:完整动画 + 逐帧位置=路径点)
- T06 碰撞报告内容断言(CollisionReportAssertions 接入虚拟/真实物体测试)
服务端增强:
- list-model-items 端点(枚举物体:DisplayName/PathId/包围盒中心/祖先链)
- run-virtual-collision-test 支持 frameRate/durationSeconds(测试动画加速:15fps/5s)
- 测试执行串行锁(SemaphoreSlim,防客户端超时后任务占用 UI 线程并发污染)
- 标准路径清单/XML 增加自动测试_Free
Bug 修复:
- AnimationControlViewModel.InvalidateLastGeneratedReport(跨测试碰撞报告残留)
- 真实物体身份校验 ReferenceEquals→InstanceGuid(NW ModelItem 实例不保证同引用)
- 真实物体动态解析(ModelPath 跨会话不稳定,禁止硬编码 PathId)
- PathImportValidity 测试点 Id 随机化(PathPoints.Id 全局主键,p1/p2 固定会冲突)
- start-navisworks.ps1:启动前清理 AutoSave(避免恢复弹窗拦截)、文件关联打开模型、dismiss 兜底、启动 15s→4.4s
验证:集成测试 13/13 通过,完整集 6min→59.6s(动画 15fps/5s)
2026-08-04 18:13:26 +08:00
8f477c0e1c
feat: 集成测试新增动画逐帧状态验证(P0 T04)
...
- 服务端新增 probe-animation-frames 端点:生成动画后 SeekToProgress 到多个进度点,返回物体跟踪位置/yaw
- 新增 AnimationFrameProbeAutomationTests:
- Ground:起点/终点 XZ 匹配路径点、高度恒定(平面链)、中间帧在起终点之间
- Hoisting:吊装剖面(起吊地面→悬挂升高→下降落地)+ 水平平移
- 集成测试 11/11 通过(P0 高风险区全部完成:真实物体 + 逐帧状态)
2026-08-04 17:11:57 +08:00
b5cfcbf8ac
feat: 集成测试新增真实物体动画验证(P0 T01-T03)
...
- 服务端 run-virtual-collision-test 支持 useVirtualObject=false + animatedObjectPath(ModelPath 定位,解决 DisplayName 重名)
- ResolveAnimatedObjectFromQuery 支持按 CreatePathId 的 PathId 精确匹配
- 修复 ModelItem 身份校验:ReferenceEquals 对 NW API 同一逻辑对象不同实例不可靠,改用 InstanceGuid 比较
- 新增 RealObjectAnimationAutomationTests:Ground/Hoisting/Rail 真实物体动画完整流程
(42" Diameter=0/0/660/0,25" x 25"=0/0/769/0)
- 集成测试 9/9 通过(3 虚拟碰撞 + 1 autoPath + 2 导入 + 3 真实物体)
2026-08-04 16:52:37 +08:00
454590ae26
docs: 新增集成测试覆盖补充计划跟踪文档
...
- 记录现有集成测试覆盖(6 个测试)与核心功能缺口(15 项待补,分 P0/P1/P2 优先级)
- P0 高风险区:真实物体动画(Ground/Hoisting/Rail)、动画逐帧状态验证
- P1 功能面:Free 路径、碰撞内容验证、自动路径障碍绕行/多策略、网格诊断、持久化
- P2 需新增端点:路径编辑/导出、播放控制、批量任务、路径分析
- 附带测试服务端点支撑能力清单与完成记录表(checkbox 跟踪)
2026-08-04 16:42:05 +08:00
d04c37a7a5
vendor Navisworks 2026 API DLL into repo, use relative references
...
- Add libs/navisworks-2026/ with 6 API DLLs + 3 XML doc files copied
from local Navisworks Manage 2026 install (Api/Timeliner/Clash/
Controls/ComApi/Interop.ComApi)
- Change TransportPlugin.csproj and UnitTests csproj HintPaths from
absolute Program Files paths to relative libs paths (build no longer
depends on the Navisworks installation directory)
- Keep Private=False semantics for plugin (NW loads its own DLLs at
runtime) and Private=True for unit tests
- Record the libs reference rule in AGENTS.md to prevent regression
Verified: compile successful, 255/255 unit tests pass
2026-08-04 11:57:20 +08:00
5bdfa8281d
docs: 强化 AGENTS.md 单位原则——模型单位≠米(取决于文档单位),补充测试警示
...
- 新增三层单位语义表(模型单位/米/配置项)
- 强调模型单位取决于当前 NW 文档单位(如 Floor2 为英尺,1米=3.281模型单位),禁止假设等于米
- 明确 TotalLength 等长度属性返回米,禁止二次换算
- 新增 §6.4 测试警示:集成测试断言长度必须按文档单位因子换算,涉及单位换算的断言不放单测
- 排查指引新增'长度/尺寸偏差约 3.28 倍'条目(源于本次集成测试单位踩坑)
2026-08-02 21:22:31 +08:00
c9c29c7170
refactor: 依赖 Navisworks 的路径导入验证从单测迁移至集成测试
...
- 删除 UnitTests/Core/PathPersistenceTests.cs:单测进程无法初始化 Navisworks API,
Rail/Hoisting 路径导入必经的长度计算(Point3D 访问)必然失败,测试'假通过'且每次产生 ERROR 日志噪音
- 新增集成测试 PathImportValidityAutomationTests:验证完整流程
JSON/XML 导入 → Rail 属性映射 → 长度计算(含文档单位换算)→ 切换路径 → 完整动画/碰撞流程
- TestAutomationHttpService 新增 /api/test/import-route-file 端点(overwrite 语义保证可重复执行)
- NavisworksTestAutomationClient 新增 ImportRouteFileAsync/SelectRouteAsync/routeName 重载
- 修正 auto-test-routes.xml Rail 属性为有效枚举值(UnderRail/RailCenterLine,与原路径一致)
验证:单测 255/255 且 API must be initialized 错误日志归零;集成测试 6/6 通过
2026-08-02 21:19:23 +08:00
43df07c84d
feat: 集成测试标准路径自动导入机制
...
- 新增 resources/auto-test-routes.xml 标准测试路径资源(自动测试_Ground/Hoisting/Rail + 测试基准),缺失时由插件自动导入,无需人工维护数据库
- TestAutomationHttpService 新增 EnsureAutoTestRoutesImported(),挂接在 ResolveVirtualCollisionRoute 与 SelectDefaultRoutePayload 找不到路径时;资源定位用 Assembly.GetExecutingAssembly().Location
- csproj 添加 auto-test-routes.xml 复制配置(构建→部署目录 resources/)
- 标准 Hoisting 路径改为 4 点含水平平移段,修复 2 点纯垂直路径触发'平面路径第 0 帧未能生成完整姿态'的动画生成失败
- 集成测试套件 4/4 通过(Ground/Hoisting/Rail 碰撞 + AutoPath)
2026-08-02 21:02:15 +08:00
488e69d27a
fix: 脚本统一用 pwsh 替代 powershell,MSTest adapter 动态查找
...
- start-navisworks.bat / run-ground-virtual-collision-test.bat:
powershell → pwsh(避免依赖 shim/PS5.1,UTF-8 中文输出更可靠)
- deploy-plugin.bat 提权兜底:PowerShell → pwsh(内外一致)
- run-unit-tests.bat:MSTest adapter 路径硬编码 3.0.4 → 通配符动态查找
(包升级后不再失效)
2026-08-02 20:41:18 +08:00
8ee06586af
docs: Shell规范更新——rg/fd等读取命令用bash直接执行
...
历史:早期默认shell有UTF-8乱码才统一用pwsh;现已配置Git Bash
(shellPath),原生支持UTF-8。更新规范:
- rg/fd/读日志等搜索读取 → bash 直接执行
- .bat 部署/编译/测试流水线 → 仍走 pwsh
2026-08-02 20:33:38 +08:00
81ddf5997f
refactor: 调整物体统一接口,任何调整后自动触发路径对齐
...
新增统一接口:
- ApplyObjectAdjustment(correction, lift):只设置调整结果(第一步),
内部自动调用 ApplyObjectStartPlacementRequest 触发路径对齐(第二步)
- ApplyObjectTranslationOnly(lift):平移模式(保持姿态)
所有调整功能统一走此接口:
- 对话框确认(角度输入/自动调整/平移)
- 贴合地面(ApplyAlignToGround)
不再各自手工定位,路径对齐统一由 ApplyObjectStartPlacementRequest 处理。
257 单测全过
2026-08-01 13:31:54 +08:00
d1ab271578
fix: 贴合地面改为走第二步路径对齐定位,不再手工底边贴地
...
此前贴合地面自行手工定位"底边贴地"(Ground 语义),绕过了路径对齐,
Free 路径下物体中心未对齐路径点。改为:
- 第一步:计算姿态修正 + 上下偏移(路径无关)
- 第二步:ApplyObjectStartPlacementRequest 按路径语义定位起点
(Ground → 底面贴地+lift;Free → 中心在路径点+lift)
移除手工原地旋转和底边贴地平移。
257 单测全过
2026-08-01 13:26:11 +08:00
775c7b6fad
fix: 贴合地面 yaw 搜索移除路径类型 gate
...
贴合地面后绕宿主Up搜索最小截面对齐路径方向,与路径类型无关。
移除 Ground/Hoisting/Free 条件,只要路径有方向(≥2点)就执行。
257 单测全过
2026-08-01 13:12:28 +08:00
a4b7b679f0
fix: 贴合地面 Free 路径补上路径方向 yaw 对齐
...
ApplyAlignToGround 的路径 yaw 搜索条件只含 Ground/Hoisting,
Free 被排除导致贴合地面后物体面朝下但未对齐路径方向。
加入 Free,贴合地面后同样搜索最小截面对齐路径。
257 单测全过
2026-08-01 13:09:45 +08:00
53ae232ebc
refactor: 起点放置按两步架构分离(调整物体统一 + 路径对齐各自处理)
...
按架构原则重构 MoveObjectToPathStart 和 PreservingInitialPose:
- 第二步:路径起点位置对齐(各路径类型各自处理,不含 lift)
- 第一步:调整物体的上下偏移(统一应用,路径无关,无分支)
- Rail 因流程提前返回(三维姿态就地应用),lift 在其分支内应用
- 更新设计文档记录架构原则
257 单测全过
2026-08-01 12:56:11 +08:00
fc8ff51ae1
fix: 平移功能 Free 路径物体中心对齐起点
...
MoveObjectToPathStartPreservingInitialPose 无 Free 分支,Free 落入
else(Ground)逻辑加了半高偏移,导致平移后物体中心不在起点。
新增 Free 分支:路径点即物体几何中心,仅叠加上下偏移。
257 单测全过
2026-08-01 12:48:32 +08:00
7fd57832e5
refactor: 上下偏移改为路径类型无关,统一沿宿主up应用
...
- ApplyGroundPathObjectLiftOffset 移除 Ground/Free gate,所有路径类型生效
- 起点:Free/Hoisting/Rail/Ground 统一在解析中心后应用 lift
- 帧循环:空中路径分支结束后统一应用 lift(Hoisting/Rail/Free)
- '调整物体'窗口对所有路径类型启用上下偏移,更新提示文字
257 单测全过
2026-08-01 12:38:01 +08:00
c2f0bfbece
fix: 自由路径上下偏移在位置解析统一应用
...
重构后真实物体走增量链、虚拟物体走平面链,都未应用 lift(仅兜底分支应用)。
改为在 Free 位置解析分支统一应用 ApplyGroundPathObjectLiftOffset,
各旋转/平移路径都使用带 lift 的起点位置。移除兜底分支重复应用。
257 单测全过
2026-08-01 12:35:48 +08:00
8ae28463b7
refactor: 分离虚拟物体平面姿态的路径对齐与角度修正
...
将两件事分开,修正始终生效、与路径几何无关:
- 新增 TryResolvePlanarVirtualObjectRotation:先尝试路径对齐+修正,
纯垂直路径(无水平方向)时无法对齐则仅把角度修正叠加到当前姿态
- 起点和帧两处虚拟物体平面姿态都改用它
- 修复:虚拟物体在纯垂直路径上角度修正被丢弃的问题
257 单测全过
2026-08-01 12:31:53 +08:00
2cce2f77c5
fix: 自由路径XYZ角度调整复用现成平面增量旋转链
...
此前自定义 Free 分支用 ApplyRotationCorrectionInPlace 应用角度修正,
旋转轴错误。改为复用现成方法:
- shouldUsePlanarPureIncrementStart 加入 Free → 真实物体走
TryApplyPlanarRealObjectStartIncrementalTransform(MoveItemCombinedAxisRotationAndTranslation)
- TryApplyPlanarRealObjectStartIncrementalTransform guard 接受 Free
- 平面姿态分支移除 Free 排除 → 虚拟物体走 TryCreatePlanarPathRotationAtStart
- 自定义 Free 分支降为兜底(仅纯垂直等失败场景保持姿态纯平移)
257 单测全过
2026-08-01 12:23:03 +08:00
0fa9562f4b
fix: 自由路径'调整物体'支持角度修正和上下偏移
...
- MoveObjectToPathStart Free 分支:应用 _objectRotationCorrection
(围绕物体中心旋转)后平移到起点;skipCadRestore 时修正已由调用方施加,仅平移
- 泛化 ApplyGroundPathObjectLiftOffset 支持 Free(原本仅 Ground)
- '调整物体'窗口对 Free 启用上下偏移输入
- 动画帧循环 Free 分支应用上下偏移
257 单测全过
2026-08-01 12:15:57 +08:00
0390c60c36
docs: 记录'调整物体'窗口姿态调整问题待办(明日处理)
...
起点姿态、动画已正确。记录调整物体窗口的角度/姿态调整功能
存在的问题作为明日待办,含排查方向。
2026-07-31 17:10:29 +08:00
bd7deea0e5
fix: 自由路径移动到起点时排除平面旋转分支,保持原始姿态
...
根因:MoveObjectToPathStart 中 'PathType != Rail && TryCreatePlanarPathRotationAtStart'
分支会捕获 Free(Free != Rail),应用基于路径方向(含与地面的夹角)的
平面旋转,导致物体姿态被修改。已将 Free 从该分支排除,使 Free 走
纯平移分支(ApplyTrackedTranslationOnly),保持物体原始姿态。
257 单测全过。
2026-07-31 17:05:08 +08:00
d3535fc5a0
fix: 自由路径保持物体原始姿态,起点不做自动旋转调整
...
真实物体(YUp)的自由路径自动对齐路径方向的旋转在宿主/几何姿态
解析上容易出错(对齐了错误前向、侧滚90°)。按用户要求,自由路径
改为保持物体原始姿态:
- MoveObjectToPathStart:自由路径纯平移(ApplyTrackedTranslationOnly),
不应用任何自动旋转
- ShouldPreservePathRotationForFrames:对 Free 始终返回 true,帧锁定
起点姿态,物体沿路径平移而保持朝向
- 移除废弃的 TryCreateFreePathRotationForFrame/AtStart(平面自动旋转)
257 单测全过。
2026-07-31 17:01:03 +08:00
ead8a35372
refactor: 部署脚本先普通权限部署,失败才提权,避免无谓UAC
...
deploy-plugin.bat 原为:非管理员直接 Start-Process RunAs 提权弹UAC。
但文件可写且 Roamer 可被当前用户关闭时根本不需要管理员。
重构:抽取部署主体到 deploy-body.ps1(关Roamer+等解锁+复制+校验+设写权限)。
deploy-plugin.bat 先以当前用户运行 deploy-body.ps1,成功则免UAC;
失败(如文件被管理员所有)才提权重试。
bat 用纯ASCII注释避免中文编码乱码问题。
2026-07-31 16:52:48 +08:00
84f67dbd79
fix: 自由路径姿态改为平面旋转(只绕垂直轴yaw,不绕前进轴滚动)
...
用户反馈:自由路径动画起点物体沿前进轴旋转90°(侧滚),
期望像地面路径一样只转向前进方向、仅绕垂直轴旋转。
根因:TryCreateFreePathRotationForFrame/AtStart 用了
CanonicalRailPoseBuilder(完整三维姿态,forward=3D切线),
会绕前进轴滚动。改为 CanonicalPlanarPoseBuilder
(forward=切线水平投影,up=世界up,只转yaw)。
撤销此前 ShouldPreservePathRotationForFrames 让 Free 保留姿态的改动。
同步更新 FreePathTests 断言(斜路径投影水平、纯垂直无水平方向返回false)。
257 单测全过。
2026-07-31 16:50:35 +08:00
4b6c3852cc
docs: MSI安装后deploy-plugin.bat权限冲突解决方案(Q7)
...
记录 MSI 安装的管理员文件阻塞 dev 部署、需提权 UAC 的问题。
根因:MSI 创建的文件对 BUILTIN\Users 只读,卸载不彻底会残留共享 DLL。
解决:一次性管理员授予目标目录及文件 Users FullControl 并解除继承保护。
同时 deploy-plugin.bat 部署成功后设置 Users 写权限,后续免 UAC。
2026-07-31 16:34:52 +08:00
20d66e9988
fix: 自由路径取点改用 ForceReinitializeToolPlugin 而非 StartClickTool
...
StartClickTool 会把 PathEditState 设为 AddingPoints,导致点击走 SetPreviewPoint
分支(白色半透明临时预览点,不保存)。改为与地面路径一致:用
ForceReinitializeToolPlugin 保持 Creating 状态,点击走 AddPathPointIn3D
正常保存路径点并渲染连线。
2026-07-31 16:27:15 +08:00
4f0723f56f
fix: 修正过弯检测测试期望值 + FreePathTests 加入csproj
...
过弯检测 CornerTurnCheckHelper 代码正确(maxLength 均为正),
但 6 个测试期望值与公式不符(7e71387 改算法时测试未同步)。
已按公式修正测试:补充 maxLength 断言,调整长度阈值。
另修复 FreePathTests 一处断言(斜路径 forward/up 分量)。
并将 FreePathTests.cs 显式加入 UnitTests.csproj(此前未编译运行)
2026-07-31 16:10:32 +08:00
002618f371
feat: 自由路径(Free Path)一级路径类型
...
- PathType 新增 Free=3,显示'自由'
- 动画:统一包围盒中心对齐,方案1姿态(forward=切线,up=世界up正交化)
复用 CanonicalRailPoseBuilder,新增 TryCreateFreePathRotationForFrame/AtStart
- 渲染:通行空间垂直偏移0(路径点即物体中心)
- 路径管理器:StartCreatingNewRoute/FinishEditing 支持 Free
- UI:PathEditingView 新增'自由'按钮 + NewFreePathCommand
- 数据库:枚举存 int 无需 schema 变更
- 迁移:加载时 IsTwoPointVertical 吊装路径 → Free
- 单测:新增 FreePathTests(6个全通过)
注:CornerTurnCheckHelperTests 6个失败为分支起点已存在的 pre-existing 问题,与本次无关
2026-07-31 16:02:25 +08:00
469f7efe2f
docs: 自由路径 - 确认决策点并标记步骤1实施中
2026-07-31 15:52:35 +08:00
8d7c2eacec
docs: 自由路径设计方案(含实施进度跟踪)
2026-07-31 15:52:27 +08:00
3aec23139f
docs: 过弯检测精度说明 - 工程对比数据修正为1-50mm/9个数量级
2026-07-31 15:52:25 +08:00
745f4c50e9
docs: 过弯检测精度说明 - 补充转角示意图和PDF版本
2026-07-27 23:09:13 +08:00
423360037f
docs: 过弯检测算法精度说明文档(含算法原理、精度分析、验证方法)
2026-07-27 23:08:08 +08:00
c3731316d4
fix: 恢复状态栏对齐,仅缩减帮助按钮右侧空间
2026-07-16 11:16:36 +08:00
a1bc23d1dc
chore: 状态栏右侧边距和padding继续缩减
2026-07-16 11:12:18 +08:00