# 15: 面板选设备与三维设备点的对应反应规格(来自决策票 06) Type: spec Status: ready-for-agent Label: ready-for-agent Blocked by: 06 Category: spec 本规格固化[决策票 06](06-panel-to-scene-device-correspondence.md)的维护者确认结果,作为[同一张 map](../map.md)的子规格单。它是「面板选设备与三维设备点互相对应反应」的实施输入,不覆盖同目录现有的 `spec.md`;现有 `spec.md` 继续只描述票 03 的监测点/设备定位视角契约。 ## 进度:100% 规格文档已发布为 `ready-for-agent` 并挂到同一决策 map;100% 仅指规格交付,不表示对应反应功能已实现。下一步:后续实现按本规格接入,表现层数值(引线虚实/颜色、压暗缩小程度、hover 拾取节流阈值)由 08 原型与实现票现场定;重叠拾取/呈现归票 11。未经本对话明确要求,本次不运行 build 或浏览器走查。 ## Problem Statement 值班人员选中监测点后,关联监测设备图层会展示该点下的设备点(票 05/14)。但当值班人员在面板中点设备卡片、或反过来在三维里点设备点时,三维设备点与面板之间缺乏「谁被选中、谁被指着」的对应反应,靠颜色表达又会与设备状态色键(票 07)冲突。若不定义这套反应语言,实现票会自行发明 hover/选中/弱化/拾取的语义,导致面板与三维互相不对应、色键语义被挪用、双向链接只做一半。 现有相机契约已定义两档定位视角(票 03:点位级 500 m / 设备级 150 m),但「点面板设备是否真的飞设备级、何时飞、返回点位级镜头如何」未定;`pickPointMarkerAt()` 只认 `pointCode` 实体(票 10),设备点目前拾不到;宿主 `dataset` 已有 `data-map-picked` 断言先例,但缺设备级断言字段。重叠(设备坐标≈点位坐标)时 `scene.pick` 只回最上层一个,逐台展开归票 11,本规格只定正常单点的反应与拾取。 ## Solution ### 维护者复验修订(优先于旧锚定与中心弱化条款) 点位摘要跟随监测点;进入设备详情后面板及其屏幕连接短线跟随所选设备,A→B 换锚,返回摘要恢复监测点锚。设备仍属于原监测点,空间锚点变化不改变业务归属。设备—监测点的场景归属线与面板连接短线是不同指示,前者保留既有语义。 中心设备图标始终不透明,不随状态特效闪烁、渐隐或旋转,不缩小到正常尺寸以下;选中/hover 的放大保留,外围光环承担状态动画。因此旧“其余中心设备压暗 + 缩小”条款不再用于地图中心符号。无位置设备按自身原因显示固定详情,不借父点坐标;展开偏移计入设备视觉锚点。此修订来自用户直接反馈,旧条款保留为历史。 从值班人员视角:面板 hover 一张设备卡片,三维里对应设备点轻放大;三维里 hover 一个设备点,面板里对应卡片高亮。点击选中一台设备时,三维点显示「它是被选中的那台」——外环 + 放大 + 引线(引线连到该监测点标记中心,即面板锚点);其余设备(≥ 3 台时)压暗并缩小退后。首次进入设备级时镜头飞到设备级预设视角看清这台设备;在同一点位内切换设备只换中心不重飞;返回点位级时回到点位级视角。三维点设备点会反选面板卡片并进入设备详情第二级;「返回点位」把三维还原为监测点选中态。三维里的设备点被拾取使用独立身份,不冒充监测点(票 05),且设备点优先于监测点被拾到。走查能通过宿主只读字段读到「当前选中哪台设备、面板停在哪个层级、当前 hover 哪台」,而不是只看图。 ## User Stories 1. 作为值班人员,我想在面板 hover 设备卡片时三维里对应设备点轻放大,以便在画面里立刻认出卡片指的是哪台设备。 2. 作为值班人员,我想在三维里 hover 设备点时面板对应卡片高亮,以便反向也认得出指针停在哪个设备的空间位置。 3. 作为值班人员,我想点击选中一台设备时三维点出现外环并放大一档,以便与没有选中的设备一眼区分。 4. 作为值班人员,我想选中设备时有一条引线连到它的监测点标记中心(面板锚点),以便明白这台设备属于哪个监测点、面板正在说它。 5. 作为值班人员,我想设备点与监测点坐标相同(重叠)时引线退化不画,以便不会出现长度为 0 的线糊在标记上。 6. 作为值班人员,我想选中反应的视觉不使用颜色,以便不与设备状态色键(票 07)冲突、也不破坏「颜色不是唯一线索」。 7. 作为值班人员,我想首次进入设备级时镜头飞到设备级预设视角(150 m,票 03 数值可配置),以便能看清这台被选中的设备。 8. 作为值班人员,我想在同一点位内从设备 A 切到设备 B 时只换中心、不再飞一次镜头,以便逐台巡检时画面不反复晃动。 9. 作为值班人员,我想从设备级返回点位级时镜头回到点位级定位视角(500 m),以便回到「看整个点位及其全部设备」的视野。 10. 作为值班人员,我想返回点位级不等于取消选中(监测点仍选中),以便不会触发票 03 的「取消不回退」语义冲突。 11. 作为值班人员,我想在三维里点一个设备点,面板滚动到该设备卡片并进入设备详情第二级,以便从地图侧也能直达这台设备的详情。 12. 作为值班人员,我想面板第二级打开时三维仍保持该设备的选中强化,以便详情与三维始终指向同一台设备。 13. 作为值班人员,我想点面板「返回点位」后三维还原为监测点选中态(设备外环/放大/引线清除),以便层级回退与视觉回退一致。 14. 作为值班人员,我想面板锚点仍跟随监测点标记中心而不是跟随设备点,以便锚定契约(票 04/12)不因设备选中被破坏。 15. 作为值班人员,我想选中一台设备时其余设备(≥ 3 台时)压暗并缩小,以便焦点设备清晰、其余设备仍可见可点。 16. 作为值班人员,我想设备数少于 3 台时不启用弱化,以便小点位不会出现无谓的视觉抖动。 17. 作为值班人员,我想 hover 到一台被压暗的设备时它撤销弱化并轻放大,以便在弱化的设备里也能认出并点击想看的这台。 18. 作为值班人员,我想 hover 不会给设备叠加外环或引线(那是选中专属),以便「被指着」和「被选中」两档一眼可分。 19. 作为值班人员,我想已选中的设备不被 hover 干扰,以便选中态在指针乱晃时保持稳定。 20. 作为值班人员,我想在三维里点设备点能拾到设备(通过独立拾取入口),以便三维 → 面板的双向联动成立。 21. 作为值班人员,我想点设备点不会误开一个监测点,以便设备身份与监测点身份(票 05)互不冒充。 22. 作为值班人员,我想设备点优先于监测点被拾到(正常单点),以便点了设备区域就是选设备;点监测点标记则回到点位级。 23. 作为值班人员,我想未关联设备的既有拾取链路不变,以便本规格不改变没有点位归属的设备行为。 24. 作为验收人员,我想走查能读到当前选中设备编码、面板层级和当前 hover 设备编码,以便对断言而不是看图。 25. 作为验收人员,我想新增字段不破坏既有 `data-map-picked` 语义,以便票 10 的既有走查继续成立。 ## Implementation Decisions - 反应语言分两档、可叠加规则固定:**hover 是瞬态、只作用于非选中设备**(被 hover 的撤弱化 + 轻放大,不叠外环/引线);**选中是持久态**(外环 + 放大 + 引线),不被 hover 干扰;已选中设备保持强化。对应反应一律**不用颜色**——色键语义仍只属于设备状态(票 07),「颜色不是唯一线索」验收不被破坏。 - hover=双侧:面板卡片 hover → 三维点轻放大;三维 pointermove hover 设备点 → 面板对应卡片高亮,复用 `detailStore`/`selectDevice` 链路。三维侧 pointermove 拾取的节流/静止判断与成本控制交实现(不在本规格锁数值)。 - 选中态引线从设备点连到**监测点标记中心**(即票 04/12 的面板锚点),随锚点走;设备点与监测点坐标相同(引线长度≈0)时**引线退化不画**,靠外环 + 放大表达。引线虚实/颜色、压暗缩小程度等表现层数值留 08 原型与实现票现场定。 - 镜头联动(数值全部仍归票 03 `map.locate`,本规格只定行为):点监测点 → 点位级定位(500 m);**首次进入设备级**(从点位级视角点设备卡片)→ 设备级定位飞一次(150 m);设备级内 A→B 切换 → **只换中心、不重飞**;**返回点位级 → 回 500 m 定位视角**。返回点位是设备级 → 点位级的**层级回退**,不是票 03 的「取消选中不回退」(监测点仍选中),两者语义并存。 - 双向联动=**全双向**:三维点设备点 → 面板滚动到该卡片并选中(进设备级第二级,复用 `detailStore.selectDevice`);面板第二级打开时三维保持该设备选中强化;「返回点位」→ 面板回第一级、三维还原为监测点选中态(设备外环/放大/引线清除)。**面板锚点仍跟随监测点标记中心**(票 04/12 与 CONTEXT.md「面板锚点」词条不动),三维强化跟随设备、锚点归属不换。 - 多设备弱化:其余设备**压暗 + 缩小**;**阈值=该点位设备数 ≥ 3 台才启用**,少于 3 台全亮。弱化不改变已上图数,票 07 独立设备图例只计实际绘制,计数不受影响;本规格不新增第二个计数口径。 - 拾取=**独立入口 `pickDeviceMarkerAt()`**(认 `deviceCode`,不混 `pointCode` 归属判据;票 05「不冒充监测点标记」由此结构性保证)。点选链路**先试设备点、再试监测点**——正常单点设备点优先、监测点兜底(点监测点标记回点位级)。未关联设备既有拾取链路不变。重叠时的 drillPick/展开/逐台点选归票 11,本规格只定正常单点;管线交互优先级低于监测点和设备点位(票 22)保持不变。 - 可断言口径:宿主 `dataset` 新增只读、可空字段,走查对断言不对图: - `data-map-device-picked` = 当前选中设备 `deviceCode` - `data-map-panel-selection` = `none|point|equipment`(与 `detailStore.selection` 对应) - `data-map-device-hovered` = 当前三维 hover 设备 `deviceCode` - 不破坏既有 `data-map-picked`(票 10 走查在用)。 ## Testing Decisions - 最高测试接缝是驾驶舱外壳的外部可观察行为:从真实地图标记或监测点台账选中监测点后,用真实鼠标/指针完成「面板 hover 卡片 → 三维反应」「三维 hover 点 → 面板高亮」「点设备卡片进设备级」「三维点设备反选面板」「返回点位还原」「弱化与 hover 撤销」「设备点拾取优先于监测点」完整流程,观察面板层级、三维选中强化、引线与镜头。验收不读取 Cesium 私有实体、不依赖组件私有变量。 - 纯逻辑断言覆盖:两级详情状态机(`none → point → equipment`)在三维反选与「返回点位」下的迁移、设备级切换只换中心的状态保持、弱化阈值(设备数 ≥ 3)判定、hover 撤弱化的作用域(只作用于非选中设备)、`pickDeviceMarkerAt()` 的身份返回(`deviceCode` 不混 `pointCode`)与设备点优先顺序。 - 走查断言读取宿主只读字段(`data-map-device-picked` / `data-map-panel-selection` / `data-map-device-hovered`),与三维场景实际状态对照;引线出现/退化、外环/放大、压暗/缩小等观感由维护者目视裁定(与票 07 相同的「A + 人工走查」口径)。 - 回归沿用票 10 两级详情/真实鼠标点选/`data-map-picked`、票 09 标记形状走查、票 03 相机定位断言(`getCameraState()` + `dataset.camera`)与票 05/14 设备图层生命周期走查的测试先例;设备状态特效、设备模型、同坐标拾取沿票 07/10/11 的各自验收契约。规格阶段只写验收契约,不运行 build、dev 或浏览器调试。 ## Out of Scope - 重叠设备(同坐标/极近)的画法、聚合展开、逐台点选与超量降级;由票 11 决定,本规格只声明「重叠时引线退化不画、正常单点设备点优先」。 - 设备状态特效(票 07)、设备「模型」口径与资产(票 10)、设备图层的触发与生命周期(票 05/14)的重定义;本规格只在其之上定义「选中/指向」反应。 - 相机定位数值本身(heading/pitch/range、`map.locate` 配置):全部仍归票 03;本规格只定「何时飞、何时只换中心、返回点位回哪档」的行为。 - 面板锚定跟随的形态与退化策略(票 04/12)及其面板浮层布局;本规格只声明「锚点归属不换仍跟随监测点」。 - 后端设备级坐标与校验契约的实际补齐(票 09)、真实数据全面接线、登录/权限/工单写操作、移动端/竖屏/多屏拼接。 - 覆盖或改写现有票 03 的定位视角规格;本规格只引用其定位行为与数值。 ## Further Notes - 本规格的唯一决策来源是票 06 的 `## Answer`;它把讨论结论转为后续实现可消费的行为契约。 - 与票 11 的边界已显式切分:**引线退化(重叠不画引线)属本规格的选中表现语言;重叠时的 drillPick/展开/逐台拾取归票 11**。实现时若先做本规格、票 11 未落地,正常单点拾取与反应可先行,重叠行为按票 11 结论补。 - **票 11 收口后的边界补充(2026-09-25)**:**展开态(聚合符号摊开成环/扇形)下,选中设备的引线照 06 逻辑画**(连监测点标记中心,表达归属);「重叠引线退化不画」只约束**未摊开(地理重合)**场景。聚合符号/展开环/逐台拾取与 K>10 降级归票 11,本规格不重开 06。 - 表现层数值(引线虚实/颜色、压暗缩小程度、hover 拾取节流阈值)属于 08 原型现场校准项,不在本规格锁死;校准结果若推翻票 06 任一条语义,回票 06 重议,不由实现票自行改。 - 本规格新增为同一决策 map 的子规格单,现有票 03 的 `spec.md` 保持不变;14 号规格(关联监测设备图层)与本规格是同一实施链路的两个输入,实施时合并消费,不发生互相覆盖。 - 规格发布后,实施票应在设备图层可用(09 设备级坐标/状态契约或明确降级)前提下开展。