gis-view-webgl2 0.1.7 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -11
- package/dist/gis-view.css +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +445 -241
- package/dist/index.js +1 -1
- package/docs/AI/345/257/271/350/257/235/346/261/207/346/200/273.md +65 -498
- package/docs/GisView.md +1 -1
- package/docs/GisView/345/256/236/347/216/260/345/216/237/347/220/206.md +1 -1
- package/docs/ai/06-/344/274/232/350/257/235/347/264/242/345/274/225/344/270/216/345/244/215/346/237/245/346/226/271/346/263/225.md +114 -478
- package/docs/demos/BasicDemo.vue +144 -27
- package/docs/demos/BatchAddDemo.vue +133 -7
- package/docs/demos/ChannelDemo.vue +61 -0
- package/docs/demos/ConnectDemo.vue +164 -33
- package/docs/demos/CopyMergeDemo.vue +144 -42
- package/docs/demos/EventDemo.vue +29 -24
- package/docs/demos/LabelDemo.vue +5 -5
- package/docs/demos/api-index.js +53 -41
- package/docs/demos/gis-view-demo/GisViewDemoCardHeader.vue +1 -1
- package/docs/demos/gis-view-demo/GisViewDemoStage.vue +1 -1
- package/docs/demos/gis-view-demo/panels/DataPanels.vue +1 -1
- package/docs/demos/gis-view-demo/useGisViewDemo.js +31 -33
- package/docs/format/02-/350/212/202/347/202/271/344/270/216/347/272/277/350/267/257.md +1 -0
- package/docs/format/04-/351/200/232/351/201/223/344/270/216/346/240/207/347/255/276.md +3 -0
- package/docs/format/07-/344/272/213/344/273/266/350/275/275/350/215/267/344/270/216/347/244/272/344/276/213/346/225/260/346/215/256.md +8 -7
- package/docs/from0/05-/347/233/270/346/234/272/344/270/216/344/272/244/344/272/222.md +1 -1
- package/docs/from0/07-/351/200/232/351/201/223/345/210/206/347/273/204/344/270/216/345/244/232/345/233/236/347/272/277.md +26 -10
- package/docs/index.html +136 -13
- package/docs/internals/15-04-/351/200/220/350/275/256/350/256/260/345/275/225-/347/203/255/345/212/233/345/233/276/344/270/216/346/200/247/350/203/275.md +10 -0
- package/docs/manual/02-/345/235/220/346/240/207/344/270/216/346/225/260/346/215/256.md +1 -1
- package/docs/manual/03-/351/205/215/347/275/256/351/241/271.md +82 -14
- package/docs/manual/04-/344/272/213/344/273/266/344/270/216/345/233/236/350/260/203.md +23 -17
- package/docs/manual/05-/347/224/273/350/264/250/344/270/216/346/211/271/351/207/217/346/233/264/346/226/260.md +65 -0
- package/docs/manual/06-/346/225/260/346/215/256/344/270/216/345/234/272/346/231/257/346/233/264/346/226/260.md +9 -10
- package/docs/manual/07-/346/214/207/351/222/210/344/270/216/350/246/201/347/264/240/347/274/226/350/276/221.md +100 -40
- package/docs/manual/08-/351/200/211/344/270/255/344/270/216/346/213/220/347/202/271.md +11 -7
- package/docs/manual/09-/351/200/232/351/201/223/344/270/216/345/244/232/345/233/236/347/272/277.md +66 -6
- package/docs/manual/10-/351/200/232/351/201/223/347/274/226/350/276/221/344/270/216/346/226/260/345/242/236.md +226 -493
- package/docs/manual/12-/346/240/207/347/255/276/344/270/216/350/243/205/351/245/260.md +28 -5
- package/docs/manual/14-/350/247/206/345/233/276/344/270/216/347/255/233/351/200/211.md +46 -14
- package/docs/manual/15-/345/257/274/345/207/272/344/270/216/351/233/206/346/210/220.md +5 -2
- package/docs/manual/16-/345/256/236/344/276/213/346/226/271/346/263/225/346/200/273/350/241/250.md +34 -29
- package/docs/manual/17-/345/217/202/346/225/260/351/200/237/346/237/245.md +30 -22
- package/docs/manual/18-/351/200/220/346/226/271/346/263/225/347/244/272/344/276/213.md +168 -81
- package/docs/manual/19-/350/257/273/346/225/260/344/270/216/346/213/226/346/213/275/351/242/204/350/247/210.md +1 -1
- package/docs/manual/20-/346/200/247/350/203/275/344/270/216/345/244/247/346/225/260/346/215/256.md +5 -3
- package/docs/manual/21-/350/257/264/346/230/216/344/270/216/345/270/270/350/247/201/351/227/256/351/242/230.md +9 -6
- package/docs/steps/README.md +201 -120
- package/docs/steps/bench-scale.html +1 -1
- package/docs/steps/index.html +222 -6
- package/docs/steps/selftest-actions.html +26 -25
- package/docs/steps/selftest-data.html +1 -1
- package/docs/steps/selftest-demos.html +290 -16
- package/docs/steps/selftest-docs.html +17 -6
- package/docs/steps/selftest-features.html +594 -54
- package/docs/steps/selftest-full.html +3 -3
- package/docs/steps/selftest-labels.html +82 -1
- package/docs/steps/selftest-perf.html +62 -7
- package/docs/steps/selftest-select.html +71 -6
- package/docs/steps/step-05-pick.js +4 -8
- package/docs/steps/step-07-channels.js +3 -5
- package/docs/steps/step-08-labels.js +3 -3
- package/docs/steps/step-10-full.js +3 -3
- package/docs/steps/step-12-events.js +41 -24
- package/docs//344/273/2160/345/210/260/345/256/214/346/225/264/347/232/204/345/256/236/347/216/260.md +1 -0
- package/package.json +1 -1
- package/docs/ai/01-/350/265/267/346/272/220/344/270/216/350/277/231/344/273/275/346/261/207/346/200/273/347/232/204/347/224/261/346/235/245.md +0 -29
- package/docs/ai/02-/346/214/211/345/206/205/345/256/271/345/210/206/347/261/273-/350/277/231/344/270/200/350/267/257/351/203/275/345/234/250/346/224/271/344/273/200/344/271/210.md +0 -66
- package/docs/ai/03-/351/207/215/350/246/201/351/227/256/347/255/224/351/200/211/357/274/210/344/270/200/357/274/211/357/274/232/351/200/211/345/236/213/351/200/232/351/201/223/344/270/216/346/240/267/345/274/217.md +0 -178
- package/docs/ai/04-/351/207/215/350/246/201/351/227/256/347/255/224/351/200/211/357/274/210/344/272/214/357/274/211/357/274/232/344/272/244/344/272/222/346/200/247/350/203/275/344/270/216/346/225/260/346/215/256.md +0 -140
- package/docs/ai/05-/351/207/215/350/246/201/351/227/256/347/255/224/351/200/211/357/274/210/344/270/211/357/274/211/357/274/232/345/256/277/344/270/273/346/227/201/346/224/257/344/270/216/346/224/266/345/217/243.md +0 -43
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
# 02 按内容分类:这一路都在改什么
|
|
2
|
-
|
|
3
|
-
> 七个主题(通道分组拐点 / 交互编辑 / 样式视觉 / 性能 / 数据接口 / 文档工程 / 宿主旁支)各自的来龙去脉与落点。
|
|
4
|
-
|
|
5
|
-
## 二、按内容分类:这一路都在改什么
|
|
6
|
-
|
|
7
|
-
### 2.1 通道、分组、拐点(贯穿全场的主线)
|
|
8
|
-
|
|
9
|
-
- 09-15 第一轮就定了「通道(channel)」概念:通道两端必须有节点才显示,demo 里节点之间的连线全部变成通道;随后连续几轮修「通道拐点加不上 / 显示错位 / 宽度不能自定义 / 拐点越出节点范围」。
|
|
10
|
-
- 09-15 最后一轮把「demo 手动把 line 聚合成 channel」改成组件内置的 `createChannels()`(按传入数组自动生成通道与回线)。
|
|
11
|
-
- 09-17 修 `channelGroupTarget` 初始化前访问的报错,并优化「分组拆开之后几组回线完全重合」的显示。
|
|
12
|
-
- 10-10 的 20 条大会话专门讨论「拐点 / 分组怎么给后端」:整体给还是单独给、同一分组的拐点怎么同步改 —— 结论落成「整份覆盖 + 组件侧按方法读最新几何」,并新写 `BackendSyncDemo.vue`(演示页 `?demo=backend`)把接口请求体摆出来。
|
|
13
|
-
- 10-13 ~ 10-14:修「删除 / 合并之后选中集与拐点键不跟着要素走」(选中的拐点会跳到邻线),并补齐拐点 / 分组 / 节点移动的事件捕捉。
|
|
14
|
-
|
|
15
|
-
落点:`docs/GisView.md` 的「线路拐点」「通道与多回线」「通道分组」「按方法新增要素」;`docs/数据格式.md` 的拐点三处写法;`docs/GisView实现原理.md` 15.30 / 15.31 / 15.41 / 15.59 / 15.60 / 15.74 / 15.76。
|
|
16
|
-
|
|
17
|
-
### 2.2 交互与编辑
|
|
18
|
-
|
|
19
|
-
- 09-15:线路 / 节点点击与悬停效果、10 万节点下整体平移与框选卡顿、Ctrl 多选后整批拖拽(与框选同一套行为)。
|
|
20
|
-
- 09-16:暴露出缩放函数;取消「没配 hover / select 样式也自动放大」的缺省增幅。
|
|
21
|
-
- 后续轮次:框选提交合并(15.30)、批量合并选主(15.31)、节点复制 / 粘贴与删除确认(15.41)、功能开关汇总表 `features`(15.25,缺省全关)、九类光标与自定义快捷键。
|
|
22
|
-
- 09-29 单独一轮优化「框选提交」。
|
|
23
|
-
|
|
24
|
-
落点:`docs/GisView.md` 的「点击与样式」「指针事件」「框选」「节点复制」「节点合并」「删除(remove)」「功能开关」「快捷键」「光标」。
|
|
25
|
-
|
|
26
|
-
### 2.3 样式与视觉
|
|
27
|
-
|
|
28
|
-
- 09-16 一连串渲染问题:SVG 路径没画出来、没有方块、`DC_NODE_COLORS is not defined`;确认 `getGisStyle` 的颜色是「描边色」、填充仍是白,SVG 描边默认 1px —— 后续定型为 `symbol` 四种写法(内置形状 / square / svg / image)。
|
|
29
|
-
- 状态样式:hover / select / multi / box 四种,缺省「不配就不改外观」(15.25 / 15.42 / 15.67 / 15.68);10-13 修「缩放 + 调元件大小后选中节点丢描边色」(15.73)。
|
|
30
|
-
- 标签:不要抖动、缩放时不要飞出去、停手必回、`labelOptimize` 两档(15.34 / 15.43 / 15.45 / 15.49 / 15.51 / 15.70)。
|
|
31
|
-
- 鹰眼图:从「demo 手写」改成「组件内置、样式可单独配、视口框可拖动、长按移动视角」(15.12 / 15.15 / 15.16 / 15.17)。
|
|
32
|
-
- 热力图与密度场:照着 ECharts 的地图热力做「往外渐淡 + 可设层级」,再补「节点热力 + 一键随机数据」(15.18 / 15.21 / 15.22)。
|
|
33
|
-
- 还有:线路装饰 `PATH_DC_LINE` 随线路移动(15.5 / 15.6 / 15.7)、线路方向箭头与动画效果(15.36 / 15.62)、贴图预热 `prebake`、背景层与网格、宿主 CSS `zoom` 对齐(09-20)。
|
|
34
|
-
|
|
35
|
-
落点:`docs/GisView.md` 的「点配置」「线配置」「节点标签」「线路标签」「热力图」「动画效果(effects)」「鹰眼图」「背景层」;实现原理对应 15.x 小节。
|
|
36
|
-
|
|
37
|
-
### 2.4 性能(第二大主线)
|
|
38
|
-
|
|
39
|
-
- 09-15 提出 10 万节点下平移 / 框选 / 框选移动卡顿;09-16 追问「分层能不能优化性能」。
|
|
40
|
-
- 之后几乎每几轮就有一次「继续优化大数据下的方法调用与交互」,做法一路演进:样式快路径(只重解析样式、不重铺场景)、状态样式按槽位就地覆盖、追加 / 删除的增量路、线路批次视口裁剪、发散渲染的批次续写、超长线段换粗网格、标签扫描预算、百万级解析一趟算完、按 id 的表惰性化。
|
|
41
|
-
- 结果口径:`docs/steps/bench-filter.html` 等基准页 + 13 页自测(当前约 1375 条断言)+ 根 `README.md` 的性能实测表。
|
|
42
|
-
|
|
43
|
-
落点:实现原理 15.39 / 15.42 / 15.43 / 15.44 / 15.46 / 15.47 / 15.48 / 15.52 ~ 15.66 / 15.75;`docs/GisView.md` 的「大数据量」「性能实测与 WebGPU 评估」。
|
|
44
|
-
|
|
45
|
-
### 2.5 数据与接口
|
|
46
|
-
|
|
47
|
-
- 数据的「五套口径」(input / full / points / lines / channels)与 `sample-*.json` 样本;标准数据文档(`importData` / `exportData` 接收 == 导出,15.40)。
|
|
48
|
-
- 10-10:要「导出视口内的线路 / 节点 / 通道信息的方法」→ `exportViewportData()`(`margin` / `rect` 两个选项,通道带着分组一起走)。
|
|
49
|
-
- 10-10:要「照着就能定接口」的演示 → `BackendSyncDemo.vue`(`?demo=backend`):场站位置 `PATCH /gis/points/{id}`、拐点整份覆盖 `PATCH /gis/lines/{id}/path`、分组拐点 `PATCH /gis/channels/{id}/groups/waypoints`,并演示「点保存一起传」与「改完就传的合并 + 延迟」两种推送策略。
|
|
50
|
-
|
|
51
|
-
落点:`docs/数据格式.md`、`docs/GisView.md` 的「导出数据」「视口内导出(exportViewportData)」「标准数据文档(full)」、`docs/demos/BackendSyncDemo.vue`。
|
|
52
|
-
|
|
53
|
-
### 2.6 文档与工程化
|
|
54
|
-
|
|
55
|
-
- 从某一轮起固定「改完同步四份文档」:`docs/GisView.md`(手册)、`docs/GisView实现原理.md`(每一轮为什么这么做)、`src/gis-view/README.md`(源码导读)、根 `README.md`(总览);分步讲义是 `docs/从0到完整的实现.md` + `docs/steps/`(12 步 demo + 13 页自测)。
|
|
56
|
-
- 对账脚本:`docs/steps/check-doc-coverage.mjs`(源码与文档双向对账)、`docs/steps/gen-api-index.mjs`(demo 的 API 清单)、`scripts/run-selftests.mjs`(无头跑全部自测页)。
|
|
57
|
-
- 每轮收尾的固定动作:`npx tsc --noEmit`、`node scripts/run-selftests.mjs`、`check-doc-coverage.mjs`、`gen-api-index.mjs --check`、`npm run build`;临时 / 探针脚本一律清掉。
|
|
58
|
-
|
|
59
|
-
### 2.7 旁支:宿主集成与借用
|
|
60
|
-
|
|
61
|
-
- 10-12(teap-gis 宿主):`D:\work\teap-gis\src\views\layout\gis.vue` 两个问题 ——「为什么每隔一段时间触发 initData」(定位到宿主自身挂载 / 路由,组件侧 `initData` 只在 `onMounted` 调一次)与「节点 SVG 又是圈 + 直流标记不画」(改宿主 `gisTools.js` 与 `buildNewData`)。
|
|
62
|
-
- 09-20:表格组件的会话里借用 gis-view 的 `docs/steps` 结构 —— 与本组件无关,只列进索引。
|
|
63
|
-
|
|
64
|
-
---
|
|
65
|
-
|
|
66
|
-
[← 01 起源与这份汇总的由来](01-%E8%B5%B7%E6%BA%90%E4%B8%8E%E8%BF%99%E4%BB%BD%E6%B1%87%E6%80%BB%E7%9A%84%E7%94%B1%E6%9D%A5.md) · [汇总目录](../AI对话汇总.md) · [03 重要问答选(一):选型、通道与样式 →](03-%E9%87%8D%E8%A6%81%E9%97%AE%E7%AD%94%E9%80%89%EF%BC%88%E4%B8%80%EF%BC%89%EF%BC%9A%E9%80%89%E5%9E%8B%E9%80%9A%E9%81%93%E4%B8%8E%E6%A0%B7%E5%BC%8F.md)
|
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
# 03 重要问答选(一):选型、通道与样式
|
|
2
|
-
|
|
3
|
-
> 选型 13 问、立项、通道诞生、缩放 / 筛选 / 搜索的成形、颜色语义(描边 vs 填充)与分组重合的修正。
|
|
4
|
-
|
|
5
|
-
### 09-15 11:34 · 选型问答:10 万节点 / 拐点拖拽,对比 ECharts / G6 / deck.gl / WebGL2;通读前身 gis-core 生成 md
|
|
6
|
-
|
|
7
|
-
**问**:我想实现一个这种的区间联络线,考虑线路添加拐点等拖拽操作,使用什么技术比较好,考虑10w节点和线路这种大数据,目前参考过echarts和antd g6,deck.gl
|
|
8
|
-
**答**:`teap-gis` 里已经有 `@deck.gl/core@9.2` + `luma.gl@9.2` + ECharts 6 了 —— 这很关键。我再看一眼现在 deck.gl 是怎么用的,避免建议和你们现有的渲染管线打架。(原答 0.1 KB)
|
|
9
|
-
|
|
10
|
-
**问**:不参考已有仓库
|
|
11
|
-
**答**:不参考你现有仓库,纯按需求给结论。 - **L1 渲染层(deck.gl)**:`PathLayer` 画线路(折线天然支持多点,拐点就是路径中间点),`ScatterplotLayer`/`IconLayer` 画节点,`TextLayer` 画标签。全部走 binary attributes(TypedArray)而不是对象数组。 - **L2 拾取层(空间索引)**:用 `flatbush` / `kdbush` 建线段包围盒索引,屏幕空间 8px 容差拾取,O(log n)。**别依赖 GPU picking 做拖拽命中**——那会触发额外渲染帧,pointermove 时扛不住。 - **L3 编辑层(SVG / Canvas2D overlay)**:只画当前选中/钉住的那几条线(通常 < 100 条)。SVG 天然有 hover、cursor、双击、命中测试,写编辑交互比在 WebGL 里手搓快 10 倍。 - **状态层**:不可变数据 + 命令模式(undo/redo 只存被改那条线的 points 快照,内存毫无压力)。(原答 2.4 KB)
|
|
12
|
-
|
|
13
|
-
**问**:**VortxGL** 可以吗
|
|
14
|
-
**答**:我把它扒开看了一遍 —— **结论:不建议**。它存在,但有几个硬伤。 - **功能不匹配(这条最致命)**:它的边模型只有 `source` / `target`,**没有折线、没有控制点、没有 waypoint 概念**。你翻遍它的类型定义找不到任何拐点相关的东西。也就是说,你要的「线路加拐点、拖拽拐点」在这个库里根本不存在,得改它的渲染器 —— 而渲染器是混淆过的。 - **定位不匹配**:它整个引擎是围绕**力导向布局**建的(物理模拟放 Worker 里跑,O(N²)),配套的是 combo 分组、径向菜单、属性面板这一套「图分析」交互。但区间联络线的节点是**固定坐标**(工程/地理坐标),你要的恰恰是「不要自动布局,我要手动摆点」。它最卖力的那部分对你完全无用。 - **工程与供应链风险**:混淆 + 无仓库 + 单人维护 + 周下载 10,意味着你**无法审计、无法调试、无法打补丁、无法 fork**。这库跑在你主线程里,能读页面里的一切。作者哪天不更新了,你的核心可视化就锁死在一个 38MB 的黑盒上。另外这个包的打包质量也很说明问题:`dist/` 里混进了 demo 的 `index.html`、`favicon.ico`、`logo.png`,还带了 `data/100k.json`(25MB)和 `10k.json`(5.3MB)两个测试数据集,所以解压后 37MB、65 个文件 —— 是把 vite 的构建输出整个发出去了。 - WebGL2 单 pass 实…(原答 1.7 KB)
|
|
15
|
-
|
|
16
|
-
**问**:除了deck.gl还有其他推荐的技术吗,考虑实时拖拽等
|
|
17
|
-
**答**:**先给结论**:实时拖拽的手感,**八成不取决于你选哪个渲染库,而取决于你把「拖拽中的几何」放在哪里**。选型只决定上限,架构决定手感。所以我分两部分答:先给可选底座,再给真正决定手感的做法。 - **档位 1 —— PixiJS v8(编辑优先的首选替代)**:这是唯一一个「WebGL 级性能 + 自带场景图和事件系统」的库,拖拽不需要你从零搭交互层。注意它的 hit-test 是 CPU 逐个对象算的,10w 元素不能靠 `eventMode: 'static'` 硬扛,得配空间索引或自定义命中区域。量级在 3~5w、编辑密集时,它比 deck.gl 省一半工作量。 - **档位 2 —— 自研 WebGL2/WebGPU(10w + 极致手感)**:deck.gl 在**高频编辑**上有个真实短板——它的 binary attribute 是「整体替换」语义,你改一个拐点,它会重传整块 buffer,而且 CPU 侧还要重建数组。要做到 10w 元素每帧流畅拖拽,得自己管 VBO,做局部更新。见下面的关键技巧。 - **档位 3 —— three.js / Sigma / MapLibre**:分别对应「要 3D」「纯展示不编辑」「有 GIS 底图」三种特定情况,不然都是绕路。 - 静态几何(10w 条线的全网坐标)进一个大 VBO,**加载时上传一次,之后永不触碰**。(原答 2.4 KB)
|
|
18
|
-
|
|
19
|
-
**问**:考虑10w节点和20w条线路综合
|
|
20
|
-
**答**:**先把数字摆平,别被 30w 吓到** - 节点坐标:10w × 2 × 4B = 800KB,加颜色/尺寸/形状属性约 3MB - 线路(每线 2 端点):20w × 2 × 2 × 4B = 3.2MB - 带拐点(平均 5 点):约 8MB - 优点:复用现成能力,快(原答 2.3 KB)
|
|
21
|
-
|
|
22
|
-
**问**:luma.gl+deck.gl可以结合使用吗,效果会超过WebGPU吗
|
|
23
|
-
**答**:**第一问:不是「结合」,是「层叠」** - **Compute shader 做几何展开**(线宽、箭头、圆角连接全在 GPU 生成) - **100w+ 图元**,GPU 本身成为瓶颈 - **多缓冲轮转**:拖拽时每帧写一个小 buffer,WebGL2 有隐式同步(要等 GPU 用完才能覆盖这块 buffer),WebGPU 可以用环形缓冲避免 stall - **底座就用 deck.gl v9 + WebGL2 后端**,别急着上 WebGPU。理由:兼容性好得多(WebGPU 虽然 2025 年后 Chrome/Safari/Firefox 都陆续默认开启了,但企业内网、老 Electron 内核这些环境不一定有),而收益接近零。(原答 2.5 KB)
|
|
24
|
-
|
|
25
|
-
**问**:gl-matrix 是什么
|
|
26
|
-
**答**:一个纯粹的 **JavaScript 矩阵/向量数学库**,WebGL 项目的标配。不渲染任何东西,只算数。 - 模块:`vec2` / `vec3` / `vec4`、`mat2` / `mat3` / `mat4`、`quat`(四元数) - 零依赖,MIT,ES module 可 tree-shake,按需引入只有几 KB - 作者 Brandon Jones,Google WebGPU 规范编辑之一 - API 早就稳定了,属于"写完就不用再动"的库(原答 1.1 KB)
|
|
27
|
-
|
|
28
|
-
**问**:WebGL2 优缺点是什么
|
|
29
|
-
**答**:**一句话定位**:WebGL2 = OpenGL ES 3.0 的浏览器版本,2017 年就上线了,是 WebGL1 的超集。它是「稳妥够用」的那一档。 - **兼容性碾压 WebGPU** —— 这是它最大的价值。2017 年起的浏览器全支持,包括老 Safari、企业内网浏览器、旧 Electron 内核。WebGPU 要到 2025 年才在 Safari/Firefox 铺开。 - **生态成熟** —— 十几年积累,Three.js / PixiJS / Babylon / deck.gl 全都围绕它建,任何坑都有人踩过、有答案。 - **相比 WebGL1 是质变**,几个关键能力正好是你要用的: - **实例化渲染**(`drawElementsInstanced`)—— 画 30w 图元的基础(原答 1.7 KB)
|
|
30
|
-
|
|
31
|
-
**问**:WebGL2 存在浏览器兼容吗
|
|
32
|
-
**答**:**短答**:浏览器版本层面早就不成问题了,真正会咬你的是**运行环境和设备层面**。 - **浏览器版本**:2026 年了,不用管。 - **实际风险点**:如果部署在客户现场工控机 / 虚拟机 / 远程桌面上,上面第 1、5 条会真实发生,**必须写降级路径**。 - **浮点纹理**:唯一需要写降级代码的地方(降级到 RGBA8 编码存位移,精度略降,视觉无感)。 - **上下文丢失**:必做,特别是如果页面里同时存在多个 WebGL canvas。(原答 2.2 KB)
|
|
33
|
-
|
|
34
|
-
**问**:WebGL2 +WebGUI可以结合使用吗
|
|
35
|
-
**答**:**先澄清一下**:「WebGUI」不是和 WebGL2 对等的技术名词,通常指两种情况 —— 两种答案都是「可以」。 - **devicePixelRatio 坐标换算** —— 最容易出 bug 的地方。canvas 的 `width/height` 属性要设成 `clientWidth * dpr`(设备像素,给 `gl.viewport` 用),但 DOM 定位用的是 CSS 像素。两套坐标来回换算时必须乘除 dpr,否则 DOM 覆盖层和 GL 画面会错位。 - **事件穿透** —— UI 容器设 `pointer-events: auto`,透明区域保持 `none`,否则 DOM 上的拖拽动作会漏给 canvas,或者反过来 canvas 拾取被 UI 挡住。 - **别每帧改 DOM** —— DOM 的 layout/reflow 比 WebGL 绘制贵一个数量级。拖拽中如果要动 DOM 手柄,只用 `transform: translate3d()`(走合成层,不触发 layout),或者干脆画在 Canvas2D 覆盖层上。 - **Dear ImGui 的 web 移植(imgui-js)**:WASM 编译 + 自己的 WebGL 后端画控件。能和你的 WebGL2 场景共存,但它是一套独立渲染 —— 要么叠一个 canvas,要么把它的绘制命令注入你的 GL 上下文。**只建议做调试面板**,中文字体、无障碍、样式全都很难搞,不适合产品 UI。(原答 1.8 KB)
|
|
36
|
-
|
|
37
|
-
**问**:帮我查看一下D:\work\teap-gis\src\components\gis-core整个文件夹的组成,生成一个md文件方便我知道目前有些交互逻辑是如何实现的
|
|
38
|
-
**答**:文档已生成:`D:\work\teap-gis\src\components\gis-core\INTERACTION.md`(317 行,UTF-8 无 BOM,PowerShell 里能正常显示中文)。 - **目标**:GIS 新 REST API 联调,把旧 `import_string_func + func_arg_dict` 迁到 `POST /api/v1/gis/**`,并让 `map_data` 走 `engine.setData()`。 - **当前状态**:进行中,工作区有 17 项未提交改动,最新在推进「TC 先选 TG 再打开编辑 GIS」切片。 - **下一步**:首个读取切片(`/gis/map/query` + `/gis/basemaps/detail`)的人工联调证据待维护者补齐。 - **目录组成**:11 个子目录 + 根文件,逐项职责,以及 `views → entries → runtime → composables → core → utils` 的调用方向。(原答 1.4 KB)
|
|
39
|
-
|
|
40
|
-
**问**:解答 问题.txt 里的内容
|
|
41
|
-
**答**:读完了。**结论:技术上可行,但以你现在的项目状态,不值得做。** - **CJK 文字**。你的标签是 `fontFamily: 'Microsoft YaHei, SimHei'` + `characterSet: 'auto'` + 描边背景 + `getPixelOffset`。手写要自己做:字形提取(opentype.js)→ MSDF 生成 → **按当前算例实际出现的字动态构图集**(中文全字库上万个字,不能预生成)→ instanced quad 逐字渲染。这是整个工程里最大的一块,而且做出来的清晰度大概率不如现在。 - **像素宽度折线**。deck 是在顶点着色器里按实例化线段 + 法线扩展做的,不是 CPU 镶嵌。要正确处理 `capRounded` / `jointRounded` / `miterLimit: 2` / `widthMinPixels` / `widthMaxPixels`,加上抗锯齿,是最容易「看起来差不多但一到交叉点就露馅」的部分。 - **标签碰撞**。你现在只在 `zoom < 5` 开,按 `vn_kv * 10 + isMain` 排优先级。手写要么 CPU 空间哈希(30w 标签下会掉帧),要么实现两趟 GPU 方案。 - `viewport.project/unproject` 出现在 **16 个文件**里,横跨 `core/interaction/`、`core/parallel/`、`core/geometry/`、`com…(原答 3.3 KB)
|
|
42
|
-
|
|
43
|
-
**问**:继续解答 问题.txt 里的内容
|
|
44
|
-
**答**:问题原文: - `interaction-group-drag.ts` 里写明了「松手会清空选中集合,是既有行为不是遗漏」 - `selection.ts` 里写明了「`applyGroupSelectionColors` 默认配置下写了也不上屏,要改选中色请改 `station-icons-layer.ts`」 - `route-control.ts` 里写明了「`groupRoute` 首尾是建组时的坐标快照,拖场站不会更新它」 - ESLint 用 `overrides` 按路径分层:`core/**` 放宽,新增文件走严格规则(原答 3.8 KB)
|
|
45
|
-
|
|
46
|
-
### 09-15 16:09 · 立项:新建 gis-view 组件 + 两点一线 demo;随后拆成独立项目
|
|
47
|
-
|
|
48
|
-
**问**:帮我当前项目文件下components 新建一个gis-view的文件夹 然后里面新建一个组件,组件基于WebGL2 +WebGUI,然后在demo里调用组件,生成一个简单的两个点和一根线条的demo
|
|
49
|
-
**答**:已完成。当前项目(`D:\zj\virtual-table-view-vue3`)下新建了组件目录与 demo,并接入现有导出与构建入口。 - `GisView.vue`:Vue 3 组件壳 + WebGUI 覆盖层(左上读数面板、右上控制面板、DOM 标签层、WebGL2 不可用时的降级提示)。 - `engine.ts`:与框架无关的 WebGL2 引擎,`createGisViewEngine(canvas, options)` 可脱离 Vue 单独使用。 - `shaders.ts`:GLSL ES 3.00 着色器;点用 `gl.POINTS` 圆形精灵,线用实例化四边形在屏幕空间展开,保证像素级线宽。 - `utils.ts` / `types.ts`:颜色解析、坐标归一、屏幕距离、网格步长与全部公开类型;`README.md` 记录缓冲区布局与渲染约定。(原答 1.2 KB)
|
|
50
|
-
|
|
51
|
-
**问**:根据修改.txt修改
|
|
52
|
-
**答**:已按 `修改.txt` 的三条要求改造完成,并用真实浏览器渲染验证过。 - `GisView.vue` 已删除。新增 `src/components/gis-view/create.ts:48` 的 `createGisView(dom, options)`:传容器元素或选择器,内部插入 `.gis-view` 根节点与 canvas,**宽高默认跟随容器**(容器高度 <40px 时回退 480px),返回可链式调用实例,`destroy()` 只移除自己插入的节点。 - 点/线独立配置:`point.ts`(圆形 / SVG path+viewBox / SVG 标记 / 图片 URL·dataURL·HTMLImageElement·canvas,大小、颜色、描边、透明度、阴影)、`line.ts`(颜色、粗细、透明度、`join` 端点、阴影、折线 `path`),单点/单线字段优先于全局 `pointStyle`/`lineStyle`。 - 背景层:`background.ts` + `geojson.ts`,支持底色、图片(`bounds`/`fit`/`opacity`/`shadow`)与 GeoJSON(填充色、填充透明度、描边色、线宽、点颜色/大小/符号、整体透明度、阴影),面做了耳切三角剖分与内环挖洞。 - 配套:`shaders.ts`(新增贴图/填充/背景图程序与逐实例阴影偏移)、`symbols.ts`、`gui.ts`(纯 DOM WebGUI:HUD、控…(原答 1.5 KB)
|
|
53
|
-
|
|
54
|
-
**问**:将当前gis-view文件夹和相关内容 移动到D:\work 生成一个新的gis-view的项目组件,参考现在的virtual-table-view-vue3,但是组件里只保留gis-view这一个组件 且只能导出这一个组件不考虑后续扩展新组件
|
|
55
|
-
**答**:新项目已就绪并全部验证通过。 - `D:\work\gis-view`:独立包 + 自带 demo 应用,源码在 `src/gis-view`(`create.ts` / `engine.ts` / `point.ts` / `line.ts` / `background.ts` / `geojson.ts` / `gui.ts` / `shaders.ts` / `symbols.ts` / `types.d.ts`) - 单一导出:`src/index.ts:1` 只 `export * from './gis-view'`,`createGisView(dom, options)` 为默认导出,另导出 `createGisViewEngine` - `package.json:17` 的 `exports` 现在只有 `.` 和 `./style.css`,已按“不考虑后续扩展”去掉多余入口,构建产物为 `dist/index.js`、`dist/index.cjs`、`dist/index.d.ts`、`dist/gis-view.css` - `index.html` + `src/main.ts` + `src/App.vue` 挂载 `docs/demos/GisViewDemo.vue`:两个点(圆形 + SVG 菱形)、一根橙色线路、GeoJSON 背景层,配 WebGUI 读数面板与控制面板,`npm run dev` 即可看(原答 1.1 KB)
|
|
56
|
-
|
|
57
|
-
### 09-15 17:55 · 通道诞生:两端必须绑节点;通道拐点 / 宽度 / 越界;createChannels;10 万卡顿;Ctrl 多选拖拽
|
|
58
|
-
|
|
59
|
-
**问**:当前是D:\work\gis-view 根据修改.txt修改
|
|
60
|
-
**答**:四条修改全部完成,并已在真实浏览器(无头 Chrome + WebGL2)里验证过。 - 删除 `src/gis-view/gui.ts`:HUD、控制面板、图例、错误浮层、DOM 标签全部移除,`gis-view.css` 只剩 `.gis-view` 容器与 `.gis-view__canvas` 两条规则。 - `showHud` / `showControls` / `showLabels` 选项一并去掉,`onError` 保留用于上报错误;尺寸、样式、布局现在完全由使用方控制。 - 新增 `onClick`、`onDblClick`(options 与引擎都暴露,空白处载荷为 `null`),双击在引擎内按 320ms / 6px 判定。 - 命中样式改为配置驱动:`pointSelectStyle`、`pointHoverStyle`、`lineSelectStyle`、`lineHoverStyle`,并支持逐要素 `selectStyle` / `hoverStyle` 覆盖;`selectStyle: {}` 表示命中不改外观,留空则走内置尺寸 / 宽度强调。(原答 1.5 KB)
|
|
61
|
-
|
|
62
|
-
**问**:继续根据修改.txt修改
|
|
63
|
-
**答**:文档补齐并完成全量复核,临时进程(无头 Chrome、Vite)已清理。 - `docs/GisView.md`:options 表新增 `boxSelect`、`selectionBoxStyle`、`waypointEditable`、`waypointStyle` / `waypointSelectStyle`;回调表更新 `onSelect` 新载荷并新增 `onWaypointChange`;新增「框选」「线路拐点」两节;实例方法表补 `getViewRect`、`select(id | id[])`、`getSelections` / `getSelectedIds`、`selectInBox`、`addWaypoint` / `removeWaypoint`,`getStats()` 说明补 `pickMs`;键盘一节补 Delete / Backspace 删除拐点;说明一节补网格索引、拐点缓冲与鹰眼图自建方式。 - `README.md`:交互与样式示例补框选、`onSelect`、拐点与 `onWaypointChange`,并说明多选 API 与拐点数据回写;顶部特性与说明补性能(`pickMs`)与 `getBounds()` + `getViewRect()` 自建预览。 - `src/gis-view/README.md`:`create.ts`、`engine.ts`、`utils.ts` 三条补多选镜像、Delete 键、框选 / 拐点交互与 `crea…(原答 1.1 KB)
|
|
64
|
-
|
|
65
|
-
**问**:继续根据修改.txt修改
|
|
66
|
-
**答**:五条需求全部完成,文档已同步,构建与浏览器校验都通过。 - `docs/GisView.md`:options 表补 `channels` / `channelWidth` / `channelInset` / `waypointVisibility`;新增「通道与多回线」「大数据量」两节;拖拽点、框选、回调表、实例方法表、说明节同步更新(多选拖拽 `payload.points`、`getWaypoints()`、`getChannels()`、鹰眼图与 10 万规模说明)。 - `README.md`:交互清单、demo 说明、配置示例、说明节同步通道 / 多选 / 性能要点。 - `src/gis-view/README.md`:补 `createSegmentGrid`、`cleanPolyline` / `offsetPolyline`、`resolvePath`、通道状态机(`resolveChannels` / `commitChannel` / `moveChannelVertex`)、增量上传与选中下标表等内部实现说明。 - 预览图:`docs/demos/GisViewDemo.vue:324` 四档尺寸 + 缩放(按钮 / 滚轮以光标为锚点)、单击定位、拖动框选放大,像素写入走 `ImageData`。(原答 1.6 KB)
|
|
67
|
-
|
|
68
|
-
**问**:参考图片1、通道两边必须有节点才能显示,增加channel这个概念,将demo中耳洞节点之间线都变成通道2、线路和节点的的点击效果没了3、鹰眼图的预览功能没了
|
|
69
|
-
**答**:这个截图更像 `teap-gis` 的 gis-core。我去确认那边的「通道 / 点击选中 / 鹰眼图」现状。(原答 0.1 KB)
|
|
70
|
-
|
|
71
|
-
**问**:只是参考这种通道效果,现在的通道两端没有节点
|
|
72
|
-
**答**:**本轮改动** - `docs/demos/GisViewDemo.vue`:给通道两端节点加了「锚点」样式(`ANCHOR_POINT_STYLE`:橙底 `#ff7a45` + 12px + 2px 白描边,选中变 26px 黄底深描边),并在卡片文案里标明「橙底白边的那几个节点就是端点」。这样通道两端落在哪个节点一眼可见,也符合你那张参考图的通道效果。 - 通道两端锚定节点本身(`GisViewChannel.from` / `to`,缺任一节点整条通道与回线都不显示)上一轮已完成,本轮做了核对与回归。 - 4 条通道全部 `anchored: true`:`node-0↔node-2600`、`node-700↔node-3600`、`node-1400↔node-4400`、`node-2100↔node-4900`;骨架首尾与节点坐标误差 `0`,拖动端点节点后误差仍 `0`(通道跟着走)。 - 回线端点相对节点只有 6.83px 的横向切点偏移(等距平行的正常结果),沿通道方向没有缩进,两端确实贴在节点上。(原答 1.0 KB)
|
|
73
|
-
|
|
74
|
-
**问**:1、通道拐点添加和显示有问题,2、拐点的两端以两端节点为限制,不能超出节点范围,也不能自定义通道宽度3.demo的节点之间的距离大一点,节点大小大一点方便展示通道的效果
|
|
75
|
-
**答**:三条反馈都已落地并验证完毕。 - 拐点添加:`src/gis-view/engine.ts:3223` Ctrl+点击改为「线比点更近时优先加点」,节点密集时不再被节点抢走点击。 - 拐点范围:新增 `clampChannelSkeleton`(`src/gis-view/engine.ts:1248`),在 `syncChannelAnchors`(`:1298`)与拖拐点 `moveChannelVertex`(`:1461`)后按「两端节点连线方向」夹取,拐点拖到节点外只停在节点边界,也不会自己折回。 - 拐点显示:新增 `channelPathFor`(`src/gis-view/engine.ts:1404`),把回线折线的 miter 尖角沿连线方向夹回节点内,两端始终落在节点上、拐角保持阶梯状(平行等距)。 - demo:`docs/demos/GisViewDemo.vue:23` 规模降到 900 节点、`:62` 点间距加大、`:137` 关键/端点节点加大、`:244` 通道宽度默认 0.24,通道对按下标重排(`:125`)。(原答 1.0 KB)
|
|
76
|
-
|
|
77
|
-
**问**:1、拐点的显示还是有问题,彻底解决这个,然后新增channel文件自动根据传入数组生成channel,而不是通过demo手动聚合line生成2、10万节点都显示的情况下整体的移动,框选,框选移动会有明显卡顿,如何优化3、可以按住ctrl同时点击多个节点,然后一起拖拽和框选一样的效果
|
|
78
|
-
**答**:全部跑通了。本轮在原有进度上收尾,并修掉了一个真实回归。 - 根因:整体重建(`resolveFeatures` + `layoutScene`)后,状态样式的记账被置空并在下一次交互时才按「当时的选中集合」补算,而那时选中集合已经变了——于是「带 `selectStyle` 的节点取消选中后」不会还原,橙色选中外观一直留在缓冲区里(`src/gis-view/engine.ts`)。 - 改为重建当场记账(`rebuildStateStyledSignatures` 紧随 `resolveFeatures` 调用,定义提前到 `defaultHighlightKeys` 之后),差集与记账都用数值签名(点用下标、线用 `-index-1`)。 - 顺带把状态样式从「必须整体重排」改成「就地按槽位覆盖」:只有符号换成/换出贴图、阴影条数变化这类批次结构变化才回退整体重排;`patchPointSlots` 的实例取值改成与 `circleFromGlyph` 同一份(`symbol.size` / `symbol.color`),并同步更新 `maxPointRadius`。10 万节点下悬停/选中带尺寸颜色的样式不再触发整场重排。 - 新增 `verify-statestyle2.mjs`:覆盖「无样式 / 改颜色大小 / 改描边 / 换 SVG 符号(换批次)/ 加阴影(换槽位)/ 仅 hoverStyle」六类节点,Ctrl 多选、悬停、整体取消、逐个取消,增量像素与整批重建全部一…(原答 1.6 KB)
|
|
79
|
-
|
|
80
|
-
### 09-16 09:22 · 缩放函数外露;取消缺省增幅;筛选与搜索分离 + 搜索 API;圆形节点;内置鹰眼图;标签不抖
|
|
81
|
-
|
|
82
|
-
**问**:当前是D:\work\gis-view 根据修改.txt修改
|
|
83
|
-
**答**:5 项需求已全部实现并验证通过,本轮还修掉了函数条件筛选的一个真实 bug。 - `{ points: (item) => item.vn_kv >= 1000 }` 这类函数条件此前会把 `null` 当数据传给函数并抛异常。现在 `evaluateFilter(projection, filter, items?)` 在同步回退时把原始要素交给判定(`src/gis-view/filter.ts:126`),`filter-runner` 透传 `items`(`src/gis-view/filter-runner.ts:87`),`create.ts` 组装任务时带上点 / 线(`src/gis-view/create.ts:286`);Worker 路径仍只走扁平投影,两条路径结果一致。文档同步更新(`docs/GisView.md:378`、`src/gis-view/README.md:14`)。 - 筛选:`filter: { points, lines, cascade }` / `setFilter` / `clearFilter` / `getVisibleData` / `getVisiblePoints` / `onFilter`;`cascade` 默认 `'binding'`(按 `from`/`to` 联动),另有 `'coordinate'` / `'both'` / `false`;被过滤节点两端都消失时通道与回线一起收起。 - 悬浮提示:`toolt…(原答 1.4 KB)
|
|
84
|
-
|
|
85
|
-
**问**:继续根据修改.txt修改
|
|
86
|
-
**答**:三条需求都已完成并验证。本次(承接上一轮)做了以下收尾与修正: - 数据下拉默认第一项就是 `new.json`:2164 站点 / 3669 线路 / 2629 通道,站点按 lon/lat 落点,一条 `channel_data` 一条通道、`line_data` 展开成多回线(`docs/demos/GisViewDemo.vue:361`)。 - 修正了一个真会踩到的字段错位:样例/真实数据原来把源字段 `type` 映射成了 `line_type`,而 test.js 的分档读的是 `type`,导致 test.json 里那条 `dc_line` 会走交流分档。现在原样保留 `type`(`docs/demos/GisViewDemo.vue:283`、`:396`)。 - 库侧新增 `getParallelGroups()`(`GisViewInstance` 与引擎都有),结构对齐 `test.json` 的 `parallel_groups`;`onWaypointChange` 载荷新增 `group_id`(`src/gis-view/engine.ts:1641`、`src/gis-view/types.d.ts:308`)。 - 只列「当前还留着拐点」的组:删掉最后一个拐点后线路回到两端点,这条组从集合里退出去(新建的 `state.skeleton.length < 3` / `path.length < 3` 判断)。(原答 1.4 KB)
|
|
87
|
-
|
|
88
|
-
**问**:继续根据修改.txt修改
|
|
89
|
-
**答**:全部改完了,最后一处语法问题也修好并做了全量校验,临时文件已清理。 - 修掉上一步遗留的语法错误:`docs/demos/GisViewDemo.vue:1319` 的放大系数联动 `watch` 现在收尾干净,并在里面补上 `scheduleChannelLabel()`(按最小间隔合并刷新,不会每帧重算读数)。 - `onCameraChange` 里的通道读数刷新收敛成一行注释 + `pointZoomScale !== 0` 才重算(`docs/demos/GisViewDemo.vue:1265`),地图平移不再调用重拷贝的 `getChannels()`。 - 清理:删掉 `.patch-tmp`、`docs/demos/.tmp-demo.ts`、`docs/demos/tsconfig.tmp.json`、临时 Chrome profile;关掉 5199 上的 dev server 与 9333 的 headless Chrome(只杀无头实例,你自己那 42 个 chrome 进程没动)。 - 需求 1:通道宽度可「按两端节点尺寸」取,缩放/整体放大后回线重排,最外两条始终贴节点两边(`src/gis-view/engine.ts:1429`、`src/gis-view/engine.ts:1578`)。实测 节点宽度=0 时退回固定宽度、节点尺寸 40→80 间距 13.33→26.67、整体放大 ×2 间距 ×2。(原答 1.8 KB)
|
|
90
|
-
|
|
91
|
-
**问**:继续根据修改.txt修改
|
|
92
|
-
**答**:Found the real bottleneck: at 100k nodes, labels ON = 0.8 fps vs OFF = 10.3 fps, while the GPU submit is 0.05 ms. Let me look at the picking/box-query path to reuse it for labels.(原答 0.2 KB)
|
|
93
|
-
|
|
94
|
-
**问**:1、暴露出地图缩放函数2、取消默认的尺寸增幅和宽度增幅,没有配置pointHoverStyle和lineHoverStyle等就不要3、flter区分筛选和搜索,如果搜索的时候会将搜索内容放到中间,添加搜索节点下的属性,通道下的某条线路,线路的搜索等api
|
|
95
|
-
**答**:New requirements. Let me read `修改.txt` and survey the current API surface.(原答 0.1 KB)
|
|
96
|
-
|
|
97
|
-
**问**:继续完成修改.txt修改 然后再修改1、暴露出地图缩放函数2、取消默认的尺寸增幅和宽度增幅,没有配置pointHoverStyle和lineHoverStyle等就不要3、flter区分筛选和搜索,如果搜索的时候会将搜索内容放到中间,添加搜索节点下的属性,通道下的某条线路,线路的搜索等api
|
|
98
|
-
**答**:三条需求全部完成并验证,临时验证产物已清理。 - 引擎层:`zoomTo(scale, origin?)`、`zoomToBounds(bounds, padding?)`、`centerOn(x, y)`;`fitView()` 改为复用 `zoomToBounds`,视口未就绪时挂起范围适应(`resize` 后补执行)。 - 实例层:`zoomTo` / `zoomToBounds` / `focusOn(target, options?)`,见 `src/gis-view/create.ts:702`。 - 实测:`zoomTo(2)` → scale=2;900×600 画布 `zoomToBounds({0,0,100,100}, 40)` → center `[50,50]`、scale `5.18`。 - 新增 `defaultHighlight`(默认 `false`):没配 `pointHoverStyle` / `lineHoverStyle` 等样式就不画任何强调,只在 `buildHighlightBuffers` 与 `defaultHighlightKeys` 两处短路,悬停/选中仍照常触发回调与提示。(原答 1.6 KB)
|
|
99
|
-
|
|
100
|
-
**问**:1、解决圆形节点的显示异常问题2、优化鹰眼图改成自带而不是手动实现,鹰眼图也可以看到线,鹰眼图里的节点样式和线路可以单独配置,当鹰眼图出现框是可以直接点击框移动,取消点击定位改成点击长按移动视角3、继续优化性能,考虑大数据下的框选和移动,增加分层是否可以优化性能
|
|
101
|
-
**答**:三项都完成并验证过了,最后一并做了文档与清理。 - 根因在 `src/gis-view/symbols.ts`:`resolveSvg` 把符号自带的 viewBox 原样交给 `<svg>`,圆形符号的半径正好等于 viewBox 边界,描边有一半压在视口外被裁掉,圆环于是看起来像圆角方形。 - 修复:按 `strokeWidth / 2` 外扩 viewBox(无描边、`stroke: 'none'` 时不扩)。形状测试页把符号放到 8 倍尺寸对比,修复前是圆角方形、修复后是正圆。 - 新增 `src/gis-view/minimap.ts`,对外是 `GisViewOptions.minimap`(`GisViewMinimapOptions | null`):`enabled / width / height / position / margin / padding / background / borderColor / borderWidth / radius / pointStyle / lineStyle / boxStyle / interactive / longPressDelay`,节点、线路、视口框三份样式完全独立,`updateOptions({ minimap: null })` 可随时关掉、不配不产生任何 DOM。 - 画的是筛选之后仍然可见的节点与线路,通道回线也在(通道线取引擎解析出的成员折线,普通线走 `lineCoordinates`)。(原答 1.9 KB)
|
|
102
|
-
|
|
103
|
-
**问**:继续根据修改.txt修改
|
|
104
|
-
**答**:九项需求已全部落地,`tsc`、`npm run build`、`npm run build:lib` 全部通过,临时验证脚本与无头 Chrome 已清理。 - 初始线路画成直线:底图取几何和引擎重建不在同一个 rAF,`engine.forEachLine` 现在把「真正画出来的线」(含通道推导折线)交出去,`refreshMinimap()` 立刻刷一次再补一帧。 - 小图滚轮缩放:`minimap.wheelZoom`(默认开),锚点世界坐标经 `source.zoomByWorld` 交给主图。 - 参考:`src/gis-view/engine.ts:1778`、`src/gis-view/create.ts:145`、`src/gis-view/minimap.ts`。 - `exportImage({ type, quality, scale, background, includeLabels, download })` 返回 data URL,画布 + 节点标签 + 线路标签合成;实测导出图里标签、通道回线、线路装饰都在(`create.ts` + `overlay.ts` 的 `labelBoxes()`)。(原答 1.8 KB)
|
|
105
|
-
|
|
106
|
-
**问**:1、初次渲染的鹰眼图的线路显示有问题,需要取消线路再线上线路才能恢复2、继续优化文本标签显示隐藏逻辑,不要让标签抖动跳动3、继续优化大数据下的数据处理和交互问题
|
|
107
|
-
**答**:本轮修改完成,三绿(`npx tsc --noEmit` / `npm run build` / `npm run build:lib`)都过,测试环境与临时工具已清理。 - 根因是底图线段走 Canvas2D 路径时没有 `beginPath()`,新路径接在上一帧后面继续描,叠出来就是碎块;点与线的先后顺序也会互相覆盖。 - 现在每帧 `beginPath()` 后重画,并且统一先点后线(点走离屏 `ImageData` 复用,线走路径)。 - 复验:首屏鹰眼图截图与「取消线路再打开」后的截图**逐像素完全一致**,线条连续。 - 缩放不再整层 `scale`(那会让字号跟着地图放大、停手弹回,看着一直在抖):标签数在 512 以内时逐个写位置、字号一点不动,位置取整到像素;切回真实排版前先 `foldLabelShift()` 把累积变换折进每个标签自身,来回切换不回跳、半像素文字不会被反复栅格化。(原答 1.4 KB)
|
|
108
|
-
|
|
109
|
-
**问**:继续根据修改.txt修改
|
|
110
|
-
**答**:5 条需求全部改完并逐条验证通过,构建三绿(`tsc`、`npm run build`、`npm run build:lib`),测试脚手架与无头 Chrome、vite 都已清理。 - 节点尺寸按 `getGisStyle` 分档:`getGisNodeRadius` 就是「宽度 = 半径」(`docs/demos/gisStyle.ts:180`),`buildGisNodeRules` 用同一套阈值给节点打尺寸(交流 1050/525/230/110 → 半径 15/9/6/3,直流各档同理,`docs/demos/gisStyle.ts:201`);煤电/气电原来写死的 `size: 20` 改成 `sizeScale: 1.5`,不再盖掉电压分档。 - 圆按面积对齐正方形:`CIRCLE_AREA_FACTOR = 2 / √π`(`src/gis-view/symbols.ts:217`),实测同 size 下圆墨迹 1524 / 方 1597(原来是 1190 / 1597)。 - 鹰眼图层级:先铺线、再把节点离屏层整层盖上去(`src/gis-view/minimap.ts`),像素验证中线穿过节点处取到的是节点色而不是线色。 - 标签固定间距:引擎新增 `getPointRadius`(`src/gis-view/engine.ts:1864`),覆盖层新增 `repositionNodeLabels`(`src/gis-view/overlay.ts:894`)——缩…(原答 1.3 KB)
|
|
111
|
-
|
|
112
|
-
**问**:继续根据修改.txt修改
|
|
113
|
-
**答**:`修改.txt` 五条已全部完成,最后一轮把文档、JS 版与关键修正补齐: - 第 4 条:`npm run build:js` 生成 `js/`(20 个文件,注释/目录/空行与 `src/` 一一对应,相对导入补 `.js`),新增 `scripts/build-js.mjs`、`tsconfig.js.json`;`/js` 已加入 `.gitignore`(生成物不入库,随时可重建)。 - 第 5 条:新增 `docs/从0到完整的实现.md`(1436 行,11 章 + 附录),从「拿 WebGL2 上下文」讲到着色器、实例化、距离场、相机数学、拾取网格、通道偏移、标签避让、鹰眼图、筛选 Worker、性能与打包,附常量速查表与 22 条踩坑清单;`README.md`、`docs/GisView.md`、`src/gis-view/README.md`、`js/README.md` 都已链接过去。 - 第 1 条收尾:demo 里「每 43 个节点一个金色节点」改成勾选「逐点样式」才出现(默认关),默认画面同一个 `vn_kv` 的颜色/大小/形状完全一致。 - 第 2 条文档:`docs/GisView.md` 的 options 表、通道字段表、`createChannels` 表与通道段落都补了 `channelTangentInset` / `tangentInset`(缺省按回线线宽内收,单侧最多 20%),`README.md` 与内部 README 同步。(原答 1.0 KB)
|
|
114
|
-
|
|
115
|
-
**问**:继续根据修改.txt修改
|
|
116
|
-
**答**:本轮把 `修改.txt` 第 1、3 条收尾完成,全部验证通过。 - 源码此前已转完;这轮把剩下的也转成 JS:`docs/demos/gisStyle.ts` → `docs/demos/gisStyle.js`,`docs/demos/GisViewDemo.vue` 与 `src/App.vue` 去掉 `lang="ts"`(类型全部剥离,模板里的 `as HTMLInputElement` 也改掉),`vite.config.ts` / `vite.config.lib.ts` → `.js`(`package.json` 构建脚本与文档引用同步)。 - 现在整库只剩 `src/gis-view/types.d.ts`、`src/index.d.ts`、`src/vite-env.d.ts` 是 TS(对外类型声明,故意的)。 - 文档里的代码块也统一成 `js`/`vue`:`docs/GisView.md`、`README.md`、`docs/从0到完整的实现.md`(仅 3 处纯 `interface` 类型块保留 `ts`)。 - 新增第 12 章「从零搭一整套(照抄这份代码)」(`docs/从0到完整的实现.md:1366`):12.1 目标与文件 → 12.2 起工程 → 12.3~12.9 七步完整代码 → 12.10 验收清单 → 12.11 从 mini 长成完整库的对照表;目录与读法建议已同步。(原答 1.3 KB)
|
|
117
|
-
|
|
118
|
-
### 09-16 18:12 · SVG / 方块渲染与颜色语义(描边 vs 填充);DC_NODE_COLORS 报错;放大渲染速度
|
|
119
|
-
|
|
120
|
-
**问**:当前是D:\work\gis-view 根据修改.txt修改
|
|
121
|
-
**答**:四条需求都已改完并验证通过。 - `src/gis-view/symbols.js:139`:根因是 `path` 没有 `viewBox` 时,视口被当成符号像素尺寸(12×12),而 path 坐标常是 100 见方 → 放大百倍后被裁掉。现在按 `symbol.viewBox` → 标记里的 `viewBox`(单双引号都认)→ 内容实测范围(`getBBox`,新增 `measureSvgViewBox`)→ 符号尺寸逐级兜底;顺带修了多 `<path>` 标记只给第一个补 `fill` 的问题。 - `docs/demos/gisStyle.js:235`:`GIS_TYPE_SYMBOLS` 改为只有 `station` 是 `circle`,其余(switch / dc_line / 换流站、风电 / 光伏 / 核电 / 煤电…含兜底规则)全是方;`pathSymbol` 改为导出,想给某类换回 test.js 线条图标时用。 - `src/gis-view/engine.js:1216`:`channelNodeWidthFor` 的 `Math.max(...)` 改成两端取 `Math.min(...)` 的节点尺寸。实测大节点 60 / 小节点 20 的四回线通道,改前有回线扑出小节点,改后 4 条回线全部落在小节点宽度内、两端保持平行。 - 引擎本来就支持 `selectionBoxStyle`(fill / fillOpacity / stroke / stro…(原答 1.5 KB)
|
|
122
|
-
|
|
123
|
-
**问**:demo中svg还是不对,也没有方块,svg路径还是没有
|
|
124
|
-
**答**:找到问题了,是两处叠加:一是 demo 里「按站点类型换符号」默认关着,二是上一轮我把所有非 station 的类型都改成了方,而且规则表最后那条兜底(`station_type: { ne: 'station' }`)按「后命中覆盖前面」的规则把所有类型规则全盖掉了 —— 所以既没有方块(开关没开),也永远出不来 SVG 图标。 - `station` → 圆; - `switch / switching_station / converter_station / dc_line`、`coal / gas` → 方(test.js 里开关/直流只有几条细线,煤电/气电的图标画在 200 见方、细节太多,缩到十几像素都看不清); - `wind / solar / nuclear / hydropower / pump / storage / feedin` → **test.js 的线条图标(SVG)恢复**; - 兜底规则挪到**最前面**,只负责「表里没列到的类型(如 load)画方」,不再盖掉后面的图标规则;`type` 的开关 / 直流规则放最后。(原答 0.9 KB)
|
|
125
|
-
|
|
126
|
-
**问**:节点根据getGisStyle里的颜色指的是描边颜色,fill颜色还是默认白色
|
|
127
|
-
**答**:按「getGisStyle 的颜色 = 描边色、填充保持白色」改完了,本地跑过构建和无头浏览器验证。 - `docs/demos/gisStyle.js:186` 的 `buildGisNodeRules()`:`style` 变成 `{ color: NODE_FILL, strokeColor: 电压配色, strokeWidth: 分档宽度, size }` —— 填充固定 `#ffffff`,getGisStyle 分出来的颜色与宽度(1~5)落在描边上(原来是 `color` 同时当填充)。配色常量改名 `DC/AC_NODE_STROKE_COLORS`,并补了说明注释。 - `src/gis-view/symbols.js:122`:SVG 的 `fill` / `stroke` 新增 `'currentStrokeColor'`(取点自身的 `strokeColor`),`'currentColor'` 仍是取 `color`;解析结果照旧进缓存键。这样白底节点的 SVG 图标能跟着描边色走。 - `docs/demos/gisStyle.js:219`:`pathSymbol` 的描边由 `'currentColor'` 换成 `'currentStrokeColor'`,图标线条跟电压色描边走,内部仍留白。 - `buildPointStyle()`(`:619`)改成白底 + 蓝描边,不套规则时也是同一个路子。(原答 1.1 KB)
|
|
128
|
-
|
|
129
|
-
**问**:控制台报错 Uncaught ReferenceError: DC\_NODE\_COLORS is not defined
|
|
130
|
-
**答**:我在仓库里搜不到 `DC_NODE_COLORS` 了,先确认是不是还有别处引用或缓存导致的。(原答 0.0 KB)
|
|
131
|
-
|
|
132
|
-
**问**:svg路径没有渲染到节点上
|
|
133
|
-
**答**:明白了 —— coal 这类节点现在是内置方块,test.js 的 SVG 路径被顶掉了。我把「除 station(圆)外都用 test.js 的路径」改回去。(原答 0.1 KB)
|
|
134
|
-
|
|
135
|
-
**问**:station渲染的piont盒子是圆,路径还是按svg渲染,类似svg中rect 和circle的形式
|
|
136
|
-
**答**:两件事都处理了。 - 我把常量改名的那次编辑是分两步写盘的(先改定义、再改引用),中间的瞬间被 Vite 的 HMR 推给了你那个一直开着的标签页,所以控制台留了这条错。现在源码、dev server 返回的模块、`dist` 里都搜不到 `DC_NODE_COLORS`,新开页面跑一遍(含切「按站点类型换符号」「图标类型」)控制台干净。**硬刷新一下(Ctrl+Shift+R)就没了。** - `docs/demos/gisStyle.js:251` 的类型表改成:`station` → 内置圆(点盒子就是圆的,`gisStyle.js:233`);**其余类型一律用 test.js 的原路径**(`pathSymbol`)——开关 / 开关站 / 换流站 / 直流 / 煤电 / 气电 / 风电 / 光伏 / 核电 / 水电 / 抽蓄 / 储能 / 外送。这些路径本身就把外框画进去了(rect 外框 + 内部线条,煤电 / 气电在 200 见方里),画出来正是「station 圆、其他都是方的」。 - `type` 上的 switch / dc_line 走 `getGisSymbol({ type })`(`gisStyle.js:304`),路径按 `type` 取。 - `ICON_TYPES`(`gisStyle.js:272`)扩到全部非 station 类型:面板「图标类型 → 内置方块」能把这一层整批换回干净方块,station 一直是圆。(原答 1.1 KB)
|
|
137
|
-
|
|
138
|
-
**问**:1、svg描边粗细可以设置,默认1,现在太粗了2、station不是只显示圆圈,也是根据原来的getGisStyle的svg路径渲染,
|
|
139
|
-
**答**:第 5 轮两条需求都已改完并验证通过。 - `src/gis-view/symbols.js:141` 新增 `DEFAULT_SVG_STROKE_WIDTH = 1`;`src/gis-view/symbols.js:311` 起 `symbol.strokeWidth` 改按 **CSS 像素**解释(跟点 / 内置形状一个单位),光栅化时按视口与符号尺寸换算成用户单位,图标缩放到多大线条都是这个粗;写 0 或 `stroke: 'none'` 就是不描边,视口按 `strokeWidth / 2` 外扩以免描边被裁掉。 - demo 面板新增「图标描边」输入(`docs/demos/GisViewDemo.vue:1427`,0~6、步进 0.5、默认 1,只在「按电压等级配色/定大小 + 按站点类型换符号 + 图标类型 = SVG」时可用),改了立即换上新的贴图。 - `docs/demos/gisStyle.js:221` 起:`pathSymbol(input, strokeWidth)` / `getGisSymbol(input, icons, strokeWidth)` / `buildGisSymbolRules(icons, strokeWidth)` 都能传粗细,默认 `SYMBOL_STROKE_WIDTH = 1`。 - station 用 test.js 的同心圆环路径(`vn_kv > 330` 三圈、其余两圈,规则在 `docs/demos/gisSt…(原答 1.2 KB)
|
|
140
|
-
|
|
141
|
-
**问**:继续 根据修改.txt 修改
|
|
142
|
-
**答**:三条需求都完成了,实测结论如下。(原答 0.9 KB)
|
|
143
|
-
|
|
144
|
-
**问**:继续优化节点放大时候的渲染速度
|
|
145
|
-
**答**:全部改完并验证过了。 - 把「节点放大」这条路径又量了一遍:单步同步耗时已经是 5 ~ 8 ms,但**持续拖**滑块时每帧都在重传通道回线(回线宽度按节点尺寸取,倍率一变就得重排)。回线在缓冲里是「一条通道一段、段与段之间还夹着别的线路」,逐段攒批退化成**一秒 30320 次 `bufferSubData`**(还各带一次 `bindBuffer`)。 - 新增 `estimateLinePatchRuns()`:扫一遍估算这次改动会被切成多少段(槽位跨度 − 占用槽位 + 1,不排序)。 - 新增 `rewriteLineSlots()`:段数超过 `LINE_PATCH_REWRITE_RUNS`(48)且改动条数 ≥ 全部线路 1/4 时,把线路 / 阴影 / 圆头三张缓冲按槽位顺序整份重写、**各传一次**;逐条校验槽位表,对不上就退回原攒批(再不行转整份重排)。阈值以下仍走原攒批,零星几条线整批重写是亏的。 - 真实数据 2164 点 / 3669 线,拖「节点放大」1 秒:`bufferSubData` **30320 → 80 次**;每步同步 5 ~ 8 ms(上一轮 6 ~ 10 ms),长任务 0 次。(原答 1.0 KB)
|
|
146
|
-
|
|
147
|
-
### 09-17 11:05 · 分组分配后回线重合的修正;channelGroupTarget 报错;文档同步
|
|
148
|
-
|
|
149
|
-
**问**:当前是D:\work\gis-view 根据修改.txt修改
|
|
150
|
-
**答**:`D:\work\gis-view` 已按 `修改.txt` 三条全部改完并验证通过。顺带修掉了 demo 里一处重复的鹰眼提示文案。 - `zoomable` 打开后空白处可直接拖动平移小图内容(主图不动,内容夹在数据范围内,平移后不再自动回中);拉框选取直接变成虚线框选,松手主图适应到框住区域(`src/gis-view/create.js:122` 接 `zoomToBounds`)。 - 两个动作不用改配置:`dragAction: 'pan' | 'box'` 配「不按修饰键时」的动作,按住 Ctrl / ⌘ 拖动始终是另一个。 - 每格缩放 `zoomStep`(默认 1.4,一格 = 100px 滚轮,单次最多两步),`zoomInStep` / `zoomOutStep` 可分别覆盖放大 / 缩小。 - `channelCircuits: false` 时一个通道只画偏移最靠中间的一根回线,走引擎新增的 `getChannelMembers()`(只读下标与偏移,不复制几何)。(原答 1.2 KB)
|
|
151
|
-
|
|
152
|
-
**问**:继续根据修改.txt修改
|
|
153
|
-
**答**:本轮 6 条需求已全部落地,`修改.txt` 已按仓库惯例清空,临时测试文件已删除(未提交,等你确认)。 - 鹰眼图规则(需求 1):`minimap.pointRules / lineRules`(颜色、半径/线宽、形状 `circle`/`square`、层级),配 `inheritRules`(缺省沿用主图规则的无量纲字段:颜色/透明度/层级)、`levels`(每一层显示什么级别)、`layered`(分层叠画开关)、`pointZoomScale`/`lineZoomScale`(节点与线路跟随小图自身倍数放大)。规则解析在 `src/gis-view/create.js:275`,绘制在 `src/gis-view/minimap.js:248`(点按层级分箱)与 `src/gis-view/minimap.js:318`(线按「层级+颜色+线宽+透明度」分桶)。 - 通道分组(需求 2~5):`channelStates` 改成「一组一份骨架」(键 `通道|分组`,分组 id 缺省是通道 id 或 `通道::2`)。`setChannelGroups`/`getChannelGroups` 在 `src/gis-view/engine.js:1577`、`1550`;视图层 `splitChannelGroups` / `mergeChannelGroups` / `getChannelGroups` 在 `src/gis-view/create.js:1088`、`1…(原答 1.7 KB)
|
|
154
|
-
|
|
155
|
-
**问**:控制台报错 Cannot access 'channelGroupTarget' before initialization
|
|
156
|
-
**答**:报错已修复并验证通过。 - 从 `.vue` 中抽出 `<script setup>` 用 vue 桩在 Node 里完整执行一遍:退出码 0(当前代码)。 - 反向对照:把 watch 挪回原来的位置重新生成再跑,精确复现 `ReferenceError: Cannot access 'channelGroupTarget' before initialization` —— 说明这个检查确实能抓到该错误,不是假通过。 - `npm run build`(`tsc` + `vite build`)通过。 - 顺带确认了同类风险:脚本里没有 `immediate: true` / `watchEffect`,其余 watch 回调与 `onMounted` 都在 setup 执行完之后才运行,不存在第二处 TDZ;临时验证文件已删除,工作区仍只有此前那 9 个改动文件(未提交)。(原答 0.7 KB)
|
|
157
|
-
|
|
158
|
-
**问**:继续根据修改.txt修改
|
|
159
|
-
**答**:收尾完成。核对了一下你报的报错:`docs/demos/GisViewDemo.vue` 里 `watch(channelGroupTarget, …)` 现在在 `const channelGroupTarget` 之后(L1292 声明 → L1340 watch),整个 `script setup` 已能在运行态完整执行,不再有 TDZ 报错。 - `docs/GisView.md`:新增三个小节 —— 「分组拐点:分开重合的分组」「通道右键交互框」「新增通道」(docs/GisView.md:398、424、458),含 `addChannelGroupWaypoint` / `removeChannelGroupWaypoint`、`getChannelContext` / `setCurrentChannelGroup` / `runChannelAction`、`beginAddChannel` / `onChannelDraft` / `commitAddChannel` / `addChannel` 的用法与三种方案、上限、blocked 说明;回调表里草稿 phase 列表同步改成 `start` / `from` / `ready` / `cancel` / `commit` / `blocked`。 - 草稿 phase 统一:引擎内部原来 `'to'`(起点已选、等终点)既不等于回调里的 `'from'` 也不等于初值,现在统一为 `start` → `fr…(原答 1.4 KB)
|
|
160
|
-
|
|
161
|
-
**问**:继续根据修改.txt修改
|
|
162
|
-
**答**:这轮做的是「真机验证 + 修掉验证中发现的真 bug」。 - 现象:右键框能正常弹出、也能拿到分组列表,但随后程序化再取就取不到——`view.getChannelContext()`(不传参)永远返回 `null`。 - 原因:`channelGroupActiveKey` 存的是 `state.channelKey`(`channel:xxx`),而 `channelStates` 的键是 `通道|分组`(`channel:xxx|ch1-b`),查表永远查不中。 - 修复:三处赋值改成 `state.key`(src/gis-view/engine.js:1870、1953、2226,注释在 :515),并在引擎 / 实例两层 harness 里补了「不传参取当前分组」的回归断言。 - 右键框:右键回线 → 交互框给出组数 / 当前分组 / 分组列表 / 5 个动作按钮,`reason` 置灰、点空白处按钮收框,不拦截空白处默认菜单。(原答 1.1 KB)
|
|
163
|
-
|
|
164
|
-
**问**:继续根据修改.txt修改
|
|
165
|
-
**答**:按 `修改.txt` 的三条需求,代码已全部实现并通过浏览器端到端验证,本轮补齐了最后一段验证并做完清理。 - 分组拆开重合:`insertGroupWaypoint` / `removeGroupWaypoint`(engine.js:1932、engine.js:1965),缺口默认落在最长骨架段中点并沿法线错开,第 1 组不动;instance 侧 `addChannelGroupWaypoint` / `removeChannelGroupWaypoint` / `runChannelAction('add-waypoint' | 'remove-waypoint' | 'split' | 'merge')`(create.js:1137、create.js:1429)。 - 右键交互框:`onChannelContextMenu` 给 `{ channelId, groupId, groupCount, groups[], group, actions[5], coordinate, originalEvent }`,`getChannelContext()` 不带参数会回落到最后命中的那一组;点击选中和右键命中的元素都带 `channelId / groupId / groupIndex`。 - 新增通道:`beginAddChannel → 点起点(from) → 线跟随光标 → 点终点(ready) → 选方案/直接落地`,`getAddChannelDraft()`…(原答 1.4 KB)
|
|
166
|
-
|
|
167
|
-
**问**:继续根据最新的修改.txt修改
|
|
168
|
-
**答**:按最新的 `修改.txt`(两回线各拆一条 + 优化 demo 分组弹框、按回线自由分配)已完成,并做了浏览器端到端验证。 - 引擎 `moveChannelLine(channelId, lineId, target)`(engine.js:1680 起):把**某一条回线**单独拆成新分组,或并进通道里的另一个分组。`target` 收 `{ type: 'newGroup' }` / `{ type: 'joinGroup', groupId }`,也接受 `'newGroup'` / 分组 id。原分组去掉这一条(搬空就整组消失),其余分组保留自己的骨架与拐点;新分组 id 自动避开 `::2 / ::3` 已占用的号,且一条拐点都不带;并进别组则改读目标分组的骨架。组数 / 回线数到上限(`channelMaxGroups` / `channelGroupMaxLines`)时返回 `{ ok: false, reason }`(如「该通道已达 4 组上限」「目标分组已达 8 回上限」「这条回线已经在这一组里」「这条回线已经是单独一组,不用再拆」)。 - 实例 `moveChannelLine`(create.js:1379 起):成功后把分组声明写回 `channels[].groups`,返回 `{ ok, channelId, lineId, groupId, groupIndex, groups }`;`types.d.ts` 补了 `GisViewChannelL…(原答 1.6 KB)
|
|
169
|
-
|
|
170
|
-
**问**:优化分组分配,避免分配之后分组之间的线路完全重合,比如两回变成两个分组之后,都显示一根线,然后都显示在中间重合了
|
|
171
|
-
**答**:已完成并验证。 - 车道规则重写:偏移不再按分组各算一套,而是按通道 `lineIds` 顺序在整条通道里排一套车道(`laneOrder` / `laneSlots`),每个分组取自己那些回线的槽位 —— 拆分 / 合并只换骨架、不换车道。见 `src/gis-view/engine.js:1379`、`src/gis-view/engine.js:1465`、`src/gis-view/engine.js:1487`。 - 效果:两回线拆两组后两根线一左一右分居骨架两侧(不再都压在中间重合);四回线拆 2+2 后四条线还停在原位;加拐点是把某一组整体拉走,其余分组车道不动;缩放 / 节点尺寸变化时按整条通道重算,各组等比缩、不会跳回居中。 - 单组通道与不分组时完全一致;越界 / 混用旧状态时退回分组自己的居中结果(`src/gis-view/engine.js:1479`)。 - 文档同步:`docs/GisView.md:368`、`docs/GisView.md:404`、`README.md:19`、`README.md:106`、`src/gis-view/README.md:42`、`src/gis-view/types.d.ts:439`,以及 demo 的提示文案(`docs/demos/GisViewDemo.vue:1880`)。(原答 1.0 KB)
|
|
172
|
-
|
|
173
|
-
**问**:完善从0到完整的实现.md 更新修改同步到md文件
|
|
174
|
-
**答**:`docs/从0到完整的实现.md` 已按当前实现补齐。 - 第 6 章改名「通道、分组与多回线」(目录锚点同步),新增 5 节: - 6.8 通道分组:`channels[].groups` 声明、`setChannelGroups` 的四步、`channelCarry` 沿用骨架与 `edited`、声明写回。 - 6.9 分组车道(本轮核心):先说清「各组各自居中 → 单回线分组偏移恒为 0 → 两组完全重合」这个坑,再讲「车道与分组解耦」:`laneOrder` / `laneSlots` 按整条通道排车道、分组只取自己那几条,并列出三个必须对齐的细节(`applyChannelLanes`、`refreshChannelSizes` 用同一套车道、`channelPathFor` 的单回线短路要带「偏移为 0」)。 - 6.10 `moveChannelLine`:三种 target 写法、内部走 `setChannelGroups`、五类拒绝原因表。(原答 1.0 KB)
|
|
175
|
-
|
|
176
|
-
---
|
|
177
|
-
|
|
178
|
-
[← 02 按内容分类:这一路都在改什么](02-%E6%8C%89%E5%86%85%E5%AE%B9%E5%88%86%E7%B1%BB-%E8%BF%99%E4%B8%80%E8%B7%AF%E9%83%BD%E5%9C%A8%E6%94%B9%E4%BB%80%E4%B9%88.md) · [汇总目录](../AI对话汇总.md) · [04 重要问答选(二):交互、性能与数据 →](04-%E9%87%8D%E8%A6%81%E9%97%AE%E7%AD%94%E9%80%89%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9A%E4%BA%A4%E4%BA%92%E6%80%A7%E8%83%BD%E4%B8%8E%E6%95%B0%E6%8D%AE.md)
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
# 04 重要问答选(二):交互、性能与数据
|
|
2
|
-
|
|
3
|
-
> 功能开关与按总量付费的循环、节点拖拽一闪一闪、线路批次视口裁剪、百万级解析、以及 20 条的超长会话(拐点 / 分组怎么给后端)。
|
|
4
|
-
|
|
5
|
-
### 09-24 18:43 · 功能开关表、两处「按总量线性付费」的循环 → 15.25 / 15.39
|
|
6
|
-
|
|
7
|
-
**问**:当前是D:\work\gis-view 根据修改.txt修改组件
|
|
8
|
-
**答**:已按 `D:\work\gis-view\修改.txt` 的两条需求改完,全部落在工作区(未提交),验证全绿。 - `collectDragLinks`(拖动时算「哪些线跟着这个点走」)原先每次都要扫全部线路:10 万点 / 12 万线下占总 CPU **27%**。现在线路 > 2048 条时走一张按 `from` / `to` 的 id 与端点坐标建的归属索引(结构变了按需重建,只挪坐标就地改),命中后仍逐字段判定、按要素下标排序 —— 降到 **1% 以下**。 - 单条 `updatePoint`(改名这类不动几何的改动)**55 → 3.3 ms**(稳态 0.02 ms),`addPoint` **132 → 11.2 ms**。 - `forEachLineInView`(线路标签排版的视口粗筛)原先整份扫包围盒、开标签的 profile 里占 **47 ~ 58%**:线路 > 2048 条且候选稀疏(不足 1/32)时改查拾取用的线段网格,候选排回下标顺序、脏线与退化线单独补 —— 访问顺序与判定口径和整份扫描逐行相同,标签换人与命中集合逐字节一致。 - 取舍一条:索引那条快路只认 id 绑定与坐标精确相等,**线路超过 2048 条时不再保留浮点容差兜底**;线路少时照旧走原扫描,行为与从前逐字不差。(原答 1.6 KB)
|
|
9
|
-
|
|
10
|
-
### 09-28 09:55 · 节点拖拽 / 缩放时「一闪一闪」
|
|
11
|
-
|
|
12
|
-
**问**:当前是D:\work\gis-view 根据修改.txt修改组件
|
|
13
|
-
**答**:按 `修改.txt` 的两条需求已全部改完并验证通过,改动都在 `D:\work\gis-view`。 - 新增 `src/gis-view/renderer.js`:`renderer: 'auto' | 'webgl2' | 'webgpu'`(布尔值兼容 true=webgpu / false=webgl2),带能力探测(只读 `navigator.gpu`,结果缓存)、`getRendererInfo()` 可在运行时查询实际后端与探测原因。 - 结论仍以 WebGL2 为默认(第 18 章实测在目标场景 WebGL2 更快),开关与灰度接口已备好,可随时切 WebGPU。 - `src/gis-view/engine.js` 网格顶点缓存窗口(`GRID_WINDOW_PAD = 0.25`):小步平移 40 帧从「每帧 1 次上传」降到「1 次」,大跳变仍按需重传(59 次),顺滑且不糊网格。 - 新增 `src/gis-view/document.js`:标准文档 `format: 'gis-view'`、`version: 1`,覆盖 节点/线路/通道/拐点(waypoints)/标记(decorations)/标签(labels)/标签状态(labelStates)/分组(groups) 八类数据,`normalizeDocument` 负责深拷贝、JSON 安全化与标准写法。(原答 1.4 KB)
|
|
14
|
-
|
|
15
|
-
**问**:继续根据修改.txt修改组件
|
|
16
|
-
**答**:这一轮的收尾工作已做完并全量复验。开发服务器也已关掉(5311 端口已释放),仓库里没留临时文件。 - `labelStates` 是标签的**运行时状态**:数据里的 `labels` 写「默认长什么样」,这一列写「后来被改成了什么样」(拖过的 `offset`、改过的 `content` / `style` / 位置、运行时 `added` 的标签、`hidden` 隐藏),靠 `kind` + `id` + `labelId` 定位,回灌(`createGisView` / `setLabelStates` / `importData`)走的就是它。 - `channels[].groups[].path` 是这一组回线**共用骨架的中间拐点**,首尾由通道 `from` / `to` 的节点坐标补;同组回线按骨架平行偏移,拖一组的拐点整组一起折,别的分组不动。 - `lines[].path` 是**整条折线**:`path[0]` 与最后一个顶点是端点(跟着 `from` / `to` 节点走),中间的才是拐点,个数 = `path.length - 2`;通道回线自己不写 `path`。 - `docs/steps/selftest-docs.html`:把两个文档页装进 iframe 自测,26 条断言(文档中心 12 + 图解页 14),标题报 `docs PASS` / `docs FAIL`。(原答 1.6 KB)
|
|
17
|
-
|
|
18
|
-
**问**:继续根据修改.txt修改组件
|
|
19
|
-
**答**:第三轮需求已按 `修改.txt` 全部改完并验证。 - `docs/demos/EventDemo.vue`:新增合并 / 复制确认条(`payload.confirm()/cancel()`、`payload.commit()/cancel()`,参考 `DragDropDemo` 的落点草稿),并把「拖到一起鼠标为什么变」写进面板——新增光标读数直接读 `canvas.style.cursor`(事件触发 + 250ms 轮询),说明引擎在待确认合并 / 复制预览 / 等选点三档都切 `cursorStyle.copy`;方法栏补 `getPointCopy()` / `getPointMerge()`。 - `src/gis-view/engine.js`:把 `copy.autoCommit` 真正接到交互入口——原先只有 `beginCopyPoint({ autoCommit: false })` 能停在预览态,现在 Alt 点击与「先点按钮再选节点」都跟着 `settings.copy.autoCommit` 走,`copy: { autoCommit: false }` 时停住等 `payload.commit()` / `commitPointCopy()`。 - `docs/demos/ChannelDemo.vue`:显式开 `features: { drag, channelMenu }` 与 `waypointEditable` 后,右键通道回线出交互框(贴指…(原答 1.5 KB)
|
|
20
|
-
|
|
21
|
-
**问**:继续根据修改.txt修改组件
|
|
22
|
-
**答**:已按 `修改.txt` 的 5 条需求完成本轮修改,并做了最终验证与收尾。 - 选中抬层:引擎原有 `selectionOnTop` / `raisedPointIndexes`、`raisedLineIndexes` 已覆盖,本轮无代码改动。 - 直流标签 svg:`docs/demos/gisStyle.js:253` 的 `dcLineDecorationSymbol` 去掉 `tint`、改 `fill: '#ffffff'`,不再被逐实例染色成实心块。 - Delete 删除流程:`src/gis-view/create.js:5602` 起的新块(`removeImpactOfPoint` / `buildRemovePlan` / `executeRemove` / `requestRemove` / `resolveRemove` / `cancelRemove`),默认 `lines` 范围,支持 `groups` / `channels`;节点连带线路、分组、整条通道都能按范围删;删除发 `onRemove` / `'remove'` 事件;`features.remove` 开关 + `shortcuts.remove` 可配;确认期间数据变过则 `invalidated: true` 作废。demo(`ChannelDemo.vue` / `GisViewDemo.vue`)与文档同步更新。 - 通道选中模式:`src/gis-view/engine.js:401…(原答 1.4 KB)
|
|
23
|
-
|
|
24
|
-
**问**:继续根据修改.txt修改组件
|
|
25
|
-
**答**:本轮 `修改.txt` 的 2 条需求已全部改完并验证通过。 - `src/gis-view/engine.js` 补了三处「落地」漏账: - `syncRaiseSets()`:抬层线路集合变化时补标 `lineBatchDirty`,线路批次顺序重铺 → 选中线路 / 通道抬层、取消选中还原生效。 - `applyDragCoordinate()`:拖动起步帧先 `syncDragLines()` 补线路几何,再按新抬层集合整份 `layoutScene()` 重排;之后每帧仍走槽位补丁 → 同电压等级拖拽也会抬层,且线路跟随不漏一拍。 - `snapshotScene()`:矢量导出里抬层线路排最后,与画布同一份次序。(原答 1.1 KB)
|
|
26
|
-
|
|
27
|
-
**问**:现在节点还有有这个问题,不管是圆的还是方的,不止拖拽,放大缩小地图也会有这个一闪一闪的问题了,到底是什么原因
|
|
28
|
-
**答**:查清楚了,并且已经修完、验证过。 - `src/gis-view/shaders.js:155`:`SPRITE_VERTEX_SHADER` 把吸附从「中心」换成「边」(`floor(… - halfSize) + halfSize`),方框四条边永远落在像素边界上,两条路径要么整格画要么整格不画,贴图仍 1:1。 - `src/gis-view/engine.js:303`:新增 `ORNAMENT_INTERACTION_LIMIT = 2000`,装饰实例总数超过 2000 才在交互期跳过(十万级照旧让位帧率),小场景照画(`engine.js:8582`)。 - 上一轮临时试过的 `u_snap` / `edgeCoverage` 已全部回退删除。 - 11 / 21 / 23 px 图标「静止帧 vs 交互帧」改前差 44 / 84 / 92 个像素,改后 11 / 21 / 22 / 23 px 与形状节点全部 **0 差异**;缩放 9 档墨量恒定 95632(原先在 83805 ~ 93889 之间摆)。(原答 1.3 KB)
|
|
29
|
-
|
|
30
|
-
### 09-29 19:12 · 线路批次视口裁剪与线路 zIndex → 15.47
|
|
31
|
-
|
|
32
|
-
**问**:当前是D:\work\gis-view 根据修改.txt修改组件
|
|
33
|
-
**答**:`gis-view` 的性能优化已完成并验证通过。 - 混合样式补丁:`pointStyle`/`lineStyle`/悬停样式混在一起改时不再整场重铺,走补丁通道(`src/gis-view/engine.js`)。 - 样式输入快照比对:配置对象内容未变时直接跳过解析,原样重发近乎零开销。 - 热力图快路径 + 色带失效修复:色带/配置变更只重算热力图,且按引用存的配置在补丁后强制重解析(修掉同对象原地改不生效的 bug)。 - 线装饰跳过:纯样式补丁不再重锚装饰端点,只重建受影响的槽位。(原答 0.9 KB)
|
|
34
|
-
|
|
35
|
-
**问**:继续优化
|
|
36
|
-
**答**:优化完成,本轮收掉的是「定向更新时线路标签候选被整趟重扫」这笔账。 - 根因:`updatePoint` / `patchPoints` 只改一个节点(哪怕只改名字)也要走一次 `layoutLabels`,线路那一半会 `forEachLineInView` 把视口里十万条线逐条算包围盒与中点 —— 线路一个字节都没变,这趟扫描在十万级 + 两层标签的 profile 里占 35%。 - 改法:`src/gis-view/overlay.js:1167` 新增 `lineCandidateCache` —— `refreshLabels(kinds)` 传 `{ line: false }` 时核对「视口矩形 / 画布 CSS 尺寸(含 DPR 换档)/ 上一轮显示过的下标集合」,全对就整份复用上一轮的 `sticky` / `fresh` / `more`(连排序都不重来);`src/gis-view/create.js:807` 的 `labelRefreshKinds(kind, patches)` 只在「改节点 + 筛选没开 + 补丁没动 `x` / `y` / `id`」时给出这个提示,认不出来返回 `undefined` 走全量扫描。 - 实测(无头 Chrome + SwiftShader,10 万点 / 10 万条长线、两层标签 DOM 75 条,单次 `updatePoint` p50): - `docs/steps/selftest-perf.html` 新增 7…(原答 1.5 KB)
|
|
37
|
-
|
|
38
|
-
**问**:继续优化
|
|
39
|
-
**答**:全部收尾完成。本轮(继续优化 · 超长线段多层网格)的代码、文档、验证与清理都已就绪,改动留在工作区未提交。 - `src/gis-view/utils.js` 的 `createSegmentGrid`:原来「一层里铺不下」的超长线段(铺开格子 > 64)只记一条包围盒、查询按盒子预筛——长线密布时等于全量扫描。现在换更粗的一层网格(`COARSE_GROWTH = 4`,格子边长 ×4),粗层同样按格线步进、只登记真正穿过的格子,查询逐层取覆盖格子并用递增 `stamp` 跨层去重;`estimate` 改为逐层按该层登记条数摊,格子改按需分配。 - `npx tsc --noEmit` 0 错、`npm run build` 通过、`check-doc-coverage.mjs` 197 成员 / 221 字段全命中。 - 十二页自测:`selftest` 19、`labels` 94、`actions` 96、`scale` 42、`perf` 82、`data` 41、`docs` 26、`effects` 79、`full` 68、`demo` 110 全 PASS;仅剩 3 条既有失败(`features` 2 条 noMsaa、`demos` 1 条 LabelDemo 13→14,与本轮无关)。 - 文档已同步:`docs/GisView实现原理.md`(15.44 + 16.26)、`README.md`、`docs/GisView.md`、`src/gis-view…(原答 1.3 KB)
|
|
40
|
-
|
|
41
|
-
**问**:继续优化
|
|
42
|
-
**答**:本轮优化完成(标签层布局抖动),改动留在工作区未提交。 - `npx tsc --noEmit` 0 错、`npm run build` 通过、`check-doc-coverage.mjs` 全命中。 - 十二页自测:`selftest-perf` 82 → **85**(3 条新断言,在旧代码上会 FAIL),其余与改前一致;仍只有 3 条既有失败(noMsaa ×2、LabelDemo 13→14)。 - 行为不变:同一场景画出来的 241 条标签(种类 / 下标 / 文字 / 顺序)逐字一致,三次快照哈希相同。 - 文档已同步:`docs/GisView实现原理.md`(15.45 + 16.27)、`README.md`、`docs/GisView.md`、`src/gis-view/README.md`、`docs/steps/README.md`、`docs/steps/selftest-perf.html`。(原答 1.4 KB)
|
|
43
|
-
|
|
44
|
-
**问**:继续优化
|
|
45
|
-
**答**:- Round 15 (this session's already-done work): fixed `parseLabelTranslate` in `overlay.js` to accept per-part "percent OR px/0" (default right anchor `translate(0, -50%)` previously unparseable → every relayout re-measured every label via `getBoundingClientRect` + forced layout). Added `offsetX/offsetY` to parser, added them in 3 call sites (`readLabelSize` deltaX/deltaY, `labelAvoidRect` cached-box + fallback-box). Measured: zoomed relayout label measurements 7255 calls/616 ms → **18/0.1 ms**; 4 consecutive `updateOptions` 166/190/216/200 → **13/12/10/15 ms**; 100 `updatePoint` p50 177 → **6.1 ms**; duplicate measurements same round 1235 → *…(原答 7.3 KB)
|
|
46
|
-
|
|
47
|
-
**问**:继续
|
|
48
|
-
**答**:这一轮收尾完成。核心是 **发散渲染(`progressiveInit`)的铺批次改成「接着写」**,另外把上一轮一条误报的断言修正了。 - 每批只排新铺到的一段:`buildFrom` / `buildCursor`,`buildMask` 只往后 OR,不再整份清底 - 前缀的账本按累加接着写:`progressiveCircles` / `progressiveTextures` / `progressiveRaised` / glyph 池下标(`progressiveHandled`),`circleRuns` 只回退到 `progressiveRunCount` - 上传换成增量:新增 `uploadPreparedFrom`(`bufferSubData` 只传新增段)、`prepareInstancesGrow`、`reserveInstances`(开始前按预计最终条数占好容量) - 线路批次在铺批次期间不再重建(只认 `lineBatchDirty`)(原答 1.6 KB)
|
|
49
|
-
|
|
50
|
-
**问**:继续根据修改.txt修改组件
|
|
51
|
-
**答**:两台测试服务(Vite 5180 / 无头 Chrome 9333)已停,工作区干净。 - 线路批次视口裁剪(性能):`D:\work\gis-view\src\gis-view\engine.js:2318` 铺批前按「视口 + 线宽余量(`max(最粗半宽×倍率×光晕, 4px)+2px`,换算回世界单位)+ 25% 富余」逐段试交(`segmentHitsRect`,slab 法;只看包围盒只能筛掉六成),视口外的线槽位记 `-1`;拖拽补丁遇到 `-1` 先判断「进视野了吗」(进了退回整份重排);相机停手时 `syncLineCull`(`engine.js:2456`)只在「跑出安全矩形 / 面积缩到一半」时重铺,其余帧只花几次比较。新增读数 `getStats().lineInstances`。 - 线路 `zIndex`(功能):`D:\work\gis-view\src\gis-view\line.js:74` 收下 `zIndex`,优先级「线路自己 > 规则 > `lineStyle` > 0」;`engine.js:4802` 的 `resolveLineLayers()` 计数排序后按层铺批,同层保持数据顺序,没人写就整块跳过;`zIndex` 变化算结构性改动。demo 侧 `docs/demos/gisStyle.js:139` 每档电压规则带上 `zIndex`(取档位起始电压),`docs/demos/GisViewDemo.vue:6220` 新增「…(原答 1.8 KB)
|
|
52
|
-
|
|
53
|
-
### 09-30 14:15 · 百万级:解析一趟算完、按 id 的表惰性化 → 15.48
|
|
54
|
-
|
|
55
|
-
**问**:当前是D:\work\gis-view 根据修改.txt修改组件
|
|
56
|
-
**答**:已在 `D:\work\gis-view` 完成本轮优化并全部验证通过。 - `src/gis-view/engine.js`:解析侧一趟算完(包围盒 / 状态样式 / 效果扫描并进索引循环,存 `fusedDataBounds`);`pointIndexById` 惰性建表(`engine.js:1587`);删掉 `pointGlyphPool`、解析结果直接当渲染项(`engine.js:5102`);槽位标记改名 `decorationSlot` / `effectSlot`,避免与节点自身的 `effect` 字段混淆。 - `src/gis-view/create.js`:id 表按「扫过的元素数」记账(`create.js:42`、`create.js:48`),单条改 id 只挪一个键(`patchIdMap`,`create.js:973`)。 - **顺带修掉一处真 bug**:发散渲染期间建出的涟漪只覆盖已铺到的那一段,铺完后签名不变、永远补不齐;现在 `stopProgressiveBuild()` 推一版 `rippleGeometryVersion` 重建(`engine.js:5677`)。 - `npx tsc --noEmit` 0 错、`npm run build` 与 `npm run build:lib` 通过、`check-doc-coverage.mjs` 全部命中。(原答 1.4 KB)
|
|
57
|
-
|
|
58
|
-
### 10-10 15:48 · 超长会话:拐点 / 分组给后端的交互设计、BackendSyncDemo、exportViewportData、多轮性能优化、dc_line → 15.55 ~ 15.66 组
|
|
59
|
-
|
|
60
|
-
**问**:你好
|
|
61
|
-
**答**:你好!👋(原答 0.1 KB)
|
|
62
|
-
|
|
63
|
-
**问**:当前是D:\work\gis-view 根据修改.txt修改组件
|
|
64
|
-
**答**:修改.txt 里是 4 个问题(拐点存储、channels 无 groups、JSON 标准化、导出格式)。先摸清组件的数据模型和文档/导出实现。(原答 0.1 KB)
|
|
65
|
-
|
|
66
|
-
**问**:继续
|
|
67
|
-
**答**:`修改.txt` 里的 4 条都是问题,我先按代码把答案核实了一遍,只补了真正缺的那一个能力。答案也已写回 `修改.txt` 末尾。 - 线路:`lines[].path` 是整条折线,首尾是端点,第 2 ~ n-1 个才是拐点(`{ id: 'l1', from:'n1', to:'n2', path:[[0,0],[13,14],[27,14],[40,0]] }`)。 - 通道 / 分组:`channels[].path`、`channels[].groups[].path` **只写中间拐点**,两端由 `from` / `to` 补齐(与线路写法相反)。 - 读写口:`getWaypoints` / `addWaypoint` / `setLineWaypoints` / `setChannelPath` / `addChannelGroupWaypoint`;统计是 `documentCounts(doc).waypoints`。 - 非要"单独一份"只在导出侧:`parallel_groups` = `{ group_id, member_line_ids, group_route }`(`group_route` 含两端)。见 docs/数据格式.md:139。(原答 2.9 KB)
|
|
68
|
-
|
|
69
|
-
**问**:可以把这个新接口在演示里露出来
|
|
70
|
-
**答**:在 ChannelDemo 的「分组」面板上加一块勾选拆组的交互(含 `options.id` / `options.path` 两个字段)。(原答 0.1 KB)
|
|
71
|
-
|
|
72
|
-
**问**:继续
|
|
73
|
-
**答**:演示侧已经接上并全量验证过了;我这轮补齐了两处缩进/编码瑕疵,并把 README 里写的所有口径逐条跑实。 - `docs/demos/ChannelDemo.vue:601` —「分组」面板下多了一块勾选:勾几条回线 → 点「勾上的拆成一组」就走 `view.addChannelGroup(channelId, lineIds, { id?, path? })`;两个选项分别演示 `options.path`(照抄来源组骨架 / `[]` 直连)与 `options.id`(留空按 `通道 id::N`),读数报新组 id、第几组、共几组、`skipped` - `docs/demos/ChannelDemo.vue:598` 顶部说明与 `docs/demos/demos.js:54` 页签简介各补一句,页签「通道与数据」一进来就能看到 - `docs/demos/api-index.js:166` 由 `gen-api-index.mjs` 重新生成,成员 208 → 209,所以 `GisViewDemo.vue` 的「实例方法速查」也自动列出它(带参数与说明) - `docs/steps/selftest-data.html:241` 新增的 12 条断言整块原来顶格写,补回四层制表符缩进,并恢复被误删的 UTF-8 BOM(原答 1.3 KB)
|
|
74
|
-
|
|
75
|
-
**问**:考虑更新拐点和分组,将数据给后端,如何交互更合理,是整体给还是拐点和分组单独给
|
|
76
|
-
**答**:**结论** 按「实体子文档」增量给,检查点整份给 —— 编辑期一次 PATCH 一条通道的 `groups` 或一条线路的整份 `path`;保存/提交/冲突恢复时给 `exportData({ format: 'full' })` 那一份。既不要单点级 delta(`pathIndex` 那种),也不要每次编辑整份 PUT。 - 拐点与分组没有独立对象:权威位置就是 `lines[].path` 与 `channels[].groups[].path`(docs/GisView.md:161),`parallel_groups` 只是导出投影。给后端「一份单独拐点数据」必须能反向拼回 `groups[].path`,否则下次打不开成同一个画面 - 分组事件已经把整份声明递到你手上:`emitDataChange('channelGroups', { channelId, item, groups })`(src/gis-view/create.js:5394)。一次 `addChannelGroup` / `splitChannelGroups` = 一条历史 + 一条这样的载荷,直接当 PATCH body 用 - 拐点事件只告诉你「动了哪一组」:`type: 'waypoint'` 带 `lineIndex / pathIndex / phase / groupId / lineIndexes`,而且只在 `add` / `remove` 发(src/gis-view/crea…(原答 2.2 KB)
|
|
77
|
-
|
|
78
|
-
**问**:1、帮我新写一个demo,考虑分组新增修改删除,拐点新增删除修改,场站位置修改等,保存等和后端接口的数据格式输入规范,让我去制定接口传参2、新增一个导出视口内的线路,节点,通道信息的方法
|
|
79
|
-
**答**:两件事都做完了,并且全量回归通过。 - 文件:`docs/demos/BackendSyncDemo.vue:1`,注册在 `docs/demos/demos.js:59`(「数据」分组) - 面板第一块就是**接口约定**,五条请求一眼可抄:`PATCH /gis/points/{id}`、`PATCH /gis/lines/{id}/path`、`PATCH /gis/channels/{id}/groups/waypoints`、`PATCH /gis/channels/{id}/groups`、`PUT /gis/documents`,body 统一带 `baseVersion`(乐观锁)+ `opId`(幂等键) - 每类操作一个区块,点一下就生成**真实**请求体(不是手写示例,是动作落地后按最新几何读回来的): - 场站位置:`movePoint(id,[x,y])` → `{ op:'point.move', pointId, x, y }`(原答 1.8 KB)
|
|
80
|
-
|
|
81
|
-
**问**:几个接口请求结构长啥样
|
|
82
|
-
**答**:刚在 `?demo=backend` 里逐个点了一遍,下面是**真实抓下来的**请求结构(不是手写样例)。 - `baseVersion` 乐观锁、`opId` 幂等键:每条请求都带,队列整批提交时服务端版本 +1(一次提交 = 一个版本) - 拐点 / 分组都发**整份覆盖**:单点 `pathIndex` delta 在增删后会错位,分组挪线还会让别的组整组消失 - 组件接口 → 请求一一对应:`movePoint`→①、`addWaypoint`/`removeWaypoint`/`setLineWaypoints`→②、`setChannelPath`/`addChannelGroupWaypoint`→③、`addChannelGroup`/`mergeChannelGroups`/`moveChannelLine`→④、`exportData({format:'full'})`→⑤ - 面板上的「接口约定」块(`docs/demos/BackendSyncDemo.vue:34` 起)就是这份写法,改动作后请求体当场刷新,可以直接抄去定义你们的接口(原答 2.7 KB)
|
|
83
|
-
|
|
84
|
-
**问**:通一分组拐点不是同步增加的吗
|
|
85
|
-
**答**:简短回答:**同一分组内是同步的,分组之间是不同步的。** - 通道里的回线按分组共用**一条骨架**,任何一条回线加点/拖点,都是往这条骨架上插顶点,整组回线一起折(各自按车道平行偏移)。见 `src/gis-view/engine.js:10657`(`insertWaypoint` 走 `slot.state.skeleton.splice`,注释就写的「整组回线共用」)。 - 所以从回线入口 `addWaypoint(lineId, ...)` 和从分组入口 `addChannelGroupWaypoint(channelId, groupId, ...)` 效果一样,都是作用于该回线**所属分组**——区别只是前者会把坐标投影到所属分组骨架上。 - 拆成多组后,每组有独立骨架/`path`,`addChannelGroupWaypoint()` 只动指定那一组,其余分组一根拐点都不动(`docs/GisView.md:1640-1641`)。 - 实测:`channel-a` 三条回线单组时加一个拐点,组路径 1 个点;拆成两组后给组 2 加点,组 1 仍是 `[[116.2,39]]`,组 2 变成 `[[116.2,39],[115.439,34.2]]`;再对组 2 里的回线 `addWaypoint()`,同样只改组 2。(原答 0.8 KB)
|
|
86
|
-
|
|
87
|
-
**问**:那同一分组如何同步修改拐点 通过接口
|
|
88
|
-
**答**:组内"同步"在接口上就是**一次 PATCH 给整份 path**——因为整组共用一条骨架,改的只有这一份东西,不用按回线逐条发。 - `path` 只写**中间拐点**(首尾由两端节点坐标补齐,和 `channels[].groups[].path` 同义)。这一条落地,组 2 的所有回线一起折(按各自车道平行偏移);组 1 有自己的 path,一根不动。 - 读当前值:`view.getChannelGroups(channelId)` 返回 `[{ id, lineIds, path }]`,直接取 `find(g => g.id === groupId).path`。 - 所以**新增、删除、拖动**在传输层是同一件事:动作做完后按最新几何重读整份 path 覆盖,不做单点 delta(索引在增删后会错位)。 - 加点:`addChannelGroupWaypoint(channelId, groupId, [x, y]?)`(不给坐标就按"分开分组"的默认偏移落点)(原答 1.5 KB)
|
|
89
|
-
|
|
90
|
-
**问**:根据问题.txt修改 修改组件
|
|
91
|
-
**答**:按 `问题.txt` 的两条都改完了,组件 + 演示 + 文档 + 自测一起。 - 新增实例方法 `getChannelGroupWaypoints(channelId?, groupId?)`(引擎实现 `src/gis-view/engine.js:3405`,实例转发 `src/gis-view/create.js:8075`): - `path` —— 整组共用的中间拐点,**给后端的 `channel.group.path` 就是这一份**(组内所有回线共用一条骨架,不用逐条回线发); - `skeleton` —— 含两端锚点的完整骨架; - `lines[]` —— 组里每条回线按各自车道偏移后的 `path` 与 `waypoints`,这就是"同组其他线路同步更新后的拐点",与图上画的一致(不用自己按车道算)。(原答 1.5 KB)
|
|
92
|
-
|
|
93
|
-
**问**:根据问题.txt修改 修改组件
|
|
94
|
-
**答**:两问都已落地并通过全部校验,改动仍未提交。下面是结论与改动清单。 - 一个分组只有一份公共骨架(数据里是 `channels[].groups[].path`,单组写 `channels[].path`)。加 / 删 / 拖都是改这一份,**不是每条回线各自存一份**。 - 每条回线「自己的」拐点不落数据,它是公共骨架按该回线所在车道偏移推出来的**只读派生值**,回写时不用管它;想让某条回线单独拐,就把它拆成新分组(`moveChannelLine(id, lineId, 'newGroup')`),新组才会多出一份公共骨架。 - 区分两层用 `getChannelGroupWaypoints(channelId, groupId)`:公共那份是 `path` / `skeleton`,返回带 `scope: 'group'`;各自那份是 `lines[].path` / `lines[].waypoints`,每项带 `derived: true`(只读)。给后端的 `channel.group.path` 就是公共那一份,组内不必按回线逐条发。 - 用法与 `label.content` 同写法:`view.setLabelContent('{vn_kv}')` 换成电压等级、`setLabelContent('{name}({vn_kv} kV)')` 拼两条、函数也认、`null` 回默认(名称)。(原答 1.5 KB)
|
|
95
|
-
|
|
96
|
-
**问**:可以 同时继续根据最新的问题.txt修改组件
|
|
97
|
-
**答**:本轮两条需求都已落地并验证完毕(工作树未提交)。 - 可配置:新增 `className` + `style`(`applyExternalStyle`,中划线 / CSS 变量 / 驼峰键都认,换配置清掉上一轮写过、这轮没写的键),`extent` 除三档预设外可直接写死世界范围(`{minX,minY,maxX,maxY}` 或 `[[..],[..]]`,`fixedExtent()` 在 `resolveExtent()` 最前)。 - 可扩展:`draw` 钩子,每帧在底图 / 线路 / 节点之后、`syncBox()` 之前拿到 `{context,width,height,ratio,zoom,scale,bounds,extent,project,unproject,data,background}`,外面包 `save()/restore()`。 - 可编辑:`boxEditable` + `boxHandleSize`(`src/gis-view/minimap.js:1051`),四角把手 + 新增 `'resize'` 拖动模式(对角锚定 + `viewportAspect()` 保宽高比 → `resizeBoxTo` → `fitBounds`),光标换 `resize:xx-resize`;demo 面板补「框可编辑 / 自定义层(指北针+中心十字)」两个开关。 - `exportImage` 编码改走新增的 `canvasToDataUrl()`(`toB…(原答 1.7 KB)
|
|
98
|
-
|
|
99
|
-
**问**:继续根据最新的问题.txt修改组件
|
|
100
|
-
**答**:我先看最新的 `问题.txt` 内容。(原答 0.0 KB)
|
|
101
|
-
|
|
102
|
-
**问**:继续根据最新的问题.txt修改组件
|
|
103
|
-
**答**:两条需求都已按最新 `问题.txt` 收口:① 鹰眼图「框可编辑」整块删除;② 线形(solid / dash / dotted)本就完整支持,本轮把口径落成可查的文档 + demo 提示,并复核了运行中改线形的接口。 - `src/gis-view/minimap.js:49` 起:删掉 `boxEditable` / `boxHandleSize`、四角把手整段(`HANDLE_CORNERS` / `syncHandles` / `handleAt` / `hideHandles` / `handleSize` / `viewportAspect` / `resizeBoxTo` / `MIN_RESIZE_BOX`)、`syncBox()` 末尾调用、`'resize'` 拖动模式与指针三处分支、`applyOptions()` 里的 `hideHandles()` - `src/gis-view/gis-view.css`:删 `.gis-view__minimap-handle` 两段(该文件已回到与已提交版本一致) - `src/gis-view/types.d.ts`:删两个字段,`draw` 注释改口(视口框由 DOM 负责) - `docs/demos/GisViewDemo.vue`:删「框可编辑」开关、watch 条目与 hint 一句(原答 2.0 KB)
|
|
104
|
-
|
|
105
|
-
**问**:继续根据最新的问题.txt修改组件
|
|
106
|
-
**答**:本轮(`问题.txt`:组件父元素 CSS 有 `zoom` 会不会影响、要不要改)已收尾。 - 显示比例 `displayScale` = `getBoundingClientRect()` 的视觉尺寸 ÷ `clientWidth` 的布局尺寸(1% 以内按 1、夹在 0.1 ~ 8);画布备份像素按「设备像素比 × 显示比例」开,线宽 / 节点尺寸 / 字号 / 指针换算 / DOM 标签 / 鹰眼图都按布局像素算,与旁边的 DOM 一致。 - 运行期改 `zoom`:设备像素那一档 `ResizeObserver` 会自动补重排。无头 Chrome 逐帧实测(dpr 1 / 2 各一遍):`zoom:1.25` → 1.2517、`zoom:0.8` → 0.799、写回后回到 1,备份像素与标签偏移全部对齐,过渡帧里 `pickAt` 命中也一直正确。 - 运行期改祖先 `transform: scale` 是唯一要自己动手的:它不动布局、观察不到,改完调一次 `view.resize()`(窗口 resize 也会带上);挂载时就写死的 `transform: scale` 不用管。 - 小口径:鹰眼图备份比例是 `clamp(dpr × displayScale, 1, 4)`,dpr 1 且缩小到 0.8 时按 1 倍开(轻微超采样,只会更清楚)。(原答 1.3 KB)
|
|
107
|
-
|
|
108
|
-
**问**:可以 同时继续根据最新的问题.txt修改组件
|
|
109
|
-
**答**:收尾核对完成,全量通过。 - 口径:**先 `createGisView`(空场景/带壳)→ 接口回来 `updateData` → `whenDataRendered` 收 loading**,组件源码逻辑本来就支持,不用改调用顺序也能跑,但先建才有状态可延续。 - 依据(无头 Chrome 实测,5 万点 + 2 万线):空实例 + `updateData` 首落位与带数据建实例**逐位一致**(`{ center: [50, 30], scale: 3.04 }`),总耗时一致(10.1 + 58.7 ms 对 67.2 ms);容器 0×0 时落位记成 `fitPending` 显示后自动补做;`updateData` 在历史里记一步。 - `GisViewDemo.vue` 新增「宿主缩放 · 父元素 zoom」滑杆后,自测发现把 zoom 调回 1 时组件量不到:根因是 `engine.js` 里两档 `ResizeObserver` 挂在**同一个实例**上,同一实例对同一目标再 `observe` 一次是改选项、设备像素档把内容盒档顶掉了(CSS `zoom` 下设备像素盒只在个别取整边界触发)。 - 修法:内容盒 / 设备像素各挂一个实例(`deviceResizeObserver`,`dispose` 一并断开),放大缩小都跟得上。(原答 1.5 KB)
|
|
110
|
-
|
|
111
|
-
**问**:继续根据最新的问题.txt修改组件
|
|
112
|
-
**答**:本轮按 `D:\work\gis-view\问题.txt` 改完了,工作树未提交(10 个文件)。 - 推荐**攒批:点保存时一起传**。拐点与分组给后端的是整份覆盖(`line.path` / `channel.group.path` / `channel.groups`),逐次发的只是一串没人要的中间态;攒批让乐观锁 `baseVersion` 的冲突窗口最小,撤销 / 重做也不产生请求。场站位置与拐点同一口径。 - 选「改完就传」就得自己加三条:**同一目标合并**(只留最后一份)、**停手延迟**(`onPointDrag` / `onWaypointChange` 只有 `phase === 'end'` 是落地,`start` / `drag` / `move` 一条都不发)、**失败回滚**(409 / 网络失败重试或拉服务端 `importData` 回灌)。 - 组件 `src/gis-view/engine.js`:`buildWaypointPayload` 补 `channelId` —— 画布/接口改通道回线的拐点后,`create.js` 的 `syncChannelGroupDeclaration` 不再被跳过,`getOptions().channels` 与 `exportData({ format: 'full' })` 的分组 `path` 与引擎同步(探针实测 0/0/0 → 1/1/1)。 - 组件 `src/gis-view/create.js…(原答 1.4 KB)
|
|
113
|
-
|
|
114
|
-
**问**:继续根据最新的问题.txt修改组件
|
|
115
|
-
**答**:全部核完:`tsc` 0 错、文档覆盖 10 项全 PASS、工作树 12 个改动文件(无临时探针残留)。 - ① 上一轮改动**有**性能影响,落点就一处:通道回线拖拐点时,中间态每帧都在往数据副本抄一份「整组成员 + 骨架」的声明快照(上一轮补了 `channelId` 才暴露出来)。 - ② 已改成只在 `add` / `remove` / `end` 落地那一刻写,并顺手继续优化、修 bug。 - `src/gis-view/create.js:3947`:`onWaypointChange` 只在拐点落地时 `syncChannelGroupDeclaration`;拖动中间态不再逐帧抄快照。 - `src/gis-view/line.js:255`:`line.caps` 不再每帧按顶点整条复制,与 `path` 共用(全库只读,安全)。(原答 0.9 KB)
|
|
116
|
-
|
|
117
|
-
**问**:继续优化性能问题
|
|
118
|
-
**答**:本轮完成。继续切「拖通道拐点」那条热路径,量出一处真 bug 加四处每帧重算,结果是 **130 ms/帧 → 0.96 ms/帧**(5000 回线的一次通道拐点拖动)。 - `src/gis-view/engine.js`:拐点来源清单的成员展开是 O(成员数²)(`visited` 只挡重复入账、每个成员还再扫一遍整份成员表,5000 回线 = 2500 万次 push/帧,实测 130 ms/帧)→ 按分组 key 记「已整组展开」,清单内容与顺序不变(导出图逐字节一致,一次选择 236 → 118.6 ms);`waypointSourceLines` / `waypointBatchMovable` / `positionWaypointGlyphs` 让来源清单与把手批次复用(结构没变只挪 x/y 再上传,整份重排与导出显式 `force`);`commitChannel` 结尾不再立 `lineBatchDirty`(改由紧随的 `patchLineSlots` 增量补,补不了自己立脏兜底);`pickLine` 的整组读数从「每个更近的候选算一遍」改成扫完只算一次(`channelGroupReadout` 原来占 profile 9.6~11%)。 - `src/gis-view/line.js`:`applyLinePath` 的线段对象 / 包围盒 / `caps` 长度没变就写回上一轮那份;新增 `offsetPolylineInto`(`channelPa…(原答 1.3 KB)
|
|
119
|
-
|
|
120
|
-
**问**:继续根据最新的问题.txt修改组件
|
|
121
|
-
**答**:- 主仓库:`D:\work\gis-view`(Vue3 + WebGL2 矢量视图组件;中文注释/文档;制表符缩进);CWD 是 `D:\zj\virtual-table-view-vue3`,**所有命令必须带 `workdir: D:\work\gis-view`** - PowerShell 5.1:`&&`、`head` 不可用;内联 `node -e` 遇中文/引号极易被拆坏 → 一律写成 `.mjs` 文件再 `node xxx.mjs`;`Remove-Item` 会被策略拦(用 node `fs.unlinkSync`) - dev server 5199 在跑(`http://localhost:5199/`);**不要 commit** - `src/gis-view/engine.js` 是 CRLF;`docs/demos/GisViewDemo.vue`、`docs/demos/gis-view-demo/*`、4 个 README 是 LF;`docs/steps/selftest-perf.html` 是 CRLF 混排(原答 6.5 KB)
|
|
122
|
-
|
|
123
|
-
**问**:取消刚刚修改
|
|
124
|
-
**答**:已把这一轮的拆分改动全部撤回,仓库回到改动前的状态: - `docs/demos/GisViewDemo.vue` 恢复为 **8326 行 / 329.7 KB**(`<style scoped>` 与数据段、API 面板、弹层壳都回来了) - 删除了新建的 `docs/demos/gis-view-demo/`(`demoPanels.css` / `demoData.js` / `demoApiPanel.vue` / `demoPopover.vue`) - 文档改动也一并回退:`README.md`、`docs/steps/README.md`、`docs/GisView实现原理.md`、`src/gis-view/README.md`(15.62 与那一轮的小节都去掉了) - `git status` 现在干净,没有任何未提交改动;`npm run build` 通过,`selftest-demo` 132 条、`selftest-demos` 135 条全 PASS(原答 0.5 KB)
|
|
125
|
-
|
|
126
|
-
**问**:demo中dc\_line是如何显示的
|
|
127
|
-
**答**:我来查一下代码里 dc_line 的完整链路。(原答 0.0 KB)
|
|
128
|
-
|
|
129
|
-
**问**:继续根据最新的问题.txt修改组件
|
|
130
|
-
**答**:已按最新 `问题.txt` 四条完成组件修改与收尾(未提交): - **Q1 线路方向**:新增 `lines[].direction` + `options.lineDirection`(写法与 `effect` 同构:`true` / 对象逐字段覆盖 / `false` / `null` 关掉,逐条盖全局)。箭头按弧长摆、朝向跟切向,「方向」= `path[0]` / `from` 那一端 → 终点,`reverse` 指回上游;与装饰共用同一条批次与槽位账。demo「线型、标记与尺寸」面板加了「线路方向箭头 / 箭头数量 / 指回起点」。 - **Q2 标签样式**:复核结论是**本来就支持、不用写 HTML** —— `label.style` / `lineLabel.style` 是内联样式增量合并(`background` / `color` / `fontSize: '14px'`…),默认白色来自 `.gis-view__label`。demo 的节点 / 线路标签面板各加「底色 / 文字色 / 字号」三个下拉跑通,口径补进文档。 - **Q3 性能**:`updateLine` 原来无条件把线路批次标脏,改一条线的颜色会让下一帧重铺视野里全部线路(六万条线实测 9~45 ms/帧);改成只有 `path` / `start` / `end` 真的换了才重铺,样式改动只补这一条的槽位(实测稳在 0.1 ms)。 - **Q4 bug**:补上 `updateLine`…(原答 1.1 KB)
|
|
131
|
-
|
|
132
|
-
**问**:继续根据最新的问题.txt修改组件
|
|
133
|
-
**答**:**结论** 按最新「问题.txt」(继续优化大数据下的方法调用与交互 + 检查 bug)已改完并全量验证通过。 - `src/gis-view/engine.js`:`updateLine` 的几何(拐点增删让段数对不上)与结构(线型 / 层级 / 阴影条数)变更不再整份重排 —— 新增 `scheduleLineRelayout(index)` 与画之前那一趟的 `flushLineRelayout()`,帧末只 `flushLineBatch()` 重铺线路批次,同一帧里改多条只重铺一次;只有动点图标换了或抬层欠账未清才回落整份重排。 - 修掉一处真 bug:装饰锚点(方格 / 方向箭头)按路径算,快路径原来漏了 `refreshLineDecorations(...)`,改拐点后装饰会停在旧拐角(探针复现过),现在补上这一趟。 - 自测里「追加一个节点」那条计时断言从「5 次平均 ×5」改成「最快一次 ×5」——十二页连跑时平均值被 GC 从 0.2 ms 抬到 1.36 ms 误报过一次。(原答 0.9 KB)
|
|
134
|
-
|
|
135
|
-
**问**:继续根据最新的问题.txt修改组件
|
|
136
|
-
**答**:这一轮把上一轮记成候选的「删/改一条线时节点那一半陪跑」做掉了,并修掉三处 bug: - `src/gis-view/engine.js:12966` / `:12998`:数据补丁里节点那一半「逐元素同引用 + 解析输入快照没变」时整半跳过(`:5227` 消费,`:5296` 记下包围盒与贴图档位)—— 十万个点的解析、id 表、层序、包围盒、阴影账都不再重跑。 - 三处修复:① 上一轮按「补丁键在不在」判样式,而组件把没配的状态样式写成 `null` 整份再交一遍 → 判定恒真、**一次都没命中过**;② `pointHalfBounds` / `pointResolvedBakeBucket` 只有声明与读取、**漏了写入**;③ 自测抓出 `updatePoint` 把新对象写回引擎内部数组后身份比对看不出「解析结果没跟上」,改成 `pointHalfOutOfSync` 一笔账(`engine.js:1407` / `:8794`)。门槛也放宽成「发散渲染跑着也跳」(这一跳不动槽位表)。 - `src/gis-view/line.js:202` / `:465`:`pushPathCoordinate` 取代逐条线的闭包、循环内逐条造的对象提到循环外。(原答 0.9 KB)
|
|
137
|
-
|
|
138
|
-
---
|
|
139
|
-
|
|
140
|
-
[← 03 重要问答选(一):选型、通道与样式](03-%E9%87%8D%E8%A6%81%E9%97%AE%E7%AD%94%E9%80%89%EF%BC%88%E4%B8%80%EF%BC%89%EF%BC%9A%E9%80%89%E5%9E%8B%E9%80%9A%E9%81%93%E4%B8%8E%E6%A0%B7%E5%BC%8F.md) · [汇总目录](../AI对话汇总.md) · [05 重要问答选(三):宿主旁支与收口 →](05-%E9%87%8D%E8%A6%81%E9%97%AE%E7%AD%94%E9%80%89%EF%BC%88%E4%B8%89%EF%BC%89%EF%BC%9A%E5%AE%BF%E4%B8%BB%E6%97%81%E6%94%AF%E4%B8%8E%E6%94%B6%E5%8F%A3.md)
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
# 05 重要问答选(三):宿主旁支与收口
|
|
2
|
-
|
|
3
|
-
> 宿主 SVG / 直流标记不画的排查、选中集与拐点键跟着要素走、以及最近一轮的六条问题。
|
|
4
|
-
|
|
5
|
-
### 10-12 16:43 · 旁支:宿主 SVG 全是圈 / 直流标记不画(改宿主 gisTools.js 与 buildNewData)
|
|
6
|
-
|
|
7
|
-
**问**:当前是D:\work\teap-gis\src\views\layout\gis.vue 为什么节点的svg路径没显示还都是圈
|
|
8
|
-
**答**:**原因**(`D:\work\teap-gis\src\views\layout\gis.vue:162` 的 `pointRules`)(原答 1.1 KB)
|
|
9
|
-
|
|
10
|
-
**问**:当前线路的直流标记为什么没有显示
|
|
11
|
-
**答**:现在把「直流标记」的实现补进 `gisTools.js`,并在 `buildNewData` 里给直流线路挂上装饰。(原答 0.1 KB)
|
|
12
|
-
|
|
13
|
-
### 10-13 16:06 · 问题.txt 轮次:选中集 / 拐点键跟要素走(删除、合并后不跳到邻线)→ 15.74
|
|
14
|
-
|
|
15
|
-
**问**:当前是D:\work\gis-view 根据问题.txt修改组件
|
|
16
|
-
**答**:已按 `问题.txt` 复核并修好了:**cascade 的判定本身没问题,断在引擎把「被筛掉」当成了「节点不存在」**。 - 被筛掉的节点在 `resolvePoints` 里整条跳过,不在 `resolvedPoints` / `pointByIndex`,id 表也查不到 → `lineContext.resolveBoundPoint` 只能返回 `undefined`。 - 没自带 `path` 的绑定线(`new.json` 的通道回线全是这种)因此拼不出顶点、整条不画;通道更直接——锚点解析不到就落进 `resolveChannels` 的「锚点缺失」分支,成员回线全部进 `channelHiddenMembers` 收起来。于是不管 `cascade` 写什么,只要端点节点被筛掉,线路/通道回线一定消失。 - `src/gis-view/engine.js:1743` 新增 `filteredAnchorIndexById`:被筛掉的节点 `id -> 数据下标`,键跟 `points` / `hiddenPointIndexes` 引用绑定、惰性重建,取坐标时当场读数据(`updatePoint` 就地换对象也跟得上)。 - `src/gis-view/engine.js:5186` `resolveBoundPoint` 在可见节点查不到时回落到它:被筛掉的节点坐标照给,`cascade` 成为「线/通道回线要不要一起收」的唯一开关(`false` 照旧画、端点仍钉在…(原答 1.3 KB)
|
|
17
|
-
|
|
18
|
-
**问**:继续根据问题.txt修改组件
|
|
19
|
-
**答**:三条问题全部改完并验证通过(未提交,工作区 16 个文件改动)。 - 审计 18 个功能开关后,真重合只有 4 对:`label` / `lineLabel` / `tooltip` / `minimap` 与各自详细配置。 - 口径统一为 AND:`create.js:236` 新增 `configuredEnabled()`,`getFeatures()` 对这四个开关现在返回 `features.label !== false && 详细配置启用`(`create.js:665`),此前 `label:{enabled:false}` 明明没渲染却报 `true`。 - 文档新增对照表:`docs/GisView.md:1373`「两层开关」。 - 扫描 212 个实例成员 + 368 个顶层函数:实例成员零重复,顶层函数仅 `resolveZIndex` 字面相同。(原答 1.1 KB)
|
|
20
|
-
|
|
21
|
-
**问**:修改之后放大缩小地图,调整元件大小会导致有些选中的节点样式丢失,但是只丢失strokeColor没丢失shadow
|
|
22
|
-
**答**:已定位并修好这条「放大缩小 + 调整元件大小后,有些选中节点只丢 `strokeColor`」的问题。 - 新增回归 `docs/steps/selftest-select.html:337`(问题 4 那一组 4 条,用 `window.Image` 的 `load` 延迟 150 ms 把「烤制还没回来」那一刻固定下来):修前 2 条红(`select / base`,大节点停在底色描边),修后全绿 —— `selftest-select` 37 → 41。 - `npx tsc --noEmit` 0 错;十三页自测 **1347 条 0 FAIL**;`check-doc-coverage` 10 项全 PASS;`gen-api-index --check` 最新;`npm run build` 通过;临时探针与调试代码已全部清掉。(原答 1.1 KB)
|
|
23
|
-
|
|
24
|
-
**问**:继续根据问题.txt修改组件
|
|
25
|
-
**答**:本轮按「问题.txt」的「继续检查组件有没有 bug 以及可以优化和提高性能的地方」收口完成。 - 修 Bug ①(选中集跟要素走):删点 / 删线 / 合并之后 `selectionKeys` 现在会跟着要素平移(被删的摘掉并补发一条 `onSelect` 读数),`create.js` 新增 `pushSelectionToEngine()` / `repairEngineSelection(keys)`,整份重建那条路不再把平移过的选中当死键清掉、也不再顶到邻要素身上。 - 修 Bug ②(拐点键跟要素走):`selectWaypoint` 把当时那条线的数据对象记进键里,`isWaypointAlive` 连身份一起认(`commitLine` / 删除平移 / `layoutScene` 各处跟着换新或找回),整份重建删除后选中的拐点不会跳到同一下标的邻线上。 - 性能:`shiftKeyThroughRemoval` 改二分(单键 O(log n)),选中集上万 × 删上千从平方级压掉。 - 13 页自测共 **1355** 条 0 FAIL(`selftest-features.html` 335 → 343,新增「⑥ 删除 / 合并之后『下标不再是身份』」8 条)(原答 0.9 KB)
|
|
26
|
-
|
|
27
|
-
### 10-14 08:50 · 本轮:问题.txt 六条(拐点样式文档 / 文档搜索 / 右键新增场站 / demo 缩放限制 / 新增方法文档 / 本汇总)→ 15.77
|
|
28
|
-
|
|
29
|
-
**问**:当前是D:\work\gis-view 根据问题.txt修改组件
|
|
30
|
-
**答**:这一轮改完了(问题.txt:继续检查 bug 与可优化点),全部验证通过。 - 通道改过之后 Worker 那份副本不换:`updateChannel` / `applyChannels` / 只导入通道都只动主线程那一份,异步搜索拿旧副本在比(新名字搜不到、旧名字还搜得到)。新增 `invalidateSearchChannels()`:`src/gis-view/create.js:458`,三处接上(`create.js:6926` / `7531` / `8568`)。 - `regex` 条件与文档对齐:文档写着认 `{ source, flags }`,实现只认字符串 / `RegExp`(静默比不等);另修掉带 `g` / `y` 时 `test()` 的 `lastIndex` 让逐要素判定 true / false 来回翻转:`src/gis-view/condition.js:78`。 - 搜索攒账从「数组相加」改成按「集合 → 下标」两层 Map 去重、发前现取当前条目(`src/gis-view/search-runner.js` 的 `touch`):20000 次 touch **100 ms → 1 ms**,同一条改多次不再只增不减。 - 删除确认面板的连带影响一趟算完(`removeImpactsOfPoints`,`create.js:6197`)+ `buildRemovePlan` 建两张索引表(`create.js:6262`)+ 下标平移改二分…(原答 1.3 KB)
|
|
31
|
-
|
|
32
|
-
**问**:继续根据问题.txt修改组件 中文回答
|
|
33
|
-
**答**:已完成。四条问题的排查结论与本轮改动如下。 - 拐点(问题 1):已有事件捕捉 —— `onWaypointChange` / `waypointChange` 覆盖增 / 选 / 删(`add` / `select` / `remove`)与拖动三相位(`start` / `move` / `end`),载荷带 `lineIndex` / `pathIndex` / `coordinate` / `group_id` / `channelId` / `lineIndexes` / `line`;程序化 `addWaypoint` / `removeWaypoint` 与分组拐点 `insertGroupWaypoint` / `removeGroupWaypoint` 都发。复核后无需改代码。 - 分组(问题 2):原来只有 `dataChange('channelGroups')`(只有 `groups` 现状,不知道是拆是并)—— 本轮补上专用事件。 - 节点移动(问题 3):已有 —— `onPointDrag` 三相位 + 落地 `dataChange('pointDrag')`(带 `movedPoints` / `movedLines`)。复核后无需改代码。 - 问题 4 的判断:现有事件已覆盖大部分,只有分组缺一份「说清动作」的读数,所以按事件补;不订阅新事件时同样能接 —— `onDataChange` 判 `type === 'channelGroups'` 或随时…(原答 1.8 KB)
|
|
34
|
-
|
|
35
|
-
**问**:继续根据问题.txt修改组件 中文回答
|
|
36
|
-
**答**:六条问题全部落地,收尾(全量自测 / 构建 / 清理临时文件)也已完成,改动未提交。 - ① 拐点样式:功能本来就支持(`waypointStyle` / `waypointSelectStyle`),文档补齐 —— options 条目 `docs/GisView.md:839`、「线路拐点」新增样式小节 `docs/GisView.md:2312`(字段表 / 覆盖补丁语义 / 拾取半径 / 整份重排口径)、总表行 `docs/GisView.md:408`;缺省值在 `src/gis-view/engine.js:211`,绘制 `src/gis-view/engine.js:9025`。 - ② 文档页搜索:`docs/index.html` 现在三段 —— 标题过滤 + 跨文档全文搜索(两字起、按小节给结果、片段 `<mark>` 高亮、防竞态)+ 回车本文内查找;点结果切文档、滚到那一节并闪一下(`docs/index.html:899`、`:1020`,钩子 `:1102`)。 - ③ demo 右键新增场站:画布菜单首行「新增场站」仅空白处可点(`docs/demos/GisViewDemo.vue:1436`),弹自定义表单(编号自动 / 名称 / x / y 预填落点 / 电压),校验通过走 `view.addPoint` 并选中(`:1504`、`:1519`、模板 `:7371`)。 - ④ demo 缩放限制:面板「最小 / 最大比例」两个输入框 + 以当前比例…(原答 1.6 KB)
|
|
37
|
-
|
|
38
|
-
**问**:继续根据问题.txt修改组件 中文回答
|
|
39
|
-
**答**:找到原因:同一份文档里两个标题生成了相同 slug(带不带反引号),我按「slug+标题」分组把它们拆开了。改成按 slug 分组(与点击跳转的口径一致)。(原答 0.1 KB)
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
[← 04 重要问答选(二):交互、性能与数据](04-%E9%87%8D%E8%A6%81%E9%97%AE%E7%AD%94%E9%80%89%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9A%E4%BA%A4%E4%BA%92%E6%80%A7%E8%83%BD%E4%B8%8E%E6%95%B0%E6%8D%AE.md) · [汇总目录](../AI对话汇总.md) · [06 会话索引与复查方法 →](06-%E4%BC%9A%E8%AF%9D%E7%B4%A2%E5%BC%95%E4%B8%8E%E5%A4%8D%E6%9F%A5%E6%96%B9%E6%B3%95.md)
|