text: '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]
      }
    }
  }
  