gis-view-webgl2 0.1.13 → 0.1.15

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.
Files changed (62) hide show
  1. package/dist/index.cjs +1 -1
  2. package/dist/index.d.ts +140 -60
  3. package/dist/index.js +1 -1
  4. package/docs/AI/345/257/271/350/257/235/346/261/207/346/200/273.md +73 -5
  5. package/docs/GisView.md +49 -49
  6. 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 +87 -16
  7. package/docs/demos/ApiCoverageDemo.vue +1 -5
  8. package/docs/demos/BackendSyncDemo.vue +1 -2
  9. package/docs/demos/BackgroundDemo.vue +68 -1
  10. package/docs/demos/BasicDemo.vue +76 -76
  11. package/docs/demos/BatchAddDemo.vue +2 -1
  12. package/docs/demos/ChannelDemo.vue +1 -3
  13. package/docs/demos/ClusterDemo.vue +48 -1
  14. package/docs/demos/CopyMergeDemo.vue +899 -904
  15. package/docs/demos/DemoShell.vue +336 -336
  16. package/docs/demos/EventDemo.vue +300 -300
  17. package/docs/demos/ExtensionDemo.vue +200 -200
  18. package/docs/demos/GisViewDemo.vue +64 -64
  19. package/docs/demos/LabelDemo.vue +489 -489
  20. package/docs/demos/StyleDemo.vue +67 -67
  21. package/docs/demos/api-index.js +24 -29
  22. package/docs/demos/demos.js +92 -92
  23. package/docs/demos/gis-view-demo/useGisViewDemo.js +19 -14
  24. package/docs/demos/shared/demoData.js +107 -107
  25. package/docs/demos/shared/demoStyle.css +249 -249
  26. package/docs/format/02-/350/212/202/347/202/271/344/270/216/347/272/277/350/267/257.md +3 -3
  27. package/docs/format/03-/346/213/220/347/202/271/350/243/205/351/245/260/344/270/216/346/240/267/345/274/217.md +3 -0
  28. package/docs/from0/01-/345/205/210/346/212/212/345/234/260/345/233/276/346/203/263/346/270/205/346/245/232.md +8 -7
  29. package/docs/index.html +3 -3
  30. package/docs/internals/04-/347/233/270/346/234/272/345/235/220/346/240/207/344/270/216/345/203/217/347/264/240.md +6 -4
  31. package/docs/internals/14-/350/203/214/346/231/257/345/261/202.md +2 -2
  32. package/docs/manual/02-/345/235/220/346/240/207/344/270/216/346/225/260/346/215/256.md +36 -16
  33. package/docs/manual/03-/351/205/215/347/275/256/351/241/271.md +38 -84
  34. package/docs/manual/04-/344/272/213/344/273/266/344/270/216/345/233/236/350/260/203.md +36 -19
  35. 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 +1 -1
  36. 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 +7 -7
  37. package/docs/manual/08-/351/200/211/344/270/255/344/270/216/346/213/220/347/202/271.md +15 -15
  38. 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 +1 -1
  39. package/docs/manual/12-/346/240/207/347/255/276/344/270/216/350/243/205/351/245/260.md +6 -0
  40. package/docs/manual/14-/350/247/206/345/233/276/344/270/216/347/255/233/351/200/211.md +1 -1
  41. package/docs/manual/15-/345/257/274/345/207/272/344/270/216/351/233/206/346/210/220.md +2 -0
  42. package/docs/manual/16-/345/256/236/344/276/213/346/226/271/346/263/225/346/200/273/350/241/250.md +10 -8
  43. package/docs/manual/17-/345/217/202/346/225/260/351/200/237/346/237/245.md +11 -7
  44. package/docs/manual/18-/351/200/220/346/226/271/346/263/225/347/244/272/344/276/213.md +27 -8
  45. package/docs/manual/20-/346/200/247/350/203/275/344/270/216/345/244/247/346/225/260/346/215/256.md +27 -4
  46. 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 +3 -3
  47. package/docs/playground/index.html +1 -1
  48. package/docs/sample-document/345/255/227/346/256/265/350/257/246/350/247/243.md +2 -2
  49. package/docs/steps/check-doc-truth.mjs +1 -1
  50. package/docs/steps/selftest-actions.html +4 -4
  51. package/docs/steps/selftest-data.html +5 -5
  52. package/docs/steps/selftest-demos.html +1683 -1619
  53. package/docs/steps/selftest-docs.html +4 -4
  54. package/docs/steps/selftest-effects.html +1 -1
  55. package/docs/steps/selftest-features.html +548 -47
  56. package/docs/steps/selftest-full.html +566 -566
  57. package/docs/steps/selftest-labels.html +647 -647
  58. package/docs/steps/selftest-perf.html +2282 -2237
  59. package/docs/steps/selftest-select.html +53 -14
  60. package/docs/steps/step-10-full.js +1 -4
  61. package/docs/steps/step-12-events.js +1 -4
  62. package/package.json +43 -43
@@ -8,7 +8,7 @@
8
8
  <div id="map" style="width:640px;height:400px"></div>
9
9
  <pre id="out"></pre>
10
10
  <script type="module">
11
- // 这一页的自测:① 多选开关(options.multiSelect)—— 打开后不用修饰键、单击即取反累加;toggleSelect 另测;
11
+ // 这一页的自测:① 多选开关(features.multiSelect)—— 打开后不用修饰键、单击即取反累加;toggleSelect 另测;
12
12
  // ② 状态样式里的阴影(selectStyle / lineSelectStyle 写 shadow 要画得出来、取消选中要收掉);
13
13
  // ③ 取消选中 / 改变选中集之后颜色与阴影要自动恢复,不必等悬停来顺手重解析;
14
14
  // ④ 同配方不同尺寸的贴图符号:借来的占位贴图不能被当成「自己烤好的那一份」(见问题 4)。
@@ -69,6 +69,8 @@
69
69
  onClick: payload => clicks.push(payload),
70
70
  onDblClick: payload => dblClicks.push(payload)
71
71
  })
72
+ // edit 预设也会打开多选 / 取反;本页前半段验证普通单击的单选语义,这里显式关掉这两项
73
+ view.setFeatures({ ...view.getFeatures(), multiSelect: false, toggleSelect: false })
72
74
  const canvas = view.canvas
73
75
  const box = canvas.getBoundingClientRect()
74
76
  const shot = async () => {
@@ -209,9 +211,9 @@
209
211
  /* ---------- 问题 1:多选开关 ---------- */
210
212
  await clickWorld(0, 0)
211
213
  await clickWorld(140, 0)
212
- check('多选开关缺省关:普通单击是单选(后点替换前点)', ids() === 'node-b', ids())
214
+ check('多选开关关闭:普通单击是单选(后点替换前点)', ids() === 'node-b', ids())
213
215
  await clickWorld(240, -150)
214
- view.updateOptions({ multiSelect: true })
216
+ view.setFeatures({ ...view.getFeatures(), multiSelect: true })
215
217
  const changesBeforeSwitch = changes.length
216
218
  await clickWorld(0, 0)
217
219
  await clickWorld(140, 0)
@@ -245,7 +247,7 @@
245
247
  // 第一次点击是取反(与 Ctrl 点击同一套:不经过 onClick),第二次点击只派发点击与双击
246
248
  check('多选开关打开:双击照常派发 onClick / onDblClick', dblClicks.length === dblBefore + 1 && clicks.length === clicksBeforeDbl + 1, `${dblClicks.length - dblBefore} / ${clicks.length - clicksBeforeDbl}`)
247
249
  await clickWorld(240, -150)
248
- view.updateOptions({ multiSelect: false })
250
+ view.setFeatures({ ...view.getFeatures(), multiSelect: false })
249
251
  await clickWorld(0, 0)
250
252
  await clickWorld(140, 0)
251
253
  check('多选开关关回去:又是单选', ids() === 'node-b', ids())
@@ -314,9 +316,9 @@
314
316
  await ckClick(0, 82, { ctrlKey: true })
315
317
  await ckClick(0, -82, { ctrlKey: true })
316
318
  check('selectionKinds 三类全开:一次 Ctrl 多选可混合累加节点 / 线路 / 通道', ckInfo().pointCount === 1 && ckInfo().lineCount === 2 && ckInfo().channelCount === 1 && ckView.isSelected('ck-a') && ckView.isSelected('ck-solo') && ckView.isSelected('ck-ch-line'), JSON.stringify({ points: ckInfo().pointCount, lines: ckInfo().lineCount, channels: ckInfo().channelCount, ids: ckInfo().ids }))
317
- ckView.updateOptions({ selectionKinds: 'all' })
318
- ckView.selectInBox({ x: 0, y: 0, width: ckBox.width, height: ckBox.height })
319
- const ckBoxedInfo = ckView.getSelectionData()
319
+ ckView.updateOptions({ selectionKinds: 'all' })
320
+ ckView.selectInBox({ x: 0, y: 0, width: ckBox.width, height: ckBox.height })
321
+ const ckBoxedInfo = ckView.getSelectionData()
320
322
  check('selectInBox:线路框选与通道摊开沿用同一份判定(整框一次收下节点 / 独立线路 / 通道回线)', ckBoxedInfo.count === 4 && ckBoxedInfo.pointCount === 2 && ckBoxedInfo.lineCount === 2 && ckBoxedInfo.channelCount === 1, JSON.stringify({ items: ckBoxedInfo.count, points: ckBoxedInfo.pointCount, lines: ckBoxedInfo.lineCount, channels: ckBoxedInfo.channelCount }))
321
323
  ckView.destroy()
322
324
  ckHost.remove()
@@ -371,6 +373,40 @@
371
373
  epView.destroy()
372
374
  epHost.remove()
373
375
 
376
+ /* ---------- 框选只认路径实际沾框:包围盒相交但几何不沾框的 U 形线路 / 通道不能误选 ---------- */
377
+ const bxHost = document.createElement('div')
378
+ bxHost.style.cssText = 'width:400px;height:320px'
379
+ document.body.append(bxHost)
380
+ const bxView = createGisView(bxHost, {
381
+ points: [
382
+ { id: 'bx-a', x: -120, y: -120, size: 10 },
383
+ { id: 'bx-b', x: 120, y: -120, size: 10 }
384
+ ],
385
+ lines: [
386
+ { id: 'bx-hit', path: [[-15, 0], [15, 0]], width: 8 },
387
+ { id: 'bx-u', path: [[-120, -120], [-120, 120], [120, 120], [120, -120]], width: 8 },
388
+ { id: 'bx-ch-line', from: 'bx-a', to: 'bx-b', width: 8 }
389
+ ],
390
+ channels: [{ id: 'bx-ch', from: 'bx-a', to: 'bx-b', path: [[-120, 120], [120, 120]], lineIds: ['bx-ch-line'] }],
391
+ features: 'view',
392
+ selectionKinds: ['line', 'channel'],
393
+ channelSelectMode: 'channel',
394
+ showGrid: false,
395
+ fitOnInit: false,
396
+ initialView: { center: [0, 0], scale: 1 },
397
+ width: 400,
398
+ height: 320
399
+ })
400
+ await settle(120)
401
+ const bxBox = bxView.canvas.getBoundingClientRect()
402
+ bxView.selectInBox({ x: bxBox.width / 2 - 20, y: bxBox.height / 2 - 20, width: 40, height: 40 }, { selectionKinds: ['line', 'channel'] })
403
+ const bxInfo = bxView.getSelectionData()
404
+ check('框选只认路径实际沾框:包围盒相交但不在框内的 U 形线路 / 通道不选中',
405
+ bxInfo.lineCount === 1 && bxInfo.channelCount === 0 && bxView.isSelected('bx-hit') && !bxView.isSelected('bx-u') && !bxView.isSelected('bx-ch-line'),
406
+ JSON.stringify({ lines: bxInfo.lineCount, channels: bxInfo.channelCount, ids: bxInfo.ids }))
407
+ bxView.destroy()
408
+ bxHost.remove()
409
+
374
410
  /* ---------- 本轮:框选保留、整框拖动、DOM 样式与手动关闭 ---------- */
375
411
  const persistHost = document.createElement('div')
376
412
  persistHost.style.cssText = 'width:400px;height:260px'
@@ -644,6 +680,8 @@
644
680
  onSelectChange: payload => { gpChanges.push(payload); gpOrder.push('selectChange') },
645
681
  onHover: payload => gpHovers.push(payload)
646
682
  })
683
+ // 这一段验证普通点击的派发与单选载荷:同样先关掉 edit 预设里的多选 / 取反
684
+ gpView.setFeatures({ ...gpView.getFeatures(), multiSelect: false, toggleSelect: false })
647
685
  await settle(140)
648
686
  const gpBox = gpView.canvas.getBoundingClientRect()
649
687
  const gpLine = gpView.getLine('gp-l1')
@@ -739,7 +777,7 @@
739
777
  ],
740
778
  pointStyle: { color: '#2438cc', size: 28 },
741
779
  pointHoverStyle: { color: '#1f9d3a' },
742
- clickable: true,
780
+ features: { hover: true, select: true },
743
781
  showGrid: false,
744
782
  width: 360,
745
783
  height: 200
@@ -986,7 +1024,8 @@
986
1024
  await triggerClick(120, 0)
987
1025
  check('selectTrigger 运行时改回 click 立刻生效', triggerIds() === 'trigger-b', triggerIds())
988
1026
 
989
- triggerView.updateOptions({ selectTrigger: 'dblClick', multiSelect: true })
1027
+ triggerView.updateOptions({ selectTrigger: 'dblClick' })
1028
+ triggerView.setFeatures({ ...triggerView.getFeatures(), multiSelect: true })
990
1029
  triggerView.selectFeatures(null)
991
1030
  triggerClicks.length = 0
992
1031
  triggerDblClicks.length = 0
@@ -1001,7 +1040,8 @@
1001
1040
  check('selectTrigger: dblClick + multiSelect:双击已选节点是取消', triggerIds() === 'trigger-b' && triggerClicks.at(-1)?.action?.type === 'toggleSelect', triggerIds())
1002
1041
 
1003
1042
  /* toggleSelect:再次选中即取消,缺省关;单击 / 双击两种触发方式与 Ctrl 先选后点同一口径 */
1004
- triggerView.updateOptions({ selectTrigger: 'click', multiSelect: false })
1043
+ triggerView.updateOptions({ selectTrigger: 'click' })
1044
+ triggerView.setFeatures({ ...triggerView.getFeatures(), multiSelect: false })
1005
1045
  triggerView.selectFeatures(null)
1006
1046
  await settle(360)
1007
1047
  triggerClicks.length = 0
@@ -1012,7 +1052,7 @@
1012
1052
  await triggerClick(0, 0)
1013
1053
  check('toggleSelect 缺省关:隔开两次普通单击仍保持选中', triggerIds() === 'trigger-a' && triggerChanges.length === 1 && triggerChanges.at(-1)?.action?.type === 'select', `${triggerIds()} / ${triggerChanges.at(-1)?.action?.type}`)
1014
1054
 
1015
- triggerView.updateOptions({ toggleSelect: true })
1055
+ triggerView.setFeatures({ ...triggerView.getFeatures(), toggleSelect: true })
1016
1056
  await settle(360)
1017
1057
  const toggleOffClicks = triggerClicks.length
1018
1058
  const toggleOffChanges = triggerChanges.length
@@ -1086,8 +1126,7 @@
1086
1126
  },
1087
1127
  { id: 'tl-ch2', from: 'tl-c', to: 'tl-d', lineIds: ['tl-other'] }
1088
1128
  ],
1089
- features: { select: true },
1090
- toggleSelect: true,
1129
+ features: { select: true, toggleSelect: true },
1091
1130
  selectionKinds: 'all',
1092
1131
  showGrid: false,
1093
1132
  fitOnInit: false,
@@ -1190,4 +1229,4 @@
1190
1229
  document.title = results.some(text => text.startsWith('FAIL') || text.startsWith('ERROR')) ? 'FAIL' : 'PASS'
1191
1230
  </script>
1192
1231
  </body>
1193
- </html>
1232
+ </html>
@@ -73,10 +73,7 @@ export const createFullView = (target, options = {}) => {
73
73
  minimap: { width: 180, height: 130 },
74
74
  // 这一步就是完整组件本身:工具栏要能点节点加通道、按住节点拖、Shift 框选、Ctrl 点击加拐点——
75
75
  // 功能开关缺省全关(见 src/gis-view/features.js),演示页把要用的逐项显式打开
76
- draggable: true,
77
- boxSelect: true,
78
- waypointEditable: true,
79
- features: { pan: true, zoom: true, hover: true, select: true, contextMenu: true, keyboard: true, channelDraft: true },
76
+ features: { pan: true, zoom: true, hover: true, select: true, contextMenu: true, keyboard: true, channelDraft: true, drag: true, boxSelect: true, waypoint: true },
80
77
  // 组件的回调都带载荷:type / index / item 就是「当前是哪个元素」,world 是光标处的世界坐标
81
78
  onHover: payload => forward.onHover?.(payload),
82
79
  onClick: payload => forward.onClick?.(payload),
@@ -133,10 +133,7 @@ export const createActionView = (target, options = {}) => {
133
133
  statsInterval: 250,
134
134
  // 这一步演示的全是交互(拖节点 / Shift 框选 / Ctrl 加拐点 / 通道草稿与通道右键):
135
135
  // 功能开关缺省全关(见 src/gis-view/features.js),演示页把要用的逐项显式打开
136
- draggable: true,
137
- boxSelect: true,
138
- waypointEditable: true,
139
- features: { pan: true, zoom: true, hover: true, select: true, contextMenu: true, keyboard: true, channelDraft: true },
136
+ features: { pan: true, zoom: true, hover: true, select: true, contextMenu: true, keyboard: true, channelDraft: true, drag: true, boxSelect: true, waypoint: true },
140
137
  // 下面五条是同一条路:每个回调先报一句判读,再交给页面自己那一条(日志、草稿读数都还在)
141
138
  onPointerDown: payload => {
142
139
  report(describeAction(payload, '按下'))
package/package.json CHANGED
@@ -1,43 +1,43 @@
1
- {
2
- "name": "gis-view-webgl2",
3
- "version": "0.1.13",
4
- "description": "WebGL2 矢量视图:点、线与 GeoJSON / 图片背景层,可选鹰眼图与图例,点击 / 双击 / 拖拽可配置",
5
- "type": "module",
6
- "scripts": {
7
- "dev": "vite",
8
- "build": "tsc && vite build",
9
- "build:lib": "tsc && node scripts/clean-dist.mjs && vite build --config vite.config.lib.js && node scripts/obfuscate-dist.mjs && node scripts/copy-types.mjs",
10
- "prepack": "npm run build:lib",
11
- "pack:lib": "npm pack --dry-run",
12
- "preview": "vite preview",
13
- "check:docs": "node docs/steps/check-doc-coverage.mjs && node docs/steps/check-doc-truth.mjs && node docs/steps/check-sample-fields.mjs && node docs/steps/check-doc-center.mjs"
14
- },
15
- "main": "./dist/index.cjs",
16
- "module": "./dist/index.js",
17
- "types": "./dist/index.d.ts",
18
- "exports": {
19
- ".": {
20
- "types": "./dist/index.d.ts",
21
- "import": "./dist/index.js",
22
- "require": "./dist/index.cjs",
23
- "default": "./dist/index.js"
24
- },
25
- "./style.css": "./dist/gis-view.css"
26
- },
27
- "files": [
28
- "dist",
29
- "README.md",
30
- "docs"
31
- ],
32
- "sideEffects": [
33
- "**/*.css"
34
- ],
35
- "devDependencies": {
36
- "@vitejs/plugin-vue": "^6.0.5",
37
- "javascript-obfuscator": "^5.6.0",
38
- "typescript": "~6.0.2",
39
- "vite": "^8.2.2",
40
- "vite-plugin-lib-inject-css": "^2.2.2",
41
- "vue": "^3.5.32"
42
- }
43
- }
1
+ {
2
+ "name": "gis-view-webgl2",
3
+ "version": "0.1.15",
4
+ "description": "WebGL2 矢量视图:点、线与 GeoJSON / 图片背景层,可选鹰眼图与图例,点击 / 双击 / 拖拽可配置",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "tsc && vite build",
9
+ "build:lib": "tsc && node scripts/clean-dist.mjs && vite build --config vite.config.lib.js && node scripts/obfuscate-dist.mjs && node scripts/copy-types.mjs",
10
+ "prepack": "npm run build:lib",
11
+ "pack:lib": "npm pack --dry-run",
12
+ "preview": "vite preview",
13
+ "check:docs": "node docs/steps/check-doc-coverage.mjs && node docs/steps/check-doc-truth.mjs && node docs/steps/check-sample-fields.mjs && node docs/steps/check-doc-center.mjs"
14
+ },
15
+ "main": "./dist/index.cjs",
16
+ "module": "./dist/index.js",
17
+ "types": "./dist/index.d.ts",
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/index.d.ts",
21
+ "import": "./dist/index.js",
22
+ "require": "./dist/index.cjs",
23
+ "default": "./dist/index.js"
24
+ },
25
+ "./style.css": "./dist/gis-view.css"
26
+ },
27
+ "files": [
28
+ "dist",
29
+ "README.md",
30
+ "docs"
31
+ ],
32
+ "sideEffects": [
33
+ "**/*.css"
34
+ ],
35
+ "devDependencies": {
36
+ "@vitejs/plugin-vue": "^6.0.5",
37
+ "javascript-obfuscator": "^5.6.0",
38
+ "typescript": "~6.0.2",
39
+ "vite": "^8.2.2",
40
+ "vite-plugin-lib-inject-css": "^2.2.2",
41
+ "vue": "^3.5.32"
42
+ }
43
+ }