jihongshun
3 天以前 f4c90cdeda652f0d40d04eefde317626593d19e5
src/utils/components/init-map.vue
@@ -30,19 +30,92 @@
      
    </div>
    <div class="zoom-info">
        <el-tag type="success">倍率: {{ zoomRatio.toFixed(1) }}X</el-tag><br>
        <!-- <el-tag type="success">倍率: {{ zoomRatio.toFixed(1) }}X</el-tag><br>
        <el-tag type="success">距离: {{ betweenDistance.toFixed(1) }}米</el-tag><br>
        <el-tag type="success">P: {{ cameraP }}&nbsp;&nbsp;T: {{ cameraT }} </el-tag>
        <el-tag type="success">P: {{ cameraP }}&nbsp;&nbsp;T: {{ cameraT }} </el-tag> -->
        <el-button type="primary" plain @click="doAction(chooseItem, '悬停')">悬停</el-button></br>
        <el-button type="success" plain @click="doAction(chooseItem, '拍照')">拍照</el-button></br>
        <el-button type="info" plain @click="doAction(chooseItem, '开始录像')">开始录像</el-button></br>
        <el-button type="info" plain @click="doAction(chooseItem, '结束录像')">结束录像</el-button>
    </div>
    
    
    <!-- botton -->
    <div class="cesiumBotton">
      <div class="cesiumButtonGroup">
        <el-button id="groundPoi" @click="addGroundPoi()" type="primary">地面点</el-button>
        <el-input v-model="mergeNumber" placeholder="请输入合并范围" type="number" style="width: 150px;"></el-input>
        <el-button  @click="mergePoint()" type="success">合并</el-button>
      <div class="cesiumContent">
        <div class="flyAction">
          <div class="actionName">{{currentAction ?currentAction.type :'' }}</div>
          <i class="el-icon-delete" />
        </div>
        <div class="flayDataAll">
          <div class="flyData">
            <div v-if="currentAction && (currentAction.type == '悬停')">
              <div>暂停时间</div>
              <div class="stopContent">
                  <!-- 减按钮 -->
                  <el-button size="mini" @click="changeTime(-100)" type="info">-100</el-button>
                  <el-button size="mini" @click="changeTime(-10)" type="info">-10</el-button>
                  <el-button size="mini" @click="changeTime(-1)" type="info">-1</el-button>
                  <!-- 可编辑数字 -->
                  <div class="stopNumber">
                    <el-input-number
                      v-model="time"
                      :min="0"
                      :controls="false"
                      style="margin: 0 15px; width: 60px;"
                      @change="onChange"
                      class="custom-input"
                    >
                    </el-input-number>
                    <span style="margin-left: -10px;">s</span>
                  </div>
                  <!-- 加按钮 -->
                  <el-button size="mini" @click="changeTime(1)" type="info">+1</el-button>
                  <el-button size="mini" @click="changeTime(10)" type="info">+10</el-button>
                  <el-button size="mini" @click="changeTime(100)" type="info">+100</el-button>
              </div>
            </div>
            <div v-if="currentAction && (currentAction.type == '拍照')">
               <div v-if="!isEditingPhoto"  class="editable-text">
                  {{ takePhoto }}
                  <i class="el-icon-edit"  @click.stop="startEditing"/>
                </div>
                <div v-else >
                  <div class="editable-container">
                    <input
                      v-model="newTakePhoto"
                      type="text"
                      class="editable-input"
                      autofocus
                    />
                  </div>
                  <button @click.stop="validateInput"  class="validate-btn">✔</button>
                  <button @click.stop="cancelEditing" class="cancel-btn">✖</button>
                </div>
            </div>
            <div v-if="currentAction && (currentAction.type == '开始录像')">
               <div v-if="!isEditingVideo"  class="editable-text">
                  {{ takeVideo }}
                  <i class="el-icon-edit"  @click.stop="startEditingVideo"/>
                </div>
                <div v-else >
                  <div class="editable-container">
                    <input
                      v-model="newTakeVideo"
                      type="text"
                      class="editable-input"
                      autofocus
                    />
                  </div>
                  <button @click.stop="validateVideoInput"  class="validate-btn">✔</button>
                  <button @click.stop="cancelVideoEditing" class="cancel-btn">✖</button>
                </div>
            </div>
          </div>
        </div>
      </div>
      <!-- <div class="key-container">
        <div class="arrow-row">
          <div
@@ -95,7 +168,11 @@
          </div>
      </div> -->
    </div>
    <el-button id="groundPoi" class="groundPoi" @click="addGroundPoi()" type="info" plain >地面点</el-button>
    <div class="cesiumButtonGroup">
      <el-input v-model="mergeNumber" placeholder="合并范围" type="number" style="width: 120px;"></el-input>
      <el-button  @click="mergePoint()" type="success">合并</el-button>
    </div>
    <!-- 动态坐标、动态相机参数显示 -->
    <!-- <div id="moveResult" class="moveResult">
      <div id="moveResultCon" class="moveResultCon"></div>
@@ -139,6 +216,9 @@
    deviceData: {
      type: Object,
    },
    chooseItem:{
      type: Object
    }
  },
  data(){
    return{
@@ -180,7 +260,16 @@
        cameraT:0.0,
        pointGround: { lon: 0, lat: 0, height: 0 },
        pointFly: { lon: 0, lat: 0, height: 0 },
        rowData:null
        rowData:null,
        time: 10,
        takePhoto: '111',  // 初始数据
        newTakePhoto: '',  // 编辑时的新数据
        isEditingPhoto: false,  // 控制是否处于编辑状态
        takeVideo: '111',  // 初始数据
        newTakeVideo: '',  // 编辑时的新数据
        isEditingVideo: false,  // 控制是否处于编辑状态
        actionCounter:0,
        currentAction:null
    }
  },
  mounted(){
@@ -518,7 +607,7 @@
      window.addEventListener("keydown", this.onKeyDown);
      window.addEventListener("keyup", this.onKeyUp);
    },
    removeKeyboardEvents() {
    removeKeyboaardEvents() {
      window.removeEventListener("keydown", this.onKeyDown);
      window.removeEventListener("keyup", this.onKeyUp);
    },
@@ -1179,15 +1268,97 @@
          }
        })
      }
    }
    },
    editAction(action){
      // 点击左侧小图标,右侧切换到该 action
      this.currentAction = action;
      console.log(action)
      console.log(this.currentAction)
      if(action.type == '悬停') {
          this.time = action.extra.value
      } else if(action.type == '拍照'){
          this.takePhoto = action.extra.value
      }else if(action.type == '开始录像'){
          this.takeVideo = action.extra.value
      }else if(action.type == '结束录像'){
      }
    },
    changeTime(val) {
      this.time += val;
      if (this.time < 0) this.time = 0; // 最小值限制
      this.currentAction.extra.value = this.time
      console.log(this.currentAction)
    },
    onChange(value) {
      if (value < 0) this.time = 0;
    },
    startEditing() {
      this.newTakePhoto = this.takePhoto;  // 进入编辑时,保存当前的值
      this.isEditingPhoto = true;
      window.removeEventListener("keydown", this.onKeyDown);
      window.removeEventListener("keyup", this.onKeyUp);
    },
    validateInput() {
      console.log(this.newTakePhoto)
      this.takePhoto = this.newTakePhoto;  // 点击对号时,更新数据
      this.isEditingPhoto = false;  // 结束编辑
      this.currentAction.extra.value = this.newTakePhoto
    },
    cancelEditing() {
      this.newTakePhoto = this.takePhoto;  // 点击取消时,恢复原数据
      this.isEditingPhoto = false;  // 结束编辑
    },
    startEditingVideo() {
      this.newTakeVideo = this.takeVideo;  // 进入编辑时,保存当前的值
      this.isEditingVideo = true;
    },
    validateVideoInput() {
      this.takeVideo = this.newTakeVideo;  // 点击对号时,更新数据
      this.isEditingVideo = false;  // 结束编辑
      this.currentAction.extra.value = this.newTakeVideo
    },
    cancelVideoEditing() {
      this.newTakeVideo = this.takeVideo;  // 点击取消时,恢复原数据
      this.isEditingVideo = false;  // 结束编辑
    },
    doAction(point, type){
      this.actionCounter++;
      let action = {
        id: this.actionCounter,
        type,
        extra: {}
      };
      if(type == '悬停') {
          action.extra.value = this.time
      } else if(type == '拍照'){
          action.extra.value = this.newTakePhoto
      }else if(type == '开始录像'){
          action.extra.value = this.newTakeVideo
      }else if(type == '结束录像'){
          action.extra.value = 'stopVideo'
      }
      console.log(action)
      point.actions.push(action);
      console.log(point)
      this.$emit('dealAction',point)
      this.time = 10
      this.newTakePhoto = '111'
      this.newTakeVideo = '111'
      this.takeVideo = '111'
      this.takePhoto = '111'
      // 切换到右侧
      this.currentAction = action;
    },
  }
}
</script>
<style scoped>
.cesium-example{
  height: calc(100vh - 185px);
  /* height: calc(100vh - 185px); */
  height: 100%;
}
#cesiumContainer {
    margin: 0;
@@ -1202,7 +1373,7 @@
    /* padding: 0 5px; */
    right: 10px;
    /* top: 0px; */
    bottom: 80px;
    bottom: 30px;
    margin: 0;
    width: 400px;
    height: 300px;
@@ -1222,11 +1393,74 @@
    bottom: 30px;
    margin: 0;
}
.cesiumContent {
  position: absolute;
  width: 100%;
  height: calc(50% + 5px);
  top:-5px;
}
.stopContent {
  display: flex;
  align-items: center;
}
.stopContent .el-button--mini {
  padding: 4px 9px;
}
.stopNumber {
  flex: 1;
  justify-content: center;
  align-items: center;
  margin: 0 4px;
  display: flex
}
.stopNumber .el-input .el-input--medium .el-input--medium .el-input__inner {
  height: 28px!important;
  line-height: 28px!important;
}
.flyAction{
  height: 55px;
  line-height: 55px;
  background-color: #232323;
  display: flex;
  justify-content: space-between;
  border-bottom: 1px solid #ddd;
}
.actionName {
  margin-left: 20px;
  font-size: 14px;
  color: white;
}
.flyAction i {
  font-size: 18px;
  line-height: 55px;
  margin-right: 20px;
}
.flayDataAll {
  background-color:#232323;
  /* height: calc(100% - 55px); */
  height: calc(100% - 5px);
  width: 100%;
}
.flyData{
  width: calc(100% - 32px);
  /* height: calc(100% - 55px); */
  height: calc(100% - 5px);
  margin: auto;
  color: white;
}
.cesiumButtonGroup{
  position: absolute;
  bottom: 0;
  top: 15px;
  left: 100px;
  /* margin-top: 10px;
  margin-left: 10px; */
}
.groundPoi {
  position: absolute;
  top: 15px;
  left: 350px;
}
.moveResult{position:absolute;z-index:2;background-color:rgba(47,53,60,1);padding:0 5px;right:50%;bottom:30px;
    border:1px solid rgba(255,255,255,.1);box-sizing:content-box;width:220px;height:30px;font-size:14px;text-align:center}
@@ -1250,7 +1484,9 @@
  font-family: sans-serif;
  margin-top: 55px;
}
.el-icon-delete {
  cursor: pointer; /* 添加鼠标悬停时的小手效果 */
}
.arrow-row{
  display: flex;
  justify-content: center;
@@ -1293,7 +1529,7 @@
  height: 300px;
  position: absolute;
  right: 10px;
  bottom:80px;
  bottom:30px;
  /* background-color: red; */
  z-index: 9;
@@ -1328,4 +1564,61 @@
.el-slider.is-vertical .el-slider__marks-text{
  width: 30px!important;
}
</style>
<style>
.custom-input .el-input__inner {
  height: 28px;
  line-height:28px;
}
</style>
<style scoped>
.editable-text {
  display: flex;
  align-items: center;
  cursor: pointer;
  font-size: 16px;
  color: #fff;
  background-color: #333;
  padding: 8px;
  border-radius: 5px;
}
.editable-text  .el-icon-edit {
  position: absolute;
  right: 30px;
}
.edit-icon {
  margin-left: 10px;
  font-size: 20px;
  cursor: pointer;
}
.editable-container {
  display: flex;
  align-items: center;
}
.editable-input {
  font-size: 16px;
  padding: 5px;
  border: 1px solid #ccc;
  margin-right: 5px;
  border-radius: 5px;
}
.validate-btn, .cancel-btn {
  background-color: transparent;
  border: none;
  color: #fff;
  font-size: 20px;
  cursor: pointer;
  margin-left: 5px;
}
.validate-btn {
  color: green;
}
.cancel-btn {
  color: red;
}
</style>