leiting-bim 2.1.144 → 2.1.145
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/leiting-bim.es.js +1 -1
- package/leiting-bim.umd.js +1 -1
- package/leitingbim.css +1 -1
- package/package.json +1 -1
- package/plugins/cesium-core/dist/cesium-core.mjs +38 -20
- package/plugins/cesium-core/dist/cesium-core.mjs.map +1 -1
- package/plugins/cesium-core/dist/cesium-core.umd.js +1 -1
- package/plugins/cesium-core/dist/cesium-core.umd.js.map +1 -1
- package/plugins/cesium-core/dist/components/draw/handlers/PolygonDrawer.d.ts +3 -0
- package/plugins/cesium-vue/dist/HtmlOverlayLabelPool-CbiNlyAM.js.map +1 -1
- package/plugins/cesium-vue/dist/cesium-vue/src/components/basic-audio/index.d.ts +1 -11
- package/plugins/cesium-vue/dist/cesium-vue/src/components/basic-video/index.d.ts +1 -95
- package/plugins/cesium-vue/dist/cesium-vue/src/components/card-carousel/index.d.ts +1 -144
- package/plugins/cesium-vue/dist/cesium-vue/src/components/card-content/index.d.ts +1 -13
- package/plugins/cesium-vue/dist/cesium-vue/src/components/card-page/index.d.ts +1 -61
- package/plugins/cesium-vue/dist/cesium-vue/src/components/carousel-img/index.d.ts +1 -31
- package/plugins/cesium-vue/dist/cesium-vue/src/components/echarts-pro/index.d.ts +1 -60
- package/plugins/cesium-vue/dist/cesium-vue/src/components/marker-bubble/index.d.ts +2 -173
- package/plugins/cesium-vue/dist/cesium-vue/src/components/marker-default/index.d.ts +1 -49
- package/plugins/cesium-vue/dist/cesium-vue/src/components/marker-html/index.d.ts +1 -40
- package/plugins/cesium-vue/dist/cesium-vue/src/components/marker-manage/index.d.ts +1 -166
- package/plugins/cesium-vue/dist/cesium-vue/src/components/marker-text/index.d.ts +1 -22
- package/plugins/cesium-vue/dist/cesium-vue/src/components/measurement/index.d.ts +1 -70
- package/plugins/cesium-vue/dist/cesium-vue/src/components/position-picker/index.d.ts +1 -55
- package/plugins/cesium-vue/dist/components/marker-bubble.js.map +1 -1
- package/plugins/cesium-vue/dist/components/marker-manage.js.map +1 -1
- package/plugins/cesium-vue/dist/components/measurement.js.map +1 -1
- package/plugins/cesium-vue/dist/components/position-picker.js.map +1 -1
- package/plugins/cesium-vue/dist/index-Kqi_S6KA.js.map +1 -1
- package/plugins/cesium-vue/dist/index-McKGafjp.js.map +1 -1
- package/plugins/cesium-vue/dist/index.js.map +1 -1
|
@@ -4,10 +4,13 @@ export default class PolygonDrawer implements IDrawer {
|
|
|
4
4
|
private viewer;
|
|
5
5
|
private handler;
|
|
6
6
|
private positions;
|
|
7
|
+
private lnglats;
|
|
7
8
|
private entity;
|
|
8
9
|
private tooltip;
|
|
9
10
|
private tempPoints;
|
|
10
11
|
constructor(Cesium: any, viewer: any);
|
|
12
|
+
private isHelperPick;
|
|
13
|
+
private withHiddenHelpers;
|
|
11
14
|
private getPickPosition;
|
|
12
15
|
startDrawing(options: DrawOptions): void;
|
|
13
16
|
stopDrawing(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HtmlOverlayLabelPool-CbiNlyAM.js","sources":["../../cesium-core/src/components/MarkerEvent.ts","../../cesium-core/src/components/HtmlOverlayLabelPool.ts"],"sourcesContent":["export enum MarkerEventKey {\r\n Click = 'marker:click',\r\n DoubleClick = 'marker:dblclick',\r\n RightClick = 'marker:rightclick',\r\n MouseEnter = 'marker:mouseenter',\r\n MouseLeave = 'marker:mouseleave',\r\n MouseDown = 'marker:mousedown',\r\n MouseUp = 'marker:mouseup',\r\n}\r\n\r\ninterface ListenerItem<T = any> {\r\n name: string;\r\n fn: (data: T, event: Event) => void;\r\n once?: boolean;\r\n}\r\n\r\nexport { ListenerItem };\r\n\r\nexport class MarkerEventBus {\r\n private listenerMap = new Map<MarkerEventKey, Map<string, ListenerItem>>();\r\n\r\n /**\r\n * 添加监听器\r\n * @param key 事件 key\r\n * @param listener 监听器项\r\n * @param overwrite 是否覆盖同名监听器\r\n * @returns 是否成功添加\r\n */\r\n addListener(key: MarkerEventKey, listener: ListenerItem, overwrite: boolean = false): boolean {\r\n let map = this.listenerMap.get(key);\r\n if (!map) {\r\n map = new Map();\r\n this.listenerMap.set(key, map);\r\n }\r\n\r\n if (map.has(listener.name)) {\r\n if (overwrite) {\r\n console.warn(\r\n `[MarkerEventBus] Overwriting listener \"${listener.name}\" for event \"${key}\".`,\r\n );\r\n map.set(listener.name, listener);\r\n return true;\r\n } else {\r\n console.warn(\r\n `[MarkerEventBus] Listener \"${listener.name}\" for event \"${key}\" already exists. Use overwrite=true to replace it.`,\r\n );\r\n return false;\r\n }\r\n }\r\n\r\n map.set(listener.name, listener);\r\n return true;\r\n }\r\n\r\n /**\r\n * 移除某个 key 的所有监听器\r\n */\r\n removeListenerByKey(key: MarkerEventKey): boolean {\r\n const existed = this.listenerMap.has(key);\r\n this.listenerMap.set(key, new Map());\r\n return existed;\r\n }\r\n\r\n /**\r\n * 移除某个 key 下的指定名字的监听器\r\n */\r\n removeListenerByKeyAndName(key: MarkerEventKey, name: string): boolean {\r\n const map = this.listenerMap.get(key);\r\n if (!map) return false;\r\n return map.delete(name);\r\n }\r\n\r\n /**\r\n * 运行监听器\r\n */\r\n runListener<T = any>(key: MarkerEventKey, data: T, e: Event) {\r\n const map = this.listenerMap.get(key);\r\n if (!map) return;\r\n\r\n for (const [name, listener] of map.entries()) {\r\n try {\r\n listener.fn(data, e);\r\n } catch (err) {\r\n console.error(`Error in listener \"${name}\" for event \"${key}\":`, err);\r\n }\r\n\r\n if (listener.once) {\r\n map.delete(name);\r\n }\r\n }\r\n }\r\n}\r\n","import { MarkerEventKey, MarkerEventBus } from './MarkerEvent';\r\n\r\n/**\r\n * 单个标签实例\r\n */\r\ninterface LabelInstance {\r\n id: string;\r\n el: HTMLDivElement;\r\n theme: string;\r\n data?: any;\r\n notCreateElement?: boolean;\r\n unload?: any;\r\n}\r\n\r\n/**\r\n * 主题配置项\r\n */\r\ninterface ThemeOptions {\r\n /**\r\n * 创建标签 DOM 内容的方法\r\n */\r\n createElement: (\r\n el: HTMLDivElement,\r\n context: { id: string; theme: string; data: any },\r\n options: ThemeOptions,\r\n ) => any;\r\n\r\n /**\r\n * 可选配置,如偏移量\r\n */\r\n options?: {\r\n offset?: { x?: number; y?: number };\r\n };\r\n}\r\n\r\n/**\r\n * 标签添加时的参数\r\n */\r\ninterface LabelOptions {\r\n id: string;\r\n lon: number;\r\n lat: number;\r\n height?: number;\r\n theme: string;\r\n show?: boolean;\r\n notCreateElement?: boolean;\r\n style?: {\r\n [key: string]: string;\r\n };\r\n}\r\nexport { LabelOptions, LabelInstance, ThemeOptions };\r\n\r\n/**\r\n * 自定义事件与 DOM 事件的映射\r\n */\r\nexport const DOM_EVENT_MAP: Record<MarkerEventKey, keyof HTMLElementEventMap> = {\r\n [MarkerEventKey.Click]: 'click',\r\n [MarkerEventKey.DoubleClick]: 'dblclick',\r\n [MarkerEventKey.RightClick]: 'contextmenu',\r\n [MarkerEventKey.MouseEnter]: 'mouseenter',\r\n [MarkerEventKey.MouseLeave]: 'mouseleave',\r\n [MarkerEventKey.MouseDown]: 'mousedown',\r\n [MarkerEventKey.MouseUp]: 'mouseup',\r\n};\r\n\r\ninterface OcclusionOptions {\r\n enabled: boolean;\r\n throttleMs: number;\r\n distanceEpsilon: number;\r\n}\r\n\r\ntype OcclusionCheckReason =\r\n | 'label-missing'\r\n | 'invalid-coordinate'\r\n | 'screen-position-undefined'\r\n | 'runtime-missing'\r\n | 'pick-unsupported'\r\n | 'pick-empty'\r\n | 'pick-error'\r\n | 'distance-compare';\r\n\r\ninterface OcclusionCheckLog {\r\n timestamp: number;\r\n id: string;\r\n lon?: number;\r\n lat?: number;\r\n height?: number;\r\n occluded: boolean;\r\n reason: OcclusionCheckReason;\r\n epsilon?: number;\r\n labelDistance?: number;\r\n pickedDistance?: number;\r\n}\r\n\r\n/**\r\n * 用于管理 Cesium HTML 标签的池,支持主题渲染、事件分发、动态更新等功能\r\n */\r\nexport class HtmlOverlayLabelPool {\r\n private viewer: any;\r\n private Cesium: any;\r\n private container: HTMLDivElement;\r\n private labels: Map<string, LabelInstance> = new Map();\r\n private activeIds: Set<string> = new Set();\r\n private occludedIds: Set<string> = new Set();\r\n private _updateFn: () => void;\r\n private _cameraChangedFn: () => void;\r\n private themes: Record<string, ThemeOptions> = {};\r\n public occlusionCheckLogs: OcclusionCheckLog[] = [];\r\n private occlusionLogEnabled = false;\n private occlusionLogMax = 10000;\n private occlusionOptions: OcclusionOptions = {\n enabled: false,\n throttleMs: 120,\n distanceEpsilon: 1.0,\n };\n private _occlusionTimer: number | null = null;\r\n private _lastOcclusionAt: number = 0;\r\n private _occlusionChecking = false;\r\n private _occlusionPending = false;\r\n public eventBus: MarkerEventBus;\r\n public openWheel = true;\r\n /**\r\n * 构造函数\r\n * @param Cesium Cesium 命名空间\r\n * @param viewer Cesium Viewer 实例\r\n * @param containerId HTML 容器 ID(默认:\"html-label-container\")\r\n * @param eventBus 可选:自定义事件总线\r\n */\r\n constructor(\r\n Cesium: any,\r\n viewer: any,\r\n containerId: string = 'html-label-container',\r\n eventBus?: MarkerEventBus,\r\n openWheel: boolean = true,\r\n ) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n this.container = this._createContainer(containerId);\r\n this._updateFn = this._update.bind(this);\r\n this.viewer.scene.postRender.addEventListener(this._updateFn);\r\n this._cameraChangedFn = this._scheduleOcclusionCheck.bind(this);\r\n this.viewer.camera.changed.addEventListener(this._cameraChangedFn);\r\n this.eventBus = eventBus || new MarkerEventBus();\r\n this.openWheel = openWheel;\r\n\r\n this.runOcclusionCheckNow();\r\n }\r\n\r\n /**\r\n * 创建标签容器\r\n */\r\n private _createContainer(id: string): HTMLDivElement {\r\n let container = document.getElementById(id) as HTMLDivElement;\r\n if (!container) {\r\n container = document.createElement('div');\r\n container.id = id;\r\n Object.assign(container.style, {\r\n position: 'absolute',\r\n top: '0',\r\n left: '0',\r\n pointerEvents: 'none',\r\n width: '100%',\r\n height: '100%',\r\n zIndex: '100',\r\n overflow: 'hidden',\r\n });\r\n document.body.appendChild(container);\r\n }\r\n return container;\r\n }\r\n\r\n /**\r\n * 注册标签主题\r\n */\r\n registerTheme(themeName: string, options: ThemeOptions) {\r\n this.themes[themeName] = options;\r\n }\r\n\r\n /**\r\n * 添加单个标签\r\n */\r\n add(data: any, options: LabelOptions) {\r\n const {\r\n id,\r\n lon,\r\n lat,\r\n height = 0,\r\n theme,\r\n show = true,\r\n notCreateElement = false,\r\n style,\r\n } = options;\r\n\r\n const themeOptions = this.themes[theme];\r\n if (!themeOptions) {\r\n console.warn(`Theme \"${theme}\" not registered`);\r\n return;\r\n }\r\n\r\n let label = this.labels.get(id);\r\n if (!label) {\r\n const el = document.createElement('div');\r\n Object.assign(el.style, {\r\n position: 'absolute',\r\n transform: 'translate(0, 0)',\r\n pointerEvents: 'auto',\r\n ...(options.style || {}),\r\n });\r\n\r\n // 绑定 DOM 事件到事件总线\r\n for (const [key, domEvent] of Object.entries(DOM_EVENT_MAP)) {\r\n el.addEventListener(domEvent, (e: Event) => {\r\n e.stopPropagation();\r\n const labelData = this.labels.get(id);\r\n this.eventBus.runListener(key as MarkerEventKey, labelData, e);\r\n });\r\n\r\n // 滚轮期间禁止点击\r\n let lastTime = 0;\r\n el.addEventListener('wheel', (event) => {\r\n if (!this.openWheel) return;\r\n const dom = event.currentTarget as HTMLElement;\r\n lastTime = Date.now();\r\n const currTime = lastTime;\r\n dom.style.pointerEvents = 'none';\r\n setTimeout(() => {\r\n if (lastTime === currTime) {\r\n dom.style.pointerEvents = 'auto';\r\n }\r\n }, 2000);\r\n });\r\n }\r\n\r\n let unload = null;\r\n if (!notCreateElement || show) {\r\n try {\r\n unload = themeOptions.createElement(el, { id, theme, data }, themeOptions) || {};\r\n } catch (err) {\r\n console.error(`Error updating label element for id \"${id}\":`, err);\r\n }\r\n this.container.appendChild(el);\r\n }\r\n label = { id, el, theme, data, notCreateElement, unload: unload };\r\n this.labels.set(id, label);\r\n } else {\r\n label.theme = theme;\r\n label.data = data;\r\n label.notCreateElement = notCreateElement;\r\n\r\n // 若已存在,则更新 DOM 内容\r\n try {\r\n label.unload = themeOptions.createElement(label.el, { id, theme, data }, themeOptions);\r\n if (!notCreateElement || show) {\r\n this.container.appendChild(label.el);\r\n }\r\n } catch (err) {\r\n console.error(`Error updating label element for id \"${id}\":`, err);\r\n }\r\n }\r\n\r\n // 存储坐标用于后续位置更新\r\n label.el.dataset.lon = String(lon);\r\n label.el.dataset.lat = String(lat);\r\n label.el.dataset.height = String(height);\r\n\r\n label.el.style.zIndex = style?.zIndex || '1';\r\n label.el.style.display = show ? 'block' : 'none';\r\n if (show) {\r\n this.activeIds.add(id);\r\n }\r\n if (!show) {\r\n this.occludedIds.delete(id);\r\n } else {\r\n this._scheduleOcclusionCheck();\r\n }\r\n }\r\n\r\n /**\r\n * 批量添加标签\r\n */\r\n addBatch(items: Array<{ data: any; options: LabelOptions }>) {\r\n for (const { data, options } of items) {\r\n this.add(data, options);\r\n }\r\n }\r\n\r\n /**\r\n * 根据 ID 批量移除标签\r\n */\r\n removeByIds(ids: string[]) {\r\n for (const id of ids) {\r\n const label = this.labels.get(id);\r\n if (label) {\r\n this.unloadByLabel(label);\r\n this.labels.delete(id);\r\n this.activeIds.delete(id);\r\n this.occludedIds.delete(id);\r\n }\r\n }\r\n }\r\n\r\n unloadByLabel(label: LabelInstance) {\r\n label.el.remove();\r\n if (label?.unload && typeof label.unload === 'function') label?.unload();\r\n label.unload = null;\r\n }\r\n\r\n /**\r\n * 移除所有标签\r\n */\r\n removeAll() {\r\n for (const label of this.labels.values()) {\r\n this.unloadByLabel(label);\r\n }\r\n this.labels.clear();\r\n this.activeIds.clear();\r\n this.occludedIds.clear();\r\n }\r\n\r\n /**\r\n * 更新标签的数据并刷新内容\r\n */\r\n update(id: string, newData: any) {\r\n const label = this.labels.get(id);\r\n if (!label) {\r\n console.warn(`Label with id \"${id}\" not found for update.`);\r\n return;\r\n }\r\n\r\n const theme = this.themes[label.theme];\r\n if (!theme) {\r\n console.warn(`Theme \"${label.theme}\" not registered.`);\r\n return;\r\n }\r\n\r\n try {\r\n theme.createElement(label.el, { id, theme: label.theme, data: newData }, theme);\r\n } catch (err) {\r\n console.error(`Failed to update label \"${id}\":`, err);\r\n }\r\n }\r\n\r\n /**\r\n * 根据 ID 批量隐藏标签\r\n */\r\n hideByIds(ids: string[]) {\r\n for (const id of ids) {\r\n const label = this.labels.get(id);\r\n if (label) {\r\n if (label.notCreateElement) {\r\n this.unloadByLabel(label);\r\n }\r\n label.el.style.display = 'none';\r\n this.activeIds.delete(id);\r\n this.occludedIds.delete(id);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 隐藏所有标签\r\n */\r\n hideAll() {\r\n for (const label of this.labels.values()) {\r\n if (label.notCreateElement) {\r\n this.unloadByLabel(label);\r\n }\r\n label.el.style.display = 'none';\r\n this.activeIds.delete(label.id);\r\n this.occludedIds.delete(label.id);\r\n }\r\n }\r\n\r\n /**\r\n * 条件过滤隐藏标签\r\n */\r\n hideFilter(filter: (data: any) => boolean) {\r\n for (const label of this.labels.values()) {\r\n if (!filter(label.data)) continue;\r\n if (label.notCreateElement) {\r\n this.unloadByLabel(label);\r\n }\r\n label.el.style.display = 'none';\r\n this.activeIds.delete(label.id);\r\n this.occludedIds.delete(label.id);\r\n }\r\n }\r\n\r\n /**\r\n * 根据 ID 显示标签\r\n */\r\n showByIds(ids: string[]) {\r\n for (const id of ids) {\r\n const label = this.labels.get(id);\r\n if (label) {\r\n if (label.notCreateElement || !label.el.parentNode) {\r\n this.container.appendChild(label.el);\r\n }\r\n if (!label.unload) {\r\n try {\r\n const themeOptions = this.themes[label.theme];\r\n if (!themeOptions) {\r\n console.warn(`Theme \"${label.theme}\" not registered`);\r\n return;\r\n }\r\n label.unload =\r\n themeOptions.createElement(\r\n label.el,\r\n { id, theme: label.theme, data: label.data },\r\n themeOptions,\r\n ) || {};\r\n } catch (err) {\r\n console.error(`Error creating label element for theme \"${label.theme}\":`, err);\r\n return;\r\n }\r\n }\r\n\r\n label.el.style.display = 'block';\r\n this.activeIds.add(id);\r\n this.occludedIds.delete(id);\r\n }\r\n }\r\n this._scheduleOcclusionCheck();\r\n }\r\n\r\n /**\r\n * 检查标签是否存在\r\n */\r\n has(id: string): boolean {\r\n return this.labels.has(id);\r\n }\r\n\r\n /**\r\n * 清空活跃 ID 列表(不影响 DOM)\r\n */\r\n reset() {\r\n for (const id of this.activeIds.values()) {\r\n let label = this.labels.get(id);\r\n label && this.unloadByLabel(label);\r\n }\r\n this.activeIds.clear();\r\n }\r\n\r\n /**\r\n * 清理当前未活跃的标签(隐藏而不移除 DOM)\r\n */\r\n cleanup() {\r\n for (const [id, label] of this.labels.entries()) {\r\n if (!this.activeIds.has(id)) {\r\n label.el.style.display = 'none';\r\n this.occludedIds.delete(id);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 经纬度 -> 自动地形高度修正 -> Cartesian3 -> 屏幕坐标\r\n */\r\n async toWindowPositionByLonLat(lon: number, lat: number): Promise<any> {\r\n const Cesium = this.Cesium;\r\n const scene = this.viewer.scene;\r\n\r\n // 1. 经纬度列表\r\n const positions = [Cesium.Cartographic.fromDegrees(lon, lat)];\r\n\r\n // 2. 使用 clampToHeightMostDetailed 获取真实地形高度\r\n let heightResult;\r\n try {\r\n heightResult = await scene.clampToHeightMostDetailed(positions);\r\n } catch (e) {\r\n console.warn('clampToHeightMostDetailed failed, fallback to ellipsoid height.');\r\n }\r\n\r\n let finalHeight = 0;\r\n if (heightResult && heightResult[0] && heightResult[0].height != null) {\r\n finalHeight = heightResult[0].height; // 用户偏好:height[0].height\r\n } else {\r\n // 如果地形未开启,则 fallback 椭球高度\r\n finalHeight = 0;\r\n }\r\n\r\n // 3. 生成真实位置 Cartesian3\r\n const worldPos = Cesium.Cartesian3.fromDegrees(lon, lat, finalHeight);\r\n\r\n // 4. 转屏幕像素坐标\r\n return this.toWindowCoordinates(worldPos);\r\n }\r\n\r\n /**\r\n * 坐标转换:经纬度 -> 屏幕像素坐标\r\n */\r\n toWindowCoordinates(position: any): any {\r\n const scene = this.viewer.scene;\r\n const st = this.Cesium.SceneTransforms;\r\n if (typeof st?.wgs84ToWindowCoordinates === 'function') {\r\n return st.wgs84ToWindowCoordinates(scene, position);\r\n }\r\n if (typeof st?.worldToWindowCoordinates === 'function') {\r\n return st.worldToWindowCoordinates(scene, position);\r\n }\r\n\r\n console.warn('No compatible window coordinate transform function found.');\r\n return undefined;\r\n }\r\n\r\n /**\r\n * 检查经纬度是否有效\r\n * @param lon 经度\r\n * @param lat 纬度\r\n * @returns 是否有效\r\n */\r\n private _isValidCoordinate(lon: number, lat: number): boolean {\r\n // 检查是否为 NaN\r\n if (Number.isNaN(lon) || Number.isNaN(lat)) return false;\r\n // 检查是否为 0(用户要求 0,0 时不显示)\r\n if (lon === 0 && lat === 0) return false;\r\n // 检查是否在有效范围内\r\n if (lon < -180 || lon > 180 || lat < -90 || lat > 90) return false;\r\n return true;\r\n }\r\n\r\n /**\r\n * 每帧刷新所有活跃标签的位置\r\n */\r\n private async _update() {\r\n for (const id of this.activeIds) {\r\n const label = this.labels.get(id);\r\n if (!label) continue;\r\n\r\n const lon = parseFloat(label.el.dataset.lon!);\r\n const lat = parseFloat(label.el.dataset.lat!);\r\n const height = parseFloat(label.el.dataset.height || '0');\r\n\r\n // 检查经纬度是否有效,无效则隐藏标签\r\n if (!this._isValidCoordinate(lon, lat)) {\r\n label.el.style.display = 'none';\r\n continue;\r\n }\r\n\r\n const position = this.Cesium.Cartesian3.fromDegrees(lon, lat, height);\r\n const screenPosition = this.toWindowCoordinates(position);\r\n\r\n if (this.Cesium.defined(screenPosition)) {\r\n const theme = this.themes[label.theme];\r\n const offset = theme.options?.offset || {};\r\n const offsetX = offset.x || 0;\r\n const offsetY = offset.y || 0;\r\n const occluded = this.occludedIds.has(id);\r\n\r\n label.el.style.left = `${screenPosition.x}px`;\r\n label.el.style.top = `${screenPosition.y}px`;\r\n label.el.style.transform = `translate(${offsetX}px, ${offsetY}px)`;\r\n label.el.style.display = occluded ? 'none' : 'block';\r\n } else {\r\n label.el.style.display = 'none';\r\n }\r\n }\r\n }\r\n\r\n private _scheduleOcclusionCheck() {\r\n if (!this.occlusionOptions.enabled) return;\r\n\r\n const now = Date.now();\r\n const throttleMs = Math.max(0, Number(this.occlusionOptions.throttleMs) || 0);\r\n const elapsed = now - this._lastOcclusionAt;\r\n const waitMs = Math.max(0, throttleMs - elapsed);\r\n\r\n if (waitMs === 0) {\r\n this.runOcclusionCheckNow();\r\n return;\r\n }\r\n\r\n if (this._occlusionTimer !== null) return;\r\n this._occlusionTimer = window.setTimeout(() => {\r\n this._occlusionTimer = null;\r\n this.runOcclusionCheckNow();\r\n }, waitMs);\r\n }\r\n\r\n private _pushOcclusionLog(log: OcclusionCheckLog) {\r\n if (!this.occlusionLogEnabled) return;\r\n this.occlusionCheckLogs.push(log);\r\n if (this.occlusionCheckLogs.length > this.occlusionLogMax) {\r\n this.occlusionCheckLogs.splice(0, this.occlusionCheckLogs.length - this.occlusionLogMax);\r\n }\r\n }\r\n\r\n private _computeLabelOccluded(\r\n id: string,\r\n worldPosition: any,\r\n windowPosition: any,\r\n lon?: number,\r\n lat?: number,\r\n height?: number,\r\n ): boolean {\r\n const scene = this.viewer?.scene;\r\n const camera = this.viewer?.camera;\r\n const Cesium = this.Cesium;\r\n if (!scene || !camera || !Cesium) {\r\n this._pushOcclusionLog({\r\n timestamp: Date.now(),\r\n id,\r\n lon,\r\n lat,\r\n height,\r\n occluded: true,\r\n reason: 'runtime-missing',\r\n });\r\n return true;\r\n }\r\n\r\n if (!scene.pickPositionSupported || !windowPosition) {\r\n this._pushOcclusionLog({\r\n timestamp: Date.now(),\r\n id,\r\n lon,\r\n lat,\r\n height,\r\n occluded: true,\r\n reason: 'pick-unsupported',\r\n });\r\n return true;\r\n }\r\n\r\n try {\r\n const pickedPosition = scene.pickPosition(windowPosition);\r\n if (!pickedPosition || !camera.positionWC) {\r\n this._pushOcclusionLog({\r\n timestamp: Date.now(),\r\n id,\r\n lon,\r\n lat,\r\n height,\r\n occluded: true,\r\n reason: 'pick-empty',\r\n });\r\n return true;\r\n }\r\n const epsilon = Number(this.occlusionOptions.distanceEpsilon) || 0;\r\n const labelDistance = Cesium.Cartesian3.distance(camera.positionWC, worldPosition);\r\n const pickedDistance = Cesium.Cartesian3.distance(camera.positionWC, pickedPosition);\r\n const occluded = pickedDistance + epsilon < labelDistance;\r\n this._pushOcclusionLog({\r\n timestamp: Date.now(),\r\n id,\r\n lon,\r\n lat,\r\n height,\r\n occluded,\r\n reason: 'distance-compare',\r\n epsilon,\r\n labelDistance,\r\n pickedDistance,\r\n });\r\n return occluded;\r\n } catch (error) {\r\n this._pushOcclusionLog({\r\n timestamp: Date.now(),\r\n id,\r\n lon,\r\n lat,\r\n height,\r\n occluded: true,\r\n reason: 'pick-error',\r\n });\r\n return true;\r\n }\r\n }\r\n\r\n runOcclusionCheckNow() {\r\n if (!this.occlusionOptions.enabled) {\r\n this.occludedIds.clear();\r\n return;\r\n }\r\n\r\n if (this._occlusionChecking) {\r\n this._occlusionPending = true;\r\n return;\r\n }\r\n\r\n this._occlusionChecking = true;\r\n try {\r\n for (const id of this.activeIds) {\r\n const label = this.labels.get(id);\r\n if (!label) {\r\n this.occludedIds.delete(id);\r\n this._pushOcclusionLog({\r\n timestamp: Date.now(),\r\n id,\r\n occluded: false,\r\n reason: 'label-missing',\r\n });\r\n continue;\r\n }\r\n\r\n const lon = parseFloat(label.el.dataset.lon!);\r\n const lat = parseFloat(label.el.dataset.lat!);\r\n const height = parseFloat(label.el.dataset.height || '0');\r\n if (!this._isValidCoordinate(lon, lat)) {\r\n this.occludedIds.delete(id);\r\n this._pushOcclusionLog({\r\n timestamp: Date.now(),\r\n id,\r\n lon,\r\n lat,\r\n height,\r\n occluded: false,\r\n reason: 'invalid-coordinate',\r\n });\r\n continue;\r\n }\r\n\r\n const worldPosition = this.Cesium.Cartesian3.fromDegrees(lon, lat, height);\r\n const screenPosition = this.toWindowCoordinates(worldPosition);\r\n if (!this.Cesium.defined(screenPosition)) {\r\n this.occludedIds.delete(id);\r\n this._pushOcclusionLog({\r\n timestamp: Date.now(),\r\n id,\r\n lon,\r\n lat,\r\n height,\r\n occluded: false,\r\n reason: 'screen-position-undefined',\r\n });\r\n continue;\r\n }\r\n\r\n const occluded = this._computeLabelOccluded(id, worldPosition, screenPosition, lon, lat, height);\r\n if (occluded) this.occludedIds.add(id);\r\n else this.occludedIds.delete(id);\r\n }\r\n } finally {\r\n this._lastOcclusionAt = Date.now();\r\n this._occlusionChecking = false;\r\n if (this._occlusionPending) {\r\n this._occlusionPending = false;\r\n this._scheduleOcclusionCheck();\r\n }\r\n }\r\n }\r\n\r\n setOcclusionEnabled(enabled: boolean) {\n this.occlusionOptions.enabled = Boolean(enabled);\n if (!this.occlusionOptions.enabled) {\n this.occludedIds.clear();\n if (this._occlusionTimer !== null) {\r\n clearTimeout(this._occlusionTimer);\r\n this._occlusionTimer = null;\r\n }\r\n } else {\r\n this.runOcclusionCheckNow();\r\n }\n }\n\n getOcclusionOptions(): OcclusionOptions {\n return {\n enabled: this.occlusionOptions.enabled,\n throttleMs: this.occlusionOptions.throttleMs,\n distanceEpsilon: this.occlusionOptions.distanceEpsilon,\n };\n }\n\n setOcclusionOptions(options: Partial<Pick<OcclusionOptions, 'throttleMs' | 'distanceEpsilon'>>) {\n if (options.throttleMs != null) {\n this.occlusionOptions.throttleMs = Math.max(0, Number(options.throttleMs) || 0);\n }\r\n if (options.distanceEpsilon != null) {\r\n this.occlusionOptions.distanceEpsilon = Math.max(0, Number(options.distanceEpsilon) || 0);\r\n }\r\n if (this.occlusionOptions.enabled) {\r\n this._scheduleOcclusionCheck();\r\n }\r\n }\r\n\r\n setOcclusionLogEnabled(enabled: boolean, clearExisting: boolean = false) {\r\n this.occlusionLogEnabled = Boolean(enabled);\r\n if (clearExisting) {\r\n this.occlusionCheckLogs = [];\r\n }\r\n }\r\n\r\n /**\r\n * 销毁标签池,清理监听器和 DOM\r\n */\r\n destroy() {\r\n this.viewer.scene.postRender.removeEventListener(this._updateFn);\r\n this.viewer.camera.changed.removeEventListener(this._cameraChangedFn);\r\n if (this._occlusionTimer !== null) {\r\n clearTimeout(this._occlusionTimer);\r\n this._occlusionTimer = null;\r\n }\r\n // this.container.remove();\r\n this.labels.clear();\r\n this.activeIds.clear();\r\n this.occludedIds.clear();\r\n }\r\n}\r\n"],"names":["MarkerEventKey","MarkerEventBus","key","listener","overwrite","map","existed","name","data","e","err","DOM_EVENT_MAP","HtmlOverlayLabelPool","Cesium","viewer","containerId","eventBus","openWheel","id","container","themeName","options","lon","lat","height","theme","show","notCreateElement","style","themeOptions","label","el","domEvent","labelData","lastTime","event","dom","currTime","unload","items","ids","newData","filter","scene","positions","heightResult","finalHeight","worldPos","position","st","screenPosition","offset","offsetX","offsetY","occluded","now","throttleMs","elapsed","waitMs","log","worldPosition","windowPosition","camera","pickedPosition","epsilon","labelDistance","pickedDistance","enabled","clearExisting"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HtmlOverlayLabelPool-CbiNlyAM.js","sources":["../../cesium-core/src/components/MarkerEvent.ts","../../cesium-core/src/components/HtmlOverlayLabelPool.ts"],"sourcesContent":["export enum MarkerEventKey {\r\n Click = 'marker:click',\r\n DoubleClick = 'marker:dblclick',\r\n RightClick = 'marker:rightclick',\r\n MouseEnter = 'marker:mouseenter',\r\n MouseLeave = 'marker:mouseleave',\r\n MouseDown = 'marker:mousedown',\r\n MouseUp = 'marker:mouseup',\r\n}\r\n\r\ninterface ListenerItem<T = any> {\r\n name: string;\r\n fn: (data: T, event: Event) => void;\r\n once?: boolean;\r\n}\r\n\r\nexport { ListenerItem };\r\n\r\nexport class MarkerEventBus {\r\n private listenerMap = new Map<MarkerEventKey, Map<string, ListenerItem>>();\r\n\r\n /**\r\n * 添加监听器\r\n * @param key 事件 key\r\n * @param listener 监听器项\r\n * @param overwrite 是否覆盖同名监听器\r\n * @returns 是否成功添加\r\n */\r\n addListener(key: MarkerEventKey, listener: ListenerItem, overwrite: boolean = false): boolean {\r\n let map = this.listenerMap.get(key);\r\n if (!map) {\r\n map = new Map();\r\n this.listenerMap.set(key, map);\r\n }\r\n\r\n if (map.has(listener.name)) {\r\n if (overwrite) {\r\n console.warn(\r\n `[MarkerEventBus] Overwriting listener \"${listener.name}\" for event \"${key}\".`,\r\n );\r\n map.set(listener.name, listener);\r\n return true;\r\n } else {\r\n console.warn(\r\n `[MarkerEventBus] Listener \"${listener.name}\" for event \"${key}\" already exists. Use overwrite=true to replace it.`,\r\n );\r\n return false;\r\n }\r\n }\r\n\r\n map.set(listener.name, listener);\r\n return true;\r\n }\r\n\r\n /**\r\n * 移除某个 key 的所有监听器\r\n */\r\n removeListenerByKey(key: MarkerEventKey): boolean {\r\n const existed = this.listenerMap.has(key);\r\n this.listenerMap.set(key, new Map());\r\n return existed;\r\n }\r\n\r\n /**\r\n * 移除某个 key 下的指定名字的监听器\r\n */\r\n removeListenerByKeyAndName(key: MarkerEventKey, name: string): boolean {\r\n const map = this.listenerMap.get(key);\r\n if (!map) return false;\r\n return map.delete(name);\r\n }\r\n\r\n /**\r\n * 运行监听器\r\n */\r\n runListener<T = any>(key: MarkerEventKey, data: T, e: Event) {\r\n const map = this.listenerMap.get(key);\r\n if (!map) return;\r\n\r\n for (const [name, listener] of map.entries()) {\r\n try {\r\n listener.fn(data, e);\r\n } catch (err) {\r\n console.error(`Error in listener \"${name}\" for event \"${key}\":`, err);\r\n }\r\n\r\n if (listener.once) {\r\n map.delete(name);\r\n }\r\n }\r\n }\r\n}\r\n","import { MarkerEventKey, MarkerEventBus } from './MarkerEvent';\r\n\r\n/**\r\n * 单个标签实例\r\n */\r\ninterface LabelInstance {\r\n id: string;\r\n el: HTMLDivElement;\r\n theme: string;\r\n data?: any;\r\n notCreateElement?: boolean;\r\n unload?: any;\r\n}\r\n\r\n/**\r\n * 主题配置项\r\n */\r\ninterface ThemeOptions {\r\n /**\r\n * 创建标签 DOM 内容的方法\r\n */\r\n createElement: (\r\n el: HTMLDivElement,\r\n context: { id: string; theme: string; data: any },\r\n options: ThemeOptions,\r\n ) => any;\r\n\r\n /**\r\n * 可选配置,如偏移量\r\n */\r\n options?: {\r\n offset?: { x?: number; y?: number };\r\n };\r\n}\r\n\r\n/**\r\n * 标签添加时的参数\r\n */\r\ninterface LabelOptions {\r\n id: string;\r\n lon: number;\r\n lat: number;\r\n height?: number;\r\n theme: string;\r\n show?: boolean;\r\n notCreateElement?: boolean;\r\n style?: {\r\n [key: string]: string;\r\n };\r\n}\r\nexport { LabelOptions, LabelInstance, ThemeOptions };\r\n\r\n/**\r\n * 自定义事件与 DOM 事件的映射\r\n */\r\nexport const DOM_EVENT_MAP: Record<MarkerEventKey, keyof HTMLElementEventMap> = {\r\n [MarkerEventKey.Click]: 'click',\r\n [MarkerEventKey.DoubleClick]: 'dblclick',\r\n [MarkerEventKey.RightClick]: 'contextmenu',\r\n [MarkerEventKey.MouseEnter]: 'mouseenter',\r\n [MarkerEventKey.MouseLeave]: 'mouseleave',\r\n [MarkerEventKey.MouseDown]: 'mousedown',\r\n [MarkerEventKey.MouseUp]: 'mouseup',\r\n};\r\n\r\ninterface OcclusionOptions {\r\n enabled: boolean;\r\n throttleMs: number;\r\n distanceEpsilon: number;\r\n}\r\n\r\ntype OcclusionCheckReason =\r\n | 'label-missing'\r\n | 'invalid-coordinate'\r\n | 'screen-position-undefined'\r\n | 'runtime-missing'\r\n | 'pick-unsupported'\r\n | 'pick-empty'\r\n | 'pick-error'\r\n | 'distance-compare';\r\n\r\ninterface OcclusionCheckLog {\r\n timestamp: number;\r\n id: string;\r\n lon?: number;\r\n lat?: number;\r\n height?: number;\r\n occluded: boolean;\r\n reason: OcclusionCheckReason;\r\n epsilon?: number;\r\n labelDistance?: number;\r\n pickedDistance?: number;\r\n}\r\n\r\n/**\r\n * 用于管理 Cesium HTML 标签的池,支持主题渲染、事件分发、动态更新等功能\r\n */\r\nexport class HtmlOverlayLabelPool {\r\n private viewer: any;\r\n private Cesium: any;\r\n private container: HTMLDivElement;\r\n private labels: Map<string, LabelInstance> = new Map();\r\n private activeIds: Set<string> = new Set();\r\n private occludedIds: Set<string> = new Set();\r\n private _updateFn: () => void;\r\n private _cameraChangedFn: () => void;\r\n private themes: Record<string, ThemeOptions> = {};\r\n public occlusionCheckLogs: OcclusionCheckLog[] = [];\r\n private occlusionLogEnabled = false;\r\n private occlusionLogMax = 10000;\r\n private occlusionOptions: OcclusionOptions = {\r\n enabled: false,\r\n throttleMs: 120,\r\n distanceEpsilon: 1.0,\r\n };\r\n private _occlusionTimer: number | null = null;\r\n private _lastOcclusionAt: number = 0;\r\n private _occlusionChecking = false;\r\n private _occlusionPending = false;\r\n public eventBus: MarkerEventBus;\r\n public openWheel = true;\r\n /**\r\n * 构造函数\r\n * @param Cesium Cesium 命名空间\r\n * @param viewer Cesium Viewer 实例\r\n * @param containerId HTML 容器 ID(默认:\"html-label-container\")\r\n * @param eventBus 可选:自定义事件总线\r\n */\r\n constructor(\r\n Cesium: any,\r\n viewer: any,\r\n containerId: string = 'html-label-container',\r\n eventBus?: MarkerEventBus,\r\n openWheel: boolean = true,\r\n ) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n this.container = this._createContainer(containerId);\r\n this._updateFn = this._update.bind(this);\r\n this.viewer.scene.postRender.addEventListener(this._updateFn);\r\n this._cameraChangedFn = this._scheduleOcclusionCheck.bind(this);\r\n this.viewer.camera.changed.addEventListener(this._cameraChangedFn);\r\n this.eventBus = eventBus || new MarkerEventBus();\r\n this.openWheel = openWheel;\r\n\r\n this.runOcclusionCheckNow();\r\n }\r\n\r\n /**\r\n * 创建标签容器\r\n */\r\n private _createContainer(id: string): HTMLDivElement {\r\n let container = document.getElementById(id) as HTMLDivElement;\r\n if (!container) {\r\n container = document.createElement('div');\r\n container.id = id;\r\n Object.assign(container.style, {\r\n position: 'absolute',\r\n top: '0',\r\n left: '0',\r\n pointerEvents: 'none',\r\n width: '100%',\r\n height: '100%',\r\n zIndex: '100',\r\n overflow: 'hidden',\r\n });\r\n document.body.appendChild(container);\r\n }\r\n return container;\r\n }\r\n\r\n /**\r\n * 注册标签主题\r\n */\r\n registerTheme(themeName: string, options: ThemeOptions) {\r\n this.themes[themeName] = options;\r\n }\r\n\r\n /**\r\n * 添加单个标签\r\n */\r\n add(data: any, options: LabelOptions) {\r\n const {\r\n id,\r\n lon,\r\n lat,\r\n height = 0,\r\n theme,\r\n show = true,\r\n notCreateElement = false,\r\n style,\r\n } = options;\r\n\r\n const themeOptions = this.themes[theme];\r\n if (!themeOptions) {\r\n console.warn(`Theme \"${theme}\" not registered`);\r\n return;\r\n }\r\n\r\n let label = this.labels.get(id);\r\n if (!label) {\r\n const el = document.createElement('div');\r\n Object.assign(el.style, {\r\n position: 'absolute',\r\n transform: 'translate(0, 0)',\r\n pointerEvents: 'auto',\r\n ...(options.style || {}),\r\n });\r\n\r\n // 绑定 DOM 事件到事件总线\r\n for (const [key, domEvent] of Object.entries(DOM_EVENT_MAP)) {\r\n el.addEventListener(domEvent, (e: Event) => {\r\n e.stopPropagation();\r\n const labelData = this.labels.get(id);\r\n this.eventBus.runListener(key as MarkerEventKey, labelData, e);\r\n });\r\n\r\n // 滚轮期间禁止点击\r\n let lastTime = 0;\r\n el.addEventListener('wheel', (event) => {\r\n if (!this.openWheel) return;\r\n const dom = event.currentTarget as HTMLElement;\r\n lastTime = Date.now();\r\n const currTime = lastTime;\r\n dom.style.pointerEvents = 'none';\r\n setTimeout(() => {\r\n if (lastTime === currTime) {\r\n dom.style.pointerEvents = 'auto';\r\n }\r\n }, 2000);\r\n });\r\n }\r\n\r\n let unload = null;\r\n if (!notCreateElement || show) {\r\n try {\r\n unload = themeOptions.createElement(el, { id, theme, data }, themeOptions) || {};\r\n } catch (err) {\r\n console.error(`Error updating label element for id \"${id}\":`, err);\r\n }\r\n this.container.appendChild(el);\r\n }\r\n label = { id, el, theme, data, notCreateElement, unload: unload };\r\n this.labels.set(id, label);\r\n } else {\r\n label.theme = theme;\r\n label.data = data;\r\n label.notCreateElement = notCreateElement;\r\n\r\n // 若已存在,则更新 DOM 内容\r\n try {\r\n label.unload = themeOptions.createElement(label.el, { id, theme, data }, themeOptions);\r\n if (!notCreateElement || show) {\r\n this.container.appendChild(label.el);\r\n }\r\n } catch (err) {\r\n console.error(`Error updating label element for id \"${id}\":`, err);\r\n }\r\n }\r\n\r\n // 存储坐标用于后续位置更新\r\n label.el.dataset.lon = String(lon);\r\n label.el.dataset.lat = String(lat);\r\n label.el.dataset.height = String(height);\r\n\r\n label.el.style.zIndex = style?.zIndex || '1';\r\n label.el.style.display = show ? 'block' : 'none';\r\n if (show) {\r\n this.activeIds.add(id);\r\n }\r\n if (!show) {\r\n this.occludedIds.delete(id);\r\n } else {\r\n this._scheduleOcclusionCheck();\r\n }\r\n }\r\n\r\n /**\r\n * 批量添加标签\r\n */\r\n addBatch(items: Array<{ data: any; options: LabelOptions }>) {\r\n for (const { data, options } of items) {\r\n this.add(data, options);\r\n }\r\n }\r\n\r\n /**\r\n * 根据 ID 批量移除标签\r\n */\r\n removeByIds(ids: string[]) {\r\n for (const id of ids) {\r\n const label = this.labels.get(id);\r\n if (label) {\r\n this.unloadByLabel(label);\r\n this.labels.delete(id);\r\n this.activeIds.delete(id);\r\n this.occludedIds.delete(id);\r\n }\r\n }\r\n }\r\n\r\n unloadByLabel(label: LabelInstance) {\r\n label.el.remove();\r\n if (label?.unload && typeof label.unload === 'function') label?.unload();\r\n label.unload = null;\r\n }\r\n\r\n /**\r\n * 移除所有标签\r\n */\r\n removeAll() {\r\n for (const label of this.labels.values()) {\r\n this.unloadByLabel(label);\r\n }\r\n this.labels.clear();\r\n this.activeIds.clear();\r\n this.occludedIds.clear();\r\n }\r\n\r\n /**\r\n * 更新标签的数据并刷新内容\r\n */\r\n update(id: string, newData: any) {\r\n const label = this.labels.get(id);\r\n if (!label) {\r\n console.warn(`Label with id \"${id}\" not found for update.`);\r\n return;\r\n }\r\n\r\n const theme = this.themes[label.theme];\r\n if (!theme) {\r\n console.warn(`Theme \"${label.theme}\" not registered.`);\r\n return;\r\n }\r\n\r\n try {\r\n theme.createElement(label.el, { id, theme: label.theme, data: newData }, theme);\r\n } catch (err) {\r\n console.error(`Failed to update label \"${id}\":`, err);\r\n }\r\n }\r\n\r\n /**\r\n * 根据 ID 批量隐藏标签\r\n */\r\n hideByIds(ids: string[]) {\r\n for (const id of ids) {\r\n const label = this.labels.get(id);\r\n if (label) {\r\n if (label.notCreateElement) {\r\n this.unloadByLabel(label);\r\n }\r\n label.el.style.display = 'none';\r\n this.activeIds.delete(id);\r\n this.occludedIds.delete(id);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 隐藏所有标签\r\n */\r\n hideAll() {\r\n for (const label of this.labels.values()) {\r\n if (label.notCreateElement) {\r\n this.unloadByLabel(label);\r\n }\r\n label.el.style.display = 'none';\r\n this.activeIds.delete(label.id);\r\n this.occludedIds.delete(label.id);\r\n }\r\n }\r\n\r\n /**\r\n * 条件过滤隐藏标签\r\n */\r\n hideFilter(filter: (data: any) => boolean) {\r\n for (const label of this.labels.values()) {\r\n if (!filter(label.data)) continue;\r\n if (label.notCreateElement) {\r\n this.unloadByLabel(label);\r\n }\r\n label.el.style.display = 'none';\r\n this.activeIds.delete(label.id);\r\n this.occludedIds.delete(label.id);\r\n }\r\n }\r\n\r\n /**\r\n * 根据 ID 显示标签\r\n */\r\n showByIds(ids: string[]) {\r\n for (const id of ids) {\r\n const label = this.labels.get(id);\r\n if (label) {\r\n if (label.notCreateElement || !label.el.parentNode) {\r\n this.container.appendChild(label.el);\r\n }\r\n if (!label.unload) {\r\n try {\r\n const themeOptions = this.themes[label.theme];\r\n if (!themeOptions) {\r\n console.warn(`Theme \"${label.theme}\" not registered`);\r\n return;\r\n }\r\n label.unload =\r\n themeOptions.createElement(\r\n label.el,\r\n { id, theme: label.theme, data: label.data },\r\n themeOptions,\r\n ) || {};\r\n } catch (err) {\r\n console.error(`Error creating label element for theme \"${label.theme}\":`, err);\r\n return;\r\n }\r\n }\r\n\r\n label.el.style.display = 'block';\r\n this.activeIds.add(id);\r\n this.occludedIds.delete(id);\r\n }\r\n }\r\n this._scheduleOcclusionCheck();\r\n }\r\n\r\n /**\r\n * 检查标签是否存在\r\n */\r\n has(id: string): boolean {\r\n return this.labels.has(id);\r\n }\r\n\r\n /**\r\n * 清空活跃 ID 列表(不影响 DOM)\r\n */\r\n reset() {\r\n for (const id of this.activeIds.values()) {\r\n let label = this.labels.get(id);\r\n label && this.unloadByLabel(label);\r\n }\r\n this.activeIds.clear();\r\n }\r\n\r\n /**\r\n * 清理当前未活跃的标签(隐藏而不移除 DOM)\r\n */\r\n cleanup() {\r\n for (const [id, label] of this.labels.entries()) {\r\n if (!this.activeIds.has(id)) {\r\n label.el.style.display = 'none';\r\n this.occludedIds.delete(id);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 经纬度 -> 自动地形高度修正 -> Cartesian3 -> 屏幕坐标\r\n */\r\n async toWindowPositionByLonLat(lon: number, lat: number): Promise<any> {\r\n const Cesium = this.Cesium;\r\n const scene = this.viewer.scene;\r\n\r\n // 1. 经纬度列表\r\n const positions = [Cesium.Cartographic.fromDegrees(lon, lat)];\r\n\r\n // 2. 使用 clampToHeightMostDetailed 获取真实地形高度\r\n let heightResult;\r\n try {\r\n heightResult = await scene.clampToHeightMostDetailed(positions);\r\n } catch (e) {\r\n console.warn('clampToHeightMostDetailed failed, fallback to ellipsoid height.');\r\n }\r\n\r\n let finalHeight = 0;\r\n if (heightResult && heightResult[0] && heightResult[0].height != null) {\r\n finalHeight = heightResult[0].height; // 用户偏好:height[0].height\r\n } else {\r\n // 如果地形未开启,则 fallback 椭球高度\r\n finalHeight = 0;\r\n }\r\n\r\n // 3. 生成真实位置 Cartesian3\r\n const worldPos = Cesium.Cartesian3.fromDegrees(lon, lat, finalHeight);\r\n\r\n // 4. 转屏幕像素坐标\r\n return this.toWindowCoordinates(worldPos);\r\n }\r\n\r\n /**\r\n * 坐标转换:经纬度 -> 屏幕像素坐标\r\n */\r\n toWindowCoordinates(position: any): any {\r\n const scene = this.viewer.scene;\r\n const st = this.Cesium.SceneTransforms;\r\n if (typeof st?.wgs84ToWindowCoordinates === 'function') {\r\n return st.wgs84ToWindowCoordinates(scene, position);\r\n }\r\n if (typeof st?.worldToWindowCoordinates === 'function') {\r\n return st.worldToWindowCoordinates(scene, position);\r\n }\r\n\r\n console.warn('No compatible window coordinate transform function found.');\r\n return undefined;\r\n }\r\n\r\n /**\r\n * 检查经纬度是否有效\r\n * @param lon 经度\r\n * @param lat 纬度\r\n * @returns 是否有效\r\n */\r\n private _isValidCoordinate(lon: number, lat: number): boolean {\r\n // 检查是否为 NaN\r\n if (Number.isNaN(lon) || Number.isNaN(lat)) return false;\r\n // 检查是否为 0(用户要求 0,0 时不显示)\r\n if (lon === 0 && lat === 0) return false;\r\n // 检查是否在有效范围内\r\n if (lon < -180 || lon > 180 || lat < -90 || lat > 90) return false;\r\n return true;\r\n }\r\n\r\n /**\r\n * 每帧刷新所有活跃标签的位置\r\n */\r\n private async _update() {\r\n for (const id of this.activeIds) {\r\n const label = this.labels.get(id);\r\n if (!label) continue;\r\n\r\n const lon = parseFloat(label.el.dataset.lon!);\r\n const lat = parseFloat(label.el.dataset.lat!);\r\n const height = parseFloat(label.el.dataset.height || '0');\r\n\r\n // 检查经纬度是否有效,无效则隐藏标签\r\n if (!this._isValidCoordinate(lon, lat)) {\r\n label.el.style.display = 'none';\r\n continue;\r\n }\r\n\r\n const position = this.Cesium.Cartesian3.fromDegrees(lon, lat, height);\r\n const screenPosition = this.toWindowCoordinates(position);\r\n\r\n if (this.Cesium.defined(screenPosition)) {\r\n const theme = this.themes[label.theme];\r\n const offset = theme.options?.offset || {};\r\n const offsetX = offset.x || 0;\r\n const offsetY = offset.y || 0;\r\n const occluded = this.occludedIds.has(id);\r\n\r\n label.el.style.left = `${screenPosition.x}px`;\r\n label.el.style.top = `${screenPosition.y}px`;\r\n label.el.style.transform = `translate(${offsetX}px, ${offsetY}px)`;\r\n label.el.style.display = occluded ? 'none' : 'block';\r\n } else {\r\n label.el.style.display = 'none';\r\n }\r\n }\r\n }\r\n\r\n private _scheduleOcclusionCheck() {\r\n if (!this.occlusionOptions.enabled) return;\r\n\r\n const now = Date.now();\r\n const throttleMs = Math.max(0, Number(this.occlusionOptions.throttleMs) || 0);\r\n const elapsed = now - this._lastOcclusionAt;\r\n const waitMs = Math.max(0, throttleMs - elapsed);\r\n\r\n if (waitMs === 0) {\r\n this.runOcclusionCheckNow();\r\n return;\r\n }\r\n\r\n if (this._occlusionTimer !== null) return;\r\n this._occlusionTimer = window.setTimeout(() => {\r\n this._occlusionTimer = null;\r\n this.runOcclusionCheckNow();\r\n }, waitMs);\r\n }\r\n\r\n private _pushOcclusionLog(log: OcclusionCheckLog) {\r\n if (!this.occlusionLogEnabled) return;\r\n this.occlusionCheckLogs.push(log);\r\n if (this.occlusionCheckLogs.length > this.occlusionLogMax) {\r\n this.occlusionCheckLogs.splice(0, this.occlusionCheckLogs.length - this.occlusionLogMax);\r\n }\r\n }\r\n\r\n private _computeLabelOccluded(\r\n id: string,\r\n worldPosition: any,\r\n windowPosition: any,\r\n lon?: number,\r\n lat?: number,\r\n height?: number,\r\n ): boolean {\r\n const scene = this.viewer?.scene;\r\n const camera = this.viewer?.camera;\r\n const Cesium = this.Cesium;\r\n if (!scene || !camera || !Cesium) {\r\n this._pushOcclusionLog({\r\n timestamp: Date.now(),\r\n id,\r\n lon,\r\n lat,\r\n height,\r\n occluded: true,\r\n reason: 'runtime-missing',\r\n });\r\n return true;\r\n }\r\n\r\n if (!scene.pickPositionSupported || !windowPosition) {\r\n this._pushOcclusionLog({\r\n timestamp: Date.now(),\r\n id,\r\n lon,\r\n lat,\r\n height,\r\n occluded: true,\r\n reason: 'pick-unsupported',\r\n });\r\n return true;\r\n }\r\n\r\n try {\r\n const pickedPosition = scene.pickPosition(windowPosition);\r\n if (!pickedPosition || !camera.positionWC) {\r\n this._pushOcclusionLog({\r\n timestamp: Date.now(),\r\n id,\r\n lon,\r\n lat,\r\n height,\r\n occluded: true,\r\n reason: 'pick-empty',\r\n });\r\n return true;\r\n }\r\n const epsilon = Number(this.occlusionOptions.distanceEpsilon) || 0;\r\n const labelDistance = Cesium.Cartesian3.distance(camera.positionWC, worldPosition);\r\n const pickedDistance = Cesium.Cartesian3.distance(camera.positionWC, pickedPosition);\r\n const occluded = pickedDistance + epsilon < labelDistance;\r\n this._pushOcclusionLog({\r\n timestamp: Date.now(),\r\n id,\r\n lon,\r\n lat,\r\n height,\r\n occluded,\r\n reason: 'distance-compare',\r\n epsilon,\r\n labelDistance,\r\n pickedDistance,\r\n });\r\n return occluded;\r\n } catch (error) {\r\n this._pushOcclusionLog({\r\n timestamp: Date.now(),\r\n id,\r\n lon,\r\n lat,\r\n height,\r\n occluded: true,\r\n reason: 'pick-error',\r\n });\r\n return true;\r\n }\r\n }\r\n\r\n runOcclusionCheckNow() {\r\n if (!this.occlusionOptions.enabled) {\r\n this.occludedIds.clear();\r\n return;\r\n }\r\n\r\n if (this._occlusionChecking) {\r\n this._occlusionPending = true;\r\n return;\r\n }\r\n\r\n this._occlusionChecking = true;\r\n try {\r\n for (const id of this.activeIds) {\r\n const label = this.labels.get(id);\r\n if (!label) {\r\n this.occludedIds.delete(id);\r\n this._pushOcclusionLog({\r\n timestamp: Date.now(),\r\n id,\r\n occluded: false,\r\n reason: 'label-missing',\r\n });\r\n continue;\r\n }\r\n\r\n const lon = parseFloat(label.el.dataset.lon!);\r\n const lat = parseFloat(label.el.dataset.lat!);\r\n const height = parseFloat(label.el.dataset.height || '0');\r\n if (!this._isValidCoordinate(lon, lat)) {\r\n this.occludedIds.delete(id);\r\n this._pushOcclusionLog({\r\n timestamp: Date.now(),\r\n id,\r\n lon,\r\n lat,\r\n height,\r\n occluded: false,\r\n reason: 'invalid-coordinate',\r\n });\r\n continue;\r\n }\r\n\r\n const worldPosition = this.Cesium.Cartesian3.fromDegrees(lon, lat, height);\r\n const screenPosition = this.toWindowCoordinates(worldPosition);\r\n if (!this.Cesium.defined(screenPosition)) {\r\n this.occludedIds.delete(id);\r\n this._pushOcclusionLog({\r\n timestamp: Date.now(),\r\n id,\r\n lon,\r\n lat,\r\n height,\r\n occluded: false,\r\n reason: 'screen-position-undefined',\r\n });\r\n continue;\r\n }\r\n\r\n const occluded = this._computeLabelOccluded(id, worldPosition, screenPosition, lon, lat, height);\r\n if (occluded) this.occludedIds.add(id);\r\n else this.occludedIds.delete(id);\r\n }\r\n } finally {\r\n this._lastOcclusionAt = Date.now();\r\n this._occlusionChecking = false;\r\n if (this._occlusionPending) {\r\n this._occlusionPending = false;\r\n this._scheduleOcclusionCheck();\r\n }\r\n }\r\n }\r\n\r\n setOcclusionEnabled(enabled: boolean) {\r\n this.occlusionOptions.enabled = Boolean(enabled);\r\n if (!this.occlusionOptions.enabled) {\r\n this.occludedIds.clear();\r\n if (this._occlusionTimer !== null) {\r\n clearTimeout(this._occlusionTimer);\r\n this._occlusionTimer = null;\r\n }\r\n } else {\r\n this.runOcclusionCheckNow();\r\n }\r\n }\r\n\r\n getOcclusionOptions(): OcclusionOptions {\r\n return {\r\n enabled: this.occlusionOptions.enabled,\r\n throttleMs: this.occlusionOptions.throttleMs,\r\n distanceEpsilon: this.occlusionOptions.distanceEpsilon,\r\n };\r\n }\r\n\r\n setOcclusionOptions(options: Partial<Pick<OcclusionOptions, 'throttleMs' | 'distanceEpsilon'>>) {\r\n if (options.throttleMs != null) {\r\n this.occlusionOptions.throttleMs = Math.max(0, Number(options.throttleMs) || 0);\r\n }\r\n if (options.distanceEpsilon != null) {\r\n this.occlusionOptions.distanceEpsilon = Math.max(0, Number(options.distanceEpsilon) || 0);\r\n }\r\n if (this.occlusionOptions.enabled) {\r\n this._scheduleOcclusionCheck();\r\n }\r\n }\r\n\r\n setOcclusionLogEnabled(enabled: boolean, clearExisting: boolean = false) {\r\n this.occlusionLogEnabled = Boolean(enabled);\r\n if (clearExisting) {\r\n this.occlusionCheckLogs = [];\r\n }\r\n }\r\n\r\n /**\r\n * 销毁标签池,清理监听器和 DOM\r\n */\r\n destroy() {\r\n this.viewer.scene.postRender.removeEventListener(this._updateFn);\r\n this.viewer.camera.changed.removeEventListener(this._cameraChangedFn);\r\n if (this._occlusionTimer !== null) {\r\n clearTimeout(this._occlusionTimer);\r\n this._occlusionTimer = null;\r\n }\r\n // this.container.remove();\r\n this.labels.clear();\r\n this.activeIds.clear();\r\n this.occludedIds.clear();\r\n }\r\n}\r\n"],"names":["MarkerEventKey","MarkerEventBus","key","listener","overwrite","map","existed","name","data","e","err","DOM_EVENT_MAP","HtmlOverlayLabelPool","Cesium","viewer","containerId","eventBus","openWheel","id","container","themeName","options","lon","lat","height","theme","show","notCreateElement","style","themeOptions","label","el","domEvent","labelData","lastTime","event","dom","currTime","unload","items","ids","newData","filter","scene","positions","heightResult","finalHeight","worldPos","position","st","screenPosition","offset","offsetX","offsetY","occluded","now","throttleMs","elapsed","waitMs","log","worldPosition","windowPosition","camera","pickedPosition","epsilon","labelDistance","pickedDistance","enabled","clearExisting"],"mappings":"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"}
|
|
@@ -1,13 +1,3 @@
|
|
|
1
|
-
declare const CxBasicAudio:
|
|
2
|
-
readonly src: {
|
|
3
|
-
readonly type: StringConstructor;
|
|
4
|
-
readonly required: true;
|
|
5
|
-
};
|
|
6
|
-
}>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
|
|
7
|
-
readonly src: {
|
|
8
|
-
readonly type: StringConstructor;
|
|
9
|
-
readonly required: true;
|
|
10
|
-
};
|
|
11
|
-
}>> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>>;
|
|
1
|
+
declare const CxBasicAudio: any;
|
|
12
2
|
export { CxBasicAudio };
|
|
13
3
|
export default CxBasicAudio;
|
|
@@ -1,98 +1,4 @@
|
|
|
1
1
|
export * from './src/basicVideo';
|
|
2
|
-
declare const CxBasicVideo:
|
|
3
|
-
readonly id: {
|
|
4
|
-
readonly type: StringConstructor;
|
|
5
|
-
readonly default: "";
|
|
6
|
-
readonly required: true;
|
|
7
|
-
};
|
|
8
|
-
readonly url: {
|
|
9
|
-
readonly type: StringConstructor;
|
|
10
|
-
readonly default: "";
|
|
11
|
-
};
|
|
12
|
-
readonly poster: {
|
|
13
|
-
readonly type: StringConstructor;
|
|
14
|
-
readonly default: "";
|
|
15
|
-
};
|
|
16
|
-
readonly autoPlay: {
|
|
17
|
-
readonly type: BooleanConstructor;
|
|
18
|
-
readonly default: false;
|
|
19
|
-
};
|
|
20
|
-
readonly loop: {
|
|
21
|
-
readonly type: BooleanConstructor;
|
|
22
|
-
readonly default: false;
|
|
23
|
-
};
|
|
24
|
-
readonly muted: {
|
|
25
|
-
readonly type: BooleanConstructor;
|
|
26
|
-
readonly default: true;
|
|
27
|
-
};
|
|
28
|
-
readonly control: {
|
|
29
|
-
readonly type: BooleanConstructor;
|
|
30
|
-
readonly default: true;
|
|
31
|
-
};
|
|
32
|
-
readonly width: {
|
|
33
|
-
readonly type: StringConstructor;
|
|
34
|
-
readonly default: "100%";
|
|
35
|
-
};
|
|
36
|
-
readonly height: {
|
|
37
|
-
readonly type: StringConstructor;
|
|
38
|
-
readonly default: "100%";
|
|
39
|
-
};
|
|
40
|
-
}>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
41
|
-
unload: (...args: any[]) => void;
|
|
42
|
-
ready: (...args: any[]) => void;
|
|
43
|
-
}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
|
|
44
|
-
readonly id: {
|
|
45
|
-
readonly type: StringConstructor;
|
|
46
|
-
readonly default: "";
|
|
47
|
-
readonly required: true;
|
|
48
|
-
};
|
|
49
|
-
readonly url: {
|
|
50
|
-
readonly type: StringConstructor;
|
|
51
|
-
readonly default: "";
|
|
52
|
-
};
|
|
53
|
-
readonly poster: {
|
|
54
|
-
readonly type: StringConstructor;
|
|
55
|
-
readonly default: "";
|
|
56
|
-
};
|
|
57
|
-
readonly autoPlay: {
|
|
58
|
-
readonly type: BooleanConstructor;
|
|
59
|
-
readonly default: false;
|
|
60
|
-
};
|
|
61
|
-
readonly loop: {
|
|
62
|
-
readonly type: BooleanConstructor;
|
|
63
|
-
readonly default: false;
|
|
64
|
-
};
|
|
65
|
-
readonly muted: {
|
|
66
|
-
readonly type: BooleanConstructor;
|
|
67
|
-
readonly default: true;
|
|
68
|
-
};
|
|
69
|
-
readonly control: {
|
|
70
|
-
readonly type: BooleanConstructor;
|
|
71
|
-
readonly default: true;
|
|
72
|
-
};
|
|
73
|
-
readonly width: {
|
|
74
|
-
readonly type: StringConstructor;
|
|
75
|
-
readonly default: "100%";
|
|
76
|
-
};
|
|
77
|
-
readonly height: {
|
|
78
|
-
readonly type: StringConstructor;
|
|
79
|
-
readonly default: "100%";
|
|
80
|
-
};
|
|
81
|
-
}>> & Readonly<{
|
|
82
|
-
onUnload?: ((...args: any[]) => any) | undefined;
|
|
83
|
-
onReady?: ((...args: any[]) => any) | undefined;
|
|
84
|
-
}>, {
|
|
85
|
-
readonly width: string;
|
|
86
|
-
readonly height: string;
|
|
87
|
-
readonly id: string;
|
|
88
|
-
readonly loop: boolean;
|
|
89
|
-
readonly url: string;
|
|
90
|
-
readonly poster: string;
|
|
91
|
-
readonly autoPlay: boolean;
|
|
92
|
-
readonly muted: boolean;
|
|
93
|
-
readonly control: boolean;
|
|
94
|
-
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {
|
|
95
|
-
videoRef: HTMLVideoElement;
|
|
96
|
-
}, HTMLDivElement>>;
|
|
2
|
+
declare const CxBasicVideo: any;
|
|
97
3
|
export { CxBasicVideo };
|
|
98
4
|
export default CxBasicVideo;
|
|
@@ -1,147 +1,4 @@
|
|
|
1
1
|
export * from './src/cardCarousel';
|
|
2
|
-
declare const CxCardCarousel:
|
|
3
|
-
readonly data: {
|
|
4
|
-
readonly type: import('vue').PropType<Array<import('../card-content').ContentModel>>;
|
|
5
|
-
readonly default: () => never[];
|
|
6
|
-
};
|
|
7
|
-
readonly bgClass: {
|
|
8
|
-
readonly type: {
|
|
9
|
-
(arrayLength: number): String[];
|
|
10
|
-
(...items: String[]): String[];
|
|
11
|
-
new (arrayLength: number): String[];
|
|
12
|
-
new (...items: String[]): String[];
|
|
13
|
-
isArray(arg: any): arg is any[];
|
|
14
|
-
readonly prototype: any[];
|
|
15
|
-
from<T>(arrayLike: ArrayLike<T>): T[];
|
|
16
|
-
from<T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[];
|
|
17
|
-
from<T>(iterable: Iterable<T> | ArrayLike<T>): T[];
|
|
18
|
-
from<T, U>(iterable: Iterable<T> | ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[];
|
|
19
|
-
of<T>(...items: T[]): T[];
|
|
20
|
-
fromAsync<T>(iterableOrArrayLike: AsyncIterable<T> | Iterable<T | PromiseLike<T>> | ArrayLike<T | PromiseLike<T>>): Promise<T[]>;
|
|
21
|
-
fromAsync<T, U>(iterableOrArrayLike: AsyncIterable<T> | Iterable<T> | ArrayLike<T>, mapFn: (value: Awaited<T>, index: number) => U, thisArg?: any): Promise<Awaited<U>[]>;
|
|
22
|
-
readonly [Symbol.species]: ArrayConstructor;
|
|
23
|
-
};
|
|
24
|
-
readonly default: () => never[];
|
|
25
|
-
};
|
|
26
|
-
readonly imgSrc: {
|
|
27
|
-
readonly type: StringConstructor;
|
|
28
|
-
readonly default: () => string;
|
|
29
|
-
};
|
|
30
|
-
readonly styleConfig: {
|
|
31
|
-
readonly type: import('vue').PropType<import('vue').CSSProperties>;
|
|
32
|
-
readonly default: () => import('vue').CSSProperties;
|
|
33
|
-
};
|
|
34
|
-
readonly arrowConfig: {
|
|
35
|
-
readonly type: import('vue').PropType<import('vue').CSSProperties & {
|
|
36
|
-
show?: boolean;
|
|
37
|
-
size: string;
|
|
38
|
-
}>;
|
|
39
|
-
readonly default: () => {
|
|
40
|
-
show: boolean;
|
|
41
|
-
color: string;
|
|
42
|
-
size: string;
|
|
43
|
-
background: string;
|
|
44
|
-
};
|
|
45
|
-
};
|
|
46
|
-
readonly titleConfig: {
|
|
47
|
-
readonly type: import('vue').PropType<import('vue').CSSProperties & {
|
|
48
|
-
show?: boolean;
|
|
49
|
-
}>;
|
|
50
|
-
readonly default: () => {
|
|
51
|
-
show: boolean;
|
|
52
|
-
color: string;
|
|
53
|
-
size: string;
|
|
54
|
-
background: string;
|
|
55
|
-
};
|
|
56
|
-
};
|
|
57
|
-
readonly pageInfoConfig: {
|
|
58
|
-
readonly type: import('vue').PropType<import('vue').CSSProperties & {
|
|
59
|
-
show?: boolean;
|
|
60
|
-
}>;
|
|
61
|
-
readonly default: () => {
|
|
62
|
-
color: string;
|
|
63
|
-
backgroundColor: string;
|
|
64
|
-
};
|
|
65
|
-
};
|
|
66
|
-
}>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
|
|
67
|
-
readonly data: {
|
|
68
|
-
readonly type: import('vue').PropType<Array<import('../card-content').ContentModel>>;
|
|
69
|
-
readonly default: () => never[];
|
|
70
|
-
};
|
|
71
|
-
readonly bgClass: {
|
|
72
|
-
readonly type: {
|
|
73
|
-
(arrayLength: number): String[];
|
|
74
|
-
(...items: String[]): String[];
|
|
75
|
-
new (arrayLength: number): String[];
|
|
76
|
-
new (...items: String[]): String[];
|
|
77
|
-
isArray(arg: any): arg is any[];
|
|
78
|
-
readonly prototype: any[];
|
|
79
|
-
from<T>(arrayLike: ArrayLike<T>): T[];
|
|
80
|
-
from<T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[];
|
|
81
|
-
from<T>(iterable: Iterable<T> | ArrayLike<T>): T[];
|
|
82
|
-
from<T, U>(iterable: Iterable<T> | ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[];
|
|
83
|
-
of<T>(...items: T[]): T[];
|
|
84
|
-
fromAsync<T>(iterableOrArrayLike: AsyncIterable<T> | Iterable<T | PromiseLike<T>> | ArrayLike<T | PromiseLike<T>>): Promise<T[]>;
|
|
85
|
-
fromAsync<T, U>(iterableOrArrayLike: AsyncIterable<T> | Iterable<T> | ArrayLike<T>, mapFn: (value: Awaited<T>, index: number) => U, thisArg?: any): Promise<Awaited<U>[]>;
|
|
86
|
-
readonly [Symbol.species]: ArrayConstructor;
|
|
87
|
-
};
|
|
88
|
-
readonly default: () => never[];
|
|
89
|
-
};
|
|
90
|
-
readonly imgSrc: {
|
|
91
|
-
readonly type: StringConstructor;
|
|
92
|
-
readonly default: () => string;
|
|
93
|
-
};
|
|
94
|
-
readonly styleConfig: {
|
|
95
|
-
readonly type: import('vue').PropType<import('vue').CSSProperties>;
|
|
96
|
-
readonly default: () => import('vue').CSSProperties;
|
|
97
|
-
};
|
|
98
|
-
readonly arrowConfig: {
|
|
99
|
-
readonly type: import('vue').PropType<import('vue').CSSProperties & {
|
|
100
|
-
show?: boolean;
|
|
101
|
-
size: string;
|
|
102
|
-
}>;
|
|
103
|
-
readonly default: () => {
|
|
104
|
-
show: boolean;
|
|
105
|
-
color: string;
|
|
106
|
-
size: string;
|
|
107
|
-
background: string;
|
|
108
|
-
};
|
|
109
|
-
};
|
|
110
|
-
readonly titleConfig: {
|
|
111
|
-
readonly type: import('vue').PropType<import('vue').CSSProperties & {
|
|
112
|
-
show?: boolean;
|
|
113
|
-
}>;
|
|
114
|
-
readonly default: () => {
|
|
115
|
-
show: boolean;
|
|
116
|
-
color: string;
|
|
117
|
-
size: string;
|
|
118
|
-
background: string;
|
|
119
|
-
};
|
|
120
|
-
};
|
|
121
|
-
readonly pageInfoConfig: {
|
|
122
|
-
readonly type: import('vue').PropType<import('vue').CSSProperties & {
|
|
123
|
-
show?: boolean;
|
|
124
|
-
}>;
|
|
125
|
-
readonly default: () => {
|
|
126
|
-
color: string;
|
|
127
|
-
backgroundColor: string;
|
|
128
|
-
};
|
|
129
|
-
};
|
|
130
|
-
}>> & Readonly<{}>, {
|
|
131
|
-
readonly data: import('../card-content').ContentModel[];
|
|
132
|
-
readonly bgClass: String[];
|
|
133
|
-
readonly imgSrc: string;
|
|
134
|
-
readonly styleConfig: import('vue').CSSProperties;
|
|
135
|
-
readonly arrowConfig: import('vue').CSSProperties & {
|
|
136
|
-
show?: boolean;
|
|
137
|
-
size: string;
|
|
138
|
-
};
|
|
139
|
-
readonly titleConfig: import('vue').CSSProperties & {
|
|
140
|
-
show?: boolean;
|
|
141
|
-
};
|
|
142
|
-
readonly pageInfoConfig: import('vue').CSSProperties & {
|
|
143
|
-
show?: boolean;
|
|
144
|
-
};
|
|
145
|
-
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>>;
|
|
2
|
+
declare const CxCardCarousel: any;
|
|
146
3
|
export { CxCardCarousel };
|
|
147
4
|
export default CxCardCarousel;
|
|
@@ -1,16 +1,4 @@
|
|
|
1
1
|
export * from './src/cardContent';
|
|
2
|
-
declare const CxCardContent:
|
|
3
|
-
readonly data: {
|
|
4
|
-
readonly type: import('vue').PropType<import('./src/cardContent').ContentModel>;
|
|
5
|
-
readonly default: () => import('./src/cardContent').ContentModel;
|
|
6
|
-
};
|
|
7
|
-
}>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
|
|
8
|
-
readonly data: {
|
|
9
|
-
readonly type: import('vue').PropType<import('./src/cardContent').ContentModel>;
|
|
10
|
-
readonly default: () => import('./src/cardContent').ContentModel;
|
|
11
|
-
};
|
|
12
|
-
}>> & Readonly<{}>, {
|
|
13
|
-
readonly data: import('./src/cardContent').ContentModel;
|
|
14
|
-
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>>;
|
|
2
|
+
declare const CxCardContent: any;
|
|
15
3
|
export { CxCardContent };
|
|
16
4
|
export default CxCardContent;
|
|
@@ -1,64 +1,4 @@
|
|
|
1
1
|
export * from './src/cardPage';
|
|
2
|
-
declare const CxCardPage:
|
|
3
|
-
readonly data: {
|
|
4
|
-
readonly type: import('vue').PropType<Array<import('../card-content').ContentModel>>;
|
|
5
|
-
readonly default: () => never[];
|
|
6
|
-
};
|
|
7
|
-
readonly imgSrc: {
|
|
8
|
-
readonly type: StringConstructor;
|
|
9
|
-
readonly default: () => string;
|
|
10
|
-
};
|
|
11
|
-
readonly styleConfig: {
|
|
12
|
-
readonly type: import('vue').PropType<import('vue').CSSProperties>;
|
|
13
|
-
readonly default: () => import('vue').CSSProperties;
|
|
14
|
-
};
|
|
15
|
-
readonly paginationStyle: {
|
|
16
|
-
readonly type: import('vue').PropType<import('vue').CSSProperties & {
|
|
17
|
-
buttonHoverColor?: string;
|
|
18
|
-
textColor?: string;
|
|
19
|
-
buttonColor?: string;
|
|
20
|
-
pageInfoColor?: string;
|
|
21
|
-
}>;
|
|
22
|
-
readonly default: () => {
|
|
23
|
-
color: string;
|
|
24
|
-
backgroundColor: string;
|
|
25
|
-
};
|
|
26
|
-
};
|
|
27
|
-
}>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
|
|
28
|
-
readonly data: {
|
|
29
|
-
readonly type: import('vue').PropType<Array<import('../card-content').ContentModel>>;
|
|
30
|
-
readonly default: () => never[];
|
|
31
|
-
};
|
|
32
|
-
readonly imgSrc: {
|
|
33
|
-
readonly type: StringConstructor;
|
|
34
|
-
readonly default: () => string;
|
|
35
|
-
};
|
|
36
|
-
readonly styleConfig: {
|
|
37
|
-
readonly type: import('vue').PropType<import('vue').CSSProperties>;
|
|
38
|
-
readonly default: () => import('vue').CSSProperties;
|
|
39
|
-
};
|
|
40
|
-
readonly paginationStyle: {
|
|
41
|
-
readonly type: import('vue').PropType<import('vue').CSSProperties & {
|
|
42
|
-
buttonHoverColor?: string;
|
|
43
|
-
textColor?: string;
|
|
44
|
-
buttonColor?: string;
|
|
45
|
-
pageInfoColor?: string;
|
|
46
|
-
}>;
|
|
47
|
-
readonly default: () => {
|
|
48
|
-
color: string;
|
|
49
|
-
backgroundColor: string;
|
|
50
|
-
};
|
|
51
|
-
};
|
|
52
|
-
}>> & Readonly<{}>, {
|
|
53
|
-
readonly data: import('../card-content').ContentModel[];
|
|
54
|
-
readonly imgSrc: string;
|
|
55
|
-
readonly styleConfig: import('vue').CSSProperties;
|
|
56
|
-
readonly paginationStyle: import('vue').CSSProperties & {
|
|
57
|
-
buttonHoverColor?: string;
|
|
58
|
-
textColor?: string;
|
|
59
|
-
buttonColor?: string;
|
|
60
|
-
pageInfoColor?: string;
|
|
61
|
-
};
|
|
62
|
-
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>>;
|
|
2
|
+
declare const CxCardPage: any;
|
|
63
3
|
export { CxCardPage };
|
|
64
4
|
export default CxCardPage;
|
|
@@ -1,34 +1,4 @@
|
|
|
1
1
|
export * from './src/carouselImg';
|
|
2
|
-
declare const CxCarouselImg:
|
|
3
|
-
readonly data: {
|
|
4
|
-
readonly type: import('vue').PropType<string[]>;
|
|
5
|
-
readonly default: () => never[];
|
|
6
|
-
};
|
|
7
|
-
readonly autoplay: {
|
|
8
|
-
readonly type: BooleanConstructor;
|
|
9
|
-
readonly default: false;
|
|
10
|
-
};
|
|
11
|
-
readonly interval: {
|
|
12
|
-
readonly type: NumberConstructor;
|
|
13
|
-
readonly default: 3000;
|
|
14
|
-
};
|
|
15
|
-
}>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
|
|
16
|
-
readonly data: {
|
|
17
|
-
readonly type: import('vue').PropType<string[]>;
|
|
18
|
-
readonly default: () => never[];
|
|
19
|
-
};
|
|
20
|
-
readonly autoplay: {
|
|
21
|
-
readonly type: BooleanConstructor;
|
|
22
|
-
readonly default: false;
|
|
23
|
-
};
|
|
24
|
-
readonly interval: {
|
|
25
|
-
readonly type: NumberConstructor;
|
|
26
|
-
readonly default: 3000;
|
|
27
|
-
};
|
|
28
|
-
}>> & Readonly<{}>, {
|
|
29
|
-
readonly data: string[];
|
|
30
|
-
readonly autoplay: boolean;
|
|
31
|
-
readonly interval: number;
|
|
32
|
-
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>>;
|
|
2
|
+
declare const CxCarouselImg: any;
|
|
33
3
|
export { CxCarouselImg };
|
|
34
4
|
export default CxCarouselImg;
|