Răsfoiți Sursa

一张图嵌入cad-提交

lxh 4 zile în urmă
părinte
comite
02b55f3bae

+ 1 - 1
src/views/vent/cad/dwgViewer.vue

@@ -144,7 +144,7 @@
   const viewerReady = ref(false);
   let viewer: Viewer2d | null = null;
 
-  const panelCollapsed = ref(false);
+  const panelCollapsed = ref(true);
   const placingMode = ref(false);
   const placingDevice = ref<DeviceInfo | null>(null);
   const currentCoord = reactive({ x: 0, y: 0, z: 0 });

+ 6 - 43
src/views/vent/home/configurable/components/content.vue

@@ -120,38 +120,11 @@
         <template v-else-if="config.name === 'generalist'">
           <generalList class="content__module" :generalData="config.data" />
         </template>
-        <template v-else-if="config.name === 'upDown'">
-          <!-- <upDown class="content__module" :option="config.config.items.option" :upDownData="config.data" /> -->
-          <gasZyList gasZyListrt class="content__module" :option="config.config.option" :listData="config.data" />
-        </template>
-        <template v-else-if="config.name === 'chart_inject'">
-          <gasInjectChart class="content__module" :option="config.config.option" :echartData="config.data" />
-        </template>
-        <template v-else-if="config.name === 'gas_inject_list'">
-          <gasInjectList class="content__module" :listData="config.data" />
-        </template>
-        <template v-else-if="config.name === 'gas_zy_chart'">
-          <gasZyChart class="content__module" :data="config.data" />
-        </template>
-        <template v-else-if="config.name === 'gas_warn_chart'">
-          <gasWarnChart class="content__module" :option="config.config.option" :echartData="config.data" />
-        </template>
-        <template v-else-if="config.name === 'gas_warn_list'">
-          <gasWarnList class="content__module" :option="config.config.option" :listData="config.data" />
-        </template>
-        <template v-else-if="config.name === 'gasdevice_status_control'">
-          <gasDeviceStatusControl class="content__module" :option="config.config.option" :statusData="config.data" />
-        </template>
-        <template v-else-if="config.name === 'board_gas'">
-          <gasBoard class="content__module" :option="config.config.option" :type="config.config.type"
-            :listData="config.data" />
-        </template>
-        <template v-else-if="config.name === 'gas_inject_card'">
-          <gasInjectCard class="content__module" :option="config.config.option" />
-        </template>
-        <template v-else-if="config.name === 'gas_cc_chart'">
-          <echartLine class="content__module" :echartOption="config.config.echartOption" :ecahrtData="config.data" />
-        </template>
+    
+    
+        
+        
+    
         <template v-else-if="config.name === 'jk-video'">
           <cameraModal class="content__module" :deviceId="config.data" />
         </template>
@@ -250,18 +223,8 @@ import RadioLabel from './preset/radioLabel.vue';
 import ButtonList from './preset/buttonList.vue';
 import cardList from './preset/cardList.vue';
 import generalList from './preset/generalList.vue';
-import upDown from './preset/upDown.vue'
-import gasInjectChart from './preset/gasInjectChart.vue'
-import gasInjectList from './preset/gasInjectList.vue'
-import gasZyChart from './preset/gasZyChart.vue'
-import gasZyList from './preset/gasZyList.vue'
-import gasWarnChart from './preset/gasWarnChart.vue'
-import gasWarnList from './preset/gasWarnList.vue'
-import gasDeviceStatusControl from './preset/gasDeviceStatusControl.vue'
-import gasBoard from './preset/gasBoard.vue'
-import gasInjectCard from './preset/gasInjectCard.vue'
+
 import cameraModal from './preset/cameraModal.vue'
-import echartLine from './preset/echartLine.vue'
 import CustomGalleryNew from './preset/CustomGalleryNew.vue'
 import ImageCardNew from './preset/ImageCardNew.vue'
 import BtnListNew from './preset/BtnListNew.vue'

+ 16 - 20
LongList.vue → src/views/vent/home/configurable/components/preset/LongList.vue

@@ -1,8 +1,9 @@
+
 <template>
   <div class="long-list">
     <div class="list-title">
       <span>设备列表</span>
-      <span style="margin-left: 5px">{{ count }}</span>
+      <span style="margin-left: 5px;">{{ count }}</span>
     </div>
     <div class="list-content">
       <div class="list-search">
@@ -10,32 +11,28 @@
       </div>
       <div class="content-container">
         <div class="content-nav">
-          <div
-            :class="activeIndex == index ? 'nav-item-active' : 'nav-item'"
-            v-for="(item, index) in navList"
-            :key="index"
-            @click="changeNav(item, index)"
-            >{{ item.label }}</div
-          >
+          <div :class="activeIndex == index ? 'nav-item-active' : 'nav-item'" v-for="(item, index) in navList"
+            :key="index" @click="changeNav(item, index)">{{ item.label }}</div>
         </div>
         <div class="content-box">
-          <basicDevice v-for="(item, index) in 10" :key="index"></basicDevice>
+          <basicDevice v-for="(item,index) in 10" :key="index"></basicDevice>
         </div>
       </div>
     </div>
+
   </div>
 </template>
 
 <script setup lang="ts">
-import { ref } from 'vue';
-import basicDevice from './src/views/vent/home/configurable/components/basicDevice.vue';
+import { ref } from 'vue'
+import basicDevice from '../basicDevice.vue'
 
 //设备列表数量
-let count = ref(0);
+let count = ref(0)
 //搜索条件
-let searchData = ref('');
+let searchData = ref('')
 //当前激活nav选项
-let activeIndex = ref(0);
+let activeIndex = ref(0)
 let navList = ref<any[]>([
   { label: '全部', value: '0' },
   { label: 'xxx', value: '1' },
@@ -43,11 +40,11 @@ let navList = ref<any[]>([
   { label: 'xxx', value: '3' },
   { label: 'xxx', value: '4' },
   { label: 'xxx', value: '5' },
-]);
+])
 
 //nav选项切换
 function changeNav(item, index) {
-  activeIndex.value = index;
+  activeIndex.value = index
 }
 </script>
 
@@ -55,8 +52,7 @@ function changeNav(item, index) {
 @import '/@/design/theme.less';
 
 @{theme-deepblue} {
-  .long-list {
-  }
+  .long-list {}
 }
 
 .long-list {
@@ -123,7 +119,7 @@ function changeNav(item, index) {
     background-color: #1d73a8;
     border-bottom: 2px solid #36c7ff;
   }
-  .content-box {
+  .content-box{
     height: calc(100% - 42px);
     overflow-y: auto;
   }
@@ -140,7 +136,7 @@ function changeNav(item, index) {
   .zxm-input-sm {
     padding: 0px 20px;
   }
-  ::-webkit-scrollbar {
+  ::-webkit-scrollbar{
     display: none;
   }
 }

+ 0 - 169
src/views/vent/home/configurable/components/preset/echartLine.vue

@@ -1,169 +0,0 @@
-<template>
-  <div class="echartLine">
-    <!-- 年月日切换 -->
-    <div v-if="echartOption.showTime" class="radio-box">
-      <a-radio-group v-model:value="nowData" name="radioGroup" @change="changeRadio">
-        <a-radio value="hours">按小时</a-radio>
-        <a-radio value="minutes">按分钟</a-radio>
-      </a-radio-group>
-    </div>
-    <div class="echart-line" ref="echartLines"></div>
-  </div>
-</template>
-
-<script setup lang="ts">
-import { nextTick, onMounted, reactive, ref, watch } from 'vue'
-import * as echarts from 'echarts';
-
-let props = defineProps({
-  //图表配置项
-  echartOption: {
-    type: Object as any
-  },
-  //图表数据
-  ecahrtData: {
-    type: Object as any
-  }
-})
-let echartLines = ref(null)
-let nowData = ref('hours')
-let ecahrtDatas = reactive({}) as any
-
-function getOption() {
-  nextTick(() => {
-    let myChart = echarts.init(echartLines.value);
-    let option = {
-      tooltip: props.echartOption.tooltip,
-      grid: props.echartOption.grid,
-      legend: props.echartOption.legend,
-      dataZoom: [
-        {
-          // 这部分是关键
-          show: true,
-          type: 'inside', // 这里可以选择你需要的类型,例如 'inside'
-          height: 10, // 设置缩放条高度
-          left: 'center',
-          bottom: 25,
-          labelPrecision: 0, // 标签精度,默认为auto
-          showDetail: false, // 是否显示详情
-          showDataShadow: false, // 是否显示数据阴影
-        },
-      ],
-      xAxis: [{
-        type: 'category',
-        boundaryGap: false,
-        axisLine: { //坐标轴轴线相关设置。数学上的x轴
-          show: true,
-          lineStyle: {
-            color: 'rgba(4, 49, 79)',
-          },
-        },
-        axisLabel: { //坐标轴刻度标签的相关设置
-          textStyle: {
-            color: '#a3a7ae',
-            padding: 5,
-            fontSize: 12
-          },
-          formatter: function (data) {
-            return data
-          }
-        },
-        splitLine: {
-          show: false,
-        },
-        axisTick: {
-          show: false,
-        },
-        data: ecahrtDatas.xData
-      }],
-      yAxis: props.echartOption.yAxis,
-      series: props.echartOption.series.map((el, index) => {
-        return {
-          ...el,
-          data: ecahrtDatas[el.data]
-        }
-      })
-    };
-    myChart.setOption(option);
-    window.onresize = function () {
-      myChart.resize();
-    };
-  });
-}
-//选项切换
-function changeRadio(val) {
-  console.log(val, 'val---')
-  nowData.value = val.target.value
-  getFormat()
-}
-//数据格式化
-function getFormat() {
-  if (nowData.value == 'hours') {
-    ecahrtDatas.xData = ecahrtDatas.hourData.xlist
-    ecahrtDatas.injectionPressure = ecahrtDatas.hourData.datalist.records.map(el => el.readData.injectionPressure) || []
-    ecahrtDatas.flowStdInstant = ecahrtDatas.hourData.datalist.records.map(el => el.readData.flowStdInstant) || []
-    ecahrtDatas.mixStdInstant = ecahrtDatas.hourData.datalist.records.map(el => el.readData.mixStdInstant) || []
-    ecahrtDatas.negativePressure = ecahrtDatas.hourData.datalist.records.map(el => el.readData.negativePressure) || []
-  } else if (nowData.value == 'minutes') {
-    ecahrtDatas.xData = ecahrtDatas.minitesData.xlist || []
-    ecahrtDatas.injectionPressure = ecahrtDatas.minitesData.datalist.records.map(el => el.readData.injectionPressure) || []
-    ecahrtDatas.flowStdInstant = ecahrtDatas.minitesData.datalist.records.map(el => el.readData.flowStdInstant) || []
-    ecahrtDatas.mixStdInstant = ecahrtDatas.minitesData.datalist.records.map(el => el.readData.mixStdInstant) || []
-    ecahrtDatas.negativePressure = ecahrtDatas.minitesData.datalist.records.map(el => el.readData.negativePressure) || []
-  }
-  getOption()
-}
-
-watch(() => props.echartOption, (newV, oldV) => {
-  if (!newV.showTime) {
-    nowData.value = ''
-  }
-}, { immediate: true, deep: true })
-
-watch(() => props.ecahrtData, (newV, oldV) => {
-  console.log(newV, '234234===')
-  if (newV) {
-    ecahrtDatas = Object.assign({}, newV)
-    getFormat()
-  }
-
-}, { immediate: true, deep: true })
-</script>
-
-<style lang="less" scoped>
-.echartLine {
-  position: relative;
-  width: 100%;
-  height: 100%;
-
-  .radio-box {
-    position: absolute;
-    right: 0;
-    top: 0%;
-  }
-
-  .echart-line {
-    width: 100%;
-    height: 100%;
-  }
-}
-
-::v-deep .radio-box {
-  background-color: transparent !important;
-}
-
-::v-deep .zxm-radio-inner {
-  background-color: transparent;
-}
-
-::v-deep .zxm-radio-wrapper {
-  font-size: 12px;
-}
-
-::v-deep .zxm-radio-inner {
-  width: 10px;
-  height: 10px;
-  top: -2px !important;
-}
-</style>
-© 2026 Gogs页面: 97ms 模板: 1ms 简体中文 官方网站

+ 0 - 290
src/views/vent/home/configurable/components/preset/gasBoard.vue

@@ -1,290 +0,0 @@
-<template>
-  <div class="gas-board">
-    <div :class="`board-box-${type}`" v-for="(item, index) in option" :key="index">
-      <div :class="`board-item-${type}`">
-        <div :class="`board-item-icon-${type}`">
-          <SvgIcon :class="`icon-style-${type}`" size="24" :name="item.iconName" />
-        </div>
-        <div :class="`board-item-content-${type}`">
-          <div :class="`item-content-label-${type}`">{{ item.label }}</div>
-          <div :class="`item-content-value-${type}`">
-            <span>{{ listData ?  listData[item.value] : '-'  }}</span>
-            <span style="margin-left: 10px;">{{ item.unit }}</span>
-          </div>
-        </div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script setup lang="ts">
-import { ref } from 'vue'
-import { SvgIcon } from '/@/components/Icon';
-
-let props = defineProps({
-  option: {
-    type: Array as any
-  },
-  type: {
-    type: String
-  },
-  listData:{
-    type:Object as any
-  }
-})
-
-// let listData = ref<any[]>(
-//   [
-//   { label: '氧气浓度', value: '60', iconName: 'o2-gas', unit: 'Nm³' },
-//   { label: '甲烷浓度', value: '60', iconName: 'ch4-gas', unit: 'm³/min' },
-//   { label: '温度', value: '60', iconName: 'temp-gas', unit: '' },
-//   { label: '风速', value: '60', iconName: 'wind-gas', unit: '' },
-// ]
-// )
-</script>
-
-<style lang="less" scoped>
-@import '/@/design/theme.less';
-
-@{theme-deepblue} {
-  .gas-board {
-    --image-gas_board_bg: url('@/assets/images/themify/deepblue/home-container/configurable/gasInjection/7-4.png');
-    --image-gas_board_bg1: url('@/assets/images/themify/deepblue/home-container/configurable/gasInjection/7-5.png');
-    --image-gas_board_bg2: url('@/assets/images/themify/deepblue/home-container/configurable/gasInjection/2-13.png');
-    --image-gas_board_bg3: url('@/assets/images/themify/deepblue/home-container/configurable/gasInjection/3-3.png');
-    --image-gas_board_bg4: url('@/assets/images/themify/deepblue/home-container/configurable/gasInjection/3-4.png');
-  }
-}
-
-.gas-board {
-  --image-gas_board_bg: url('@/assets/images/gasInjection/7-4.png');
-  --image-gas_board_bg1: url('@/assets/images/gasInjection/7-5.png');
-  --image-gas_board_bg2: url('@/assets/images/gasInjection/2-13.png');
-  --image-gas_board_bg3: url('@/assets/images/gasInjection/3-3.png');
-  --image-gas_board_bg4: url('@/assets/images/gasInjection/3-4.png');
-  display: flex;
-  flex-wrap: wrap;
-  width: 100%;
-  height: 100%;
-  padding: 15px 20px;
-  box-sizing: border-box;
-
-  .board-box-A {
-    width: 50%;
-    height: 50%;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-
-    &:nth-child(1) {
-      .board-item-A {
-        background: var(--image-gas_board_bg1) no-repeat;
-        background-size: 100% 100%;
-
-        .item-content-value-A {
-          color: #91e0ff;
-        }
-      }
-
-    }
-
-    &:nth-child(2) {
-      .board-item-A {
-        background: var(--image-gas_board_bg) no-repeat;
-        background-size: 100% 100%;
-
-        .item-content-value-A {
-          color: #2cffdd;
-        }
-      }
-
-    }
-
-    &:nth-child(3) {
-      .board-item-A {
-        background: var(--image-gas_board_bg) no-repeat;
-        background-size: 100% 100%;
-
-        .item-content-value-A {
-          color: #2cffdd;
-        }
-      }
-
-
-    }
-
-    &:nth-child(4) {
-      .board-item-A {
-        background: var(--image-gas_board_bg1) no-repeat;
-        background-size: 100% 100%;
-
-        .item-content-value-A {
-          color: #91e0ff;
-        }
-      }
-    }
-  }
-
-  .board-box-B {
-    width: 33.3%;
-    height: 33.3%;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-  }
-
-  .board-box-C {
-    width: 50%;
-    height: 50%;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-
-    &:nth-child(1) {
-      .board-item-C {
-        background: var(--image-gas_board_bg3) no-repeat;
-        background-size: 100% 100%;
-
-        .item-content-value-C {
-          color: #91e0ff;
-        }
-      }
-
-    }
-
-    &:nth-child(2) {
-      .board-item-C {
-        background: var(--image-gas_board_bg4) no-repeat;
-        background-size: 100% 100%;
-
-        .item-content-value-C {
-          color: #2cffdd;
-        }
-      }
-
-    }
-
-    &:nth-child(3) {
-      .board-item-C {
-        background: var(--image-gas_board_bg4) no-repeat;
-        background-size: 100% 100%;
-
-        .item-content-value-C {
-          color: #2cffdd;
-        }
-      }
-
-
-    }
-
-    &:nth-child(4) {
-      .board-item-C {
-        background: var(--image-gas_board_bg3) no-repeat;
-        background-size: 100% 100%;
-
-        .item-content-value-C {
-          color: #91e0ff;
-        }
-      }
-    }
-  }
-
-  .board-item-A {
-    position: relative;
-    width: 180px;
-    height: 60px;
-  }
-
-
-  .board-item-B {
-    position: relative;
-    width: 213px;
-    height: 57px;
-    background: var(--image-gas_board_bg2) no-repeat;
-    background-size: 100% 100%;
-  }
-
-  .board-item-C {
-    position: relative;
-    width: 194px;
-    height: 76px;
-  }
-
-  .board-item-icon-A {
-    position: absolute;
-    left: 24px;
-    top: 50%;
-    transform: translate(0, -35%);
-  }
-
-  .board-item-icon-B {
-    position: absolute;
-    left: 14px;
-    top: 50%;
-    transform: translate(0, -45%);
-  }
-
-  .board-item-icon-C {
-    position: absolute;
-    left: 24px;
-    top: 50%;
-    transform: translate(0, -45%);
-  }
-
-  .board-item-content-A {
-    position: absolute;
-    height: 100%;
-    left: 70px;
-    display: flex;
-    flex-direction: column;
-    justify-content: center;
-  }
-
-  .board-item-content-B {
-    position: absolute;
-    height: 100%;
-    left: 70px;
-    display: flex;
-    flex-direction: column;
-    justify-content: center;
-  }
-
-  .board-item-content-C {
-    position: absolute;
-    height: 100%;
-    left: 82px;
-    display: flex;
-    flex-direction: column;
-    justify-content: center;
-  }
-
-  .item-content-label-A {
-    margin-bottom: 10px;
-  }
-
-  .item-content-label-B {
-    margin-bottom: 10px;
-  }
-
-  .item-content-label-C {
-      font-size: 13px;
-    margin-bottom: 10px;
-  }
-
-  .item-content-value-A {
-    font-size: 12px;
-    font-family: 'douyuFont';
-  }
-
-  .item-content-value-B {
-    font-size: 12px;
-    color: #91e0ff;
-    font-family: 'douyuFont';
-  }
-
-  .item-content-value-C {
-    font-size: 12px;
-    font-family: 'douyuFont';
-  }
-}
-</style>

+ 0 - 256
src/views/vent/home/configurable/components/preset/gasDeviceStatusControl.vue

@@ -1,256 +0,0 @@
-<template>
-  <div class="device-status-control">
-    <div class="status-control-box" v-for="(item, index) in option" :key="index">
-      <SvgIcon class="icon-style" size="20" :name="item.iconName" />
-      <div class="control-box-title">{{ item.label }}</div>
-      <div class="control-box" v-if="item.isShowSwitch">
-        <div class="btn-item" :class="statusDatas[item.value] == '1' ? 'btn-avtive' : ''"
-          @click="handlerClick('open', item)">开启
-        </div>
-        <div class=" btn-item" :class="statusDatas[item.value] != '1' ? 'btn-avtive' : ''"
-          @click="handlerClick('close', item)">
-          关闭
-        </div>
-      </div>
-      <div class="control-box" v-else-if="item.toggleModel">
-        <div class="btn-item" :class="statusDatas[item.value] == '1' ? 'btn-avtive' : ''"
-          @click="handlerClick('jd', item)">就地
-        </div>
-        <div class="btn-item" :class="statusDatas[item.value] != '1' ? 'btn-avtive' : ''"
-          @click="handlerClick('yc', item)">
-          远程
-        </div>
-      </div>
-      <div class="control-box" v-else>
-        <a-input v-model:value="presure" size="small" placeholder="请输入" />
-        <span style="font-size: 12px;">MPa</span>
-        <div class="nav-btn" @click="handleSetting">
-          <div class="nav-text">
-            <SvgIcon class="icon-style1" size="12" name="gas-export"></SvgIcon>
-            <span @click="handlerClick('set', item)">设置</span>
-          </div>
-        </div>
-      </div>
-    </div>
-    <!--密码操作弹窗 -->
-    <a-modal v-model:visible="visibleTip" width="450px" okText="确定" cancelText="" title="提示" centered destroyOnClose
-      @cancel="handleCancel" @ok="handleOk">
-      <div class="pass-box" style="margin:25px 15px;">
-        <p style="display: flex;align-items: center;justify-content: center;">
-          <ExclamationCircleFilled style="color: #ffb700; font-size: 20px;margin-right: 10px;" />
-          您是否要进行{{ modalLabel }} ?
-        </p>
-        <div style="display: flex;align-items: center;">
-          <span style="width:100px">操作密码:</span>
-          <a-input-password v-model:value="passWords" :disabled="false" />
-        </div>
-      </div>
-    </a-modal>
-  </div>
-</template>
-
-<script setup lang="ts">
-import { reactive, ref, watch } from 'vue'
-import { SvgIcon } from '/@/components/Icon';
-import { ExclamationCircleFilled } from '@ant-design/icons-vue';
-import { useMessage } from '/@/hooks/web/useMessage';
-
-let props = defineProps({
-  option: {
-    type: Array as any
-  },
-  statusData: {
-    type: Object as any
-  }
-})
-
-const { createMessage } = useMessage();
-let statusDatas = reactive({}) as any
-let presure = ref('')
-let visibleTip = ref(false)//密码提示弹窗是否开启
-let modalLabel = ref('')
-let modalCode = ref('')
-let modalStatusVal = ref('')
-let passWords = ref('')//操作密码
-
-//设置
-function handleSetting() {
-
-}
-//按钮操作
-function handlerClick(param, item) {
-  passWords.value = ''
-  visibleTip.value = true
-  modalLabel.value = item.label
-  switch (param) {
-    case 'open':
-      statusDatas[item.value] = '1'
-      if (item.isPqfm) {
-        //排气端阀门
-        modalCode.value = 'runStatus'
-      } else {
-        //装备启停
-        modalCode.value = 'runStatus'
-      }
-      modalStatusVal.value = '1'
-      break;
-    case 'close':
-      statusDatas[item.value] = '0'
-      if (item.isPqfm) {
-        //排气端阀门
-        modalCode.value = 'runStatus'
-      } else {
-        //装备启停
-        modalCode.value = 'runStatus'
-      }
-      modalStatusVal.value = '0'
-      break;
-    case 'jd':
-      modalCode.value = 'remoteStatus'
-      modalStatusVal.value = '1'
-      break;
-    case 'yc':
-      modalCode.value = 'remoteStatus'
-      modalStatusVal.value = '0'
-      break;
-    case 'set':
-      modalCode.value = 'remoteStatus'
-      modalStatusVal.value = '1'
-      break;
-  }
-}
-//密码提示弹窗-确定
-async function handleOk() {
-  if (!passWords.value) {
-    createMessage.warning('请输入密码!');
-  } else {
-    let res = await devicecontrol({ deviceid: statusDatas.deviceId, devicetype: statusDatas.devicetype, masterComputer: 0, paramcode: modalCode.value, password: passWords.value, value:modalStatusVal.value })
-    console.log(res, '控制---')
-    if(res.success){
-       createMessage.success(res.message);
-       visibleTip.value = false
-    }
-    
-  }
-
-}
-//密码提示弹窗-关闭
-function handleCancel() {
-  visibleTip.value = false
-}
-
-
-watch(() => props.statusData, (newV, oldV) => {
-  if (newV) {
-    statusDatas = newV
-    presure.value = presure.value ? presure.value : newV.paramSetting
-  }
-})
-
-</script>
-
-<style lang="less" scoped>
-@import '/@/design/theme.less';
-
-@{theme-deepblue} {
-  .device-status-control {
-    --image-status_control_bg: url('@/assets/images/themify/deepblue/home-container/configurable/gasInjection/7-1.png');
-  }
-}
-
-.device-status-control {
-  --image-status_control_bg: url('@/assets/images/gasInjection/7-1.png');
-  display: flex;
-  flex-direction: column;
-  justify-content: space-between;
-  align-items: center;
-  width: 100%;
-  height: 100%;
-  padding: 15px 25px;
-  box-sizing: border-box;
-
-  .status-control-box {
-    position: relative;
-    width: 100%;
-    height: 39px;
-    background: var(--image-status_control_bg) no-repeat;
-    background-size: 100% 100%;
-  }
-
-  .icon-style {
-    position: absolute;
-    left: 10px;
-    top: 50%;
-    transform: translate(0, -50%);
-  }
-
-  .control-box-title {
-    position: absolute;
-    left: 50px;
-    top: 50%;
-    transform: translate(0, -50%);
-  }
-
-  .control-box {
-    position: absolute;
-    right: 0px;
-    top: 50%;
-    transform: translate(0, -50%);
-    display: flex;
-    align-items: center;
-  }
-
-  .btn-item {
-    font-size: 10px;
-    font-family: 'douyuFont';
-    display: flex;
-    align-items: center;
-    padding: 5px 10px 3px 10px;
-    border: 1px solid #2cb6ff;
-    border-radius: 4px;
-    margin-right: 5px;
-  }
-
-  .btn-open {
-    margin-right: 5px;
-  }
-
-  .btn-avtive {
-    background-color: rgba(44, 182, 255, .4);
-  }
-
-  .nav-btn {
-    width: 56px;
-    height: 78%;
-    padding: 2px;
-    border: 1px solid #1081d7;
-    cursor: pointer;
-    color: #fff;
-    margin-left: 10px;
-  }
-
-  .nav-text {
-    width: 100%;
-    height: 100%;
-    display: flex;
-    font-size: 12px;
-    justify-content: center;
-    align-items: center;
-    background-color: #1081d7;
-  }
-
-  .icon-style1 {
-    margin-right: 5px;
-  }
-
-}
-
-::v-deep .zxm-input-sm {
-  width: 70px;
-  margin-right: 5px;
-  height: 25px !important;
-  background-color: transparent !important;
-  border: 1px solid #2cb6ff;
-  color: #fff;
-}
-</style>

+ 0 - 88
src/views/vent/home/configurable/components/preset/gasInjectCard.vue

@@ -1,88 +0,0 @@
-<template>
-  <div class="gas-inject-card">
-    <div class="inject-card-item" v-for="(item, index) in listData" :key="index">
-      <div class="pie-bg"></div>
-      <div class="icon-bg"></div>
-      <div class="card-item-content">
-        <div class="content-label">{{ item.label }}</div>
-        <div class="content-value">{{ item.value }}</div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script setup lang="ts">
-import { ref } from 'vue'
-
-let listData = ref([
-  { label:'抽采单元-1',value:'xx'  },
-  { label:'抽采单元-2',value:'xx' },
-  { label:'抽采单元-3',value:'xx' }
-])
-</script>
-
-<style lang="less" scoped>
-@import '/@/design/theme.less';
-
-@{theme-deepblue} {
-  .gas-inject-card {
-    --image-inject_card_bg: url('@/assets/images/themify/deepblue/home-container/configurable/gasInjection/8-1.png');
-    --image-inject_card_bg1: url('@/assets/images/themify/deepblue/home-container/configurable/gasInjection/8-2.png');
-    --image-inject_card_bg2: url('@/assets/images/themify/deepblue/home-container/configurable/gasInjection/8-3.png');
-  }
-}
-
-.gas-inject-card {
-  --image-inject_card_bg: url('@/assets/images/gasInjection/8-1.png');
-  --image-inject_card_bg1: url('@/assets/images/gasInjection/8-2.png');
-  --image-inject_card_bg2: url('@/assets/images/gasInjection/8-3.png');
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  width: 100%;
-  height: 100%;
-  padding: 20px 15px;
-  box-sizing: border-box;
-  overflow-y: auto;
-
-  .inject-card-item {
-    position: relative;
-    width: 379px;
-    height: 94px;
-    margin: 10px auto;
-    background: var(--image-inject_card_bg) no-repeat;
-    background-size: 100% 100%;
-  }
-  .pie-bg{
-    position: absolute;
-    top: -9px;
-    right: -5px;
-    width: 78px;
-    height: 78px;
-    background: var(--image-inject_card_bg1) no-repeat;
-    background-size: 100% 100%;
-  }
-  .icon-bg{
-    position: absolute;
-    left: 20px;
-    top: -4px;
-    width: 77px;
-    height: 79px;
-    background: var(--image-inject_card_bg2) no-repeat;
-    background-size: 100% 100%;
-  }
-  .card-item-content{
-    position: absolute;
-    left: 144px;
-    top: 50%;
-    transform: translate(0,-50%);
-  }
-  .content-label{
-    margin-bottom: 10px;
-  }
-  .content-value{
-     font-family: 'douyuFont';
-    color: #91faff;
-  }
-}
-</style>

+ 0 - 192
src/views/vent/home/configurable/components/preset/gasInjectChart.vue

@@ -1,192 +0,0 @@
-<template>
-  <div ref="gasInjectChart" class="inject-echart-box"></div>
-</template>
-
-<script setup lang="ts">
-import { nextTick, ref, onMounted, reactive, watch } from 'vue'
-import * as echarts from 'echarts';
-
-let props = defineProps({
-  option: {
-    type: Object as any
-  },
-  echartData: {
-    type: Object as any
-  }
-})
-
-let gasInjectChart = ref(null)
-//图表数据
-let echartDatas = reactive({}) as any
-
-let xLabel = ['3.26', '3.27', '3.28', '3.29', '3.30', '3.31']
-let goToSchool = ["40", "60", "22", "85", "50", "40"]
-let goOutSchool = ["20", "50", "12", "65", "30", "60"]
-
-function getOption() {
-  nextTick(() => {
-    let myChart = echarts.init(gasInjectChart.value);
-    let option
-    if (props.option.type == 'bar_lt') {
-      option = {
-        tooltip: props.option.tooltip,
-        grid: props.option.grid,
-        legend: props.option.legend,
-        xAxis: [{
-          data: echartDatas.xData,
-          axisLabel: {
-            textStyle: {
-              color: 'rgba(181, 185, 191)',
-              fontSize: 12
-            },
-            margin: 10, //刻度标签与轴线之间的距离。
-          },
-
-          axisLine: {
-            lineStyle: {
-              color: 'rgba(1, 63, 97)',
-            },
-          },
-          axisTick: {
-            show: false //不显示刻度
-          },
-          boundaryGap: true,
-          splitLine: {
-            show: false,
-          },
-        }],
-        yAxis: props.option.yAxis,
-        series: props.option.series.map(el => {
-          return {
-            ...el,
-            data: echartDatas[el.data]
-          }
-        })
-      };
-    } else if (props.option.type == 'line-area') {
-      option = {
-        tooltip: props.option.tooltip,
-        grid: props.option.grid,
-        xAxis: [{
-          type: 'category',
-          boundaryGap: false,
-          axisLine: { //坐标轴轴线相关设置。数学上的x轴
-            show: true,
-            lineStyle: {
-              color: 'rgba(1, 63, 97)',
-            },
-          },
-          axisLabel: { //坐标轴刻度标签的相关设置
-            textStyle: {
-              color: 'rgba(181, 185, 191)',
-              padding: 5,
-              fontSize: 12
-            },
-            formatter: function (data) {
-              return data
-            }
-          },
-          splitLine: {
-            show: false,
-          },
-          axisTick: {
-            show: false,
-          },
-          data: xLabel
-        }],
-        yAxis: [{
-          name: '(MPa)',
-          nameTextStyle: {
-            color: 'rgba(181, 185, 191)',
-            fontSize: 12,
-            padding: 0
-          },
-          min: 0,
-          splitLine: {
-            show: true,
-            lineStyle: {
-              color: 'rgba(1, 63, 97)',
-            },
-          },
-          axisLine: {
-            show: false,
-          },
-          axisLabel: {
-            show: true,
-            textStyle: {
-              color: 'rgba(181, 185, 191)',
-              padding: 12
-            },
-            formatter: '{value}',
-          },
-          axisTick: {
-            show: false,
-          },
-        }],
-        series: [{
-          name: '',
-          type: 'line',
-          symbol: 'circle', // 默认是空心圆(中间是白色的),改成实心圆
-          showAllSymbol: true,
-          symbolSize: 0,
-          smooth: true,
-          lineStyle: {
-            normal: {
-              width: 3,
-              color: props.option.colorLine, // 线条颜色
-            },
-            borderColor: 'rgba(0,0,0,.4)',
-          },
-          itemStyle: {
-            color: props.option.colorLine,
-            borderColor: "#646ace",
-            borderWidth: 2
-
-          },
-          areaStyle: { //区域填充样式
-            normal: {
-              //线性渐变,前4个参数分别是x0,y0,x2,y2(范围0~1);相当于图形包围盒中的百分比。如果最后一个参数是‘true’,则该四个值是绝对像素位置。
-              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
-                offset: 0,
-                color: props.option.colorArea[0]
-              },
-              {
-                offset: 1,
-                color: props.option.colorArea[1]
-              }
-              ], false),
-              shadowColor: 'rgba(255, 157, 29, 0.5)', //阴影颜色
-              shadowBlur: 20 //shadowBlur设图形阴影的模糊大小。配合shadowColor,shadowOffsetX/Y, 设置图形的阴影效果。
-            }
-          },
-          data: goToSchool
-        },
-        ]
-      };
-    }
-
-    myChart.setOption(option);
-    window.onresize = function () {
-      myChart.resize();
-    };
-  });
-}
-
-watch(() => props.echartData, (newV, oldV) => {
-  console.log(newV, '单元抽采数据')
-  if (newV) {
-    echartDatas.xData = newV.map(el => el.typeName)
-    echartDatas.yData = newV.map(el => el.datalist[0].readData.mixStdInstant)
-    echartDatas.yData1 = newV.map(el => el.datalist[0].readData.gasConcentration)
-    getOption()
-  }
-}, { immediate: true })
-
-</script>
-
-<style lang="less" scoped>
-.inject-echart-box {
-  width: 100%;
-  height: 100%;
-}
-</style>

+ 0 - 119
src/views/vent/home/configurable/components/preset/gasInjectList.vue

@@ -1,119 +0,0 @@
-<template>
-  <div class="gas-inject-list">
-    <!-- <div class="list-box-item" v-for="(item, index) in option" :key="index">
-      <div class="box-item-label">{{ item.label }}</div>
-      <div class="box-item-value">
-        <span> {{ listDatas[item.value] }}</span>
-        <span style="margin-left: 5px; color: aliceblue">{{ item.unit }}</span>
-      </div>
-    </div> -->
-    <div class="list-box-item">
-      <div class="box-item-label">工作面名称</div>
-      <div class="box-item-value">
-        <span> {{ listDatas['strinstallpos'] }}</span>
-        <span style="margin-left: 5px; color: aliceblue"></span>
-      </div>
-    </div>
-    <div class="list-box-item">
-      <div class="box-item-label">区段长度</div>
-      <div class="box-item-value">
-        <span> {{ listDatas['quduanLength'] }}</span>
-        <span style="margin-left: 5px; color: aliceblue">m</span>
-      </div>
-    </div>
-    <div class="list-box-item">
-      <div class="box-item-label">区段宽度</div>
-      <div class="box-item-value">
-        <span> {{ listDatas['quduanWidth'] }}</span>
-        <span style="margin-left: 5px; color: aliceblue">m</span>
-      </div>
-    </div>
-    <div class="list-box-item">
-      <div class="box-item-label">平均煤厚</div>
-      <div class="box-item-value">
-        <span> {{ listDatas['avgMeihou'] }}</span>
-        <span style="margin-left: 5px; color: aliceblue">m</span>
-      </div>
-    </div>
-    <div class="list-box-item">
-      <div class="box-item-label">煤层瓦斯含量</div>
-      <div class="box-item-value">
-        <span> {{ listDatas['wasiHanliang'] }}</span>
-        <span style="margin-left: 5px; color: aliceblue">m³/t</span>
-      </div>
-    </div>
-    <div class="list-box-item">
-      <div class="box-item-label">区段瓦斯储量</div>
-      <div class="box-item-value">
-        <span> {{ listDatas['wasiHanliang'] }}</span>
-        <span style="margin-left: 5px; color: aliceblue">m³</span>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script setup lang="ts">
-import { reactive, ref, watch } from 'vue';
-
-let props = defineProps({
-  listData: {
-    type: Object as any
-  }
-});
-
-let listDatas = reactive({})
-
-watch(() => props.listData, (newV, oldV) => {
-  if (newV) {
-    listDatas = Object.assign({}, newV)
-  }
-}, { immediate: true })
-</script>
-
-<style lang="less" scoped>
-@import '/@/design/theme.less';
-
-@{theme-deepblue} {
-  .gas-inject-list {
-    --image-model_list_bg: url('@/assets/images/themify/deepblue/home-container/configurable/gasInjection/5-1.png');
-  }
-}
-
-.gas-inject-list {
-  --image-model_list_bg: url('@/assets/images/gasInjection/5-1.png');
-  position: relative;
-  display: flex;
-  flex-direction: column;
-  justify-content: space-between;
-  align-items: center;
-  width: 100%;
-  height: 100%;
-  padding: 10px 15px;
-  box-sizing: border-box;
-  overflow-y: auto;
-
-  .list-box-item {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    width: 100%;
-    height: 50px;
-    padding: 0px 28px;
-    background: var(--image-model_list_bg) no-repeat;
-    background-size: 100% 100%;
-  }
-
-  .box-item-label {
-    color: #c3f5ff;
-    font-size: 15px;
-    font-weight: 700;
-  }
-
-  .box-item-value {
-    font-size: 15px;
-    font-weight: 700;
-    // font-family: 'douyuFont';
-    color: #91faff;
-  }
-}
-</style>

+ 0 - 125
src/views/vent/home/configurable/components/preset/gasWarnChart.vue

@@ -1,125 +0,0 @@
-<template>
-  <div class="gas-warn-chart">
-    <div class="echart-box" ref="gasWarnChart"></div>
-    <SvgIcon class="icon-style" size="46" name="warn-chart" />
-  </div>
-</template>
-
-<script setup lang="ts">
-import { nextTick, onMounted, ref, watch } from 'vue'
-import { SvgIcon } from '/@/components/Icon';
-import * as echarts from 'echarts';
-
-let props = defineProps({
-  option: {
-    type: Object as any
-  },
-  echartData: {
-    type: Array as any
-  }
-})
-let gasWarnChart = ref(null)
-let echartD = ref<any[]>([])
-let maxCircleData = ref<any[]>([])
-
-function getOption() {
-  nextTick(() => {
-    let myChart = echarts.init(gasWarnChart.value);
-    let option = {
-      color: props.option.colorOut,
-      series: [
-        {
-          type: "pie",
-          padAngle: 2,
-          radius: ["55%", "64%"],
-          label: {
-            show: false,
-          },
-          emphasis: {
-            disabled: true,
-          },
-          data: maxCircleData.value,
-        },
-        {
-          type: "pie",
-          padAngle: 2,
-          radius: ["64%", "77%"],
-          avoidLabelOverlap: false,
-          label: {
-            show: false,
-            // formatter: function (params) {
-            //   return "20%";
-            // },
-            // color: "#fff",
-            // fontSize: 14,
-            // fontFamily: "DIN",
-          },
-          emphasis: {
-            disabled: false,
-          },
-          // labelLine: {
-          //   show: false,
-          //   length: 6,
-          //   length2: 6,
-          //   minTurnAngle: 30,
-          // },
-          data: echartD.value,
-        },
-      ],
-    }
-    myChart.setOption(option);
-    window.onresize = function () {
-      myChart.resize();
-    };
-  });
-}
-
-watch(() => props.echartData, (newV, oldV) => {
-  if (newV) {
-    echartD.value = newV
-    maxCircleData.value = newV.map((item, index) => {
-      return {
-        ...item,
-        itemStyle: {
-          color: props.option.colorOn[index],
-        },
-      };
-    });
-    getOption()
-  }
-}, { immediate: true })
-</script>
-
-<style lang="less" scoped>
-@import '/@/design/theme.less';
-
-@{theme-deepblue} {
-  .gas-warn-chart {
-    --image-chart_bg: url('@/assets/images/themify/deepblue/home-container/configurable/gasInjection/6-1.png');
-  }
-}
-
-.gas-warn-chart {
-  --image-chart_bg: url('@/assets/images/gasInjection/6-1.png');
-  position: relative;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  width: 100%;
-  height: 100%;
-
-  .echart-box {
-    width: 168px;
-    height: 168px;
-    background: var(--image-chart_bg) no-repeat;
-    background-size: 100% 100%;
-  }
-
-  .icon-style {
-    position: absolute;
-    left: 50%;
-    top: 50%;
-    transform: translate(-50%, -50%);
-  }
-}
-</style>

+ 0 - 127
src/views/vent/home/configurable/components/preset/gasWarnList.vue

@@ -1,127 +0,0 @@
-<template>
-  <div class="gas-warn-list">
-    <div class="warn-list-box">
-      <div class="list-box-item" v-for="(item, index) in option" :key="index">
-        <div class="box-item-label">
-          <div class="item-icon"></div>
-          <div class="item-text">{{ item.label }}</div>
-        </div>
-        <div class="box-item-value">{{ listD[item.value] }}</div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script setup lang="ts">
-import { reactive, ref, watch } from 'vue'
-
-let props = defineProps({
-  option: {
-    type: Array as any,
-  },
-  listData: {
-    type: Object as any
-  }
-})
-
-let listD = reactive({})
-
-watch(() => props.listData, (newV, oldV) => {
-  if (newV) {
-    listD = Object.assign({}, newV)
-  }
-}, { immediate: true })
-</script>
-
-<style lang="less" scoped>
-@import '/@/design/theme.less';
-
-@{theme-deepblue} {
-  .gas-warn-list {
-    --image-warn_list_bg: url('@/assets/images/themify/deepblue/home-container/configurable/gasInjection/6-2.png');
-  }
-}
-
-.gas-warn-list {
-  --image-warn_list_bg: url('@/assets/images/gasInjection/6-2.png');
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  width: 100%;
-  height: 100%;
-
-  .warn-list-box {
-    display: flex;
-    flex-direction: column;
-    justify-content: space-around;
-    align-items: flex-start;
-    width: 100%;
-    height: 154px;
-  }
-
-  .list-box-item {
-    display: flex;
-    justify-content: space-around;
-    align-items: center;
-    width: 186px;
-    height: 26px;
-    background: var(--image-warn_list_bg) no-repeat;
-    background-size: 100% 100%;
-    font-size: 12px;
-    color: #fff;
-
-    &:nth-child(1) {
-      .item-icon {
-        width: 7px;
-        height: 7px;
-        margin-right: 5px;
-        background-color: rgba(70, 255, 156);
-        border-radius: 50%;
-      }
-    }
-
-    &:nth-child(2) {
-      .item-icon {
-        width: 7px;
-        height: 7px;
-        margin-right: 5px;
-        background-color: rgba(0, 243, 255);
-        border-radius: 50%;
-      }
-    }
-
-    &:nth-child(3) {
-      .item-icon {
-        width: 7px;
-        height: 7px;
-        margin-right: 5px;
-        background-color: rgba(255, 157, 28);
-        border-radius: 50%;
-      }
-    }
-
-    &:nth-child(4) {
-      .item-icon {
-        width: 7px;
-        height: 7px;
-        margin-right: 5px;
-        background-color: rgba(44, 182, 255);
-        border-radius: 50%;
-      }
-    }
-
-  }
-
-  .box-item-label {
-    height: 100%;
-    display: flex;
-    align-items: center;
-  }
-
-  .box-item-value {
-    font-family: 'douyuFont';
-    color: #91faff;
-  }
-
-}
-</style>

+ 0 - 282
src/views/vent/home/configurable/components/preset/gasZyChart.vue

@@ -1,282 +0,0 @@
-<template>
-  <div class="gas-zy-chart">
-    <div class="echart-box" ref="gasZyChart"></div>
-  </div>
-</template>
-
-<script setup lang="ts">
-import { nextTick, onMounted, ref, watch } from 'vue'
-import * as echarts from 'echarts';
-import moment from 'moment'
-
-let props = defineProps({
-  data: {
-    type: Object as any
-  }
-})
-
-let gasZyChart = ref(null)
-//选项标签
-let series = ref<any[]>([]);
-//x轴开始时间
-let startTimeAll = ref(0);
-//x轴结束时间
-let endTimeAll = ref(0);
-//1为运行状态,0为停止状态
-let categories = ref<any[]>(['注气开', '抽采开', '', '注气关', '抽采关']);
-let seriesValue = ref<any[]>([]);
-let jsonData = ref<any[]>([])
-
-let colorList = [
-  { color: 'rgba(255, 158, 30)', color1: 'rgba(255, 247, 194)' },
-  { color: 'rgba(14, 98, 255)', color1: 'rgba(3, 223, 252)' },
-]
-
-function getXDate(time) {
-  let year = time.getFullYear();
-  let month = parseInt(time.getMonth()) + 1;
-  let day = time.getDate();
-  let hour = time.getHours();
-  let minutes = time.getMinutes();
-  let seconds = time.getSeconds();
-  return year + '-' + month + '-' + day + ' ' + hour + ':' + minutes + ':' + seconds;
-  // if (hour.toString().length < 2) {
-  //   hour = '0' + hour
-  // } else if (minutes.toString().length < 2) {
-  //   minutes = '0' + minutes
-  // } else if (seconds.toString().length < 2) {
-  //   seconds = '0' + seconds
-  // }
-  // return hour + ':' + minutes + ':' + seconds;
-}
-
-function renderItem(params, api) {
-  let categoryIndex = api.value(0);
-  let start = api.coord([api.value(1), categoryIndex]);
-  let end = api.coord([api.value(2), categoryIndex]);
-  let height = api.size([0, 1])[1] * 0.15;
-
-  let rectShape = echarts.graphic.clipRectByRect(
-    {
-      x: start[0],
-      y: start[1] - height / 2,
-      width: end[0] - start[0],
-      height: height,
-    },
-    {
-      x: params.coordSys.x,
-      y: params.coordSys.y,
-      width: params.coordSys.width,
-      height: params.coordSys.height,
-    }
-  );
-
-  return (
-    rectShape && {
-      type: 'rect',
-      shape: rectShape,
-      style: api.style(),
-    }
-  );
-}
-
-
-function getOption() {
-  nextTick(() => {
-    let myChart = echarts.init(gasZyChart.value);
-    let option = {
-      tooltip: {
-        backgroundColor: 'rgba(0, 0, 0, .6)',
-        textStyle: {
-          color: '#fff',
-          fontSize: 12,
-        },
-        formatter: function (params) {
-          console.log(params,'00---')
-          return `${params.marker} ${params.name}&nbsp:&nbsp${(params.value[3] / 1000 / 60 / 60).toFixed(2)}h<br/>${params.marker}开始运行&nbsp:&nbsp${moment(params.value[1]).format('YYYY-MM-DD HH:mm:ss')}<br/>${params.marker}结束运行&nbsp:&nbsp${moment(params.value[2]).format('YYYY-MM-DD HH:mm:ss')}`
-        },
-      },
-      grid: {
-        top: "12%",
-        left: "7%",
-        right: "18%",
-        bottom: "3%",
-        containLabel: true,
-      },
-      legend: {
-        right: '10',
-        top: '2',
-        type: 'plain',
-        textStyle: {
-          color: '#fff',
-          fontSize: 12,
-        },
-        // icon:'rect',
-        itemGap: 2,
-        itemWidth: 18,
-        icon: 'path://M0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v0a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z',
-        data: series.value,
-      },
-
-      xAxis: [
-        {
-          min: startTimeAll.value,
-          max: endTimeAll.value,
-          interval: 3600 * 12 * 1000,
-          axisLabel: {
-            show: true,
-            fontSize: 12,
-            textStyle: {
-              color: '#b3b8cc',
-            },
-            formatter: function (val) {
-              let dateTime = new Date(val);
-              return getXDate(dateTime);
-            },
-          },
-          axisLine: {
-            lineStyle: {
-              // color: 'rgba(14, 53, 95)',
-            },
-          },
-          splitLine: {
-            show: false,
-          },
-          axisTick: {
-            show: false,
-          },
-        },
-        // {
-        //   // data: ['2021-03-01', '2021-03-02', '2021-03-03'],
-        //   data: [],
-        // },
-      ],
-      yAxis: {
-        data: categories.value,
-        axisLabel: {
-          show: true,
-          fontSize: 12,
-          textStyle: {
-            color: '#b3b8cc',
-          },
-        },
-        axisLine: {
-          show: false,
-        },
-        splitLine: {
-          show: true,
-          lineStyle: {
-            color: 'rgba(6, 48, 77)',
-          },
-        },
-        axisTick: {
-          show: false,
-        },
-      },
-      series: seriesValue.value
-    };
-    myChart.setOption(option);
-    window.onresize = function () {
-      myChart.resize();
-    };
-  });
-}
-
-
-watch(() => props.data, (newV, oldV) => {
-  if (newV) {
-    console.log(newV, '运行状态')
-    startTimeAll.value = new Date(newV.startTime).getTime()
-    endTimeAll.value = new Date(newV.endTime).getTime()
-    series.value = newV.devices.map(el => el.name)
-    let yData = newV.devices[0].segments.map(el => {
-      return {
-        series: newV.devices[0].name,
-        category: el.status + 0.5 == 1.5 ? '注气开' : el.status + 0.5 == 0.5 ? '注气关' : '',
-        startTime: el.start,
-        endTime: el.end,
-      }
-    })
-    let yData1 = newV.devices[1].segments.map(el => {
-      return {
-        series: newV.devices[1].name,
-        category: el.status == 1 ? '抽采开' : el.status == 0 ? '抽采关' : '',
-        startTime: el.start,
-        endTime: el.end,
-      }
-    })
-    jsonData.value = [...yData, ...yData1]
-    echarts.util.each(categories.value, function (category, index: number) {
-      if (category) {
-        let cgory = categories.value[index];
-        series.value.forEach((itemS, indexS) => {
-          jsonData.value.forEach((itemj, indexj) => {
-            if (itemj.category == cgory) {
-              let data: any[] = [];
-              let startTime = new Date(itemj.startTime).getTime();
-              let endTime = new Date(itemj.endTime).getTime();
-              let duration = endTime - startTime;
-              if (itemj.series == itemS) {
-                data.push({
-                  name: itemj.series,
-                  value: [index, startTime, endTime, duration],
-                  itemStyle: {
-                    normal: {
-                      //color: '#7b9ce1',
-                    },
-                  },
-                });
-                seriesValue.value.push({
-                  name: itemS,
-                  type: 'custom',
-                  renderItem: renderItem,
-                  itemStyle: {
-                    normal: {
-                      color: new echarts.graphic.LinearGradient(
-                        0,
-                        0,
-                        1,
-                        0,
-                        [
-                          {
-                            offset: 0,
-                            color: colorList[indexS].color,
-                          },
-                          {
-                            offset: 1,
-                            color: colorList[indexS].color1,
-                          },
-                        ],
-                        false
-                      ),
-                    },
-                  },
-                  encode: {
-                    x: [1, 2],
-                    y: 0,
-                  },
-                  data: data,
-                });
-              }
-            }
-          });
-        });
-      }
-
-    });
-    getOption()
-  }
-}, { immediate: true })
-
-</script>
-
-<style lang="less" scoped>
-.gas-zy-chart {
-  width: 100%;
-  height: 100%;
-
-  .echart-box {
-    height: 100%;
-  }
-}
-</style>

+ 0 - 106
src/views/vent/home/configurable/components/preset/gasZyList.vue

@@ -1,106 +0,0 @@
-<template>
-  <div class="gasZyList">
-    <div class="list-box">
-      <div class="list-box-item" v-for="(item, index) in option" :key="index">
-        <SvgIcon class="icon-style" size="30" :name="item.iconName" />
-        <div class="item-label">{{ item.label }}</div>
-        <div class="item-value">
-          <span> {{ listData ? listData[item.value] : '-'}}</span>
-          <span class="item-unit">{{ item.unit }}</span>
-        </div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script setup lang="ts">
-import { ref } from 'vue';
-import { SvgIcon } from '/@/components/Icon';
-
-let props = defineProps({
-  listData: {
-    type: Object as any
-  },
-  option: {
-    type: Array as any,
-  },
-});
-</script>
-
-<style lang="less" scoped>
-@import '/@/design/theme.less';
-
-@{theme-deepblue} {
-  .gasZyList {
-    --image-zy_list_bg: url('@/assets/images/themify/deepblue/home-container/configurable/gasInjection/1-7.png');
-    --image-zy_list_bg1: url('@/assets/images/themify/deepblue/home-container/configurable/gasInjection/1-8.png');
-  }
-}
-
-.gasZyList {
-  --image-zy_list_bg: url('@/assets/images/gasInjection/1-7.png');
-  --image-zy_list_bg1: url('@/assets/images/gasInjection/1-8.png');
-  width: 100%;
-  height: 100%;
-  padding: 25px;
-  box-sizing: border-box;
-
-  .list-box {
-    height: 100%;
-    display: flex;
-    flex-direction: column;
-    justify-content: space-between;
-    align-items: center;
-  }
-
-  .list-box-item {
-    position: relative;
-    width: 100%;
-    height: 57px;
-    display: flex;
-
-    &:nth-child(1) {
-      .item-value {
-        color: #c4ebff;
-      }
-
-      background: var(--image-zy_list_bg) no-repeat;
-      background-size: 100% 100%;
-    }
-
-    &:nth-child(2) {
-      .item-value {
-        color: #91faff;
-      }
-
-      background: var(--image-zy_list_bg1) no-repeat;
-      background-size: 100% 100%;
-    }
-  }
-
-  .item-label {
-    position: absolute;
-    left: 76px;
-    bottom: 10px;
-  }
-
-  .item-value {
-    font-size: 12px;
-    position: absolute;
-    right: 10px;
-    bottom: 10px;
-    font-family: 'douyuFont';
-  }
-
-  .item-unit {
-    margin-left: 10px;
-  }
-
-  .icon-style {
-    position: absolute;
-    left: 11px;
-    top: 50%;
-    transform: translate(0, -50%);
-  }
-}
-</style>

+ 0 - 19
src/views/vent/home/configurable/configurable.api.ts

@@ -635,25 +635,6 @@ export const getElectroData = (params) => {
   });
 };
 
-//获取注气历史数据
-//export const sysZq = (params) => defHttp.get({ url: Api.listdays, params });
-//获取注气历史数据
-//async function getZqSystem(param) {
-//  const result = await sysZq(param);
-//  return result
-//}
-//获取系统运行状态数据
-//export const todayDeviceRunStatus = (params) => defHttp.post({ url: Api.todayDeviceRunStatus, params });
-//async function getTodayDeviceRunStatus(param) {
-//  const result = await todayDeviceRunStatus(param);
-//  return result
-//}
-//获取异常提醒数据
-//export const summary = (params) => defHttp.get({ url: Api.summary, params });
-//async function getSummary(param) {
-//  const result = await summary(param);
-//  return result
-//}
 //获取红沙泉露天煤矿数据
 export const getSystemApi = (params) => {
   const key = `${Api.getSystem}?${JSON.stringify(params)}`;

+ 19 - 13
src/views/vent/home/configurable/fireMonitor.vue

@@ -1,21 +1,18 @@
 <template>
   <div class="fire-monitor">
-    <ModuleCommon
-      v-for="cfg in configs"
-      :key="cfg.deviceType"
-      :show-style="cfg.showStyle"
-      :module-data="cfg.moduleData"
-      :module-name="cfg.moduleName"
-      :device-type="cfg.deviceType"
-      :data="data"
-      :visible="true"
-    />
+    <!-- 模型区域 -->
+    <div class="model-box">
+      <dwgViewer />
+    </div>
+    <ModuleCommon v-for="cfg in configs" :key="cfg.deviceType" :show-style="cfg.showStyle" :module-data="cfg.moduleData"
+      :module-name="cfg.moduleName" :device-type="cfg.deviceType" :data="data" :visible="true" />
   </div>
 </template>
 <script lang="ts" setup>
 import { onMounted, onUnmounted, ref, computed, nextTick, onBeforeMount, watch } from 'vue';
 import { useInitConfigs, useInitPage } from './hooks/useInit';
 import ModuleCommon from './components/ModuleCommon.vue';
+import dwgViewer from '../../cad/dwgViewer.vue'
 import { getSystemApi } from './configurable.api';
 import { testConfigFire } from './configurable.data';
 
@@ -45,7 +42,7 @@ onMounted(() => {
 
 watch(
   () => data.value,
-  (newData, oldData) => {}
+  (newData, oldData) => { }
 );
 
 onUnmounted(() => {
@@ -57,8 +54,7 @@ onUnmounted(() => {
 @import '/@/design/theme.less';
 
 @{theme-deepblue} {
-  .fire-monitor {
-  }
+  .fire-monitor {}
 }
 
 .fire-monitor {
@@ -68,6 +64,16 @@ onUnmounted(() => {
   position: relative;
   padding: 0px 10px;
   box-sizing: border-box;
+
+  .model-box {
+    position: absolute;
+    top: 63px;
+    left: 50%;
+    transform: translateX(-50%);
+    width: 1000px;
+    height: 615px;
+  border: 1px solid rgba(40, 165, 232, 0.8);
+  }
 }
 
 :deep(.loading-box) {

+ 1 - 1
src/views/vent/home/configurable/gasInjection.vue

@@ -22,7 +22,7 @@ import warnMonitor from './warnMonitor.vue'
 import systemManger from './systemManger.vue'
 import largeScreen from './largeScreen.vue'
 
-const { mainTitle, data, updateData } = useInitPage('红泉露天煤矿系统');
+const { mainTitle, data, updateData } = useInitPage('红泉露天煤矿系统');
 //当前激活界面
 const activeComponente = ref<any>(fireMonitor);
 

+ 0 - 1085
src/views/vent/home/configurable/threejs/gasInjection.ts

@@ -1,1085 +0,0 @@
-import { Ref, ref, watch } from 'vue';
-import * as THREE from 'three';
-import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';
-import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js';
-import { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass.js';
-import { UnrealBloomPass } from 'three/examples/jsm/postprocessing/UnrealBloomPass.js';
-import { OutputPass } from 'three/examples/jsm/postprocessing/OutputPass.js';
-import { PathPointList, PathGeometry } from 'three.path';
-import { modelMouseHandler } from '/@/utils/threejs/useEvent';
-import { panelManager } from './PanelManager';
-
-// const cgqMarkerList = [];
-// const lljMarkerList = [];
-const zhuqiPipList = []; // 注气支管
-const zhuqiZkList = []; // 注气钻孔
-const gasUnitList = []; //瓦斯抽采单元
-const pipList = [];
-let mouseoverEvent: any;
-let mouseUpEvent: any;
-let clickSelecteObject: any;
-let pipDataList = [];
-export function modalAnimate(modal, data: Ref<any, any>) {
-  const zhuqiPipDataRef = ref(null);
-  const maxIndex = getPipIndex(data.value) || 0;
-  const zhuqiModal = modal.scene.getObjectByName('zhuqi').getObjectByName('ZhuQiChangJing_1');
-
-  watch(data, (newValue) => {
-    const zhuqiData = newValue.msgTxt.find((item) => item.type.includes('injection'))?.datalist[0];
-    if (zhuqiData) {
-      const readData = zhuqiData.readData;
-      const zzgData = {
-        positionName: '总支管#',
-        flowStdInstant: readData['flowStdInstant'], // 瞬时流量
-        flowStdAccum: readData['flowStdAccum'], // 累计流量
-        injectionTemperature: readData['injectionTemperature'], // 温度
-        injectionPressure: readData['injectionPressure'], // 压力
-        valveOpening: readData['valveOpening'], // 阀门开度
-        paiqiStatus: readData['paiqiStatus'], // 阀门状态
-      };
-      zhuqiPipDataRef.value = zzgData;
-
-      for (let i = 1; i <= maxIndex; i++) {
-        if (pipDataList[i - 1]) {
-          const zzgData = {
-            positionName: `${i}#`,
-            flowStdInstant: readData['flowStdInstant_' + i], // 瞬时流量
-            flowStdAccum: readData['flowStdAccum_' + i], // 累计流量
-            injectionTemperature: readData['injectionTemperature_' + i], // 温度
-            injectionPressure: readData['injectionPressure_' + i], // 压力
-            valveOpening: readData[`valve${i}Opening`], // 阀门开度
-            paiqiStatus: readData['paiqiStatus_' + i], // 阀门状态
-          };
-          pipDataList[i - 1].value = zzgData;
-        } else {
-          const zzgData = ref({
-            positionName: `${i}#`,
-            flowStdInstant: readData['flowStdInstant_' + i], // 瞬时流量
-            flowStdAccum: readData['flowStdAccum_' + i], // 累计流量
-            injectionTemperature: readData['injectionTemperature_' + i], // 温度
-            injectionPressure: readData['injectionPressure_' + i], // 压力
-            valveOpening: readData[`valve${i}Opening`], // 阀门开度
-            paiqiStatus: readData['paiqiStatus_' + i], // 阀门状态
-          });
-          pipDataList[i - 1] = zzgData;
-        }
-        // if (i > 4) {
-        //   zhuqiPipList[i - 1].visible = false;
-        //   zhuqiZkList[i - 1].visible = false;
-        // }
-      }
-    }
-  });
-  initAnimate(modal);
-
-  const zhuqiData = data.value.msgTxt.find((item) => item.type.includes('injection'))?.datalist[0];
-  if (zhuqiData) {
-    const readData = zhuqiData.readData;
-    const zzgData = {
-      positionName: '总支管#',
-      flowStdInstant: readData['flowStdInstant'], // 瞬时流量
-      flowStdAccum: readData['flowStdAccum'], // 累计流量
-      injectionTemperature: readData['injectionTemperature'], // 温度
-      injectionPressure: readData['injectionPressure'], // 压力
-      valveOpening: readData['valveOpening'], // 阀门开度
-      paiqiStatus: readData['paiqiStatus'], // 阀门状态
-    };
-    zhuqiPipDataRef.value = zzgData;
-    initPanel(modal, zhuqiModal, zhuqiPipDataRef);
-  }
-}
-
-function initAnimate(modal) {
-  const curveNum = 8;
-  const unitNum = 8;
-
-  resetModalParam(modal);
-
-  const bounds = {
-    min: new THREE.Vector3(-25, -2, -35),
-    max: new THREE.Vector3(10, 10, 30),
-  };
-
-  // 初始化多种颜色气泡
-  const allBubbles = initGasAnimate(modal);
-
-  const zhuqiModal = modal.scene.getObjectByName('zhuqi').getObjectByName('ZhuQiChangJing_1');
-  const touming3 = zhuqiModal.getObjectByName('touming3');
-  touming3.parent.remove(touming3);
-
-  const time = Date.now() * 0.001;
-
-  // 绘制注气钻孔
-  const arrowObj = addArrow(zhuqiModal, curveNum);
-
-  // 绘制注气支管
-  const pipObj = addPip(zhuqiModal, curveNum);
-
-  // 绘制抽采单元
-  const unitObj = addUnit(zhuqiModal, unitNum);
-
-  initCss2DContainer(modal);
-  // 添加鼠标拾取
-  initMouseEvent(modal, zhuqiModal);
-
-  // const clock = new THREE.Clock();
-  // 帧刷新
-  modal.startAnimation = () => {
-    /**气泡运动 - 遍历所有颜色组*/
-    allBubbles.forEach((bubbleGroup) => {
-      const { bubblesData, instancedMesh, bubbleCount, dummy } = bubbleGroup;
-
-      for (let i = 0; i < bubbleCount; i++) {
-        const data = bubblesData[i];
-
-        // 1. 更新位置
-        data.position.add(data.velocity);
-
-        // 2. 添加正弦波动
-        data.position.y += Math.sin(time + i) * 0.02;
-
-        // 3. 边界检测与反弹
-        if (data.position.x < bounds.min.x || data.position.x > bounds.max.x) {
-          data.velocity.x *= -1;
-          data.position.x = THREE.MathUtils.clamp(data.position.x, bounds.min.x, bounds.max.x);
-        }
-        if (data.position.y < bounds.min.y || data.position.y > bounds.max.y) {
-          data.velocity.y *= -1;
-          data.position.y = THREE.MathUtils.clamp(data.position.y, bounds.min.y, bounds.max.y);
-        }
-        if (data.position.z < bounds.min.z || data.position.z > bounds.max.z) {
-          data.velocity.z *= -1;
-          data.position.z = THREE.MathUtils.clamp(data.position.z, bounds.min.z, bounds.max.z);
-        }
-
-        // 4. 更新实例矩阵
-        dummy.position.copy(data.position);
-        dummy.scale.setScalar(data.scale);
-        dummy.rotation.y = time * 0.5;
-        dummy.rotation.z = time * 0.2;
-        dummy.updateMatrix();
-        instancedMesh.setMatrixAt(i, dummy.matrix);
-      }
-      instancedMesh.instanceMatrix.needsUpdate = true;
-    });
-
-    /**箭头流动效果*/
-    if (arrowObj) {
-      const { texture } = arrowObj;
-      if (texture) {
-        texture.offset.x -= 0.1776;
-      }
-    }
-    if (unitObj) {
-      const { arrowTexture } = unitObj;
-      arrowTexture.offset.x -= 0.0576;
-    }
-
-    if (pipObj) {
-      const { texture } = pipObj;
-      texture.offset.x -= 0.1076;
-    }
-
-    // [...cgqMarkerList, ...lljMarkerList].forEach((marker: THREE.Mesh) => {
-    //   // 更新水波纹动画
-    //   const delta = clock.getElapsedTime();
-    //   if (marker.userData.update) {
-    //     marker.userData.update(delta);
-    //   }
-    // });
-  };
-}
-
-function getPipIndex(data: Ref<any, any>) {
-  if (data && data['msgTxt']) {
-    const zhuqiData = data['msgTxt'].find((item) => item.type.includes('injection'))?.datalist[0];
-    if (zhuqiData) {
-      const readData = zhuqiData.readData;
-      const max = 20;
-      let maxIndex = 0;
-      for (let i = 1; i < max; i++) {
-        if (readData['flowWorkAccum_' + i] !== undefined) {
-          continue;
-        } else {
-          maxIndex = i;
-        }
-      }
-      for (let i = 1; i <= maxIndex; i++) {
-        const zzgData = ref({
-          positionName: `${i}#`,
-          flowStdInstant: readData['flowStdInstant_' + i], // 瞬时流量
-          flowStdAccum: readData['flowStdAccum_' + i], // 累计流量
-          injectionTemperature: readData['injectionTemperature_' + i], // 温度
-          injectionPressure: readData['injectionPressure_' + i], // 压力
-          valveOpening: readData[`valve${i}Opening`], // 阀门开度
-          paiqiStatus: readData['paiqiStatus_' + i], // 阀门状态
-        });
-        pipDataList.push(zzgData);
-      }
-      return maxIndex;
-    }
-  }
-}
-// 初始化主支管面板
-function initPanel(modal, zhuqiModal, zhuqiPipDataRef) {
-  const changjingpPipe38 = zhuqiModal.getObjectByName('guandao')?.getObjectByName('changjingpPipe38');
-  if (changjingpPipe38) {
-    const option = {
-      instanceId: changjingpPipe38.name,
-      sensorData: zhuqiPipDataRef,
-      threshold: { temperature: 20 },
-      position: [],
-      scale: 0.005,
-    };
-    createMonitorPanel3D(modal, changjingpPipe38, option);
-    const position = panelManager.getPanel(changjingpPipe38.name)?.vm.cssObject.position.clone();
-    panelManager.getPanel(changjingpPipe38.name)?.vm.cssObject.position.set(position.x, position.y + 0.6, position.z + 3.5);
-  }
-}
-
-function initMouseEvent(modal, zhuqiModal) {
-  const zhuqiModalGroup = zhuqiModal.getObjectByName('zhuqiModalGroup');
-  mouseoverEvent = (event) => {
-    modelMouseHandler(modal, pipList, event, (intersects) => {
-      partEvent(intersects, pipList, modal, event);
-    });
-  };
-  mouseUpEvent = (event) => {
-    modelMouseHandler(modal, pipList, event, (intersects) => {
-      partEvent(intersects, pipList, modal, event);
-    });
-  };
-  modal.canvasContainer?.addEventListener('mousemove', mouseoverEvent);
-  modal.canvasContainer?.addEventListener('mouseup', mouseUpEvent);
-}
-
-function partEvent(intersects, partitionList, modal, event) {
-  partitionList.forEach((partition) => {
-    if (!clickSelecteObject || (clickSelecteObject && partition.name !== clickSelecteObject.name)) {
-      partition.visible = false;
-    }
-  });
-  if (intersects && intersects.length > 0) {
-    const partitionObj = intersects.find((item) => {
-      if (item.object.type === 'Line') {
-        const partition = partitionList.find((partition) => partition.name === item.object.name);
-        if (partition) {
-          partition.visible = true;
-        }
-        return true;
-      }
-      return false;
-    });
-    // 如果是点击事件
-    if (event.type === 'mouseup' && event.button == 0) {
-      if (clickSelecteObject) {
-        panelManager.destroyPanel(clickSelecteObject.name);
-        clickSelecteObject = null;
-      }
-      if (partitionObj) {
-        clickSelecteObject = partitionObj.object;
-        const index = clickSelecteObject.name.split('pipLine')[1];
-        const name = parseInt(index) + 1 + '#';
-        const pipDataRef = pipDataList.find((item) => item.value.positionName === name);
-        const option = {
-          instanceId: clickSelecteObject.name,
-          sensorData: pipDataRef,
-          threshold: { temperature: 20 },
-          position: [],
-          scale: 0.004,
-        };
-        createMonitorPanel3D(modal, clickSelecteObject, option);
-      }
-    }
-
-    return partitionObj;
-  } else {
-    if (event.type === 'mouseup' && event.button == 0) {
-      if (clickSelecteObject) {
-        panelManager.destroyPanel(clickSelecteObject.name);
-        clickSelecteObject = null;
-      }
-    }
-  }
-}
-
-function createMonitorPanel3D(modal, partition, options?) {
-  const box = new THREE.Box3();
-  box.setFromObject(partition);
-  const center = box.getCenter(new THREE.Vector3());
-  options.position = [center.x, center.y, center.z];
-  console.log('创建面板', options.position);
-
-  panelManager.createPanel(modal.scene, options);
-
-  // // 点击后相机
-  // const target0 = modal.camera.position.clone();
-  // const target1 = modal.orbitControls.target.clone();
-  // gsap.fromTo(
-  //   modal.orbitControls.target,
-  //   { x: target1.x, y: target1.y, z: target1.z },
-  //   {
-  //     x: center.x - 4,
-  //     y: center.y + 1,
-  //     z: center.z,
-  //     duration: 0.4,
-  //     ease: 'easeInCirc',
-  //     onUpdate: function (object) {
-  //       if (object) modal.camera?.lookAt(new THREE.Vector3(object.x, object.y, object.z));
-  //     },
-  //   }
-  // );
-}
-
-function resetModalParam(modal) {
-  modal.renderer.toneMappingExposure = 1.35;
-
-  console.log('初始化模型', modal);
-  modal.isRender = true;
-
-  // 【关键步骤】设置旋转速度
-  // 默认是 1.0,设置为 0.5 会让移动幅度减半(更慢/更精细)
-  modal.orbitControls.rotateSpeed = 0.3;
-  // 可选:如果你也想减慢缩放和平移的速度
-  modal.orbitControls.zoomSpeed = 0.3; // 缩放速度
-  modal.orbitControls.panSpeed = 0.3; // 平移速度
-
-  // 启用阻尼效果(可选,让运动更有惯性,感觉更平滑)
-  modal.orbitControls.enableDamping = true;
-  modal.orbitControls.dampingFactor = 0.9;
-}
-
-function initGasAnimate(modal, colorConfigs: any[] = []) {
-  // 默认配置:如果没有传入颜色配置,使用默认的红蓝两种
-  if (colorConfigs.length === 0) {
-    colorConfigs = [
-      {
-        name: 'gas',
-        color: 0xffa2a244,
-        emissive: 0xff4400,
-        bubbleCount: 100,
-        hslHue: 0.4, // 红色
-      },
-      {
-        name: 'n2',
-        color: 0x4fedf788,
-        emissive: 0x0044aa,
-        bubbleCount: 300,
-        hslHue: 0.5, // 蓝色
-      },
-    ];
-  }
-
-  // 1. 定义容器边界 (矩形)
-  const bounds = {
-    min: new THREE.Vector3(-25, -2, -35),
-    max: new THREE.Vector3(10, 10, 30),
-  };
-
-  const allBubbles = [] as {
-    bubblesData: { position: THREE.Vector3; velocity: THREE.Vector3; scale: number }[];
-    instancedMesh: THREE.InstancedMesh;
-    bubbleCount: number;
-    dummy: THREE.Object3D;
-  }[];
-
-  // 2. 为每种颜色配置创建气泡
-  colorConfigs.forEach((config) => {
-    const { bubbleCount, color, emissive, hslHue } = config;
-    const geometry = new THREE.SphereGeometry(1, 16, 16);
-
-    // 创建材质
-    const material = new THREE.MeshPhysicalMaterial({
-      color: color,
-      emissive: emissive,
-      emissiveIntensity: 0.4,
-      transparent: true,
-      opacity: 0.1,
-      depthWrite: false,
-      roughness: 0.0,
-      metalness: 0.1,
-      clearcoat: 1.0,
-      clearcoatRoughness: 0.1,
-      transmission: 0.7,
-      thickness: 0.5,
-      ior: 1.0004,
-      // blending: THREE.AdditiveBlending,
-      side: THREE.DoubleSide,
-    });
-
-    // 创建实例化网格
-    const instancedMesh = new THREE.InstancedMesh(geometry, material, bubbleCount);
-    modal.scene.add(instancedMesh);
-
-    // 存储气泡运动数据
-    const dummy = new THREE.Object3D();
-    const bubblesData = [] as { position: THREE.Vector3; velocity: THREE.Vector3; scale: number }[];
-
-    for (let i = 0; i < bubbleCount; i++) {
-      const x = THREE.MathUtils.randFloat(bounds.min.x, bounds.max.x);
-      const y = THREE.MathUtils.randFloat(bounds.min.y, bounds.max.y);
-      const z = THREE.MathUtils.randFloat(bounds.min.z, bounds.max.z);
-      const scale = THREE.MathUtils.randFloat(0.2, 0.8);
-      const velocity = new THREE.Vector3(
-        THREE.MathUtils.randFloat(-0.05, 0.05),
-        THREE.MathUtils.randFloat(-0.05, 0.05),
-        THREE.MathUtils.randFloat(-0.05, 0.05)
-      );
-
-      bubblesData.push({ position: new THREE.Vector3(x, y, z), velocity, scale });
-
-      dummy.position.copy(bubblesData[i].position);
-      dummy.scale.setScalar(bubblesData[i].scale);
-      dummy.updateMatrix();
-      instancedMesh.setMatrixAt(i, dummy.matrix);
-    }
-
-    // 设置实例颜色
-    const colorObj = new THREE.Color();
-    for (let i = 0; i < bubbleCount; i++) {
-      colorObj.setHSL(hslHue, 0.5, 0.8 + Math.random() * 0.2);
-      instancedMesh.setColorAt(i, colorObj);
-    }
-    instancedMesh.instanceColor.needsUpdate = true;
-
-    allBubbles.push({ bubblesData, instancedMesh, bubbleCount, dummy });
-  });
-
-  return allBubbles;
-}
-
-function addZhuqiAnimate(zhuqiModal, modal) {
-  return null;
-  const renderer = modal.renderer;
-
-  const renderScene = new RenderPass(modal.scene, modal.camera);
-  const BLOOM_SCENE = 1;
-
-  const bloomLayer = new THREE.Layers();
-  bloomLayer.set(BLOOM_SCENE);
-
-  const params = {
-    threshold: 0,
-    strength: 0,
-    radius: 0.001,
-    exposure: 0,
-  };
-
-  const materials = {};
-
-  const darkMaterial = new THREE.MeshBasicMaterial({ color: 'black' });
-
-  const bloomPass = new UnrealBloomPass(new THREE.Vector2(renderer.domElement.innerWidth, renderer.domElement.innerHeight), 1.5, 0.4, 0.85);
-  bloomPass.threshold = params.threshold;
-  bloomPass.strength = params.strength;
-  bloomPass.radius = params.radius;
-
-  const bloomRenderTarget = new THREE.WebGLRenderTarget(renderer.domElement.innerWidth, renderer.domElement.innerHeight, {
-    type: THREE.HalfFloatType,
-  });
-  const bloomComposer = new EffectComposer(renderer, bloomRenderTarget);
-  bloomComposer.renderToScreen = false;
-  bloomComposer.addPass(renderScene);
-  bloomComposer.addPass(bloomPass);
-  const shader = new THREE.ShaderMaterial({
-    uniforms: {
-      baseTexture: { value: null },
-      bloomTexture: { value: bloomComposer.renderTarget2.texture },
-      bloomStrength: { value: params.strength },
-    },
-    vertexShader: `varying vec2 vUv;
-
-			void main() {
-
-				vUv = uv;
-
-				gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
-
-			}`,
-    fragmentShader: `uniform sampler2D baseTexture;
-			uniform sampler2D bloomTexture;
-			uniform float bloomStrength;
-
-			varying vec2 vUv;
-
-			void main() {
-
-				gl_FragColor = ( texture2D( baseTexture, vUv ) + texture2D( bloomTexture, vUv ) * bloomStrength );
-
-			}`,
-    defines: {},
-  });
-
-  const mixPass = new ShaderPass(shader, 'baseTexture');
-  mixPass.needsSwap = true;
-
-  const outputPass = new OutputPass();
-
-  const finalRenderTarget = new THREE.WebGLRenderTarget(modal.canvasContainer.clientWidth, modal.canvasContainer.clientHeight, {
-    type: THREE.HalfFloatType,
-    samples: 4,
-  });
-  const finalComposer = new EffectComposer(renderer, finalRenderTarget);
-  finalComposer.addPass(renderScene);
-  finalComposer.addPass(mixPass);
-  finalComposer.addPass(outputPass);
-
-  // 注气动画
-  const changjingzhuqiguan = zhuqiModal.getObjectByName('changjingzhuqiguan');
-  if (changjingzhuqiguan) {
-    const zhuqiPips = changjingzhuqiguan.children.filter((item) => {
-      return item.name.includes('changjingwire');
-    });
-    zhuqiPips.forEach((item) => {
-      // modal.scene.add(item);
-      const material = new THREE.MeshStandardMaterial({ color: '#f00', roughness: 1, metalness: 1 });
-      item.material = material;
-      item.layers.enable(BLOOM_SCENE);
-    });
-
-    return { zhuqiPips, bloomComposer, finalComposer, materials, darkMaterial, shader, bloomLayer };
-  }
-  return null;
-}
-
-function addArrow(zhuqiModal, curveNum = 8) {
-  const changjing5 = zhuqiModal.getObjectByName('changjing5');
-  if (changjing5) {
-    const pCube53 = changjing5.getObjectByName('pCube53');
-    pCube53.material.color.set('#888');
-    // 盒子
-    const box = new THREE.Box3();
-    box.setFromObject(pCube53);
-    const min = box.min;
-    const max = box.max;
-    const height = -300;
-    // 获取包围盒的四个顶点
-    const vertices = [
-      new THREE.Vector3(min.x + 200, min.y + 500, min.z), // 点 4
-      new THREE.Vector3(max.x, min.y + 500, min.z), //点3
-      new THREE.Vector3(min.x + 200, max.y, min.z), // 起点1
-      new THREE.Vector3(max.x, max.y, min.z), // 点2
-    ];
-
-    // 绘制钻孔曲线
-    // 根据份数计算均线位置, max.x - min.x 为总长, 端点坐标
-    // 纵长
-    const num1 = curveNum + 1; // 钻孔个数+1
-    const gap = (max.x - (min.x + 200)) / num1;
-    const curvePoints: THREE.Vector3[] = [];
-    for (let i = 0; i < num1; i++) {
-      if (i !== 0) {
-        const x = min.x + 200 + gap * i;
-        const y = min.y + 500;
-        const z = min.z + height;
-        const position = new THREE.Vector3(x, y, z);
-        curvePoints.push(position);
-
-        // const ball = new THREE.Mesh(new THREE.SphereGeometry(50, 32, 32), new THREE.MeshStandardMaterial({ color: '#f00' }));
-        // ball.position.set(position.x, position.y, position.z);
-        // pCube53.add(ball);
-      }
-    }
-
-    // 绘制终点集合
-    // (max.y - min.y + 300)
-    const startP = min.y + 300 + (max.y - (min.y + 300)) / 2; // 起点
-    const len = max.y - startP;
-    const curvePoints1: THREE.Vector3[] = [];
-    for (let i = 0; i < curveNum; i++) {
-      const x = curvePoints[curvePoints.length - i - 1].x;
-      const y = startP + (len / curveNum) * i;
-      const z = min.z + height;
-      const position = new THREE.Vector3(x, y, z);
-      curvePoints1.push(position);
-
-      // const ball = new THREE.Mesh(new THREE.SphereGeometry(50, 32, 32), new THREE.MeshStandardMaterial({ color: '#ff0' }));
-      // ball.position.set(position.x, position.y, position.z);
-      // pCube53.add(ball);
-    }
-
-    // 绘制起点集合
-    const curvePoints0: THREE.Vector3[] = [];
-    for (let i = 0; i < curvePoints.length; i++) {
-      const position = new THREE.Vector3(vertices[2].x + 50 * i, vertices[2].y - 50, min.z);
-      curvePoints0.unshift(position);
-      // const ball = new THREE.Mesh(new THREE.SphereGeometry(50, 32, 32), new THREE.MeshStandardMaterial({ color: '#0ff' }));
-      // ball.position.copy(position);
-      // pCube53.add(ball);
-    }
-
-    // 绘制控制点
-    const curvePoints2: THREE.Vector3[] = [];
-    for (let i = 0; i < curvePoints.length; i++) {
-      const y = curvePoints1[i].y + (vertices[2].y - curvePoints1[i].y) / 2;
-      const x = curvePoints1[i].x - gap / 2;
-      const position = new THREE.Vector3(x, y, min.z + height / 2);
-      curvePoints2.push(position);
-      // const ball = new THREE.Mesh(new THREE.SphereGeometry(50, 32, 32), new THREE.MeshStandardMaterial({ color: '#00f' }));
-      // ball.position.copy(position);
-      // pCube53.add(ball);
-    }
-
-    const textureLoader = new THREE.TextureLoader();
-    const texture = textureLoader.load(`/texture/2-1.png`);
-
-    // 设置阵列模式 RepeatWrapping
-    texture.wrapS = THREE.RepeatWrapping;
-    texture.wrapT = THREE.RepeatWrapping;
-    // 设置x方向的重复数(沿着管道路径方向)
-    // 设置y方向的重复数(环绕管道方向)
-    texture.repeat.x = 50;
-    texture.repeat.y = 6;
-    // 设置管道纹理偏移数,便于对中
-    texture.offset.y = 100;
-    const tubeMaterial = new THREE.MeshPhongMaterial({
-      map: texture,
-      color: '#fff',
-      transparent: true,
-      opacity: 1.0,
-    });
-
-    // 根据起点curvePoints0、控制点curvePoints2、终点curvePoints1集合 绘制多条管道
-    for (let i = 0; i < curvePoints0.length; i++) {
-      const contrlP2 = new THREE.Vector3(curvePoints1[i].x, curvePoints1[i].y - 500 * (i + 1), curvePoints1[i].z);
-      const points = [curvePoints0[i], curvePoints2[i], curvePoints1[i], contrlP2];
-      const vec3List = new THREE.CubicBezierCurve3(...points).getPoints();
-      vec3List.push(curvePoints[curvePoints0.length - i - 1]);
-      const geometry = new THREE.TubeGeometry(new THREE.CatmullRomCurve3(vec3List), 100, 10, 8, false);
-      const material = new THREE.MeshStandardMaterial({
-        color: '#4F4F4F',
-        roughness: 0.31,
-        metalness: 0.74,
-      });
-      const mesh = new THREE.Mesh(geometry, material);
-      pCube53.add(mesh);
-
-      const geometry1 = new THREE.TubeGeometry(new THREE.CatmullRomCurve3(vec3List), 100, 40, 8, false);
-      const mesh1 = new THREE.Mesh(geometry1, tubeMaterial.clone());
-      mesh.name = 'zk' + i;
-      pCube53.add(mesh1);
-      pCube53.updateMatrixWorld();
-      pCube53.updateMatrix();
-      mesh1.renderOrder = 1;
-      zhuqiZkList.push(mesh1);
-    }
-
-    zhuqiZkList.reverse();
-    return { texture };
-  }
-  return null;
-}
-
-function addUnit(zhuqiModal, unitNum = 8) {
-  const changjingzhuqiguan = zhuqiModal.getObjectByName('changjingzhuqiguan');
-  if (changjingzhuqiguan) {
-    changjingzhuqiguan.parent.remove(changjingzhuqiguan);
-  }
-  const choucaiguandao = zhuqiModal.getObjectByName('choucaiguandao');
-  if (choucaiguandao) {
-    choucaiguandao.parent.remove(choucaiguandao);
-  }
-
-  const changjing5 = zhuqiModal.getObjectByName('changjing5');
-  if (changjing5) {
-    const pCube53 = changjing5.getObjectByName('pCube53');
-    // 盒子
-    const box = new THREE.Box3();
-    box.setFromObject(pCube53);
-    const min = box.min;
-    const max = box.max;
-    const height = 300;
-    // 获取包围盒的四个顶点
-    const vertices = [
-      new THREE.Vector3(min.x, min.y + 400, min.z + height), // 点 4
-      new THREE.Vector3(max.x, min.y + 400, min.z + height), //点3
-      new THREE.Vector3(min.x, max.y - 700, min.z + height), // 起点1
-      new THREE.Vector3(max.x, max.y - 700, min.z + height), // 点2
-    ];
-
-    // const num = 4;
-    // // 绘制 mun 个小球
-    // for (let i = 0; i < num; i++) {
-    //   const ball = new THREE.Mesh(new THREE.SphereGeometry(100, 32, 32), new THREE.MeshStandardMaterial({ color: '#f00' }));
-    //   ball.position.set(vertices[i].x, vertices[i].y, vertices[i].z);
-    //   pCube53.add(ball);
-    // }
-
-    const textureLoader = new THREE.TextureLoader();
-    const texture = textureLoader.load(`/texture/3-2.png`);
-
-    // 设置阵列模式 RepeatWrapping
-    texture.wrapS = THREE.RepeatWrapping;
-    texture.wrapT = THREE.RepeatWrapping;
-    // 设置x方向的重复数(沿着管道路径方向)
-    // 设置y方向的重复数(环绕管道方向)
-    texture.repeat.x = 0.4;
-    texture.repeat.y = 1;
-    // // 设置管道纹理偏移数,便于对中
-    texture.offset.y = 1;
-    const tubeMaterial = new THREE.MeshPhongMaterial({
-      map: texture,
-      // color: '#FF3B40',
-      color: '#FFC4C4',
-      transparent: true,
-      opacity: 0.5,
-      side: THREE.DoubleSide,
-    });
-
-    // 横长
-    const len = max.y - 700 - (min.y + 400);
-    const gap = len / unitNum;
-    const curvePoints: THREE.Vector3[] = [];
-    // 绘制区域面
-    let lastP = new THREE.Vector3(vertices[0].x, vertices[0].y, vertices[0].z);
-    for (let i = 0; i < unitNum; i++) {
-      let p1, p2, p3, p4;
-      if (i == 0) {
-        const x = vertices[0].x;
-        const y = vertices[0].y + gap;
-        const z = vertices[0].z;
-        p1 = lastP.clone();
-        p2 = new THREE.Vector3(x, y, z);
-        p3 = new THREE.Vector3(max.x, y, z);
-        p4 = new THREE.Vector3(max.x, vertices[0].y, vertices[0].z);
-        lastP = p2.clone();
-      } else {
-        p1 = lastP.clone();
-        p2 = new THREE.Vector3(p1.x, p1.y + gap, p1.z);
-        p3 = new THREE.Vector3(max.x, p2.y, p2.z);
-        p4 = new THREE.Vector3(max.x, p1.y, p1.z);
-        lastP = p2.clone();
-      }
-
-      // 绘制面
-      if (p1 && p2 && p3 && p4) {
-        const geometry = new THREE.BufferGeometry();
-        geometry.setFromPoints([p1, p2, p3, p3, p4, p1]);
-        const material = new THREE.MeshPhongMaterial({
-          color: '#f00',
-        });
-        const mesh = new THREE.Mesh(geometry, tubeMaterial.clone());
-        pCube53.add(mesh);
-
-        // p1 p2 p3 p4
-        // 在该区域内绘制管道, p2->p3走向的管道
-        const num = 5; // 管道数量-1
-        let startGap = getMinGapThreshold(gap, num - 2);
-        startGap = startGap + startGap / 3;
-        const unitGap = (gap - startGap * 2) / (num - 2);
-        const gapStartP = new THREE.Vector3(p1.x, p1.y + startGap, p1.z);
-        for (let i = 0; i < num - 1; i++) {
-          const startP = new THREE.Vector3(gapStartP.x, gapStartP.y + unitGap * i, gapStartP.z);
-          const endP = new THREE.Vector3(max.x, startP.y, startP.z);
-          const geometry = new THREE.TubeGeometry(new THREE.CatmullRomCurve3([startP, endP]), 100, 6, 8, false);
-          const material = new THREE.MeshStandardMaterial({
-            color: '#6F6F6F',
-            roughness: 0.31,
-            metalness: 0.74,
-          });
-          const mesh = new THREE.Mesh(geometry, material);
-          pCube53.add(mesh);
-        }
-
-        const y = p1.y + (p2.y - p1.y) / 2;
-        const startP = new THREE.Vector3(p1.x, y, p1.z - 20);
-        const endP = new THREE.Vector3(max.x, y, p1.z - 20);
-        const cuver = new THREE.CatmullRomCurve3([endP, startP]);
-        const points = cuver.getPoints(64);
-        // const geometry1 = new THREE.TubeGeometry(new THREE.CatmullRomCurve3([endP, startP]), 64, 50, 4, false);
-        // const mesh1 = new THREE.Mesh(geometry1, tubeMaterial);
-        // pCube53.add(mesh1);
-
-        const pathPointList = new PathPointList();
-        const up = new THREE.Vector3(0, 0, -1);
-        pathPointList.set(points, 0, 0, up, false);
-        const geometry1 = new PathGeometry(points.length, false);
-        geometry1.update(pathPointList, {
-          width: 200,
-          arrow: false,
-        });
-        const mesh1 = new THREE.Mesh(geometry1, tubeMaterial.clone());
-        mesh1.renderOrder = 99;
-        pCube53.add(mesh1);
-        gasUnitList.push(mesh1);
-      }
-    }
-    return { arrowTexture: texture };
-  }
-  return null;
-}
-
-function addPip(zhuqiModal, curveNum = 8) {
-  const zhuqiguandao = zhuqiModal.getObjectByName('zhuqiguandao');
-  const changjingpPipe37 = zhuqiModal.getObjectByName('guandao').getObjectByName('changjingpPipe37');
-  const box = new THREE.Box3();
-  box.setFromObject(changjingpPipe37);
-  const min = box.min;
-  const max = box.max;
-  const endP = new THREE.Vector3(max.x - 30, min.y + (max.y - min.y) / 2, min.z + (max.z - min.z) / 2);
-  const startP = new THREE.Vector3(min.x + 30, min.y + (max.y - min.y) / 2, min.z + (max.z - min.z) / 2);
-
-  const endP0 = new THREE.Vector3(max.x, min.y + (max.y - min.y) / 2, min.z + (max.z - min.z) / 2);
-  const startP0 = new THREE.Vector3(min.x, min.y + (max.y - min.y) / 2, min.z + (max.z - min.z) / 2);
-
-  const len = endP.x - startP.x;
-  const gap = len / curveNum;
-
-  const zhuqiguandaoList: THREE.Object3D[] = [];
-
-  for (let i = 0; i < curveNum; i++) {
-    const position = new THREE.Vector3(0 + gap * i, 0, 0);
-    const zhuqiguandaoClone = zhuqiguandao.clone(); // 创建克隆
-    zhuqiguandaoClone.name = 'zhuqiguandao' + i;
-    zhuqiguandaoClone.position.copy(position);
-
-    // 添加点击标识
-    zhuqiModal.add(zhuqiguandaoClone);
-    zhuqiguandaoList.push(zhuqiguandaoClone);
-  }
-  zhuqiguandao.visible = false;
-
-  const { texture } = pipAnimation(zhuqiguandaoList, startP0, endP0, zhuqiModal);
-
-  return { texture };
-}
-
-function pipAnimation(zhuqiguandaoList, startP, endP, zhuqiModal) {
-  const zhuqiModalGroup = new THREE.Object3D();
-  zhuqiModalGroup.name = 'zhuqiModalGroup';
-
-  const textureLoader = new THREE.TextureLoader();
-  const texture = textureLoader.load(`/texture/2-1.png`);
-
-  // 设置阵列模式 RepeatWrapping
-  texture.wrapS = THREE.RepeatWrapping;
-  texture.wrapT = THREE.RepeatWrapping;
-  // 设置x方向的重复数(沿着管道路径方向)
-  // 设置y方向的重复数(环绕管道方向)
-  texture.repeat.x = 20;
-  texture.repeat.y = 6;
-  // 设置管道纹理偏移数,便于对中
-  texture.offset.y = 100;
-  const tubeMaterial = new THREE.MeshPhongMaterial({
-    map: texture,
-    color: '#fff',
-    transparent: true,
-    opacity: 1.0,
-  });
-  const material = new THREE.MeshStandardMaterial({
-    color: '#4F4F4F',
-    roughness: 0.31,
-    metalness: 0.74,
-  });
-
-  const zhuqi_dian = zhuqiModal.getObjectByName('zhuqi_dian');
-  const dian4 = zhuqi_dian.getObjectByName('dian4');
-  const dian3 = zhuqi_dian.getObjectByName('dian3');
-
-  const center = new THREE.Vector3();
-  const box4 = new THREE.Box3();
-  box4.setFromObject(dian4);
-  box4.getCenter(center);
-
-  const pipSP = new THREE.Vector3();
-  const box3 = new THREE.Box3();
-  box3.setFromObject(dian3);
-  box3.getCenter(pipSP);
-
-  // 构建三段管道
-  const pipGeometry1 = new THREE.TubeGeometry(new THREE.CatmullRomCurve3([pipSP, center], false, 'centripetal'), 30, 8, 10, false);
-  const pipGeometry2 = new THREE.TubeGeometry(new THREE.CatmullRomCurve3([center, startP], false, 'centripetal'), 30, 8, 10, false);
-  const pipGeometry3 = new THREE.TubeGeometry(new THREE.CatmullRomCurve3([center, endP], false, 'centripetal'), 30, 8, 10, false);
-
-  const pip1 = new THREE.Mesh(pipGeometry1, tubeMaterial);
-  const pip2 = new THREE.Mesh(pipGeometry2, tubeMaterial);
-  const pip3 = new THREE.Mesh(pipGeometry3, tubeMaterial);
-
-  zhuqiModal.add(pip1, pip2, pip3);
-
-  try {
-    for (let i = 0; i < zhuqiguandaoList.length; i++) {
-      const zhuqiguandao = zhuqiguandaoList[i];
-      const zhuqi_dian_1 = zhuqiguandao.getObjectByName('zhuqi_dian_1');
-
-      const dian1 = zhuqi_dian_1?.getObjectByName('dian2') as THREE.Object3D;
-      const dian2 = zhuqi_dian_1?.getObjectByName('dian1') as THREE.Object3D;
-      const dian3 = zhuqi_dian_1?.getObjectByName('dian') as THREE.Object3D;
-
-      const position1 = new THREE.Vector3();
-      const position2 = new THREE.Vector3();
-      const position3 = new THREE.Vector3();
-
-      const box1 = new THREE.Box3();
-      box1.setFromObject(dian1);
-      box1.getCenter(position1);
-
-      const box2 = new THREE.Box3();
-      box2.setFromObject(dian2);
-      box2.getCenter(position2);
-
-      const box3 = new THREE.Box3();
-      box3.setFromObject(dian3);
-      box3.getCenter(position3);
-
-      const position21 = position2.clone().setY(position2.y - 5);
-      const position22 = position2.clone().setZ(position2.z + 5);
-      const curve = new THREE.QuadraticBezierCurve3(position22, position2, position21);
-      const points = curve.getPoints(30);
-
-      const geometry = new THREE.TubeGeometry(new THREE.CatmullRomCurve3([position1, ...points, position3], false, 'chordal'), 20, 6, 10, false);
-      const mesh = new THREE.Mesh(geometry, tubeMaterial.clone());
-      mesh.position.copy(zhuqiguandao.position);
-      mesh.name = 'pip' + i;
-      zhuqiModal.add(mesh);
-      zhuqiPipList.push(mesh);
-
-      // 绘制点击区域
-      // 鼠标经过时显示线框
-      const material = new THREE.MeshBasicMaterial({
-        color: '#f00',
-        transparent: true,
-        opacity: 1,
-      });
-      const geometry1 = new THREE.TubeGeometry(new THREE.CatmullRomCurve3([position1, ...points, position3], false, 'chordal'), 20, 6, 10, false);
-      // const mesh1 = new THREE.Mesh(geometry1, material);
-      const mesh1 = new THREE.Line(geometry1, material);
-      mesh1.position.copy(zhuqiguandao.position);
-      mesh1.name = 'pipLine' + i;
-      // mesh1.visible = false;
-      zhuqiModal.add(mesh1);
-      pipList.push(mesh1);
-    }
-  } catch (error) {
-    debugger;
-  }
-  // zhuqiModal.add(zhuqiModalGroup);
-
-  return { texture };
-}
-
-function initCss2DContainer(modal) {
-  modal.initCSS3Renderer('#css3dContainer');
-}
-
-/**
- * 计算满足不等式 gap*2 > (len - gap*2)/num 的最小临界值
- * @param {number} len - 总长度
- * @param {number} num - 数量/分段数
- * @returns {number} 返回 gap 必须大于的这个值
- */
-function getMinGapThreshold(len, num) {
-  if (num <= 0) {
-    throw new Error('num 必须大于 0');
-  }
-  if (len <= 0) {
-    return 0;
-  }
-
-  // 公式推导结果: gap > len / (2 * (num + 1))
-  return len / (2 * (num + 1));
-}
-
-/***绘制波纹标识 */
-function createRippleMarker() {
-  // 主容器(方便整体控制)
-  const marker = new THREE.Group();
-
-  // --------------------------
-  // 配置参数(可自由修改)
-  // --------------------------
-  const config = {
-    radius: 10, // 标注大小
-    baseColor: 0x00aaff, // 底色
-    rippleColor: 0xffffff, // 波纹颜色
-    rippleCount: 3, // 波纹层数
-    animateSpeed: 1.5, // 动画速度
-    opacity: 0.8, // 整体透明度
-  };
-
-  // --------------------------
-  // 1)底层静态圆形
-  // --------------------------
-  const baseGeometry = new THREE.CircleGeometry(config.radius, 32);
-  const baseMaterial = new THREE.MeshBasicMaterial({
-    color: config.baseColor,
-    transparent: true,
-    opacity: config.opacity * 0.3,
-  });
-  const baseCircle = new THREE.Mesh(baseGeometry, baseMaterial);
-  marker.add(baseCircle);
-
-  // --------------------------
-  // 2)动态波纹(多层)
-  // --------------------------
-  const ripples = [];
-  for (let i = 0; i < config.rippleCount; i++) {
-    const geo = new THREE.RingGeometry(
-      0, // 内半径
-      config.radius, // 外半径
-      config.radius * 2
-    );
-    const mat = new THREE.MeshBasicMaterial({
-      color: config.rippleColor,
-      transparent: true,
-      opacity: 0,
-      side: THREE.DoubleSide,
-      depthWrite: false, // 防止透明遮挡
-    });
-    const ripple = new THREE.Mesh(geo, mat);
-    ripple.userData.delay = i * 0.4; // 错开动画
-    ripple.userData.speed = config.animateSpeed;
-    ripples.push(ripple);
-    marker.add(ripple);
-  }
-
-  // --------------------------
-  // 3)动画更新函数
-  // --------------------------
-  marker.userData.update = (delta) => {
-    ripples.forEach((rip: THREE.Mesh) => {
-      let t = (delta * rip.userData.speed - rip.userData.delay) % 3;
-      if (t < 0) t += 3;
-
-      // 波纹从中心向外扩散
-      const progress = Math.min(t / 2, 1);
-      const radius = progress * config.radius;
-
-      // 更新环形大小
-      rip.geometry.dispose();
-      rip.geometry = new THREE.RingGeometry(radius * 0.8, radius, 32);
-
-      // 透明度:出现 → 最亮 → 消失
-      rip.material.opacity = progress < 0.5 ? progress * 2 : (1 - progress) * 0.8;
-    });
-  };
-
-  // marker.userData.lookAtCamera = true;
-  return marker;
-}
-
-function addMarker(zhuqiguandao: THREE.Object3D) {
-  const posObj1 = zhuqiguandao?.getObjectByName('网格004_6');
-  const box1 = new THREE.Box3();
-  box1.setFromObject(posObj1);
-  const center1 = box1.getCenter(new THREE.Vector3());
-  const marker_cgq = createRippleMarker();
-  const position = new THREE.Vector3(center1.x, center1.y, center1.z);
-  marker_cgq.position.copy(position.setZ(position.z - 10));
-  marker_cgq.name = 'cgq';
-  marker_cgq.rotateY(Math.PI / 2);
-  zhuqiguandao.add(marker_cgq);
-  cgqMarkerList.push(marker_cgq);
-
-  const posObj2 = zhuqiguandao?.getObjectByName('网格004_2');
-  const box2 = new THREE.Box3();
-  box2.setFromObject(posObj2);
-  const center2 = box2.getCenter(new THREE.Vector3());
-  const marker_llj = createRippleMarker();
-  const pos = new THREE.Vector3(center2.x, center2.y, center2.z);
-  marker_llj.position.copy(pos);
-  marker_llj.name = 'llj';
-  zhuqiguandao.add(marker_llj);
-  lljMarkerList.push(marker_llj);
-}
-/***绘制波纹标识 */