Files
sdk4.0/src/Obj/Base/RadarScanStereoscopic/index.js
2025-08-31 16:12:36 +08:00

1497 lines
55 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.

/**
* @description 立体雷达扫描
*/
import Base from "../index";
import cy_tabs from "../../Element/cy_html_tabs";
import richText from "../../Element/richText";
import { html } from "./_element";
import Dialog from '../../Element/Dialog';
import EventBinding from '../../Element/Dialog/eventBinding';
import MouseEvent from '../../../Event/index'
import LabelObject from '../LabelObject'
import Controller from "../../../Controller/index";
import { syncData } from '../../../Global/MultiViewportMode'
import { legp } from '../../Element/datalist';
import { getFontList, getFontFamilyName } from '../../Element/fontSelect'
import { setSplitDirection, syncSplitData, setActiveId } from '../../../Global/SplitScreen'
import { setActiveViewer, closeRotateAround, closeViewFollow} from '../../../Global/global'
class RadarScanStereoscopic extends Base {
/**
* @constructor
* @description 立体雷达扫描
* @param sdk
* @param options {object} 属性
* @param options.id {string} 标注id
* @param options.show=true {boolean} 显示/隐藏
* @param options.lng {number} 经度
* @param options.lat {number} 纬度
* @param options.alt {number} 高度
* @param options.colorOut=rgba(255,255,0,0.3){string} 范围颜色
* @param options.colorIn=rgba(255,0,0,0.3){string} 扫描颜色
* @param options.radius=10 {number} 半径
* @param options.duration=2000 {number} 持续时间
* @param options.label {object} 标签对象
* @param options.label.show {string} 标签显隐
* @param options.label.position {string} 标签位置
* @param options.label.position {object} 标签位置
* @param options.label.position.lng {number} 经度
* @param options.label.position.lat {number} 纬度
* @param options.label.position.alt {number} 高度
* @param options.label.fontSize=20 {number} 字体大小
* @param options.label.fontFamily=0 {number} 字体项 0黑体1思源黑体2庞门正道标题体3数黑体
* @param options.label.color=#ffffff {string} 字体颜色
* @param options.label.lineWidth=4 {number} 引线宽
* @param options.label.lineColor=#00ffff80 {string} 引线颜色
* @param options.label.pixelOffset=20 {number} 字体偏移(引线长度)
* @param options.label.backgroundColor=['#00ffff80', '#00ffff80'] {array} 背景颜色
* @param options.label.scaleByDistance {boolean} 距离缩放
* @param options.label.near=2000 {number} 视野缩放最近距离
* @param options.label.far=100000 {number} 视野缩放最远距离
* @param options.attribute {object} 属性内容
* @param {object} options.attribute.link={} 链接
* @param options.attribute.link.content=[]] {array} 链接内容
* @param options.attribute.link.content[].name {string} 链接名称
* @param options.attribute.link.content[].url {string} 链接地址
* @param options.richTextContent {string} 富文本内容
* @param options.customView {object} 默认视角
* @param options.customView.orientation {object} 默认视角方位
* @param options.customView.orientation.heading {number} 航向角
* @param options.customView.orientation.pitch {number} 俯仰角
* @param options.customView.orientation.roll {number} 翻滚角
* @param options.customView.relativePosition {object} 视角相对位置
* @param options.customView.relativePosition.lng {number} 经度
* @param options.customView.relativePosition.lat {number} 纬度
* @param options.customView.relativePosition.alt {number} 高度
*/
constructor(sdk, options, _Dialog = {}) {
super(sdk, options);
this.options.lng = options.lng
this.options.lat = options.lat
this.options.alt = options.alt
this.options.colorOut = options.colorOut || 'rgba(255,255,0,0.3)'
this.options.colorIn = options.colorIn || 'rgba(255,0,0,0.3)'
this.options.radius = options.radius || 10
if(this.options.radius > 999999) {
this.options.radius = 999999
}
this.options.duration = options.duration || 2000
this.event = new MouseEvent(this.sdk)
this.options.positionEditin = false
options.label = options.label || {}
this.options.label = {
text: this.options.name,
show: options.label.show || false,
position: options.label.position,
fontSize: (options.label.fontSize || options.label.fontSize === 0) ? options.label.fontSize : 20,
fontFamily: options.label.fontFamily ? options.label.fontFamily : 0,
color: options.label.color || '#ffffff',
lineWidth: (options.label.lineWidth || options.label.lineWidth === 0) ? options.label.lineWidth : 4,
pixelOffset: (options.label.pixelOffset || options.label.pixelOffset === 0) ? options.label.pixelOffset : 20,
backgroundColor: options.label.backgroundColor || ['#00ffff80', '#00ffff80'],
lineColor: options.label.lineColor || '#00ffff80',
scaleByDistance: options.label.scaleByDistance || false,
near: (options.label.near || options.label.near === 0) ? options.label.near : 2000,
far: (options.label.far || options.label.far === 0) ? options.label.far : 100000,
}
this.options.instruct = options.instruct || ""
this.options.operatingPoint = options.operatingPoint || ""
this.options.attribute = options.attribute || {}
this.options.attribute.vr = this.options.attribute.vr || {}
this.options.attribute.vr.content = this.options.attribute.vr.content || []
this.options.attribute.link = this.options.attribute.link || {}
this.options.attribute.link.content = this.options.attribute.link.content || []
this.options.attribute.camera = this.options.attribute.camera || {}
this.options.attribute.camera = this.options.attribute.camera.content || []
this.options.attribute.ISC = this.options.attribute.ISC || {}
this.options.attribute.ISC.content = this.options.attribute.ISC.content || []
this.options.attribute.goods = this.options.attribute.goods || {}
this.options.attribute.goods.content = this.options.attribute.goods.content || []
this.options.attributeType = options.attributeType || 'richText'
this._elms = {};
this.Dialog = _Dialog
this._EventBinding = new EventBinding()
this.ControllerObject = new Controller(this.sdk)
this.sdk.addIncetance(this.options.id, this)
RadarScanStereoscopic.radarSolidScan(this)
}
get type() {
return 'RadarScanStereoscopic'
}
static radarSolidScan(that) {
let viewer = that.sdk.viewer
let options = that.options
let radius = options.radius;
let centerLng = options.lng;
let centerLat = options.lat;
let height = options.alt;
let heading = that.options.duration ? 360 / that.options.duration * Cesium.getTimestamp() : 0;
let arr = calculatePane(that.options, that.options.radius, heading);
let _time = new Date().getTime();
// 每一帧刷新时调用
viewer.clock.onTick.addEventListener(() => {
// let tempTime = new Date().getTime()
// let everyTime = that.options.duration ? 360 / that.options.duration : 0
// let speed = (tempTime - _time) * everyTime
// _time = tempTime
// heading += speed;
heading = that.options.duration ? 360 / that.options.duration * Cesium.getTimestamp() : 0;
arr = calculatePane(that.options, that.options.radius, heading);
});
that.entity = viewer.entities.add({
id: that.options.id,
show: that.options.show,
position: new Cesium.CallbackProperty(() => {
return new Cesium.Cartesian3.fromDegrees(
that.options.lng,
that.options.lat,
that.options.alt
)
}, false),
ellipsoid: {
radii: new Cesium.CallbackProperty(() => {
return new Cesium.Cartesian3(that.options.radius, that.options.radius, that.options.radius)
}, false),
material: Cesium.Color.fromCssColorString(options.colorOut),
outline: true,
outlineColor: Cesium.Color.fromCssColorString(options.colorOut),
outlineWidth: 1,
maximumCone: Cesium.Math.toRadians(90),
},
wall: {
positions: new Cesium.CallbackProperty(() => {
return Cesium.Cartesian3.fromDegreesArrayHeights(arr.positionArr);
}, false),
material: Cesium.Color.fromCssColorString(options.colorIn),
minimumHeights: new Cesium.CallbackProperty(() => {
return arr.bottomArr
}, false),
},
});
RadarScanStereoscopic.createLabel(that)
syncData(that.sdk, that.options.id)
if(that.options.show) {
setSplitDirection(0, that.options.id)
}
// 计算平面扫描范围
function calculatePane(position, radius, heading) {
let x1 = position.lng,
y1 = position.lat,
height = position.alt;
let m = Cesium.Transforms.eastNorthUpToFixedFrame(
Cesium.Cartesian3.fromDegrees(x1, y1, height)
);
let rx = radius * Math.cos((heading * Math.PI) / 180.0);
let ry = radius * Math.sin((heading * Math.PI) / 180.0);
let translation = Cesium.Cartesian3.fromElements(rx, ry, height);
let d = Cesium.Matrix4.multiplyByPoint(
m,
translation,
new Cesium.Cartesian3()
);
let c = Cesium.Cartographic.fromCartesian(d);
let x2 = Cesium.Math.toDegrees(c.longitude);
let y2 = Cesium.Math.toDegrees(c.latitude);
return calculateSector(x1, y1, x2, y2, height);
}
// 计算竖直扇形
function calculateSector(x1, y1, x2, y2, height) {
let positionArr = [];
let bottomArr = [];
positionArr.push(x1, y1, height);
bottomArr.push(height);
let radius = Cesium.Cartesian3.distance(
Cesium.Cartesian3.fromDegrees(x1, y1),
Cesium.Cartesian3.fromDegrees(x2, y2)
);
// 角度设置为0-90,也就是1/4圆
for (let i = 0; i <= 90; i++) {
let h = radius * Math.sin((i * Math.PI) / 180.0);
let r = Math.cos((i * Math.PI) / 180.0);
let x = (x2 - x1) * r + x1;
let y = (y2 - y1) * r + y1;
positionArr.push(x, y, h + height);
bottomArr.push(height);
}
return { positionArr, bottomArr };
}
}
static async createLabel(that) {
let height
if (that.options.alt) {
height = that.options.alt + that.options.radius
}
else {
let objectsToExclude = [...that.sdk.viewer.entities.values]
height = await that.getClampToHeight({ lng: that.options.lng, lat: that.options.lat }, objectsToExclude)
}
if (!that.options.label.position) {
that.options.label.position = { lng: that.options.lng, lat: that.options.lat, alt: height }
}
// 标签
that.label = new LabelObject(that.sdk, {
id: that.options.id,
show: that.options.show ? that.options.label.show : false,
position: [that.options.label.position.lng, that.options.label.position.lat, that.options.label.position.alt],
text: that.options.name,
ground: false,
fontSize: that.options.label.fontSize,
fontFamily: that.options.label.fontFamily,
color: that.options.label.color,
pixelOffset: that.options.label.pixelOffset,
backgroundColor: that.options.label.backgroundColor,
lineColor: that.options.label.lineColor,
lineWidth: that.options.label.lineWidth,
scaleByDistance: that.options.label.scaleByDistance,
near: that.options.label.near,
far: that.options.label.far
})
}
/**@desc 打开平移功能
*
* @memberOf Source
* @param status {boolean}
*
* */
set positionEditing(status) {
if (!this.sdk || !this.sdk.viewer || !this.entity) {
return
}
if (status) {
this.picking = false
this.ControllerObject.position = { lng: this.options.lng, lat: this.options.lat, alt: this.options.alt }
this.ControllerObject.editTranslational()
this.ControllerObject.controllerCallBack = (params) => {
this.lng = params.position.lng
this.lat = params.position.lat
this.alt = params.position.alt
}
}
else {
setTimeout(() => {
this.picking = true
}, 500);
this.ControllerObject.destroy()
}
// this.options.positionEditing = status
// if (status === true) {
// this.picking = false
// this.event.mouse_move((movement, cartesian) => {
// let positions = this.cartesian3Towgs84(cartesian, this.sdk.viewer)
// this.lng = positions.lng
// this.lat = positions.lat
// })
// this.event.mouse_left((movement, cartesian) => {
// let positions = this.cartesian3Towgs84(cartesian, this.sdk.viewer)
// this.originalOptions.lng = this.lng = positions.lng
// this.originalOptions.lat = this.lat = positions.lat
// this.event.mouse_move(() => { })
// this.event.mouse_left(() => { })
// this.event.mouse_right(() => { })
// this.positionEditing = false
// })
// this.event.mouse_right((movement, cartesian) => {
// this.positionEditing = false
// })
// }
// else {
// this.picking = true
// this.event.mouse_move(() => { })
// this.event.mouse_left(() => { })
// this.event.mouse_right(() => { })
// this.lng = this.originalOptions.lng
// this.lat = this.originalOptions.lat
// }
}
get positionEditing() {
if (this.ControllerObject.getActiveState() === 'translational') {
return true
}
return false
}
get lng() {
return this.options.lng
}
set lng(v) {
this.options.lng = Number(v)
this.label.position = [v, this.lat, this.alt + this.radius]
this._elms.lng && this._elms.lng.forEach((item) => {
item.value = v
})
RadarScanStereoscopic.changeParam(this)
}
get lat() {
return this.options.lat
}
set lat(v) {
this.options.lat = Number(v)
this.label.position = [this.lng, v, this.alt + this.radius]
this._elms.lat && this._elms.lat.forEach((item) => {
item.value = v
})
RadarScanStereoscopic.changeParam(this)
}
get alt() {
return this.options.alt
}
set alt(v) {
this.options.alt = Number(v)
this.label.position = [this.lng, this.lat, v + this.radius]
this._elms.alt && this._elms.alt.forEach((item) => {
item.value = v
})
RadarScanStereoscopic.changeParam(this)
}
get radius() {
return this.options.radius
}
set radius(v) {
let radius = Number(v.toFixed(2))
if(radius > 999999) {
radius = 999999
}
if(radius < 0.1) {
radius = 0.1
}
this.options.radius = radius
this.label.position = [this.lng, this.lat, this.alt + v]
if (this._DialogObject && this._DialogObject._element && this._DialogObject._element.content) {
let unitDataLegpElm = this._DialogObject._element.content.getElementsByClassName('input-radius-unit')[0].getElementsByTagName('input')[0]
if (unitDataLegpElm.value === '千米') {
radius = Number((radius / 1000).toFixed(5))
}
}
this._elms.radius && this._elms.radius.forEach((item) => {
item.value = radius
})
RadarScanStereoscopic.changeParam(this)
}
get duration() {
return this.options.duration
}
set duration(v) {
this.options.duration = v
this._elms.duration && this._elms.duration.forEach((item) => {
item.value = v
})
RadarScanStereoscopic.changeParam(this)
}
get colorOut() {
return this.options.colorOut
}
set colorOut(v) {
this.options.colorOut = v
this.entity.ellipsoid.material = Cesium.Color.fromCssColorString(v)
this.entity.ellipsoid.outlineColor = Cesium.Color.fromCssColorString(v)
if (this._elms.colorOut) {
this._elms.colorOut.forEach((item, i) => {
let colorPicker = new YJColorPicker({
el: item.el,
size: 'mini',//颜色box类型
alpha: true,//是否开启透明度
defaultColor: v,
disabled: false,//是否禁止打开颜色选择器
openPickerAni: 'opacity',//打开颜色选择器动画
sure: (c) => {
this.colorOut = c
},//点击确认按钮事件回调
clear: () => {
this.colorOut = 'rgba(255,255,255,1)'
},//点击清空按钮事件回调
})
this._elms.colorOut[i] = colorPicker
})
}
}
get colorIn() {
return this.options.colorIn
}
set colorIn(v) {
this.options.colorIn = v
this.entity.wall.material = Cesium.Color.fromCssColorString(v)
if (this._elms.colorIn) {
this._elms.colorIn.forEach((item, i) => {
let colorPicker = new YJColorPicker({
el: item.el,
size: 'mini',//颜色box类型
alpha: true,//是否开启透明度
defaultColor: v,
disabled: false,//是否禁止打开颜色选择器
openPickerAni: 'opacity',//打开颜色选择器动画
sure: (c) => {
this.colorIn = c
},//点击确认按钮事件回调
clear: () => {
this.colorIn = 'rgba(255,255,255,1)'
},//点击清空按钮事件回调
})
this._elms.colorIn[i] = colorPicker
})
}
}
get labelShow() {
return this.options.label.show
}
set labelShow(v) {
this.options.label.show = v
if (this.show && !this.showView || this.showView == 3) {
this.label.show = v
}
else {
this.label.show = false
}
this._elms.labelShow && this._elms.labelShow.forEach((item) => {
item.checked = v
})
}
get labelFontFamily() {
return this.options.label.fontFamily
}
set labelFontFamily(v) {
this.options.label.fontFamily = v || 0
this.label && (this.label.fontFamily = this.options.label.fontFamily)
let name = getFontFamilyName(this.labelFontFamily) || ''
this._elms.labelFontFamily &&
this._elms.labelFontFamily.forEach(item => {
item.value = name
})
}
get labelColor() {
return this.options.label.color
}
set labelColor(v) {
this.options.label.color = v
this.label.color = v
if (this._elms.labelColor) {
this._elms.labelColor.forEach((item, i) => {
let labelColorPicker = new YJColorPicker({
el: item.el,
size: 'mini',//颜色box类型
alpha: true,//是否开启透明度
defaultColor: this.labelColor,
disabled: false,//是否禁止打开颜色选择器
openPickerAni: 'opacity',//打开颜色选择器动画
sure: (color) => {
this.labelColor = color
},//点击确认按钮事件回调
clear: () => {
this.labelColor = 'rgba(255,255,255,1)'
},//点击清空按钮事件回调
})
this._elms.labelColor[i] = labelColorPicker
})
}
}
get labelFontSize() {
return this.options.label.fontSize
}
set labelFontSize(v) {
this.options.label.fontSize = v
this.label.fontSize = v
this._elms.labelFontSize && this._elms.labelFontSize.forEach((item) => {
item.value = v
})
}
get labelScaleByDistance() {
return this.options.label.scaleByDistance
}
set labelScaleByDistance(v) {
this.options.label.scaleByDistance = v
this.label.scaleByDistance = v
this._elms.labelScaleByDistance && this._elms.labelScaleByDistance.forEach((item) => {
item.checked = v
})
}
get labelNear() {
return this.options.label.near
}
set labelNear(v) {
let near = v
if (near > this.labelFar) {
near = this.labelFar
}
this.options.label.near = near
this.label.near = near
this._elms.labelNear && this._elms.labelNear.forEach((item) => {
item.value = near
})
}
get labelFar() {
return this.options.label.far
}
set labelFar(v) {
let far = v
if (far < this.labelNear) {
far = this.labelNear
}
this.options.label.far = far
this.label.far = far
this._elms.labelFar && this._elms.labelFar.forEach((item) => {
item.value = far
})
}
get labelLineWidth() {
return this.options.label.lineWidth
}
set labelLineWidth(v) {
this.options.label.lineWidth = v
this.label.lineWidth = v
this._elms.labelLineWidth && this._elms.labelLineWidth.forEach((item) => {
item.value = v
})
}
get labelPixelOffset() {
return this.options.label.pixelOffset
}
set labelPixelOffset(v) {
this.options.label.pixelOffset = v
this.label.pixelOffset = v
this._elms.labelPixelOffset && this._elms.labelPixelOffset.forEach((item) => {
item.value = v
})
}
get labelLineColor() {
return this.options.label.lineColor
}
set labelLineColor(v) {
this.options.label.lineColor = v
this.label.lineColor = v
if (this._elms.labelLineColor) {
this._elms.labelLineColor.forEach((item, i) => {
let lineColorPicker = new YJColorPicker({
el: item.el,
size: 'mini',//颜色box类型
alpha: true,//是否开启透明度
defaultColor: this.labelLineColor,
disabled: false,//是否禁止打开颜色选择器
openPickerAni: 'opacity',//打开颜色选择器动画
sure: (color) => {
this.labelLineColor = color
},//点击确认按钮事件回调
clear: () => {
this.labelLineColor = 'rgba(0,255,255,0.5)'
},//点击清空按钮事件回调
})
this._elms.labelLineColor[i] = lineColorPicker
})
}
}
get labelBackgroundColorStart() {
return this.options.label.backgroundColor[0]
}
set labelBackgroundColorStart(v) {
this.options.label.backgroundColor[0] = v
this.label.backgroundColor = [v, this.label.backgroundColor[1]]
if (this._elms.labelBackgroundColorStart) {
this._elms.labelBackgroundColorStart.forEach((item, i) => {
let labelBackgroundColorStartPicker = new YJColorPicker({
el: item.el,
size: 'mini',//颜色box类型
alpha: true,//是否开启透明度
defaultColor: this.labelBackgroundColorStart,
disabled: false,//是否禁止打开颜色选择器
openPickerAni: 'opacity',//打开颜色选择器动画
sure: (color) => {
this.labelBackgroundColorStart = color
},//点击确认按钮事件回调
clear: () => {
this.labelBackgroundColorStart = 'rgba(255,255,255,1)'
},//点击清空按钮事件回调
})
this._elms.labelBackgroundColorStart[i] = labelBackgroundColorStartPicker
})
}
}
get labelBackgroundColorEnd() {
return this.options.label.backgroundColor[1]
}
set labelBackgroundColorEnd(v) {
this.options.label.backgroundColor[1] = v
this.label.backgroundColor = [this.label.backgroundColor[0], v]
if (this._elms.labelBackgroundColorEnd) {
this._elms.labelBackgroundColorEnd.forEach((item, i) => {
let labelBackgroundColorEndPicker = new YJColorPicker({
el: item.el,
size: 'mini',//颜色box类型
alpha: true,//是否开启透明度
defaultColor: this.labelBackgroundColorEnd,
disabled: false,//是否禁止打开颜色选择器
openPickerAni: 'opacity',//打开颜色选择器动画
sure: (color) => {
this.labelBackgroundColorEnd = color
},//点击确认按钮事件回调
clear: () => {
this.labelBackgroundColorEnd = 'rgba(255,255,255,1)'
},//点击清空按钮事件回调
})
this._elms.labelBackgroundColorEnd[i] = labelBackgroundColorEndPicker
})
}
}
get instruct() {
return this.options.instruct
}
set instruct(v) {
this.options.instruct = v
this._elms.instruct && this._elms.instruct.forEach((item) => {
item.value = v
})
}
get operatingPoint() {
return this.options.operatingPoint
}
set operatingPoint(v) {
this.options.operatingPoint = v
this._elms.operatingPoint && this._elms.operatingPoint.forEach((item) => {
item.value = v
})
}
get attributeType() {
return this.options.attributeType
}
set attributeType(v) {
this.options.attributeType = v
this._elms.attributeType && this._elms.attributeType.forEach((item) => {
item.value = v
})
let attributeContent = this._DialogObject._element.content.getElementsByClassName('attribute-content')
for (let i = 0; i < attributeContent.length; i++) {
if (attributeContent[i].className.indexOf('attribute-content-' + v) > -1) {
attributeContent[i].style.display = 'block';
}
else {
attributeContent[i].style.display = 'none';
}
}
}
get attributeLink() {
return this.options.attribute.link.content
}
set attributeLink(v) {
this.options.attribute.link.content = v
if (!this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content || this._DialogObject._element.content.getElementsByClassName('attribute-content-link').length == 0) {
return
}
let table = this._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0]
let tableContent = table.getElementsByClassName('table-body')[0]
tableContent.innerHTML = ''
if (this.options.attribute.link.content.length > 0) {
table.getElementsByClassName('table-empty')[0].style.display = 'none'
}
else {
table.getElementsByClassName('table-empty')[0].style.display = 'flex'
}
for (let i = 0; i < this.options.attribute.link.content.length; i++) {
let tr = `
<div class="tr">
<div class="td">` + this.options.attribute.link.content[i].name + `</div>
<div class="td">` + this.options.attribute.link.content[i].url + `</div>
<div class="td">
<button @click="linkEdit">编辑</button>
<button @click="linkDelete">删除</button>
</div>
</div>`
let trElm = document.createRange().createContextualFragment(tr)
tableContent.appendChild(trElm)
}
let item = tableContent.getElementsByClassName('tr')
let fun = {
linkEdit: async (index) => {
this.attributeLink = await this.options.attribute.link.content
let table = this._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0]
let tableContent = table.getElementsByClassName('table-body')[0]
let item = tableContent.getElementsByClassName('tr')
for (let i = 0; i < item.length; i++) {
if (index === i) {
let height = item[i].offsetHeight
let html = `
<div class="td">
<input class="input" type="text">
</div>
<div class="td">
<textarea class="input link-edit" type="text"></textarea>
</div>
<div class="td">
<button @click="confirmEdit">确认</button>
<button @click="cancelEdit">取消</button>
</div>`
item[i].innerHTML = html
let textareaElm = item[i].getElementsByClassName('link-edit')[0]
textareaElm.style.height = (height - 10) + 'px'
let td = item[i].getElementsByClassName('td')
td[0].getElementsByClassName('input')[0].value = this.options.attribute.link.content[index].name
td[1].getElementsByClassName('input')[0].value = this.options.attribute.link.content[index].url
let btn = item[i].getElementsByTagName('button')
for (let n = 0; n < btn.length; n++) {
if (!btn[n] || !btn[n].attributes) {
continue
}
for (let m of btn[n].attributes) {
if (m.name === '@click') {
btn[n].addEventListener('click', (e) => {
if (typeof (fun[m.value]) === 'function') {
fun[m.value]({ name: td[0].getElementsByClassName('input')[0].value, url: td[1].getElementsByClassName('input')[0].value }, i)
}
});
btn[n].attributes.removeNamedItem(m.name)
break
}
}
}
break
}
}
},
linkDelete: (i) => {
this.options.attribute.link.content.splice(i, 1)
this.attributeLink = this.options.attribute.link.content
},
confirmEdit: (value, i) => {
let name = value.name && value.name.replace(/\s/g, "")
let url = value.url && value.url.replace(/\s/g, "")
if (name && url) {
this.options.attribute.link.content[i] = value
}
else {
window.ELEMENT && window.ELEMENT.Message({
message: '名称或链接不能为空!',
type: 'warning',
duration: 1500
});
}
this.attributeLink = this.options.attribute.link.content
},
cancelEdit: () => {
this.attributeLink = this.options.attribute.link.content
},
fileSelect: (value, i) => {
let fileElm = item[i].getElementsByClassName('file-select')[0]
fileElm.click()
fileElm.removeEventListener('change', fileSelect)
fileElm.addEventListener('change', fileSelect)
}
}
let fileSelect = (event) => {
if (event.target.value) {
let td = item[event.target.getAttribute('index')].getElementsByClassName('td')
td[1].getElementsByClassName('input')[0].value = event.target.value
event.target.value = null
}
}
for (let i = 0; i < item.length; i++) {
let btn = item[i].getElementsByTagName('button')
for (let n = 0; n < btn.length; n++) {
if (!btn[n] ||!btn[n].attributes) {
continue
}
for (let m of btn[n].attributes) {
if (m.name === '@click') {
btn[n].addEventListener('click', (e) => {
if (typeof (fun[m.value]) === 'function') {
fun[m.value](i)
}
});
btn[n].attributes.removeNamedItem(m.name)
break
}
}
}
}
}
get attributeCamera() {
return this.options.attribute.camera.content
}
set attributeCamera(v) {
this.options.attribute.camera.content = v
}
get attributeISC() {
return this.options.attribute.ISC.content
}
set attributeISC(v) {
this.options.attribute.ISC.content = v
}
get attributeVr() {
return this.options.attribute.vr.content
}
set attributeVr(v) {
this.options.attribute.vr.content = v
if (!this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content || this._DialogObject._element.content.getElementsByClassName('attribute-content-vr').length == 0) {
return
}
let table = this._DialogObject._element.content.getElementsByClassName('attribute-content-vr')[1].getElementsByClassName('table')[0]
let tableContent = table.getElementsByClassName('table-body')[0]
tableContent.innerHTML = ''
if (this.options.attribute.vr.content.length > 0) {
table.getElementsByClassName('table-empty')[0].style.display = 'none'
}
else {
table.getElementsByClassName('table-empty')[0].style.display = 'flex'
}
for (let i = 0; i < this.options.attribute.vr.content.length; i++) {
let tr = `
<div class="tr">
<div class="td">` + this.options.attribute.vr.content[i].name + `</div>
<div class="td">` + this.options.attribute.vr.content[i].url + `</div>
<div class="td">
<button @click="vrEdit">编辑</button>
<button @click="vrDelete">删除</button>
</div>
</div>`
let trElm = document.createRange().createContextualFragment(tr)
tableContent.appendChild(trElm)
}
let item = tableContent.getElementsByClassName('tr')
let fun = {
vrEdit: async (index) => {
this.attributeVr = await this.options.attribute.vr.content
let table = this._DialogObject._element.content.getElementsByClassName('attribute-content-vr')[1].getElementsByClassName('table')[0]
let tableContent = table.getElementsByClassName('table-body')[0]
let item = tableContent.getElementsByClassName('tr')
for (let i = 0; i < item.length; i++) {
if (index === i) {
let height = item[i].offsetHeight
let html = `
<div class="td">
<input class="input" type="text">
</div>
<div class="td">
<textarea class="input link-edit" type="text"></textarea>
</div>
<div class="td">
<button @click="confirmEdit">确认</button>
<button @click="cancelEdit">取消</button>
</div>`
item[i].innerHTML = html
let textareaElm = item[i].getElementsByClassName('link-edit')[0]
textareaElm.style.height = (height - 10) + 'px'
let td = item[i].getElementsByClassName('td')
td[0].getElementsByClassName('input')[0].value = this.options.attribute.vr.content[index].name
td[1].getElementsByClassName('input')[0].value = this.options.attribute.vr.content[index].url
let btn = item[i].getElementsByTagName('button')
for (let n = 0; n < btn.length; n++) {
if (!btn[n] || !btn[n].attributes) {
continue
}
for (let m of btn[n].attributes) {
if (m.name === '@click') {
btn[n].addEventListener('click', (e) => {
if (typeof (fun[m.value]) === 'function') {
fun[m.value]({ name: td[0].getElementsByClassName('input')[0].value, url: td[1].getElementsByClassName('input')[0].value }, i)
}
});
btn[n].attributes.removeNamedItem(m.name)
break
}
}
}
break
}
}
},
vrDelete: (i) => {
this.options.attribute.vr.content.splice(i, 1)
this.attributeVr = this.options.attribute.vr.content
},
confirmEdit: (value, i) => {
let name = value.name && value.name.replace(/\s/g, "")
let url = value.url && value.url.replace(/\s/g, "")
if (name && url) {
this.options.attribute.vr.content[i] = value
}
else {
window.ELEMENT && window.ELEMENT.Message({
message: '名称或链接不能为空!',
type: 'warning',
duration: 1500
});
}
this.attributeVr = this.options.attribute.vr.content
},
cancelEdit: () => {
this.attributeVr = this.options.attribute.vr.content
},
fileSelect: (value, i) => {
let fileElm = item[i].getElementsByClassName('file-select')[0]
fileElm.click()
fileElm.removeEventListener('change', fileSelect)
fileElm.addEventListener('change', fileSelect)
}
}
let fileSelect = (event) => {
if (event.target.value) {
let td = item[event.target.getAttribute('index')].getElementsByClassName('td')
td[1].getElementsByClassName('input')[0].value = event.target.value
event.target.value = null
}
}
for (let i = 0; i < item.length; i++) {
let btn = item[i].getElementsByTagName('button')
for (let n = 0; n < btn.length; n++) {
if (!btn[n] ||!btn[n].attributes) {
continue
}
for (let m of btn[n].attributes) {
if (m.name === '@click') {
btn[n].addEventListener('click', (e) => {
if (typeof (fun[m.value]) === 'function') {
fun[m.value](i)
}
});
btn[n].attributes.removeNamedItem(m.name)
break
}
}
}
}
}
get attributeGoods() {
return this.options.attribute.goods.content
}
set attributeGoods(v) {
this.options.attribute.goods.content = v
}
// 编辑框
async edit(state) {
let _this = this
this.originalOptions = this.deepCopyObj(this.options)
if (this._DialogObject && this._DialogObject.close) {
this._DialogObject.close()
this._DialogObject = null
}
if (state) {
this._DialogObject = await new Dialog(this.sdk, this.options, {
title: '立体雷达扫描属性', left: '180px', top: '100px',
confirmCallBack: (options) => {
this.name = this.name.trim()
if (!this.name) {
this.name = '未命名对象'
}
this.options.label.position = { lng: this.label.position[0], lat: this.label.position[1], alt: this.options.alt + this.options.radius }
this.label.position = [this.options.label.position.lng, this.options.label.position.lat, this.options.label.position.alt]
this.originalOptions = this.deepCopyObj(this.options)
this._DialogObject.close()
this.Dialog.confirmCallBack && this.Dialog.confirmCallBack(this.originalOptions)
syncData(this.sdk, this.options.id)
syncSplitData(this.sdk, this.options.id)
},
resetCallBack: () => {
this.reset()
this.Dialog.resetCallBack && this.Dialog.resetCallBack()
},
removeCallBack: () => {
this.Dialog.removeCallBack && this.Dialog.removeCallBack(this.options)
},
closeCallBack: () => {
this.reset()
this.Dialog.closeCallBack && this.Dialog.closeCallBack()
if (this.positionEditing) {
this.positionEditing = false
}
this.positionEditing = false
},
showCallBack: (show) => {
this.options.show = show
this.originalOptions.show = show
this.show = show
this.Dialog.showCallBack && this.Dialog.showCallBack()
},
translationalCallBack: () => {
this.positionEditing = !this.positionEditing
}
}, true)
this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' radar-scan-stereoscopic'
let contentElm = document.createElement('div');
contentElm.innerHTML = html(this)
this._DialogObject.contentAppChild(contentElm)
this.attributeType = this.options.attributeType
this.attributeCamera = this.options.attribute.camera.content
this.attributeISC = this.options.attribute.ISC.content
// 创建标签页
let tabsElm = new cy_tabs('radar-scan-edit-tabs', undefined, this.sdk)
// 颜色组件
let colorOutPicker = new YJColorPicker({
el: contentElm.getElementsByClassName("colorOut")[0],
size: 'mini',//颜色box类型
alpha: true,//是否开启透明度
defaultColor: this.colorOut,
disabled: false,//是否禁止打开颜色选择器
openPickerAni: 'opacity',//打开颜色选择器动画
sure: (color) => {
this.colorOut = color
},//点击确认按钮事件回调
clear: () => {
this.colorOut = 'rgba(255,255,255,1)'
},//点击清空按钮事件回调
})
let colorInPicker = new YJColorPicker({
el: contentElm.getElementsByClassName("colorIn")[0],
size: 'mini',//颜色box类型
alpha: true,//是否开启透明度
defaultColor: this.colorIn,
disabled: false,//是否禁止打开颜色选择器
openPickerAni: 'opacity',//打开颜色选择器动画
sure: (color) => {
this.colorIn = color
},//点击确认按钮事件回调
clear: () => {
this.colorIn = 'rgba(255,255,255,1)'
},//点击清空按钮事件回调
})
let labelColorPicker = new YJColorPicker({
el: contentElm.getElementsByClassName("labelColor")[0],
size: 'mini',//颜色box类型
alpha: true,//是否开启透明度
defaultColor: this.labelColor,
disabled: false,//是否禁止打开颜色选择器
openPickerAni: 'opacity',//打开颜色选择器动画
sure: (color) => {
this.labelColor = color
},//点击确认按钮事件回调
clear: () => {
this.labelColor = 'rgba(255,255,255,1)'
},//点击清空按钮事件回调
})
let lineColorPicker = new YJColorPicker({
el: contentElm.getElementsByClassName("labelLineColor")[0],
size: 'mini',//颜色box类型
alpha: true,//是否开启透明度
defaultColor: this.labelLineColor,
disabled: false,//是否禁止打开颜色选择器
openPickerAni: 'opacity',//打开颜色选择器动画
sure: (color) => {
this.labelLineColor = color
},//点击确认按钮事件回调
clear: () => {
this.labelLineColor = 'rgba(255,255,255,1)'
},//点击清空按钮事件回调
})
let labelBackgroundColorStartPicker = new YJColorPicker({
el: contentElm.getElementsByClassName("labelBackgroundColorStart")[0],
size: 'mini',
alpha: true,
defaultColor: this.labelBackgroundColorStart,
disabled: false,
openPickerAni: 'opacity',
sure: (color) => {
this.labelBackgroundColorStart = color
},
clear: () => {
this.labelBackgroundColorStart = 'rgba(255,255,255,1)'
},
})
let labelBackgroundColorEndPicker = new YJColorPicker({
el: contentElm.getElementsByClassName("labelBackgroundColorEnd")[0],
size: 'mini',
alpha: true,
defaultColor: this.labelBackgroundColorEnd,
disabled: false,
openPickerAni: 'opacity',
sure: (color) => {
this.labelBackgroundColorEnd = color
},
clear: () => {
this.labelBackgroundColorEnd = 'rgba(255,255,255,1)'
},
})
let all_elm = contentElm.getElementsByTagName("*")
this._EventBinding.on(this, all_elm)
this._elms = this._EventBinding.element
this._elms.colorOut = [colorOutPicker]
this._elms.colorIn = [colorInPicker]
this._elms.labelColor = [labelColorPicker]
this._elms.labelLineColor = [lineColorPicker]
this._elms.labelBackgroundColorStart = [labelBackgroundColorStartPicker]
this._elms.labelBackgroundColorEnd = [labelBackgroundColorEndPicker]
let inputRadiusElm = this._DialogObject._element.content.getElementsByClassName('input-radius')[0].getElementsByTagName('input')[0]
inputRadiusElm.value = this.options.radius
this._elms.radius = [inputRadiusElm]
inputRadiusElm.addEventListener('input', (e) => {
let unitDataLegpElm = this._DialogObject._element.content.getElementsByClassName('input-radius-unit')[0].getElementsByTagName('input')[0]
let unit = unitDataLegpElm.value
if (e.target.value || e.target.value === 0) {
let value = e.target.value
value = Number(value)
if (e.data != '.' && (e.data != '-' || e.target.value)) {
if (((!e.target.max) && (!e.target.min)) || ((value <= (Number(e.target.max) / (unit === '米' ? 1 : 1000))) && value >= Number(e.target.min))) {
this.radius = value * (unit === '米' ? 1 : 1000)
}
}
}
})
inputRadiusElm.addEventListener('blur', (e) => {
let unitDataLegpElm = this._DialogObject._element.content.getElementsByClassName('input-radius-unit')[0].getElementsByTagName('input')[0]
let unit = unitDataLegpElm.value
if (e.target.value || e.target.value === 0) {
let value = e.target.value
value = Number(value)
if ((e.target.max) && value > (Number(e.target.max) / (unit === '米' ? 1 : 1000))) {
value = (Number(e.target.max) / (unit === '米' ? 1 : 1000))
}
if ((e.target.min) && value < Number(e.target.min)) {
value = Number(e.target.min)
}
this.radius = Number((value * (unit === '米' ? 1 : 1000)).toFixed(2))
}
})
setTimeout(() => {
this.attributeLink = this.options.attribute.link.content
this.attributeVr = this.options.attribute.vr.content
this.ISCSelect && this.ISCSelect()
this.goodsSelect && this.goodsSelect()
this.cameraSelect && this.cameraSelect()
let tagData = this.attributeSelect
let attributeElm = this._DialogObject._element.content.getElementsByClassName('attribute-select-box')[0]
if (attributeElm) {
let legpObject = legp(attributeElm, ".attribute-select")
legpObject.legp_search(tagData)
let attributeSelectElm = attributeElm.getElementsByTagName('input')[0]
for (let i = 0; i < tagData.length; i++) {
if (tagData[i].key === this.options.attributeType) {
attributeSelectElm.value = tagData[i].value
legpObject.legp_searchActive(tagData[i].value)
break
}
}
attributeSelectElm.addEventListener('input', () => {
for (let i = 0; i < tagData.length; i++) {
if (tagData[i].value === attributeSelectElm.value) {
this.attributeType = tagData[i].key
break
}
}
})
}
let unitData = [
{
name: '米',
value: '米'
},
{
name: '千米',
value: '千米'
}
]
let unitDataElm = this._DialogObject._element.content.getElementsByClassName('input-radius-unit-box')[0]
if (unitDataElm) {
let unitDataLegpObject = legp(unitDataElm, ".input-radius-unit")
unitDataLegpObject.legp_search(unitData)
let unitDataLegpElm = this._DialogObject._element.content.getElementsByClassName('input-radius-unit')[0].getElementsByTagName('input')[0]
unitDataLegpElm.value = unitData[0].value
unitDataLegpElm.addEventListener('input', () => {
let radiusElmBox = this._DialogObject._element.content.getElementsByClassName('input-radius')[0]
let unitElm = radiusElmBox.getElementsByClassName('unit')[0]
let radiusElm = radiusElmBox.getElementsByClassName('input')[0]
switch (unitDataLegpElm.value) {
case '米':
if (unitElm.innerHTML === 'km') {
unitElm.innerHTML = 'm'
radiusElm.value = Number((radiusElm.value * 1000).toFixed(2))
}
break
case '千米':
if (unitElm.innerHTML === 'm') {
unitElm.innerHTML = 'km'
radiusElm.value = Number((radiusElm.value / 1000).toFixed(5))
}
break
default:
break
}
})
}
let fontData = getFontList()
let fontObject = legp(
this._DialogObject._element.content.getElementsByClassName(
'font-select-box'
)[0],
'.font-select'
)
if (fontObject) {
fontObject.legp_search(fontData)
let fontDataLegpElm = this._DialogObject._element.content
.getElementsByClassName('font-select')[0]
.getElementsByTagName('input')[0]
fontDataLegpElm.value = fontData[this.labelFontFamily].value
for (let i = 0; i < fontData.length; i++) {
if (fontData[i].value == fontDataLegpElm.value) {
fontObject.legp_searchActive(fontData[i].value)
break
}
}
fontDataLegpElm.addEventListener('input', () => {
for (let i = 0; i < fontData.length; i++) {
if (fontData[i].value === fontDataLegpElm.value) {
this.labelFontFamily = fontData[i].key
break
}
}
})
this._elms.labelFontFamily = [fontDataLegpElm]
}
}, 0);
}
}
static changeParam(that) {
}
async flyTo(options = {}) {
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) {
position = { ...this.options.position }
}
else if (this.options.positions) {
position = { ...this.options.positions[0] }
}
else if (this.options.center) {
position = { ...this.options.center }
}
else if (this.options.start) {
position = { ...this.options.start }
}
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 {
let height = await this.getClampToHeight({ lng: this.options.lng, lat: this.options.lat })
this.sdk.viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(this.options.lng, this.options.lat, this.options.radius * 6 + height),
orientation: options.orientation || {
heading: Cesium.Math.toRadians(0.0),
pitch: Cesium.Math.toRadians(-90.0),
roll: Cesium.Math.toRadians(0.0)
},
duration: 1,
});
}
}
reset() {
if (!this.entity) {
return
}
this.options = this.deepCopyObj(this.originalOptions)
this.name = this.originalOptions.name
this.lng = this.originalOptions.lng
this.lat = this.originalOptions.lat
this.alt = this.originalOptions.alt
this.colorOut = this.originalOptions.colorOut
this.colorIn = this.originalOptions.colorIn
this.radius = this.originalOptions.radius
this.duration = this.originalOptions.duration
this.labelShow = this.originalOptions.label.show
this.labelColor = this.originalOptions.label.color
this.labelFontSize = this.originalOptions.label.fontSize
this.labelFontFamily = this.originalOptions.label.fontFamily
this.labelScaleByDistance = this.originalOptions.label.scaleByDistance
this.labelNear = this.originalOptions.label.near
this.labelFar = this.originalOptions.label.far
this.labelLineWidth = this.originalOptions.label.lineWidth
this.labelPixelOffset = this.originalOptions.label.pixelOffset
this.labelLineColor = this.originalOptions.label.lineColor
this.labelBackgroundColorStart = this.originalOptions.label.backgroundColor[0]
this.labelBackgroundColorEnd = this.originalOptions.label.backgroundColor[1]
this.instruct = this.originalOptions.instruct
this.operatingPoint = this.originalOptions.operatingPoint
this.attributeLink = this.options.attribute.link.content
this.attributeVr = this.options.attribute.vr.content
this.attributeCamera = this.options.attribute.camera.content
this.attributeGoods = this.options.attribute.goods.content
this.attributeISC = this.options.attribute.ISC.content
this.positionEditing = false
this.cameraSelect && this.cameraSelect()
this.goodsSelect && this.goodsSelect()
}
async remove() {
this.label.remove()
this.sdk.viewer.entities.remove(this.entity)
this.entity = null
if (this._DialogObject && !this._DialogObject.isDestroy) {
this._DialogObject.close()
this._DialogObject = null
}
await this.sdk.removeIncetance(this.options.id)
await syncData(this.sdk, this.options.id)
}
instructSubmit() {
this.Dialog.instructSubmit && this.Dialog.instructSubmit(this.options.id, this.options.label.text, this.instruct)
this.originalOptions.instruct = this.instruct
}
operatingPointSubmit() {
this.Dialog.operatingPointSubmit && this.Dialog.operatingPointSubmit(this.options.id, this.options.label.text, this.operatingPoint)
this.originalOptions.operatingPoint = this.operatingPoint
}
_addLink() {
if (this._DialogObject._element.content.getElementsByClassName('link_add')[0].value) {
this.options.attribute.link.content.push({
name: '链接',
url: this._DialogObject._element.content.getElementsByClassName('link_add')[0].value
})
this._DialogObject._element.content.getElementsByClassName('link_add')[0].value = ''
this.attributeLink = this.options.attribute.link.content
}
else {
this.Dialog.clickAddLink && this.Dialog.clickAddLink()
}
}
addAttributeLink(link) {
this.options.attribute.link.content.push({
name: '链接',
url: link
})
this.attributeLink = this.options.attribute.link.content
}
_addRr() {
if (this._DialogObject._element.content.getElementsByClassName('vr_add')[0].value) {
this.options.attribute.vr.content.push({
name: '全景图' ,
url: this._DialogObject._element.content.getElementsByClassName('vr_add')[0].value
})
this._DialogObject._element.content.getElementsByClassName('vr_add')[0].value = ''
this.attributeVr = this.options.attribute.vr.content
}
else {
this.Dialog.clickAddVr && this.Dialog.clickAddVr()
}
}
addAttributeRr(vr) {
this.options.attribute.vr.content.push({
name: '全景图' ,
url: vr
})
this.attributeVr = this.options.attribute.vr.content
}
/**
* 打开富文本框
*/
openRichTextEditor(e) {
richText.open(this.options.id, this.options.name, this.options.richTextContent)
richText.primaryCallBack = (content) => {
this.options.richTextContent = content
}
}
setDIV(options = { domid: "", x: 10, y: 10 }) {
options.x = (options.x || options.x === 0) ? options.x : 10
options.y = (options.y || options.y === 0) ? options.y : 10
let siteInfoDom = document.getElementById(options.domid)
let siteInfoPosition = Cesium.Cartesian3.fromDegrees(this.options.lng, this.options.lat, this.options.alt + this.options.radius)
this.sdk.viewer.scene.postRender.addEventListener((percentage) => {
//转换到屏幕坐标
if (siteInfoDom.style.display === 'block' || siteInfoDom.style.display === '') {
let winpos = this.sdk.viewer.scene.cartesianToCanvasCoordinates(siteInfoPosition);
if (winpos) {
siteInfoDom.style.left = (winpos.x + options.x).toFixed(0) + 'px';
siteInfoDom.style.top = (winpos.y + options.y).toFixed(0) + 'px';
}
}
});
}
}
export default RadarScanStereoscopic