Files
sdk4.0/src/Obj/Base/index.js

532 lines
14 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @name: index
* @author: Administrator
* @date: 2023-12-01 12:12
* @descriptionindex
* @update: 2023-12-01 12:12
*/
import Tools from "../../Tools";
import { getHost, getToken } from "../../on";
import { regLeftClickCallback, regRightClickCallback, regMoveCallback } from "../../Global/ClickCallback";
import { regLeftClickCallback as regLeftClickCallback2, regRightClickCallback as regRightClickCallback2, regMoveCallback as regMoveCallback2 } from "../../Global/SplitScreen/ClickCallback";
import { setSplitDirection, syncSplitData, getSdk } from "../../Global/SplitScreen";
import { syncData, getSdk as get2DSdk } from '../../Global/MultiViewportMode'
import { setActiveViewer, closeRotateAround, closeViewFollow } from '../../Global/global'
class Base extends Tools {
#_showView
#_isShowView
constructor(sdk, options = {}) {
super(sdk, options);
if (!sdk || !sdk.viewer) {
return
}
// this._splitDirection = -1
this.sdk = sdk
this.viewer = sdk.viewer
this.options = { ...options }
this.options.id = options.id || this.randomString()
this.entity = null
this.clickCallBack = null
this.rightClickCallBack = null
this.picking = true
this.options.host = this.options.host || getHost()
// this.#_showView = this.options.showView || 0
this.setDefaultValue()
// this.sdk.addIncetance(this.options.id, this)
}
// get splitDirection() {
// return this._splitDirection
// }
// set splitDirection(v) {
// switch (v) {
// case 1:
// case '1':
// this._splitDirection = 1
// break
// case -1:
// case '-1':
// this._splitDirection = -1
// break
// default:
// this._splitDirection = 0
// break
// }
// setSplitDirection(this._splitDirection, this.options.id)
// }
get showView() {
return this.#_showView
}
set showView(v) {
let sdk2D = get2DSdk().sdkD
if (!sdk2D) {
this.#_showView = v
if(this.entity) {
this.entity._showView = v
}
return
}
if (this.sdk === sdk2D) {
this.#_showView = 0
return
}
if (!this.#_showView && !this.show) {
return
}
if (this.sdk === sdk2D) {
this.#_showView = 0
return
}
if (v != 2 && v != 3) {
this.#_showView = 0
}
else {
this.#_showView = v
}
this.isShowView = true
// if(!this.show) {
// return
// }
if (!this.#_showView) {
this.show = true
}
else {
if (v == 2) {
this.show = false
}
else {
this.show = true
}
}
}
get name() {
return this.options.name
}
set name(v) {
this.options.name = v
this.label && (this.label.text = v)
this._elms.name && this._elms.name.forEach((item) => {
item.value = v
})
}
get show() {
return this.options.show
}
set show(v) {
if (typeof v === "boolean") {
let sdkD = get2DSdk().sdkD
if (!this.isShowView || !sdkD) {
this.options.show = v
if (this.originalOptions) {
this.originalOptions.show = v
}
}
this.entity._showView = this.showView
if (this.type == 'layer') {
if (this.entity) {
this.entity._objectState = this.options.show
}
}
if (!this.showView || this.showView == 3 || !sdkD) {
this.entity && (this.entity.show = this.options.show)
if (this.options.label && this.options.label.show && this.label) {
this.label.show = this.options.show
}
}
else {
this.entity && (this.entity.show = false)
if (this.options.label && this.options.label.show && this.label) {
this.label.show = false
}
}
if (this._DialogObject && this._DialogObject.showBtn) {
this._DialogObject.showBtn.checked = this.options.show
}
syncData(this.sdk, this.options.id)
syncSplitData(this.sdk, this.options.id)
this.isShowView = false
if (this.type == 'layer' && sdkD) {
let layer2d = sdkD.viewer.imageryLayers._layers[this.layerIndex]
let layer3d = this.entity
if (!layer2d) {
return
}
if (layer3d._objectState) {
if (!layer3d._showView || layer3d._showView == 2) {
layer2d.show = true
}
if (layer3d._showView == 3) {
layer2d.show = false
}
}
else {
layer2d.show = this.options.show
}
}
} else {
console.error("参数必须为boolean")
}
}
get attributeSelect() {
return [
{
name: '富文本',
value: '富文本',
key: 'richText'
},
{
name: '链接',
value: '链接',
key: 'link'
},
// {
// name: 'IP摄像头',
// value: 'IP摄像头',
// key: 'camera'
// },
// {
// name: 'ISC摄像头',
// value: 'ISC摄像头',
// key: 'isc'
// },
// {
// name: '传感器',
// value: '传感器',
// key: 'sensor'
// },
// {
// name: '全景图',
// value: '全景图',
// key: 'vr'
// },
// {
// name: '物资',
// value: '物资',
// key: 'goods'
// },
]
}
display() {
this.show = true
}
hide() {
this.show = false
}
/**
* 闪烁
* @param {number} times 闪烁一次所需时间
* @param {number} number 闪烁次数
*/
flicker(times = 500, number) {
if (this.flickerAnimate) {
TWEEN.remove(this.flickerAnimate)
}
this.flickerAnimate = new TWEEN.Tween({ degree: 1 }).to({ degree: 0 }, times / 2).easing(TWEEN.Easing.Linear.None).repeat((number || number === 0) ? (number * 2) - 1 : Infinity).yoyo(true).onUpdate(async (r, a) => {
// this.entity.billboard.color = Cesium.Color.fromCssColorString(`rgba(255,255,255,${r.degree})`)
if (!this.sdk.viewer) {
TWEEN.remove(this.flickerAnimate)
return
}
if (this.show) {
if (r.degree === 1) {
this.entity && (this.entity.show = true)
this.labelShow && this.label && (this.label.show = true)
this.text && this.text && (this.text.show = true)
}
if (r.degree === 0) {
this.entity && (this.entity.show = false)
this.labelShow && this.label && (this.label.show = false)
this.text && this.text && (this.text.show = false)
}
}
}).onComplete((d) => {
TWEEN.remove(this.flickerAnimate)
this.flickerAnimate = undefined
}).start()
}
async flyTo(options = {}) {
if (this._error) {
return
}
setActiveViewer(0)
closeRotateAround(this.sdk)
closeViewFollow(this.sdk)
if (this.options.customView && this.options.customView.relativePosition && this.options.customView.orientation) {
let orientation = {
heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0),
pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0),
roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0)
}
let lng = this.options.customView.relativePosition.lng
let lat = this.options.customView.relativePosition.lat
let alt = this.options.customView.relativePosition.alt
let destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt)
let position = { lng: 0, lat: 0 }
if (this.options.position && Object.prototype.toString.call(this.options.position) === '[object Object]') {
position = { ...this.options.position }
}
else if (this.options.positions) {
position = { ...this.options.positions[0] }
}
else if (this.options.line && this.options.line.positions) {
position = { ...this.options.line.positions[0] }
}
else if (this.options.center) {
position = { ...this.options.center }
}
else if (this.options.start) {
position = { ...this.options.start }
}
else if (this.geojson) {
let range = turf.bbox(this.geojson);
position = { lng: range[0], lat: range[1] }
}
else {
if (this.options.hasOwnProperty('lng')) {
position.lng = this.options.lng
}
if (this.options.hasOwnProperty('lat')) {
position.lat = this.options.lat
}
if (this.options.hasOwnProperty('alt')) {
position.alt = this.options.alt
}
}
// 如果没有高度值,则获取紧贴高度计算
if (!position.hasOwnProperty('alt')) {
position.alt = await this.getClampToHeight(position)
}
lng = this.options.customView.relativePosition.lng + position.lng
lat = this.options.customView.relativePosition.lat + position.lat
alt = this.options.customView.relativePosition.alt + position.alt
destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt)
this.sdk.viewer.camera.flyTo({
destination: destination,
orientation: orientation
})
}
else {
this.sdk.viewer.flyTo(this.entity, {
offset: options.orientation || {
heading: Cesium.Math.toRadians(0.0),
pitch: Cesium.Math.toRadians(-60.0),
roll: Cesium.Math.toRadians(0.0)
}
})
}
}
async remove() {
await this.sdk.removeIncetance(this.options.id)
this.event && this.event.destroy()
this.tip && this.tip.destroy()
syncData(this.sdk, this.options.id)
syncSplitData(this.sdk, this.options.id)
}
get onClick() {
return this.clickCallBack
}
set onClick(val) {
if (val && typeof val !== 'function') {
console.error('val:', val, '不是一个function')
} else {
let sdkD = getSdk().sdkD
if (sdkD && this.sdk === sdkD) {
if (this.clickCallBack == null && this.options && this.options.id) {
regLeftClickCallback2(this.options.id, this.leftClickCB, this)
}
}
else {
if (this.clickCallBack == null && this.options && this.options.id) {
regLeftClickCallback(this.options.id, this.leftClickCB, this)
}
}
this.clickCallBack = val
}
}
get onRightClick() {
return this.rightClickCallBack
}
set onRightClick(val) {
if (val && typeof val !== 'function') {
console.error('val:', val, '不是一个function')
} else {
let sdkD = getSdk().sdkD
if (sdkD && this.sdk === sdkD) {
if (this.rightClickCallBack == null && this.entity && this.entity.id) {
regRightClickCallback2(this.entity.id, this.rightClickCB, this)
}
}
else {
if (this.rightClickCallBack == null && this.entity && this.entity.id) {
regRightClickCallback(this.entity.id, this.rightClickCB, this)
}
}
this.rightClickCallBack = val
}
}
get onMouseMove() {
return this.mouseMoveCallBack
}
set onMouseMove(val) {
if (val && typeof val !== 'function') {
console.error('val:', val, '不是一个function')
} else {
let sdkD = getSdk().sdkD
if (sdkD && this.sdk === sdkD) {
if (this.mouseMoveCallBack == null && this.entity && this.entity.id) {
regMoveCallback2(this.entity.id, this.mouseMoveCB, this)
}
}
else {
if (this.mouseMoveCallBack == null && this.entity && this.entity.id) {
regMoveCallback(this.entity.id, this.mouseMoveCB, this)
}
}
this.mouseMoveCallBack = val
}
}
get customView() {
return this.options.customView
}
// 设置视角
async setCustomView(val) {
if (val) {
this.options.customView = val
}
else {
let camera = this.sdk.viewer.camera
let cameraPosition84 = this.cartesian3Towgs84(camera.position, this.sdk.viewer)
let position = { lng: 0, lat: 0 }
let relativePosition = { ...cameraPosition84 }
if (this.options.position && Object.prototype.toString.call(this.options.position) === '[object Object]') {
position = { ...this.options.position }
}
else if (this.options.positions) {
position = { ...this.options.positions[0] }
}
else if (this.options.line && this.options.line.positions) {
position = { ...this.options.line.positions[0] }
}
else if (this.options.center) {
position = { ...this.options.center }
}
else if (this.options.start) {
position = { ...this.options.start }
}
else if (this.geojson) {
let range = turf.bbox(this.geojson);
position = { lng: range[0], lat: range[1] }
}
else {
if (this.options.hasOwnProperty('lng')) {
position.lng = this.options.lng
}
if (this.options.hasOwnProperty('lat')) {
position.lat = this.options.lat
}
if (this.options.hasOwnProperty('alt')) {
position.alt = this.options.alt
}
}
// 如果没有高度值,则获取紧贴高度计算
if (!position.hasOwnProperty('alt')) {
position.alt = await this.getClampToHeight(position)
}
relativePosition = {
lng: cameraPosition84.lng - position.lng,
lat: cameraPosition84.lat - position.lat,
alt: cameraPosition84.alt - position.alt
}
this.options.customView = {
orientation: { heading: Cesium.Math.toDegrees(camera.heading), pitch: Cesium.Math.toDegrees(camera.pitch), roll: Cesium.Math.toDegrees(camera.roll) },
relativePosition: relativePosition
}
this.originalOptions && (this.originalOptions.customView = this.options.customView)
}
}
// 重置视角
resetCustomView() {
this.options.customView = undefined
}
//每个节点的编辑页面
edit() {
}
leftClickCB(mo, id, p, that) {
if (that.clickCallBack && typeof that.clickCallBack === 'function') {
that.clickCallBack(mo, id, p)
}
}
rightClickCB(mo, id, p, that) {
if (that.rightClickCallBack && typeof that.rightClickCallBack === 'function') {
that.rightClickCallBack(mo, id, p)
}
}
mouseMoveCB(mo, id, p, that) {
if (that.mouseMoveCallBack && typeof that.mouseMoveCallBack === 'function') {
that.mouseMoveCallBack(mo, id, p)
}
}
getGuid() {
return Cesium.createGuid()
}
setDefaultValue() {
this.options.id = this.options.id ?? this.getGuid()
this.options.show = this.options.show ?? true
this.options.name = this.options.name ?? "未命名对象"
}
start() { }
end() { }
}
export default Base