gis-view-webgl2 0.1.2 → 0.1.3
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 +12 -8
- package/dist/gis-view.css +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +309 -59
- package/dist/index.js +1 -1
- package/docs/AI/345/257/271/350/257/235/346/261/207/346/200/273.md +117 -0
- package/docs/GisView.md +2 -2
- 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 +107 -0
- package/docs/api/index.html +1 -1
- package/docs/demos/ApiCoverageDemo.vue +644 -0
- package/docs/demos/ChannelDemo.vue +14 -12
- package/docs/demos/ClusterDemo.vue +251 -0
- package/docs/demos/CopyMergeDemo.vue +3 -4
- package/docs/demos/EventDemo.vue +3 -3
- package/docs/demos/GisViewDemo.vue +64 -8809
- package/docs/demos/api-index.js +48 -41
- package/docs/demos/demos.js +33 -16
- package/docs/demos/gis-view-demo/GisViewDemoCardHeader.vue +28 -0
- package/docs/demos/gis-view-demo/GisViewDemoDialogs.vue +82 -0
- package/docs/demos/gis-view-demo/GisViewDemoFooter.vue +16 -0
- package/docs/demos/gis-view-demo/GisViewDemoHeading.vue +16 -0
- package/docs/demos/gis-view-demo/GisViewDemoPanelStack.vue +71 -0
- package/docs/demos/gis-view-demo/GisViewDemoStage.vue +219 -0
- package/docs/demos/gis-view-demo/demo.css +1230 -0
- package/docs/demos/gis-view-demo/demoContext.js +12 -0
- package/docs/demos/gis-view-demo/panels/DataPanels.vue +303 -0
- package/docs/demos/gis-view-demo/panels/OpsPanels.vue +174 -0
- package/docs/demos/gis-view-demo/panels/StylePanels.vue +561 -0
- package/docs/demos/gis-view-demo/panels/ViewPanels.vue +396 -0
- package/docs/demos/gis-view-demo/useGisViewDemo.js +6188 -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 +3 -2
- package/docs/internals/16-03-/344/274/230/345/214/226/344/270/216/345/217/226/350/210/215-/344/270/213.md +1 -1
- package/docs/manual/02-/345/235/220/346/240/207/344/270/216/346/225/260/346/215/256.md +3 -2
- package/docs/manual/03-/351/205/215/347/275/256/351/241/271.md +87 -14
- package/docs/manual/04-/344/272/213/344/273/266/344/270/216/345/233/236/350/260/203.md +8 -8
- 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 +40 -3
- package/docs/manual/08-/351/200/211/344/270/255/344/270/216/346/213/220/347/202/271.md +26 -0
- package/docs/manual/09-/351/200/232/351/201/223/344/270/216/345/244/232/345/233/236/347/272/277.md +6 -2
- 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 +39 -7
- package/docs/manual/12-/346/240/207/347/255/276/344/270/216/350/243/205/351/245/260.md +13 -4
- package/docs/manual/13-/345/212/250/346/225/210/344/270/216/345/233/276/345/205/203.md +3 -0
- package/docs/manual/14-/350/247/206/345/233/276/344/270/216/347/255/233/351/200/211.md +35 -19
- package/docs/manual/15-/345/257/274/345/207/272/344/270/216/351/233/206/346/210/220.md +5 -0
- package/docs/manual/16-/345/256/236/344/276/213/346/226/271/346/263/225/346/200/273/350/241/250.md +12 -6
- package/docs/manual/17-/345/217/202/346/225/260/351/200/237/346/237/245.md +39 -22
- package/docs/manual/18-/351/200/220/346/226/271/346/263/225/347/244/272/344/276/213.md +52 -13
- package/docs/manual/20-/346/200/247/350/203/275/344/270/216/345/244/247/346/225/260/346/215/256.md +25 -1
- 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 +5 -5
- package/docs/steps/README.md +17 -11
- package/docs/steps/selftest-actions.html +3 -5
- package/docs/steps/selftest-demo.html +27 -18
- package/docs/steps/selftest-demos.html +387 -27
- package/docs/steps/selftest-docs.html +4 -4
- package/docs/steps/selftest-effects.html +200 -0
- package/docs/steps/selftest-features.html +512 -11
- package/docs/steps/selftest-labels.html +74 -0
- package/docs/steps/selftest-perf.html +293 -20
- package/docs/steps/selftest-scale.html +52 -29
- package/docs/steps/step-10-full.js +1 -1
- package/docs/steps/step-12-events.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { useGisViewDemoContext } from '../demoContext.js'
|
|
3
|
+
const {
|
|
4
|
+
SMALL_SCALE, LARGE_SCALE, hostZoom, hostScaleText, building, scale, showGrid, activePanel, BACKGROUND_MODES,
|
|
5
|
+
backgroundMode, backgroundOpacity, BACKGROUND_SOURCES, backgroundSource, backgroundImageFit,
|
|
6
|
+
backgroundImageCorners, provinceAspectScale, provincePalette, provinceLabelShow, provinceLabelSize,
|
|
7
|
+
provinceLabelColor, provinceLoading, INITIAL_VIEW_MODES, initialViewMode, initialZoom, initialCenterText,
|
|
8
|
+
initialViewReadout, draggable, liveDrag, liveDragHint, clickable, boxSelect, multiSelect, selectionBoxMode,
|
|
9
|
+
SHORTCUT_MODES, shortcutBoxSelect, shortcutMultiSelect, shortcutAddWaypoint, shortcutDuplicate,
|
|
10
|
+
shortcutReadout, COPY_OFFSETS, copyEnabled, copyOffsetMode, mergeEnabled, mergeTrigger, MERGE_TRIGGERS,
|
|
11
|
+
mergeDistance, MERGE_CONFIRM_MODES, mergeConfirmMode, mergeChannelGroups, selectionOnTop, copyRollback,
|
|
12
|
+
removeReadout, channelSelectMode, removeByApi, copyReadout, mergeReadout, mergeSelectedReadout,
|
|
13
|
+
mergeSelectedTarget, mergeTargetOptions, exportWithLines, exportReadout, exportFormat, exportBackground,
|
|
14
|
+
waypointEditable, waypointAlways, pointSelectMode, lineSelectMode, pointMultiSelectMode, pointBoxSelectMode,
|
|
15
|
+
lineMultiSelectMode, hoverHighlight, defaultHighlight, cascadeHighlightEnabled, cascadeHighlightScope,
|
|
16
|
+
cascadeTriggerOnClick, cascadeTriggerOnMultiSelect, cascadeTriggerOnBoxSelect,
|
|
17
|
+
cascadeReadout, CASCADE_HIGHLIGHT_SCOPES, readCascadeHighlight, datasetMode, DATASET_PROJECTIONS, datasetProjection,
|
|
18
|
+
datasetProjectionScale, datasetProjectionReadout, convertLngLatText, convertScreenText, convertReadout,
|
|
19
|
+
applyDatasetMapping, mergeSelectedByApi, exportSelectionImage, exportSelectedRecords, exportWholeImage,
|
|
20
|
+
startCopyPick, copyPointByApi, copyThenPaste, frameProvince, applyBackground, backgroundHint,
|
|
21
|
+
convertFromLngLat, convertFromScreen, applyInitialViewFromControls, minScale, maxScale, scaleLimitReadout,
|
|
22
|
+
applyScaleLimits, useCurrentScaleLimits, clearScaleLimits, testScaleLimit, toggleDraggable, selectionReadout,
|
|
23
|
+
selectedItemsJson, readSelectionByApi,
|
|
24
|
+
} = useGisViewDemoContext()
|
|
25
|
+
</script>
|
|
26
|
+
|
|
27
|
+
<template>
|
|
28
|
+
<div v-show="activePanel === 'view-initial'" class="demo-panel-body">
|
|
29
|
+
<div class="demo-controls">
|
|
30
|
+
<label class="demo-slider">
|
|
31
|
+
初始视图
|
|
32
|
+
<select v-model="initialViewMode" @change="applyInitialViewFromControls">
|
|
33
|
+
<option v-for="item in INITIAL_VIEW_MODES" :key="item.value" :value="item.value">{{ item.label }}</option>
|
|
34
|
+
</select>
|
|
35
|
+
</label>
|
|
36
|
+
<label v-if="initialViewMode === 'custom'" class="demo-slider">
|
|
37
|
+
中心
|
|
38
|
+
<input v-model="initialCenterText" type="text" placeholder="留空 = 数据范围中心" @change="applyInitialViewFromControls" />
|
|
39
|
+
</label>
|
|
40
|
+
<label v-if="initialViewMode === 'custom'" class="demo-slider">
|
|
41
|
+
倍数
|
|
42
|
+
<input v-model.number="initialZoom" type="number" min="0.1" max="20" step="0.1" @change="applyInitialViewFromControls" />
|
|
43
|
+
</label>
|
|
44
|
+
<button type="button" @click="applyInitialViewFromControls">重新套用初始视图</button>
|
|
45
|
+
<span class="demo-control-hint">{{ initialViewReadout }}</span>
|
|
46
|
+
</div>
|
|
47
|
+
<div class="demo-controls">
|
|
48
|
+
<label class="demo-slider">
|
|
49
|
+
最小比例
|
|
50
|
+
<input v-model.number="minScale" type="number" min="0.000001" step="0.01" @change="applyScaleLimits" />
|
|
51
|
+
</label>
|
|
52
|
+
<label class="demo-slider">
|
|
53
|
+
最大比例
|
|
54
|
+
<input v-model.number="maxScale" type="number" min="0.000001" step="10" @change="applyScaleLimits" />
|
|
55
|
+
</label>
|
|
56
|
+
<button type="button" @click="useCurrentScaleLimits">以当前比例设限(÷5 ~ ×5)</button>
|
|
57
|
+
<button type="button" @click="testScaleLimit('min')">试一下下限</button>
|
|
58
|
+
<button type="button" @click="testScaleLimit('max')">试一下上限</button>
|
|
59
|
+
<button type="button" @click="clearScaleLimits">解除限制</button>
|
|
60
|
+
<span class="demo-control-hint">{{ scaleLimitReadout }} —— 滚轮 / 双击 / setCamera 都会被夹住</span>
|
|
61
|
+
</div>
|
|
62
|
+
<div class="demo-controls">
|
|
63
|
+
<label class="demo-slider">
|
|
64
|
+
背景来源
|
|
65
|
+
<select v-model="backgroundSource">
|
|
66
|
+
<option v-for="item in BACKGROUND_SOURCES" :key="item.value" :value="item.value">{{ item.label }}</option>
|
|
67
|
+
</select>
|
|
68
|
+
</label>
|
|
69
|
+
<label v-if="backgroundSource === 'basemap'" class="demo-slider">
|
|
70
|
+
底图样式
|
|
71
|
+
<select v-model="backgroundMode">
|
|
72
|
+
<option v-for="item in BACKGROUND_MODES" :key="item.value" :value="item.value">{{ item.label }}</option>
|
|
73
|
+
</select>
|
|
74
|
+
</label>
|
|
75
|
+
<label class="demo-slider">
|
|
76
|
+
背景透明度
|
|
77
|
+
<input v-model.number="backgroundOpacity" type="range" min="0" max="1" step="0.05" />
|
|
78
|
+
<span>{{ Math.round(backgroundOpacity * 100) }}%</span>
|
|
79
|
+
</label>
|
|
80
|
+
<button type="button" @click="applyBackground()">{{ backgroundSource === 'province' ? '重新应用' : '重新生成底图' }}</button>
|
|
81
|
+
</div>
|
|
82
|
+
<div v-if="backgroundSource === 'image' || backgroundSource === 'canvas' || backgroundSource === 'path'" class="demo-controls">
|
|
83
|
+
<label class="demo-slider">
|
|
84
|
+
铺法
|
|
85
|
+
<select v-model="backgroundImageFit">
|
|
86
|
+
<option value="contain">contain 等比铺满</option>
|
|
87
|
+
<option value="cover">cover 铺满裁剪</option>
|
|
88
|
+
<option value="stretch">stretch 拉伸</option>
|
|
89
|
+
<option value="center">center 原尺寸居中</option>
|
|
90
|
+
</select>
|
|
91
|
+
</label>
|
|
92
|
+
<label v-if="backgroundSource === 'image'" class="demo-slider">
|
|
93
|
+
<input v-model="backgroundImageCorners" type="checkbox" />
|
|
94
|
+
四角坐标定位(任意四边形)
|
|
95
|
+
</label>
|
|
96
|
+
<label v-if="backgroundSource === 'path'" class="demo-slider">
|
|
97
|
+
<span>pathStyle 填充 / 描边在代码里配</span>
|
|
98
|
+
</label>
|
|
99
|
+
</div>
|
|
100
|
+
<div v-if="backgroundSource === 'province'" class="demo-controls">
|
|
101
|
+
<label class="demo-slider">
|
|
102
|
+
aspectScale
|
|
103
|
+
<input v-model.number="provinceAspectScale" type="range" min="0.4" max="1.2" step="0.05" />
|
|
104
|
+
<span>{{ provinceAspectScale.toFixed(2) }}</span>
|
|
105
|
+
</label>
|
|
106
|
+
<label class="demo-slider">
|
|
107
|
+
区域配色
|
|
108
|
+
<select v-model="provincePalette">
|
|
109
|
+
<option value="plain">统一色</option>
|
|
110
|
+
<option value="regions">按区域名(regions)</option>
|
|
111
|
+
<option value="itemStyle">调色板(itemStyle)</option>
|
|
112
|
+
</select>
|
|
113
|
+
</label>
|
|
114
|
+
<label class="demo-slider">
|
|
115
|
+
<input v-model="provinceLabelShow" type="checkbox" />
|
|
116
|
+
区域文字
|
|
117
|
+
</label>
|
|
118
|
+
<label v-if="provinceLabelShow" class="demo-slider">
|
|
119
|
+
字号
|
|
120
|
+
<input v-model.number="provinceLabelSize" type="range" min="8" max="16" step="1" />
|
|
121
|
+
<span>{{ provinceLabelSize }}px</span>
|
|
122
|
+
</label>
|
|
123
|
+
<label v-if="provinceLabelShow" class="demo-slider">
|
|
124
|
+
文字颜色
|
|
125
|
+
<input v-model="provinceLabelColor" type="color" />
|
|
126
|
+
</label>
|
|
127
|
+
<button type="button" @click="frameProvince">定位到全省范围</button>
|
|
128
|
+
<span v-if="provinceLoading" class="demo-control-hint">正在加载全省 GeoJSON…</span>
|
|
129
|
+
</div>
|
|
130
|
+
<span class="demo-control-hint">{{ backgroundHint }}</span>
|
|
131
|
+
</div>
|
|
132
|
+
|
|
133
|
+
<div v-show="activePanel === 'view-coords'" class="demo-panel-body">
|
|
134
|
+
<div class="demo-controls">
|
|
135
|
+
<span class="demo-control-hint">lngLatToScreen / screenToLngLat · project / unproject</span>
|
|
136
|
+
<label class="demo-slider">
|
|
137
|
+
经纬度
|
|
138
|
+
<input v-model="convertLngLatText" type="text" placeholder="118.8, 32.1" @change="convertFromLngLat" />
|
|
139
|
+
</label>
|
|
140
|
+
<button type="button" @click="convertFromLngLat">经纬度 → 屏幕</button>
|
|
141
|
+
<label class="demo-slider">
|
|
142
|
+
屏幕 px
|
|
143
|
+
<input v-model="convertScreenText" type="text" placeholder="240, 180" @change="convertFromScreen" />
|
|
144
|
+
</label>
|
|
145
|
+
<button type="button" @click="convertFromScreen">屏幕 → 经纬度</button>
|
|
146
|
+
<span class="demo-control-hint">{{ convertReadout }}</span>
|
|
147
|
+
</div>
|
|
148
|
+
</div>
|
|
149
|
+
|
|
150
|
+
<div v-show="activePanel === 'view-data'" class="demo-panel-body">
|
|
151
|
+
<div class="demo-controls">
|
|
152
|
+
<label class="demo-slider">
|
|
153
|
+
数据集
|
|
154
|
+
<select v-model="datasetMode" :disabled="building">
|
|
155
|
+
<option value="new">真实数据 new.json(站点 / 通道)</option>
|
|
156
|
+
<option value="sample">样例数据 test.json</option>
|
|
157
|
+
<option value="synthetic">合成数据(可调规模)</option>
|
|
158
|
+
</select>
|
|
159
|
+
</label>
|
|
160
|
+
<label>
|
|
161
|
+
规模
|
|
162
|
+
<select v-model.number="scale" :disabled="building || datasetMode !== 'synthetic'">
|
|
163
|
+
<option :value="SMALL_SCALE">{{ SMALL_SCALE }} 节点 / 线路</option>
|
|
164
|
+
<option :value="5000">5000 节点 / 线路</option>
|
|
165
|
+
<option :value="LARGE_SCALE">10 万节点 / 线路</option>
|
|
166
|
+
</select>
|
|
167
|
+
</label>
|
|
168
|
+
<span class="demo-control-hint">合成数据的节点与线路都带 max_loading_rate(「热力图」面板可按种子重新随机一份)</span>
|
|
169
|
+
<label class="demo-slider">
|
|
170
|
+
数据映射
|
|
171
|
+
<select v-model="datasetProjection" title="把数据集坐标搬到 GeoJSON 底图坐标系:raw 不搬、lngLat 经纬度完全贴合、fit 等比铺进去、scale 按大小比例缩放">
|
|
172
|
+
<option v-for="item in DATASET_PROJECTIONS" :key="item.value" :value="item.value">{{ item.label }}</option>
|
|
173
|
+
</select>
|
|
174
|
+
</label>
|
|
175
|
+
<label v-if="datasetProjection !== 'raw'" class="demo-slider">
|
|
176
|
+
节点 / geojson 比例
|
|
177
|
+
<input v-model.number="datasetProjectionScale" type="range" min="0.1" max="3" step="0.05" />
|
|
178
|
+
<span>{{ datasetProjectionScale.toFixed(2) }}×</span>
|
|
179
|
+
</label>
|
|
180
|
+
<button type="button" :disabled="datasetProjection === 'raw'" @click="applyDatasetMapping">重新映射数据</button>
|
|
181
|
+
<span class="demo-control-hint">映射:{{ datasetProjectionReadout }}</span>
|
|
182
|
+
<label><input v-model="showGrid" type="checkbox" /> 网格</label>
|
|
183
|
+
</div>
|
|
184
|
+
</div>
|
|
185
|
+
|
|
186
|
+
<div v-show="activePanel === 'view-interact'" class="demo-panel-body">
|
|
187
|
+
<div class="demo-controls">
|
|
188
|
+
<label><input :checked="draggable" type="checkbox" @change="toggleDraggable($event.target.checked)" /> 拖拽节点</label>
|
|
189
|
+
<label><input v-model="liveDrag" type="checkbox" /> 线路实时跟随</label>
|
|
190
|
+
<span class="demo-control-hint">{{ liveDragHint }}</span>
|
|
191
|
+
<label><input v-model="clickable" type="checkbox" /> 可点击</label>
|
|
192
|
+
<label><input v-model="boxSelect" type="checkbox" /> 框选</label>
|
|
193
|
+
<label><input v-model="multiSelect" type="checkbox" /> 点击多选(multiSelect:不用按修饰键,单击即取反累加)</label>
|
|
194
|
+
<label><input v-model="waypointEditable" type="checkbox" /> 可编辑拐点</label>
|
|
195
|
+
<label><input v-model="waypointAlways" type="checkbox" /> 拐点始终显示</label>
|
|
196
|
+
<label><input v-model="hoverHighlight" type="checkbox" /> 悬停强调</label>
|
|
197
|
+
<label class="demo-slider">
|
|
198
|
+
宿主缩放 · 父元素 zoom
|
|
199
|
+
<input v-model.number="hostZoom" type="range" min="0.75" max="1.5" step="0.05" />
|
|
200
|
+
<span>{{ hostZoom.toFixed(2) }}×</span>
|
|
201
|
+
</label>
|
|
202
|
+
<span class="demo-control-hint">displayScale {{ hostScaleText }} —— 滑杆改的是画布外面那一层(.demo-stage)的 CSS zoom:组件按布局像素自适应,线宽 / 字号跟着一起缩放,画布备份像素按「设备像素比 × 显示比例」开,指针命中不用换算,鹰眼图跟着重铺</span>
|
|
203
|
+
<label><input v-model="defaultHighlight" type="checkbox" /> 未配样式的内置强调</label>
|
|
204
|
+
<label><input v-model="cascadeHighlightEnabled" data-demo="cascade-highlight-enabled" type="checkbox" /> 点击级联高亮(cascadeHighlight,与选中集独立)</label>
|
|
205
|
+
<label class="demo-slider">
|
|
206
|
+
级联范围
|
|
207
|
+
<select v-model="cascadeHighlightScope" data-demo="cascade-highlight-scope" :disabled="!cascadeHighlightEnabled">
|
|
208
|
+
<option v-for="item in CASCADE_HIGHLIGHT_SCOPES" :key="item.value" :value="item.value">{{ item.label }}</option>
|
|
209
|
+
</select>
|
|
210
|
+
</label>
|
|
211
|
+
<span class="demo-control-hint">触发方式(彼此独立)</span>
|
|
212
|
+
<label><input v-model="cascadeTriggerOnClick" data-demo="cascade-trigger-click" type="checkbox" :disabled="!cascadeHighlightEnabled" /> 单击</label>
|
|
213
|
+
<label><input v-model="cascadeTriggerOnMultiSelect" data-demo="cascade-trigger-multi" type="checkbox" :disabled="!cascadeHighlightEnabled" /> 多选</label>
|
|
214
|
+
<label><input v-model="cascadeTriggerOnBoxSelect" data-demo="cascade-trigger-box" type="checkbox" :disabled="!cascadeHighlightEnabled" /> 框选</label>
|
|
215
|
+
<button type="button" data-demo="cascade-highlight-read" @click="readCascadeHighlight()">读取 getCascadeHighlight()</button>
|
|
216
|
+
<span class="demo-control-hint" data-demo="cascade-highlight-readout">{{ cascadeReadout }}</span>
|
|
217
|
+
<label class="demo-slider">
|
|
218
|
+
快捷键 · 框选
|
|
219
|
+
<select v-model="shortcutBoxSelect">
|
|
220
|
+
<option v-for="item in SHORTCUT_MODES" :key="item.value" :value="item.value">{{ item.label }}</option>
|
|
221
|
+
</select>
|
|
222
|
+
</label>
|
|
223
|
+
<label class="demo-slider">
|
|
224
|
+
快捷键 · 多选
|
|
225
|
+
<select v-model="shortcutMultiSelect">
|
|
226
|
+
<option v-for="item in SHORTCUT_MODES" :key="item.value" :value="item.value">{{ item.label }}</option>
|
|
227
|
+
</select>
|
|
228
|
+
</label>
|
|
229
|
+
<label class="demo-slider">
|
|
230
|
+
快捷键 · 加点
|
|
231
|
+
<select v-model="shortcutAddWaypoint">
|
|
232
|
+
<option v-for="item in SHORTCUT_MODES" :key="item.value" :value="item.value">{{ item.label }}</option>
|
|
233
|
+
</select>
|
|
234
|
+
</label>
|
|
235
|
+
<label class="demo-slider">
|
|
236
|
+
快捷键 · 复制
|
|
237
|
+
<select v-model="shortcutDuplicate">
|
|
238
|
+
<option v-for="item in SHORTCUT_MODES" :key="item.value" :value="item.value">{{ item.label }}</option>
|
|
239
|
+
</select>
|
|
240
|
+
</label>
|
|
241
|
+
<span class="demo-control-hint">{{ shortcutReadout }}</span>
|
|
242
|
+
</div>
|
|
243
|
+
</div>
|
|
244
|
+
|
|
245
|
+
<div v-show="activePanel === 'view-copy'" class="demo-panel-body">
|
|
246
|
+
<div class="demo-controls">
|
|
247
|
+
<label><input v-model="copyEnabled" type="checkbox" /> 可复制节点(Alt 点节点跟随鼠标,松开落地)</label>
|
|
248
|
+
<label class="demo-slider">
|
|
249
|
+
复制落点偏移
|
|
250
|
+
<select v-model="copyOffsetMode">
|
|
251
|
+
<option v-for="item in COPY_OFFSETS" :key="item.value" :value="item.value">{{ item.label }}</option>
|
|
252
|
+
</select>
|
|
253
|
+
</label>
|
|
254
|
+
<button type="button" @click="startCopyPick()">先点按钮再选节点(复制到旁边)</button>
|
|
255
|
+
<button type="button" @click="copyPointByApi()">复制选中 / 光标下的节点</button>
|
|
256
|
+
<button type="button" @click="copyThenPaste()">复制到剪贴板 → 粘贴</button>
|
|
257
|
+
<span class="demo-control-hint">{{ copyReadout }}</span>
|
|
258
|
+
<label><input v-model="copyRollback" type="checkbox" /> 复制后模拟「接口失败」:立刻 payload.revert() 回滚</label>
|
|
259
|
+
<label><input v-model="mergeEnabled" type="checkbox" /> 可合并节点(拖动一个节点撞上另一个)</label>
|
|
260
|
+
<label class="demo-slider">
|
|
261
|
+
合并触发时机
|
|
262
|
+
<select v-model="mergeTrigger">
|
|
263
|
+
<option v-for="item in MERGE_TRIGGERS" :key="item.value" :value="item.value">{{ item.label }}</option>
|
|
264
|
+
</select>
|
|
265
|
+
</label>
|
|
266
|
+
<label class="demo-slider">
|
|
267
|
+
合并容差
|
|
268
|
+
<input v-model.number="mergeDistance" type="range" min="0" max="40" step="1" />
|
|
269
|
+
<span>{{ mergeDistance }} px</span>
|
|
270
|
+
</label>
|
|
271
|
+
<label class="demo-slider">
|
|
272
|
+
合并确认
|
|
273
|
+
<select v-model="mergeConfirmMode">
|
|
274
|
+
<option v-for="item in MERGE_CONFIRM_MODES" :key="item.value" :value="item.value">{{ item.label }}</option>
|
|
275
|
+
</select>
|
|
276
|
+
</label>
|
|
277
|
+
<label class="demo-slider">
|
|
278
|
+
通道合并分组
|
|
279
|
+
<select v-model="mergeChannelGroups">
|
|
280
|
+
<option value="keep">各自保留分组(keep)</option>
|
|
281
|
+
<option value="merge">合成一个分组(merge)</option>
|
|
282
|
+
</select>
|
|
283
|
+
</label>
|
|
284
|
+
<label><input v-model="selectionOnTop" type="checkbox" /> 选中 / 拖动 / 待合并的要素与选中通道画在最上层(selectionOnTop)</label>
|
|
285
|
+
<span class="demo-control-hint">{{ mergeReadout }}</span>
|
|
286
|
+
<span class="demo-control-hint" data-demo="merge-style-hint">「合并样式」不是一项额外配置,而是合并后保留节点最终写进数据的 <code>size</code> 与 <code>symbol</code>:尺寸取双方较大值,图标优先目标节点。它决定合并后的外观,可在 <code>merge.createItem()</code> 或 <code>payload.item</code> 里改写。</span>
|
|
287
|
+
<label class="demo-slider">
|
|
288
|
+
批量合并以谁为主
|
|
289
|
+
<select v-model="mergeSelectedTarget">
|
|
290
|
+
<option v-for="item in mergeTargetOptions" :key="item.value" :value="item.value">{{ item.label }}</option>
|
|
291
|
+
</select>
|
|
292
|
+
</label>
|
|
293
|
+
<button type="button" @click="mergeSelectedByApi()">合并选中的节点(框选 / 多选之后一步并拢)</button>
|
|
294
|
+
<span class="demo-control-hint">{{ mergeSelectedReadout }}</span>
|
|
295
|
+
<label class="demo-slider">
|
|
296
|
+
通道选中模式
|
|
297
|
+
<select v-model="channelSelectMode" title="点中通道里的回线时选中什么:只选这一条 / 连所在分组 / 连整条通道(Ctrl + 点击在 group / channel 下整批取反)">
|
|
298
|
+
<option value="line">line(只选点中的回线)</option>
|
|
299
|
+
<option value="group">group(连所在分组)</option>
|
|
300
|
+
<option value="channel">channel(连整条通道)</option>
|
|
301
|
+
</select>
|
|
302
|
+
</label>
|
|
303
|
+
<button type="button" @click="removeByApi()">删除选中(requestRemove,与 Delete 同一条路)</button>
|
|
304
|
+
<span class="demo-control-hint">{{ removeReadout }}</span>
|
|
305
|
+
</div>
|
|
306
|
+
</div>
|
|
307
|
+
|
|
308
|
+
<div v-show="activePanel === 'view-export'" class="demo-panel-body">
|
|
309
|
+
<div class="demo-controls">
|
|
310
|
+
<label class="demo-slider">
|
|
311
|
+
导出格式
|
|
312
|
+
<select v-model="exportFormat" title="PNG 是位图(画布 + DOM 标签合成),SVG 是矢量(线 / 点 / 符号 / 标签都是 SVG 元素,放大不糊)">
|
|
313
|
+
<option value="png">PNG(位图)</option>
|
|
314
|
+
<option value="svg">SVG(矢量)</option>
|
|
315
|
+
</select>
|
|
316
|
+
</label>
|
|
317
|
+
<label class="demo-slider">
|
|
318
|
+
背景
|
|
319
|
+
<select v-model="exportBackground" title="带背景 = 跟画面上一样;透明底 = 背景色 / 底图 / 区域填充与网格都不画;白底 = 只把最底下那层底色换成白色(底图 / 网格照旧)">
|
|
320
|
+
<option value="view">带背景(跟画面一样)</option>
|
|
321
|
+
<option value="none">不带背景(透明底)</option>
|
|
322
|
+
<option value="white">白底(#ffffff)</option>
|
|
323
|
+
</select>
|
|
324
|
+
</label>
|
|
325
|
+
<button type="button" @click="exportWholeImage()">导出整幅画面</button>
|
|
326
|
+
<span class="demo-control-hint">导出的是当前这一帧:格式与背景对「整幅」和「选中」两边都管用</span>
|
|
327
|
+
<label><input v-model="exportWithLines" type="checkbox" /> 导出选中时携带线路(两端都在选中集里的)</label>
|
|
328
|
+
<button type="button" @click="exportSelectionImage()">导出选中为图片</button>
|
|
329
|
+
<button type="button" @click="exportSelectedRecords()">导出选中为数据</button>
|
|
330
|
+
<span class="demo-control-hint">{{ exportReadout }}</span>
|
|
331
|
+
<label class="demo-slider">
|
|
332
|
+
选中点样式
|
|
333
|
+
<select v-model="pointSelectMode">
|
|
334
|
+
<option value="default">不配样式</option>
|
|
335
|
+
<option value="custom">自定义</option>
|
|
336
|
+
<option value="plain">不改变</option>
|
|
337
|
+
</select>
|
|
338
|
+
</label>
|
|
339
|
+
<label class="demo-slider">
|
|
340
|
+
选中线样式
|
|
341
|
+
<select v-model="lineSelectMode">
|
|
342
|
+
<option value="default">不配样式</option>
|
|
343
|
+
<option value="custom">自定义</option>
|
|
344
|
+
<option value="plain">不改变</option>
|
|
345
|
+
</select>
|
|
346
|
+
</label>
|
|
347
|
+
<label class="demo-slider">
|
|
348
|
+
多选点样式
|
|
349
|
+
<select v-model="pointMultiSelectMode">
|
|
350
|
+
<option value="default">同选中样式</option>
|
|
351
|
+
<option value="custom">自定义(绿)</option>
|
|
352
|
+
<option value="plain">不改变</option>
|
|
353
|
+
</select>
|
|
354
|
+
</label>
|
|
355
|
+
<label class="demo-slider">
|
|
356
|
+
框选点样式
|
|
357
|
+
<select v-model="pointBoxSelectMode">
|
|
358
|
+
<option value="default">同选中样式</option>
|
|
359
|
+
<option value="custom">自定义(粉)</option>
|
|
360
|
+
<option value="plain">不改变</option>
|
|
361
|
+
</select>
|
|
362
|
+
</label>
|
|
363
|
+
<label class="demo-slider">
|
|
364
|
+
多选线样式
|
|
365
|
+
<select v-model="lineMultiSelectMode">
|
|
366
|
+
<option value="default">同选中样式</option>
|
|
367
|
+
<option value="custom">自定义(绿)</option>
|
|
368
|
+
<option value="plain">不改变</option>
|
|
369
|
+
</select>
|
|
370
|
+
</label>
|
|
371
|
+
<label class="demo-slider">
|
|
372
|
+
框选矩形
|
|
373
|
+
<select v-model="selectionBoxMode">
|
|
374
|
+
<option value="default">组件默认(蓝)</option>
|
|
375
|
+
<option value="amber">琥珀色 · 粗边框</option>
|
|
376
|
+
<option value="pink">粉色 · 半透明填充</option>
|
|
377
|
+
<option value="line">只描边(背景全透明)</option>
|
|
378
|
+
</select>
|
|
379
|
+
</label>
|
|
380
|
+
<span class="demo-control-hint">Ctrl + 点击 / Shift + 拖动分别走多选与框选样式;节点或线路自己配了样式时以自身的为准;「框选矩形」换的是框本身(options.selectionBoxStyle:fill / fillOpacity / stroke / strokeWidth)</span>
|
|
381
|
+
</div>
|
|
382
|
+
|
|
383
|
+
</div>
|
|
384
|
+
<div v-show="activePanel === 'view-events'" class="demo-panel-body">
|
|
385
|
+
<div class="demo-controls">
|
|
386
|
+
<span class="demo-control-hint">指针载荷里直接给了三样东西:selected(这一刻在不在选中集里)/ wasSelected(onClick 是「点之前」的那一份,右键与按下 / 松开就是当下)/ selection(整份选中集的 ids / count / 点 / 线 / 通道条数);点、线、空白都有载荷,空白处的 onClick 是 null;Ctrl + 点击(多选取反)与 Shift + 拖动(框选)不走 onClick,那一下的结果看 onSelectChange</span>
|
|
387
|
+
</div>
|
|
388
|
+
<div class="demo-controls">
|
|
389
|
+
<button type="button" @click="readSelectionByApi()">读一次选中信息(getSelectionData)</button>
|
|
390
|
+
<span class="demo-control-hint">{{ selectionReadout }}</span>
|
|
391
|
+
</div>
|
|
392
|
+
<div class="demo-controls">
|
|
393
|
+
<pre class="demo-groups">{{ selectedItemsJson || 'getSelectionData():ids / count / pointCount / lineCount / channelCount / points / lines / channels / pointIndexes / lineIndexes / bounds' }}</pre>
|
|
394
|
+
</div>
|
|
395
|
+
</div>
|
|
396
|
+
</template>
|