"use script"; //开发环境建议开启严格模式 // 移动位置、旋转 3dtiles class TilesEditor extends mars3d.BaseClass { //========== 构造方法 ========== constructor(options) { super(options); this.options = options; this.map = options.map; this.scene = this.map.scene; this._position = options.position; this._heading = options.heading || 0; this._range = options.range || 100; this.dragging = false; this.rotating = false; this._enabled = false; this.billboards = this.map.scene.primitives.add(new Cesium.BillboardCollection()); this.handler = new Cesium.ScreenSpaceEventHandler(this.map.canvas); //用来平移位置的指示器 this.movep = this.billboards.add({ position: this.position, color: Cesium.Color.fromCssColorString("#FFFF00"), image: options.moveImg, show: false, disableDepthTestDistance: Number.POSITIVE_INFINITY, }); //用来旋转的指示器 this.rotatep = this.billboards.add({ position: this.rotationPosition, color: Cesium.Color.fromCssColorString("#FFFF00"), image: options.rotateImg, show: false, disableDepthTestDistance: Number.POSITIVE_INFINITY, }); } //========== 对外属性 ========== //启用状态 get enabled() { return this._enabled; } set enabled(val) { this._enabled = val; if (val) { var self = this; this.handler.setInputAction((p) => { self.handler_onLeafDown(p); }, Cesium.ScreenSpaceEventType.LEFT_DOWN); this.handler.setInputAction((p) => { self.handler_onMouseMove(p); }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); this.handler.setInputAction((p) => { self.handler_onLeftUp(p); }, Cesium.ScreenSpaceEventType.LEFT_UP); this.rotatep.show = true; this.movep.show = true; } else { this.handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN); this.handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE); this.handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP); this.rotatep.show = false; this.movep.show = false; } } //移动位置的图标位置 get position() { return this._position; } set position(value) { this._position = value; this.movep.position = this.position; this.rotatep.position = this.rotationPosition; } //旋转方向的图标位置(依据位置和朝向计算) get rotationPosition() { if (this._position) { return mars3d.PointUtil.getPositionByDirectionAndLen(this._position, this._heading, this._range); } else { return null; } } get heading() { return this._heading; } set heading(value) { this._heading = value; if (this._position) { this.rotatep.position = this.rotationPosition; } } get range() { return this._range; } set range(value) { this._range = value; if (this._position) { this.rotatep.position = this.rotationPosition; } } //========== 方法 ========== handler_onLeafDown(event) { var pickedObjects = this.scene.drillPick(event.position, 2); for (var i = 0; i < pickedObjects.length; i++) { var pickedObject = pickedObjects[i]; if (Cesium.defined(pickedObject) && pickedObject.primitive === this.movep) { this.dragging = true; this.scene.screenSpaceCameraController.enableRotate = false; break; } else if (Cesium.defined(pickedObject) && pickedObject.primitive === this.rotatep) { this.rotating = true; this.scene.screenSpaceCameraController.enableRotate = false; break; } } } handler_onMouseMove(event) { var position = this.pickTerrain(event.endPosition); if (!position) { return; } if (this.dragging) { this.position = position; this.movep.position = this.position; this.rotatep.position = this.rotationPosition; this.fire(mars3d.EventType.change, { position: this._position, }); } else if (this.rotating) { this.rotatep.position = position; this._range = Cesium.Cartesian3.distance(this._position, position); this._heading = mars3d.MeasureUtil.getAngle(this._position, position); //模型是正东为0 this.fire(mars3d.EventType.change, { heading: this._heading, }); } } handler_onLeftUp(event) { if (this.dragging || this.rotating) { this.rotating = this.dragging = false; this.scene.screenSpaceCameraController.enableRotate = true; //如果没有这句话 会导致billboards的某些没有刷新,无法再次点击 this.billboards._createVertexArray = true; } } pickTerrain(wndpos) { var ray = this.map.camera.getPickRay(wndpos); var pos = this.map.scene.globe.pick(ray, this.map.scene); return pos; } remove() { //从场景中移除 if (this.billboards) { this.scene.primitives.remove(this.billboards); this.billboards = undefined; } this.rotatep.show = false; this.movep.show = false; } destroy() { this.remove(); this.handler.destroy(); //删除所有绑定的数据 for (let i in this) { delete this[i]; } } }