|
|
@@ -3717,11 +3717,41 @@ export function pickDeviceOrPointAt(clientX, clientY) {
|
|
|
return pickMarkerByIdentity(target.kind, target.code)
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * 票 69:点到**正被强调**的对象时解除整轮强调。
|
|
|
+ *
|
|
|
+ * 为什么放在派发链上:用户点击走 `overlay 节点 → pickDeviceOrPointAt → dispatchPickResult`,
|
|
|
+ * 解除挂在同一条下游,两条入口(真实点击 / DEV 按坐标点选)不会有一条漏掉。
|
|
|
+ * 判定只认「点的是高亮对象本身」:点位码、`pointCode`、标记的 `deviceCodes`
|
|
|
+ * (与引擎候选编码同一份集合,走 `domain/mapEmphasis.shouldEmphasize`);
|
|
|
+ * 点别的对象或空白**不**替用户取消上一轮强调(事件详情可能还开着)。
|
|
|
+ * 还原复用 `highlightMapObject([])` 的同一条空目标路径(引擎 `emphasisBase` 写回原值),
|
|
|
+ * 不在这里另写一套尺寸还原。
|
|
|
+ * @returns {boolean} 这一次点击是否真的解除了强调
|
|
|
+ */
|
|
|
+function releaseEmphasisIfPicked(resolved) {
|
|
|
+ const pick = resolved && resolved.pick
|
|
|
+ if (!pick || !emphasisCodes.length) return false
|
|
|
+ const marker = (markerPlan.markers || []).find((item) => item.code === pick.code) || null
|
|
|
+ const candidates = [
|
|
|
+ pick.code,
|
|
|
+ pick.pointCode,
|
|
|
+ ...(marker && Array.isArray(marker.deviceCodes) ? marker.deviceCodes : []),
|
|
|
+ ]
|
|
|
+ if (!shouldEmphasize(candidates, emphasisCodes)) return false
|
|
|
+ highlightMapObject([])
|
|
|
+ return true
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* 派发一次点选结论(票 76 / C6 抽出):GPU 拾取与「按 DOM 身份点选」共用同一段下游 ——
|
|
|
* 选中/呈现/收起/订阅派发只有这一处,两条入口不会各写一套行为。
|
|
|
*/
|
|
|
function dispatchPickResult(resolved) {
|
|
|
+ // 票 69:点到的正是**当前被强调**的对象 —— 注意力已经落到地图上,这一轮强调到此为止。
|
|
|
+ // 用户真正的点击走这条(overlay 节点 → `pickDeviceOrPointAt` → 本函数),
|
|
|
+ // 与 DEV 把手同一条下游,所以解除也只需挂在这里一处。
|
|
|
+ releaseEmphasisIfPicked(resolved)
|
|
|
if (resolved.target === 'device') {
|
|
|
// 统一选择入口负责选中与呈现;不提前写 selectedDeviceCode,避免 store 的幂等检查吞掉更新。
|
|
|
lastPicked = resolved.pick
|
|
|
@@ -3974,8 +4004,13 @@ export function clearPointMarkers() {
|
|
|
* 所以「高亮关联管线」只能按设备码匹配;点位码则用于强调那个点位标记。
|
|
|
* 引擎只调已存在实体的显示参数 —— 事件不新开图层;还没落地时(票 22 之前)返回 0,
|
|
|
* 调用方如实说「尚未出现在地图上」,不伪造成成功。
|
|
|
+ *
|
|
|
+ * **空目标必须下发给引擎**(票 69 修):票 14 的契约是 `highlightEntities(viewer, [])` = 全部还原,
|
|
|
+ * 但这里曾用 `resolved.length` 把空目标整段跳过 —— DOM 覆盖层只承担点位视觉,于是收起详情只改写了
|
|
|
+ * `data-map-emphasis` 这个读数,管线线宽与设备 billboard 一直停在强调值(「高亮解除不了」的真根因)。
|
|
|
+ * 还原本来就是**空目标那条路径**,不能因为「没有目标」就不发。
|
|
|
* @param {string|Array<string>} codes
|
|
|
- * @returns {number} 实际被强调的实体数(0 = 目标还不在图上 / 引擎没就绪)
|
|
|
+ * @returns {number} 实际被强调的实体数(0 = 目标还不在图上 / 引擎没就绪 / 刚还原完)
|
|
|
*/
|
|
|
export function highlightMapObject(codes) {
|
|
|
const wanted = (Array.isArray(codes) ? codes : [codes]).map((item) => String(item || '').trim()).filter(Boolean)
|
|
|
@@ -3994,8 +4029,8 @@ export function highlightMapObject(codes) {
|
|
|
emphasisCodes = resolved
|
|
|
|
|
|
const matched =
|
|
|
- instance && instance.engine && instance.viewer && resolved.length
|
|
|
- ? instance.engine.highlightEntities(instance.viewer, resolved)
|
|
|
+ instance && instance.engine && instance.viewer
|
|
|
+ ? instance.engine.highlightEntities(instance.viewer, resolved) || 0
|
|
|
: 0
|
|
|
|
|
|
// 强调结果写进宿主 dataset(`data-map-emphasis` = 当前被强调的实体数):
|