guonan
2025-07-10 e92dd671ed1f79243bee0083aecbc5627b5cc7f6
src/components/menu/CrossSectionalAnalysis.vue
@@ -1,24 +1,89 @@
<template>
   <div style="display: flex; justify-content: space-between;">
      <div @click="initPickHandler">
         <img v-if="!isPicking" src="@/assets/img/timeline/断面.png" style="width: 26px;height: 26px;" />
         <img v-else src="@/assets/img/timeline/已断面.png" style="width: 26px;height: 26px;" />
      </div>
      <div @click="confirmPoints">
         <img v-if="!isUploaded" src="@/assets/img/timeline/上传.png" style="width: 26px;height: 26px;" />
         <img v-else src="@/assets/img/timeline/已上传.png" style="width: 26px;height: 26px;" />
      </div>
      <div @click="clearPoints">
         <img src="@/assets/img/timeline/清除.png" style="width: 26px;height: 26px;" />
      </div>
      <!-- 第一个按钮:选取断面点 -->
      <el-tooltip placement="top" show-after="1000">
         <template #content>
            断面分析功能说明:
            <br /><br />
            🔹 点击按钮切换状态:
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;- 白色:关闭拾取功能(不可选点)
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;- 黄色:开启拾取功能(可点击地图选择2个断面点)
            <br /><br />
            🔹 使用流程:
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;1. 点击按钮切换为黄色 ➜ 开始拾取坐标点
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;2. 在地图上点击选择 2 个断面点(如需修改,可重新点击)
            <br /><br />
            ⚠️ 温馨提示:
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;每次只能分析一条沟渠的断面,多个断面可能导致计算异常;
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;使用完毕请将按钮切回白色,避免影响其他功能。
         </template>
         <div @click="initPickHandler" :class="{ active: isPicking }">
            <img v-if="!isPicking" src="@/assets/img/timeline/断面.png" style="width: 26px;height: 26px;" />
            <img v-else src="@/assets/img/timeline/已断面.png" style="width: 26px;height: 26px;" />
         </div>
      </el-tooltip>
      <!-- 第二个按钮:上传并分析断面 -->
      <el-tooltip placement="top" show-after="1000">
         <template #content>
            上传并分析断面数据:
            <br /><br />
            📌 条件限制:
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;仅当成功选择 2 个断面点后才可点击
            <br /><br />
            🔁 功能说明:
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;点击后将对当前断面进行分析,稍等片刻即可在图表区域查看结果
            <br /><br />
            ⚠️ 注意事项:
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;该功能仅支持单条沟渠分析,多个断面可能导致计算不稳定或出错
         </template>
         <div @click="confirmPoints" :class="{ disabled: !isReadyForUpload }">
            <img v-if="!isUploaded" src="@/assets/img/timeline/上传.png" style="width: 26px;height: 26px;" />
            <img v-else src="@/assets/img/timeline/已上传.png" style="width: 26px;height: 26px;" />
         </div>
      </el-tooltip>
      <!-- 第三个按钮:清除所有点和分析结果 -->
      <el-tooltip placement="top" show-after="1000">
         <template #content>
            清除所有断面点及分析结果:
            <br /><br />
            🔁 功能说明:
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;点击后将移除地图上的所有断面点以及相关分析图表
            <br /><br />
            ⚠️ 温馨提示:
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;此操作会清空当前分析进度,请确认后再执行
         </template>
         <div @click="clearPoints">
            <img src="@/assets/img/timeline/清除.png" style="width: 26px;height: 26px;" />
         </div>
      </el-tooltip>
   </div>
</template>
<script setup>
import { ElMessage } from 'element-plus';
import { ref, onMounted, defineExpose } from "vue";
import { getCrossSection } from '@/api/trApi.js'; // 假设你有真实接口
import { useSimStore } from '@/store/simulation';
import { storeToRefs } from 'pinia';
import { EventBus } from "@/eventBus";
const simStore = useSimStore();
const { selectedScheme } = storeToRefs(simStore);
const viewer = window.viewer;
let selectedSchemeId = selectedScheme.value.id
let pickedPointsCross = ref([]);
let pickHandlerCross = null;
@@ -52,7 +117,13 @@
// 选取两个断面点坐标并绘制断面截面
function addPointToViewer(point) {
   if (pickedPointsCross.value.length >= 2) {
      clearPoints();
      for (const id of pickedEntitiesIds.value) {
         viewer.entities.remove(viewer.entities.getById(id));
      }
      pickedPointsCross.value = [];
      pickedEntitiesIds.value = [];
      isWallCreated.value = false;
      isUploaded.value = false;
   }
   pickedPointsCross.value.push(point);
   drawPointOnMap(point);
@@ -106,14 +177,14 @@
   );
   const cylinderBottomHeight = 0;
   const cylinderTopHeight = terrainHeight + 190;
   const cylinderTopHeight = terrainHeight + 100;
   const cartesianBottom = viewer.scene.globe.ellipsoid.cartographicToCartesian(
      Cesium.Cartographic.fromDegrees(midLon, midLat, cylinderBottomHeight)
   );
   const CrosscylinderEntity = viewer.entities.add({
      position: cartesianBottom,
      cylinder: {
         length: 190.0,
         length: 100.0,
         topRadius: 1.0,
         bottomRadius: 1.0,
         material: Cesium.Color.YELLOW,
@@ -160,6 +231,15 @@
   pickedEntitiesIds.value = [];
   isWallCreated.value = false;
   isUploaded.value = false;
   if (pickHandlerCross) {
      pickHandlerCross.destroy();
      pickHandlerCross = null;
   }
   isPicking.value = false;
    simStore.crossSection = []
   EventBus.emit("clear-dM")
   console.log('这里发送请求,清空郭楠的echarts2');
}
function initPickHandler() {
   if (isPicking.value) {
@@ -191,7 +271,9 @@
   pickHandlerCross.setInputAction(clickAction, Cesium.ScreenSpaceEventType.LEFT_CLICK);
}
function confirmPoints() {
async function confirmPoints() {
   console.log(selectedSchemeId,'这里拿的是方案的数据');
   if (pickedPointsCross.value.length < 2) {
      ElMessage.warning('请先选择两个点后再进行确认!');
      return;
@@ -199,6 +281,7 @@
   const point1 = pickedPointsCross.value[0];
   const point2 = pickedPointsCross.value[1];
console.log(point1,point2);
   console.log('第一个点信息:', {
      longitude: point1.longitude,
@@ -211,11 +294,35 @@
      latitude: point2.latitude,
      cartesian: point2.cartesian
   });
   const startPoint = `${point1.longitude},${point1.latitude}`;
   const endPoint = `${point2.longitude},${point2.latitude}`;
   const result = await getCrossSectionInfo(startPoint, endPoint);
   simStore.crossSection = result
   console.log(result,'这里是郭楠需要的断面数据');
   isUploaded.value = true;
   ElMessage.success('正在进行--断面截面--数据分析上传,请稍等...');
}
  // 获取真实数据
function getCrossSectionInfo(a, b) {
  const params = {
    startPoint: a,
    endPoint: b,
    id: selectedSchemeId
  };
  return getCrossSection(params).then(data => {
    if (data && data.code === 200) {
      return data.data; // 返回原始数据数组
    } else {
      return [];
    }
  }).catch(error => {
    console.error('获取数据时发生错误:', error);
    ElMessage.warning('数据有误,请联系管理员或重新进行模拟!');
    return [];
  });
}
defineExpose({
   clearPoints
});