人生啊人生 4 mēneši atpakaļ
vecāks
revīzija
5b068e6ef9
37 mainītis faili ar 16365 papildinājumiem un 2 dzēšanām
  1. 252 0
      src/components/ChengGuangYuanJing/ThreeWorld.vue
  2. 1871 0
      src/components/ChengGuangYuanJing/js/IframeEdit.js
  3. 26 0
      src/components/ChengGuangYuanJing/store/CommonVal.js
  4. 137 0
      src/components/ThreeWorldEventQingXiCheAndQv/DemoEvent.vue
  5. 186 0
      src/components/ThreeWorldEventQingXiCheAndQv/EyeTab.vue
  6. 186 0
      src/components/ThreeWorldEventQingXiCheAndQv/LoadingDemo.vue
  7. 78 0
      src/components/ThreeWorldEventQingXiCheAndQv/MapGps.vue
  8. 62 0
      src/components/ThreeWorldEventQingXiCheAndQv/MeshDb.vue
  9. 119 0
      src/components/ThreeWorldEventQingXiCheAndQv/MeshEvent.vue
  10. 412 0
      src/components/ThreeWorldEventQingXiCheAndQv/ThreeWorldEventMainQingXiCheAndQv.vue
  11. 252 0
      src/components/ThreeWorldEventQingXiCheAndQv/ThreeWorldQingXiCheAndQv.vue
  12. 156 0
      src/components/ThreeWorldEventQingXiCheAndQv/common/ComVal.js
  13. 148 0
      src/components/ThreeWorldEventQingXiCheAndQv/event/QingXiCheAndQvProcessEvent.vue
  14. 228 0
      src/components/ThreeWorldEventQingXiCheAndQv/event/store/QingXiCheAndQvProcessEventStore.js
  15. 2346 0
      src/components/ThreeWorldEventQingXiCheAndQv/js/QingXiCheAndQvCarEvent.js
  16. 3329 0
      src/components/ThreeWorldEventQingXiCheAndQv/js/QingXiCheAndQvCarEventClick.js
  17. 598 0
      src/components/ThreeWorldEventQingXiCheAndQv/js/QingXiCheAndQvComClipPlaneMeshEvent.js
  18. 398 0
      src/components/ThreeWorldEventQingXiCheAndQv/js/QingXiCheAndQvComHighlightLayer.js
  19. 40 0
      src/components/ThreeWorldEventQingXiCheAndQv/js/QingXiCheAndQvComRes.js
  20. 3169 0
      src/components/ThreeWorldEventQingXiCheAndQv/js/QingXiCheAndQvThreeWorldCamera.js
  21. 277 0
      src/components/ThreeWorldEventQingXiCheAndQv/js/QingXiCheAndQvThreeWorldEvent.js
  22. 267 0
      src/components/ThreeWorldEventQingXiCheAndQv/js/QingXiCheAndQvThreeWorldEventMain.js
  23. 61 0
      src/components/ThreeWorldEventQingXiCheAndQv/store/QingXiCheAndQvMyThreeWorldStore.js
  24. 130 0
      src/components/WindowQingXiCheAndQv/WindowCountdown.vue
  25. 183 0
      src/components/WindowQingXiCheAndQv/WindowTxt.vue
  26. 138 0
      src/components/WindowQingXiCheAndQv/WindowVideo.vue
  27. 105 0
      src/components/WindowQingXiCheAndQv/WindowVideoRemoveColor.vue
  28. 123 0
      src/components/WindowQingXiCheAndQv/css/commonsScrollbar.css
  29. 144 0
      src/components/WindowQingXiCheAndQv/css/commonsScrollbar.less
  30. 453 0
      src/components/WindowQingXiCheAndQv/js/VideoAndCanvasToImg.js
  31. 272 0
      src/components/WindowQingXiCheAndQv/js/WindowEvent.js
  32. 28 0
      src/components/WindowQingXiCheAndQv/store/WindowCountdownStore.js
  33. 24 0
      src/components/WindowQingXiCheAndQv/store/WindowTxtStore.js
  34. 31 0
      src/components/WindowQingXiCheAndQv/store/WindowVideoRemoveColorStore.js
  35. 28 0
      src/components/WindowQingXiCheAndQv/store/WindowVideoStore.js
  36. 101 0
      src/utils/common/ComMusic.js
  37. 7 2
      src/view/student/trainChapter/trainChapter.vue

+ 252 - 0
src/components/ChengGuangYuanJing/ThreeWorld.vue

@@ -0,0 +1,252 @@
+<script setup>
+import { watch } from "vue";
+import { CommonVal } from "@/components/ChengGuangYuanJing/store/CommonVal.js";
+import { IframeEdit } from './js/IframeEdit.js'
+
+// 固定操作3d的代码。可以不做其他修改
+
+// 接收参数
+const props = defineProps({
+    iframeId: {
+        type: String
+    },
+    url: {
+        type: String
+    },
+});
+
+
+// 定义发射给父组件的方法
+const emits = defineEmits([
+    'callbackObjIframeEdit',
+    'callbackLoadPercentage',
+    'callbackLoadEnd',
+    'callbackDistanceYes',
+    'callbackDistanceNo',
+    'callbackCameraVisualAngleJsonToLook'
+])
+
+
+/**
+ * 回调加载百分比
+ */
+const callbackLoadPercentageEvent = (json) => {
+    emits('callbackLoadPercentage', json);
+}
+
+/**
+ * 回调加载完成
+ */
+const callbackLoadEndEvent = (json) => {
+    emits('callbackLoadEnd', json);
+}
+
+/**
+ * 回调距离范围内
+ */
+const callbackDistanceYesEvent = (json) => {
+    emits('callbackDistanceYes', json);
+}
+
+/**
+ * 回调距离范围外
+ */
+const callbackDistanceNoEvent = (json) => {
+    emits('callbackDistanceNo', json);
+}
+
+/**
+ * 回调视角切换完成
+ */
+const callbackCameraVisualAngleJsonToLookEvent = (json) => {
+    emits('callbackCameraVisualAngleJsonToLook', json);
+}
+
+/**
+ * 页面初始化
+ */
+const viewInit = () => {
+
+    // 判断是否成功找到摇杆才触发
+    var viewTimeBool = setInterval(function () {
+
+        try {
+
+            var objPreviewBtnMove = objIframeEdit.objIframe.$("#previewBtnMove");
+            if (objPreviewBtnMove != null && objPreviewBtnMove != undefined) {
+                viewAssemblyVisibilityMain();
+                // clearInterval(viewTimeBool);
+                // viewTimeBool = null;
+            }
+
+        } catch (e) {
+        }
+
+    }, 1000 / 3);
+
+}
+
+/**
+ * 隐藏页面组件
+ */
+const viewAssemblyVisibilityMain = () => {
+
+    objIframeEdit.viewAssemblyVisibility();
+    objIframeEdit.viewAssemblyVisibilityRole();
+    objIframeEdit.viewBackgroundColorClean();
+    // 额外隐藏其他的组件
+    objIframeEdit.objIframe.$("#edit3DActionTab").css("display", "none");
+    objIframeEdit.objIframe.$(".previewRoleChatMain").css("display", "none");
+    objIframeEdit.objIframe.$(".previewBtnMove").css("display", "none");
+    objIframeEdit.objIframe.$(".previewBtnAction").css("display", "none");
+    
+}
+
+// 如果是多个iframe,则new 出多个即可。 后续对应的iframe,单独对应的对象去触发封装好的方法
+let objIframeEdit = new IframeEdit();
+CommonVal().obj[props.iframeId] = objIframeEdit;
+
+/**
+ * 初始化应用
+ */
+const appInit = () => {
+
+    objIframeEdit.loading(
+        // html iframe 的 唯一 id, 也就是对应 html id="" 的参数
+        props.iframeId,
+        // 加载完成回调
+        function (roleChoiceOpenBool) {
+
+            callbackLoadEndEvent({
+                "roleChoiceOpenBool": roleChoiceOpenBool
+            });
+
+            // 如果是角色选择
+            if (roleChoiceOpenBool === true) {
+
+                try {
+                    objIframeEdit.objIframe.$(".weiXinSaoYiSao").css("display", "none");
+                } catch (e) {
+                }
+
+                try {
+                    objIframeEdit.objIframe.$(".qrContainerMainLogin").css("display", "none");
+                } catch (e) {
+                }
+
+                try {
+                    objIframeEdit.objIframe.$(".mainLoginSubmitWeiXin").css("display", "none");
+                } catch (e) {
+                }
+
+                try {
+
+                    let btnAll = objIframeEdit.objIframe.$(".btn");
+                    for (let btnAllI = 0; btnAllI < btnAll.length; btnAllI++) {
+
+                        if (btnAll[btnAllI].innerText == "微信登录") {
+                            // console.log(btnAll[btnAllI].innerText);
+                            btnAll[btnAllI].style.display = "none";
+                        }
+
+                    }
+
+                } catch (e) {
+
+                }
+
+            // console.log("加载完成,当前是选择角色页面");
+            } else {
+
+                // console.log("加载完成,当前是3d场景页面");
+                // 某个视角切换完成回调逻辑
+                objIframeEdit.objIframe.window.CameraVisualAngleJsonToLookEvent = function (json) {
+                callbackCameraVisualAngleJsonToLookEvent(json);
+                
+            };
+
+            // 初始化被操作的页面
+            viewInit();
+            
+        }
+
+        },
+        // 加载百分比
+        function (
+            // 加载百分比
+            loadPercentage,
+            // 是否需要触发点击进入的逻辑
+            clickIntoBool
+        ) {
+
+            // console.log( "当前加载百分比", loadPercentage, clickIntoBool );
+            callbackLoadPercentageEvent({
+                "loadPercentage": loadPercentage,
+                "clickIntoBool": clickIntoBool
+            });
+            
+        }
+    );
+
+    // 回调距离事件
+    objIframeEdit.distanceEventJsonCallback = function (distanceEventJson) {
+
+        // console.log("回调距离事件", distanceEventJson);
+        callbackDistanceYesEvent(distanceEventJson["yes"]);
+        callbackDistanceNoEvent(distanceEventJson["no"]);
+
+    };
+
+}
+
+appInit();
+
+</script>
+
+<template>
+    <div class="threeWorldIframeContent" >
+
+        <iframe
+            :id="iframeId" :name="iframeId"
+            class="threeWorldIframe"
+            scrolling="auto" frameborder="no" marginwidth="0" marginheight="0"
+            :src="url"
+        >
+        </iframe>
+
+    </div>
+</template>
+
+<style lang="less" scoped>
+
+.threeWorldIframeContent * {
+    -moz-user-select: none;
+    -webkit-user-select: none;
+    -ms-user-select: none;
+    -khtml-user-select: none;
+    user-select: none;
+}
+
+.threeWorldIframeContent {
+    width: 100%;
+    height: 100%;
+    // position: fixed;
+    position: absolute;
+    left: 0px;
+    top: 0px;
+    z-index: 0;
+    /* 注意这里必须是被允许穿透点击的,否则堆叠高于了  canvas,则会出现无法点击到canvas了。加了这个即可解决这个问题  */
+    // pointer-events: none;
+}
+
+.threeWorldIframe {
+    width: 100%;
+    height: 100%;
+    position: absolute;
+    left: 0px;
+    top: 0px;
+    z-index: 0;
+    /* 注意这里必须是被允许穿透点击的,否则堆叠高于了  canvas,则会出现无法点击到canvas了。加了这个即可解决这个问题  */
+    // pointer-events: none;
+}
+</style>

+ 1871 - 0
src/components/ChengGuangYuanJing/js/IframeEdit.js

@@ -0,0 +1,1871 @@
+/**
+ * 通过iframe进行通讯
+ */
+
+/**
+ * 用于处理3d场景使用,该代码为固定代码
+ * 可以不用修改里面的逻辑
+ * 
+ * 如果你自己有所理解,则可以进行修改
+ * 
+ */
+export class IframeEdit {
+
+    // 每次 new 出对象则会调用这个构造函数
+    constructor() {
+        
+        // 记录 iframe的id
+        this.iframeId = null;
+        // 被调用触发的iframe对象
+        this.objIframe = null;
+        // 判断是否加载完成的计时器,回调使用,判断加载完成,停止计时器
+        this.loadingTime = null;
+         /**
+         * 计时器,用于控制每秒更新全局配置的移动速度使用
+         */
+        this.commonSpeedUpdateTime = null;
+        // 记录最后一次执行的时间戳,来控制多少秒计数一次,每帧的话,太频繁,影响性能,  new Date().getTime();
+        this.allEventTimeRecord = 0;
+        // 统一控制某些事件,多少毫秒执行一次 配合 
+        this.allEventTime = 200;
+        // 回调距离事件,设置回调方法即可
+        this.distanceEventJsonCallback = null;
+
+        // 得到 iframe 里面的地址
+        // 地址前缀是 http, 还是 https
+        this.protocol = null;
+        // 获取域名
+        this.hostname = null;
+        // 获取端口号
+        this.port = null;
+        // 获取主机名+端口号 例如:172.20.11.111:8000
+        this.host = null;
+        // 地址
+        this.lanUrl = null;
+        // 当前访问网址 index.html 的根目录地址
+        this.mainUrl = null;
+
+    }
+
+    /**
+     * 加载,是否可以开始操作3d编辑器了
+     * iframeId         iframe 的id,例如 <iframe allowfullscreen="true" name="newIframe" id="newIframe" ></iframe> 就传 newIframe
+     * callback         回调函数,加载完成成功后返回 callback("ok") 失败则为 callback("error")
+     * loadPercentage   回调函数,加载进度
+     */
+    loading(iframeId, callback, loadPercentage) {
+
+        // 当前自己对象
+        let objThisClass = this;
+        objThisClass.iframeId = iframeId;
+        if (objThisClass.loadingTime != null && objThisClass.loadingTime != 'undefined') {
+            return;
+        }
+
+        objThisClass.loadingTime = setInterval(function () {
+            if (window.frames[iframeId] != null && window.frames[iframeId] != undefined) {
+                objThisClass.objIframe = window.frames[iframeId];
+                
+                try {
+
+                    // 判断页面加载模型是否完成
+                    var initLoadingEnd = objThisClass.objIframe.ChengGuangYuanJing.Loading.find().initLoadingEnd;
+                    // 是否加载完成所有的追加模型
+                    var exhibitionJsonModelLoadSumMaxOkRet = objThisClass.objIframe.ChengGuangYuanJing.MapNew.find().exhibitionJsonModelLoadSumMaxOk();
+                    // 是否允许使用重力了
+                    var moveStartBool = objThisClass.objIframe.ChengGuangYuanJing.EventMoveRole.find().moveStartBool;
+                    // 是否允许帧事件了
+                    var objSceneInitLoadingOneBoolRet = objThisClass.objIframe.ChengGuangYuanJing.CommonEvent.find().objSceneInitLoadingOneBoolRet();
+
+                    // 是否显示点击进入的按钮逻辑
+                    var objLoadingClickInto = objThisClass.objIframe.$("#loadingClickInto");
+                    var objLoadingClickIntoDisplay = objLoadingClickInto.css("display");
+                    // 是否弹出点击进入的逻辑
+                    var objLoadingClickIntoDisplayBool = objLoadingClickIntoDisplay === "block" ? true : false;
+                    
+                    // 此时说明,加载完成了
+                    if (
+                        initLoadingEnd == true
+                        && exhibitionJsonModelLoadSumMaxOkRet["bool"] == true
+                        && moveStartBool == true
+                        && objSceneInitLoadingOneBoolRet == true
+                    ) {
+
+                        objThisClass.objIframe.ChengGuangYuanJing.Loading.find().loadPercentageMain = 100;
+
+                        // 如果不是选择角色页面,则停止回调
+                        if (objThisClass.objIframe.ChengGuangYuanJing.CommonVal.find().roleChoiceOpenBool === false) {
+
+                            clearInterval(objThisClass.loadingTime);
+                            objThisClass.loadingTime = null;
+
+                            clearInterval(objThisClass.commonSpeedUpdateTime);
+                            objThisClass.commonSpeedUpdateTime = null;
+
+                            objThisClass.registerBeforeRenderInit();
+                            objThisClass.htmlUrlPrefixUpdate();
+                            
+                        }
+
+                        loadPercentage(
+                            objThisClass.objIframe.ChengGuangYuanJing.Loading.find().loadPercentageMain,
+                            objLoadingClickIntoDisplayBool
+                        );
+                        
+                        callback(
+                            objThisClass.objIframe.ChengGuangYuanJing.CommonVal.find().roleChoiceOpenBool
+                        );
+                        
+                    } else {
+                        
+                        loadPercentage(
+                            objThisClass.objIframe.ChengGuangYuanJing.Loading.find().loadPercentageMain,
+                            objLoadingClickIntoDisplayBool
+                        );
+
+                    }
+
+                } catch (e) {
+
+                    console.log("报错了");
+
+                }
+
+            }
+
+        }, 300);
+
+        return this;
+
+    }
+
+    /**
+     * 地址前缀等数据的更新
+     */
+    htmlUrlPrefixUpdate() {
+
+        // 地址前缀是 http, 还是 https
+        this.protocol = this.objIframe.window.location.protocol;
+        // 获取域名
+        this.hostname = this.objIframe.window.location.hostname;
+        // 获取端口号
+        this.port = this.objIframe.window.location.port;
+        // 获取主机名+端口号 例如:172.20.11.111:8000
+        this.host = this.objIframe.window.location.host;
+        // 地址
+        this.lanUrl = this.protocol + "//" + this.hostname + ":" + this.port;
+
+        var href = this.objIframe.window.location.href;
+        if (href.indexOf("index.html")) {
+            var hrefArray = href.split("index.html");
+            this.mainUrl = hrefArray[0];
+        } else if (href.indexOf("#")) {
+            var hrefArray = href.split("#");
+            this.mainUrl = hrefArray[0];
+        }
+
+        // console.log(
+        //     "htmlUrlPrefixUpdate",
+        //     href,
+        //     this.mainUrl
+        // );
+
+        return this;
+        
+    }
+
+    /**
+     * 切换成人称模式
+     * val      人称模式
+     *      0        第一人称
+     *      1        第三人称
+     *      2        编辑模式
+     *      3        只有飞行模式
+     */
+    modelPeopleLook(val) {
+        
+
+        // 自动停止GPS漫游
+        this.objIframe.ChengGuangYuanJing.GpsEvent.find().toPlayUpdate(false);
+
+        // 是否发布了
+        // this.objIframe.ChengGuangYuanJing.CommonVal.find().releaseBool = parseFloat(val) < 3 ? true : false;
+        this.objIframe.ChengGuangYuanJing.CommonVal.find().releaseBool = true;
+        // 第一人称视角
+        this.objIframe.ChengGuangYuanJing.CameraArray.find().cameraVisualAngleUpdate(
+            parseFloat(val) >= 3 ? 2 : val
+        );
+        // 可以点击鼠标移动
+        this.objIframe.ChengGuangYuanJing.CommonEvent.find().clickEventMoveRoleBool = true;
+        // 允许键盘操作
+        this.objIframe.ChengGuangYuanJing.CommonEvent.find().keyEventBool == true;
+        // 【 >= 3 只有飞行模式 】
+        this.objIframe.ChengGuangYuanJing.CommonVal.find().releaseCameraVisualAngle = val;
+
+        return this;
+
+    }
+
+    /**
+     * 注册帧事件
+     */
+    registerBeforeRenderInit() {
+
+        // 当前自己对象
+        let objThisClass = this;
+
+        // 场景注册帧事件
+        objThisClass.objIframe.ChengGuangYuanJing.CommonVal.find().objScene.registerBeforeRender(function () {
+
+            // 统一控制一些事件,多少毫秒执行一次
+            if ((new Date().getTime() - objThisClass.allEventTimeRecord) >= objThisClass.allEventTime) {
+
+                // 记录最后一次时间戳
+                objThisClass.allEventTimeRecord = new Date().getTime();
+
+                try {
+
+                    var distanceEventJson = objThisClass.objIframe.ChengGuangYuanJing.CommonEventMesh.find().distanceEventJson;
+                    // console.log("distanceEventJson", distanceEventJson);
+                    // 触发回调
+                    if (objThisClass.distanceEventJsonCallback != null && objThisClass.distanceEventJsonCallback != undefined) {
+                        objThisClass.distanceEventJsonCallback(distanceEventJson);
+                    }
+
+                } catch (e) {
+
+                }
+                
+            }
+
+        });
+
+        // 我们修改位 babylon 的键盘事件来操作
+        objThisClass.objIframe.ChengGuangYuanJing.CommonVal.find().objScene.onKeyboardObservable.add(function (kbInfo) {
+
+            // console.log("键盘事件", kbInfo);
+            switch (kbInfo.type) {
+
+                // 键盘按下
+                case objThisClass.objIframe.BABYLON.KeyboardEventTypes.KEYDOWN:
+                    // console.log("键盘按下", kbInfo, kbInfo.event);
+                    break;
+
+                // 键盘弹起
+                case objThisClass.objIframe.BABYLON.KeyboardEventTypes.KEYUP:
+                    // console.log("键盘弹起", kbInfo, kbInfo.event);
+                    switch (kbInfo.event.keyCode) {
+
+                        // case 32:
+                        // console.log("空格");
+
+                        case 90:
+                            break;
+
+                    }
+
+                    break;
+            }
+
+        });
+        
+    }
+    
+    /**
+     * 通过名字定位到漫游相机
+     * cameraName       相机名字
+     */
+    cameraVisualAngleGetListNameGpsTo(cameraName) {
+
+        // 当前自己对象
+        let objThisClass = this;
+
+        // 如果是在角色视角
+        if (objThisClass.objIframe.ChengGuangYuanJing.CameraArray.find().cameraVisualAngle <= 1) {
+            // 记录相机的坐标和视角,以当前角色视角记录
+            objThisClass.objIframe.ChengGuangYuanJing.CommonVal.find().cameraConfigUpdateOrRecord('record');
+        }
+
+        objThisClass.modelPeopleLook(3);
+        objThisClass.objIframe.ChengGuangYuanJing.CommonVal.find().previewJson.visualAngleRoamPalyBool = false;
+        
+        // 暂停漫游逻辑
+        objThisClass.objIframe.ChengGuangYuanJing.CameraArray.find().fpsSuspend();
+
+        // 获取漫游列表
+        // var cameraVisualAngleGetList = objThisClass.objIframe.ChengGuangYuanJing.CameraArray.find().cameraVisualAngleGetList();
+        var cameraVisualAngleGetList = objThisClass.objIframe.ChengGuangYuanJing.CameraArray.find().cameraVisualAngleJson;
+
+        // console.log(cameraName, "漫游列表", cameraVisualAngleGetList);
+        // 循环数组,找到名字
+        for (var i = 0; i < cameraVisualAngleGetList.length; i++) {
+
+            var thisCameraVisualAngleGetList = cameraVisualAngleGetList[i];
+            // console.log("当前的json", thisCameraVisualAngleGetList);
+
+            // 如果找到名字
+            if (thisCameraVisualAngleGetList.name == cameraName) {
+
+                // 触发动画
+                objThisClass.objIframe.ChengGuangYuanJing.CameraArray.find().cameraVisualAngleJsonToLook(
+                    // 数组下标
+                    i,
+                    // 是否触发直接切换视角的逻辑,如果为 false 则不会触发,否则会根据配置来触发
+                    // false
+                    objThisClass.objIframe.ChengGuangYuanJing.CameraArray.find().cameraVisualAngleCommonConfig.openBoolVisualAngle
+                );
+                return;
+            }
+        }
+    }
+
+    /**
+     * 如果场景加载完成,必须触发点击进入的逻辑
+     */
+    clickEnter() {
+        this.objIframe.ChengGuangYuanJing.Loading.find().clickIntoMain();
+        return this;
+    }
+
+    /**
+     * 得到漫游列表
+     */
+    getCameraVisualAngleGetList() {
+
+        var array = [];
+
+        var cameraVisualAngleGetList = this.objIframe.ChengGuangYuanJing.CameraArray.find().cameraVisualAngleGetList();
+
+        let hostUrl = this.objIframe.ChengGuangYuanJing.MapNew.find().loadUrlAppend;
+        
+        for (let i = 0; i < cameraVisualAngleGetList.length; i++) {
+
+            const thisCameraVisualAngleGetList = cameraVisualAngleGetList[i];
+            thisCameraVisualAngleGetList.img = hostUrl + thisCameraVisualAngleGetList.img;
+            array.push(thisCameraVisualAngleGetList);
+
+        }
+        
+        return array;
+
+    }
+
+
+    /**
+     * 是否显示自己控制的角色
+     * lookBool     是否显示
+     */
+    roleShow(lookBool) {
+        // 显示还是隐藏角色
+        this.objIframe.ChengGuangYuanJing.Role.find().roleShow(lookBool);
+        return this;
+    }
+
+    /**
+     * 获取当前是否自动漫游
+     */
+    getVisualAngleRoamPalyBool() {
+        // 正在切换到人物视角
+        if (this.objIframe.ChengGuangYuanJing.CameraArray.find().toRoleAngleOfView == true) {
+            // 没有播放漫游
+            this.objIframe.ChengGuangYuanJing.CommonVal.find().previewJson.visualAngleRoamPalyBool = false;
+            return false;
+        }
+        return this.objIframe.ChengGuangYuanJing.CommonVal.find().previewJson.visualAngleRoamPalyBool;
+    }
+
+    /**
+     * 自动漫游切换
+     * playBool     true 开启自动漫游, false 暂停自动漫游
+     */
+    visualAngleRoamPalyBoolUpdate(playBool) {
+        if (playBool === true) {
+            this.objIframe.ChengGuangYuanJing.CommonVal.find().previewJson.visualAngleRoamPalyBool = true;
+            this.objIframe.ChengGuangYuanJing.CameraArray.find().fpsPlay();
+            return this;
+        }
+
+        this.objIframe.ChengGuangYuanJing.CameraArray.find().fpsSuspend();
+        this.objIframe.ChengGuangYuanJing.CommonVal.find().previewJson.visualAngleRoamPalyBool = false;
+        return this;
+    }
+
+
+    /**
+     * 获取当前的视角模式
+     */
+    getCameraVisualAngleModel() {
+        return this.objIframe.ChengGuangYuanJing.CameraArray.find().cameraVisualAngle;
+    }
+
+    /**
+     * 得到画的列表
+     */
+    getMeshEditList() {
+
+        var list = [];
+        
+        // 得到飞过去,可以配置的列表
+        var getHuaEditStrList = this.objIframe.ChengGuangYuanJing.CommonVal.find().getHuaEditStrList(true);
+        
+        // 遍历所有物体
+        var meshes = this.objIframe.ChengGuangYuanJing.CommonVal.find().objScene.meshes;
+        for (var i = 0; i < meshes.length; i++) {
+
+            var objMesh = meshes[i];
+            
+            var meshId = objMesh.id;
+            if (meshId == null || meshId == undefined) {
+                continue;
+            }
+
+            var meshName = objMesh.name;
+            if (meshName == null || meshName == undefined) {
+                meshName = "";
+            }
+
+            // 得到分组的上级名字
+            var parentName = objMesh.parent == null || objMesh.parent == undefined ? '' : objMesh.parent.name;
+
+            if (parentName == null || parentName == undefined) {
+                parentName = "";
+            }
+            
+            // 是否触发飞行
+            var huaFlyBool = false;
+            
+            try {
+
+                for (var getHuaEditStrListI = 0; getHuaEditStrListI < getHuaEditStrList.length; getHuaEditStrListI++) {
+                    if (huaFlyBool == true) {
+                        continue;
+                    }
+                    var thisGetHuaEditStrList = getHuaEditStrList[getHuaEditStrListI];
+
+                    if (
+                        parentName.indexOf(thisGetHuaEditStrList) >= 0
+                        || meshName.indexOf(thisGetHuaEditStrList) >= 0
+                        || meshId.indexOf(thisGetHuaEditStrList) >= 0
+                    ) {
+                        huaFlyBool = true;
+                    }
+                }
+
+            } catch (e) {
+
+            }
+            
+            // if (huaFlyBool == false) {
+
+            //     if (
+            //         parentName.indexOf("hua") >= 0
+            //         || (meshName.indexOf("exhibition_html") >= 0 && meshName.indexOf("_hua_") >= 0)
+            //         || (meshId.indexOf("exhibition_html") >= 0 && meshId.indexOf("_hua_") >= 0)
+            //         || parentName.indexOf("图片") >= 0
+            //         || parentName.indexOf("标题文字") >= 0
+            //         || parentName.indexOf("大屏") >= 0
+            //         || meshId.indexOf("hua") >= 0
+            //         || meshId.indexOf("图片") >= 0
+            //         || meshId.indexOf("标题文字") >= 0
+            //         || meshId.indexOf("大屏") >= 0
+            //     ) {
+            //         huaFlyBool = true;
+            //     }
+                
+            // }
+            
+            // 找到带有画的分组
+            if (huaFlyBool == true) {
+                
+                var url = null;
+                if (objMesh.material != null && objMesh.material != undefined) {
+
+                    var objMaterial = objMesh.material;
+                    var urlTexture = objMaterial.diffuseTexture != null && objMaterial.diffuseTexture != undefined
+                    ? objMaterial.diffuseTexture : objMaterial.albedoTexture;
+    
+                    if (urlTexture != null && urlTexture != undefined) {
+                        
+                        // console.log("_buffer", urlTexture._buffer);
+                        if (urlTexture._buffer != null && urlTexture._buffer != undefined) {
+                            var buffer = urlTexture._buffer;
+                            url = URL.createObjectURL(new Blob([buffer]));
+                        } else {
+                            url = urlTexture.url;
+                            try {
+
+                                if (url.indexOf("http") < 0) {
+                                    
+                                    if (
+                                        this.objIframe.ChengGuangYuanJing.ModelObjEdit.find().modelUrl.indexOf("http://") >= 0
+                                        || this.objIframe.ChengGuangYuanJing.ModelObjEdit.find().modelUrl.indexOf("https://") >= 0
+                                    ) {
+                                        url = this.objIframe.ChengGuangYuanJing.ModelObjEdit.find().modelUrl + url;
+                                    } else {
+                                        url = this.mainUrl + url;
+                                    }
+                                    
+                                }
+
+                            } catch (e) {
+                                url = "./assets/img/mp4.png";
+                            }
+                            
+                        }
+    
+                    }
+
+                }
+
+                if (url == null) {
+                    url = "";
+                }
+                
+                if (url.indexOf(".mp4") >= 0) {
+                    url = "./assets/img/mp4.png";
+                }
+                
+                list.push({
+                    "meshId" : objMesh.id,
+                    "imgUrl" : url
+                });
+
+            }
+
+        }
+
+        return list;
+
+    }
+    
+    /**
+     * 得到物体对象以及编辑器的配置数据
+     * meshId       物体的唯一id值
+     */
+    getMeshAndConfig(meshId) {
+
+        var objMesh = this.objIframe.ChengGuangYuanJing.CommonVal.find().objScene.getMeshByID(meshId);
+        if (objMesh == null || objMesh == undefined) {
+            return {
+                "objMesh" : null,
+                "config" : null
+            }
+        }
+
+        var config = this.objIframe.ChengGuangYuanJing.ModelObjEdit.find().getEditJsonOrInit(objMesh);
+
+        return {
+            "objMesh" : objMesh,
+            "config" : config
+        }
+
+    }
+
+    /**
+     * 飞到指定物体的视角
+     * meshId       物体id
+     */
+    flight(meshId) {
+        var objMesh = this.objIframe.ChengGuangYuanJing.CommonVal.find().objScene.getMeshByID(meshId);
+        if (objMesh == null || objMesh == undefined) {
+            return objMesh;
+        }
+        
+        // 切换到只有飞行模式
+        this.modelPeopleLook(3);
+
+        // 编辑模式的情况下,才可以飞过去看
+        this.objIframe.ChengGuangYuanJing.CameraLookFlightObj.find().objStart('mesh', meshId);
+
+        return objMesh;
+
+    }
+
+    /**
+     * 更新目标物体的材质
+     * meshId   物体的id
+     * json     更新的相关json参数
+     * 例如
+     * {
+     *      "albedoTexture" : urlImg,
+     *      "diffuseTexture" : urlImg,
+     *      "diffuseTextureUScale" : 1,
+     *      "diffuseTextureVScale" : 1,
+     * }
+     */
+    objOneMeshListIdToJsonUpdate(meshId, json) {
+
+        // 更新对应模型的参数
+        this.objIframe.ChengGuangYuanJing.ModelObjEdit.find().objOneMeshListIdToJsonUpdate(
+            meshId, json
+        );
+
+        return this;
+    
+    }
+
+
+    /**
+     * 得到保存的配置
+     */
+    getSaveConfig = function() {
+    
+        var httpConfigJson = this.objIframe.ChengGuangYuanJing.CommonVal.find().httpConfigJson;
+        // 拼接处最后保存的 JSON格式的数据
+        var saveJson = this.objIframe.ChengGuangYuanJing.CommonVal.find().saveConfig();
+        httpConfigJson["configJson"] = saveJson;
+        return httpConfigJson;
+
+    }
+
+    /**
+     * 缩放小距离后继续前进
+     * bool     true 继续前进,  false 停止
+     */
+    cameraRadiusForwardUpdate(bool) {
+        this.objIframe.ChengGuangYuanJing.CameraArray.find().cameraRadiusForward = bool;
+        return this;
+    }
+    
+    /**
+     * 鼠标操作模式
+     * 
+     * 参数 type
+     * 0 :
+     * 左键和中间滚轮按住是旋转,右键是平移
+     * Ctrl + 左键按住 是平移
+     * 滚轮滚动是缩放
+     * 
+     * 1 :
+     * 
+     * 右键和中间滚轮按住是旋转
+     * 左键按住 是平移
+     * 滚轮滚动是缩放
+     * 
+     */
+    mouseOperationTypeUpdate(type) {
+
+        this.objIframe.ChengGuangYuanJing.CameraArray.find().mouseOperationType = type;
+        this.objIframe.ChengGuangYuanJing.CommonVal.find().mouseOperationTypeEventUpdate();
+        
+    }
+    
+    /**
+     * 移动速度
+     * value    正值则为追加,负值则不断减少
+     * 
+     * 最大值再 9.99
+     * 最小值   0.01
+     * 
+     */
+    moveTranslationSpeed(value) {
+
+        this.objIframe.ChengGuangYuanJing.Role.find().speed += value;
+
+        var val = this.objIframe.ChengGuangYuanJing.CameraArray.find().jsonCamera.panningSensibility;
+        val += value;
+
+        val = val >= 9.99 ? 9.99 : val;
+        // val = val <= 0.01 ? 0.01 : val;
+        val = val <= 9.3 ? 9.3 : val;
+        
+        this.objIframe.ChengGuangYuanJing.CameraArray.find().jsonCamera.panningSensibility = val;
+
+        this.objIframe.ChengGuangYuanJing.CommonVal.find().objScene.activeCamera.panningSensibility =
+        this.objIframe.ChengGuangYuanJing.CameraArray.find().sensibilityMax - (val * 1000);
+        
+    }
+
+    /**
+     * 更新滚轮速度
+     * value    正值则为追加,负值则不断减少
+     * 
+     * 最大值再 9.99
+     * 最小值   0.01
+     * 
+     */
+    rollerSpeed(value) {
+
+        var val = this.objIframe.ChengGuangYuanJing.CameraArray.find().jsonCamera.precision;
+        val += value;
+
+        val = val >= 9.99 ? 9.99 : val;
+        val = val <= 0.01 ? 0.01 : val;
+
+        this.objIframe.ChengGuangYuanJing.CameraArray.find().jsonCamera.precision = val;
+        
+        this.objIframe.ChengGuangYuanJing.CommonVal.find().objScene.activeCamera.wheelPrecision = 100 - val * 10;
+        this.objIframe.ChengGuangYuanJing.CommonVal.find().objScene.activeCamera.pinchPrecision = 100 - val * 10;
+        
+    }
+    
+    /**
+     * 更新旋转速度
+     * value    正值则为追加,负值则不断减少
+     * 
+     * 最大值再 9.99
+     * 最小值   0.01
+     * 
+     */
+    rotateSpeedUpdate (value) {
+
+        var val = this.objIframe.ChengGuangYuanJing.CameraArray.find().jsonCamera.angularSensibilityXY;
+        val += value;
+
+        val = val >= 9.99 ? 9.99 : val;
+        val = val <= 0.01 ? 0.01 : val;
+
+        this.objIframe.ChengGuangYuanJing.CameraArray.find().jsonCamera.angularSensibilityXY = val;
+        
+        // 旋转速度
+        this.objIframe.ChengGuangYuanJing.CommonVal.find().objScene.activeCamera.angularSensibilityX =
+        this.objIframe.ChengGuangYuanJing.CameraArray.find().sensibilityMax - (val * 1000);
+
+        this.objIframe.ChengGuangYuanJing.CommonVal.find().objScene.activeCamera.angularSensibilityY =
+        this.objIframe.ChengGuangYuanJing.CameraArray.find().sensibilityMax - (val * 1000);
+        
+    }
+
+
+    /**
+     * 获取角色列表
+     */
+    getRoleList() {
+        
+        var list = [];
+
+        var roleSelectList = this.objIframe.ChengGuangYuanJing.CommonVal.find().roleConfigArrayGetSelectList();
+        
+        for (var i = 0; i < roleSelectList.length; i++) {
+            
+            var thisRoleSelectList = roleSelectList[i];
+
+            // 如果不是可选择的角色
+            if (thisRoleSelectList["skinConfig"]["selectRoleSureBool"] != true) {
+                continue;
+            }
+
+            var fileUrl =  this.objIframe.ChengGuangYuanJing.Loading.find().urlReleaseTransformation(thisRoleSelectList.fileUrl);
+            var roleImg =  this.objIframe.ChengGuangYuanJing.Loading.find().urlReleaseTransformation("../../" + thisRoleSelectList.roleImg);
+
+            if (fileUrl.indexOf("http") < 0) {
+                fileUrl = "https://www.3dyzt.com/main/" + fileUrl;
+            }
+
+            if (roleImg.indexOf("http") < 0) {
+                roleImg = "https://www.3dyzt.com/main/" + roleImg;
+            }
+
+            thisRoleSelectList["fileUrl"] = fileUrl;
+            thisRoleSelectList["roleImg"] = roleImg;
+            list.push(thisRoleSelectList);
+
+        }
+        
+        return list;
+
+    }
+    
+
+    /**
+     * 切换当前角色的皮肤
+     * codeId      角色列表的 codeId
+     */
+    thisSkinUpdate(codeId) {
+
+        this.objIframe.ChengGuangYuanJing.Role.find().skinUpdate(
+            this.objIframe.ChengGuangYuanJing.Role.find().roleCode,
+            codeId
+        );
+
+        // 更新缓存
+        this.objIframe.localStorage.removeItem('skinName');
+        this.objIframe.localStorage.setItem('skinName', codeId);
+
+        return this;
+    }
+
+    /**
+     * 更新当前玩家的昵称
+     * name     更新的名称
+     */
+    nicknameUpdate(name) {
+
+        this.objIframe.ChengGuangYuanJing.WebSocketMain.find().nickname = name;
+        // 更新缓存
+        this.objIframe.localStorage.removeItem('nicknameMy');
+        this.objIframe.localStorage.setItem('nicknameMy', name);
+        return this;
+        
+    }
+
+    /**
+     * 进入活动
+     */
+    goActivity() {
+
+        this.objIframe.$("#goActivityBtn").click();
+
+        // this.objIframe.ChengGuangYuanJing.goActivity();
+
+        // var url = this.objIframe.window.location.href;
+
+        // if (url.indexOf("index.html#")) {
+        //     var hrefArray = url.split("index.html#");
+        //     url = hrefArray[1];
+        // } else if (url.indexOf("index.html")) {
+        //     var hrefArray = url.split("index.html");
+        //     url = hrefArray[1];
+        // }
+        
+        // url = "index.html#" + url;
+        
+        // if (url.indexOf("rolechoice=yes") < 0) {
+        //     if (url.indexOf("?") >= 0) {
+        //         url = url + "&rolechoice=yes";
+        //     } else {
+        //         url = url + "?rolechoice=yes";
+        //     }
+        // }
+
+        // if (
+        //     url.indexOf("special_code=") < 0
+        //     && specialCode != null && specialCode != undefined
+        // ) {
+        //     if (url.indexOf("?") >= 0) {
+        //         url = url + "&special_code=" + specialCode;
+        //     } else {
+        //         url = url + "?special_code=" + specialCode;
+        //     }
+        // }
+        
+        // console.log( "跳转地址", url );
+
+        // document.getElementById(this.iframeId).src = url;
+        
+        return this;
+
+    }
+
+    /**
+     * 操作当前控制的玩家跳跃
+     */
+    roleJump() {
+
+        // 不是编辑模式,说明是操作角色的时候
+        if (this.objIframe.ChengGuangYuanJing.CameraArray.find().cameraVisualAngle != 2) {
+            // console.log("触发跳跃逻辑");
+            this.objIframe.ChengGuangYuanJing.Role.find().jump();
+        }
+
+        return this;
+
+    }
+
+    /**
+     * 获取当前被操作的角色的唯一标识的皮肤
+     * 成功返回 container 对象,否则返回 null
+     */
+    getRoleCodeSkin = function() {
+
+        let roleCode = this.objIframe.ChengGuangYuanJing.Role.find().roleCode;
+        return this.objIframe.ChengGuangYuanJing.Role.find().getRoleCodeSkin(roleCode);
+
+    }
+
+    /**
+     * 得到对应物体id可以播放的动画列表
+     * meshId       物体id
+     * 成功返回数组对象,否则返回null
+     */
+    getMeshIdAnimationGroups(meshId) {
+
+        if (meshId == null || meshId == undefined) {
+            return null;
+        }
+
+        let getMeshIdAnimationGroups = this.objIframe.ChengGuangYuanJing.CommonEventMesh.find().getMeshIdAnimationGroups(meshId);
+        let getMeshAnimationGroups = this.objIframe.ChengGuangYuanJing.CommonEventMesh.find().getMeshAnimationGroups(meshId);
+
+        if (
+            getMeshIdAnimationGroups == null || getMeshIdAnimationGroups == undefined
+            || getMeshAnimationGroups == null || getMeshAnimationGroups == undefined
+        ) {
+            return null;
+        }
+
+        // 如果是角色
+        let meshIdNew = meshId;
+        // 转换成正确的code
+        meshIdNew = meshIdNew.replaceAll("_roleCodeGet_", "");
+
+        if (
+            this.objIframe.ChengGuangYuanJing.Role.find().roleCodeAllConfig[meshIdNew] != null
+            && this.objIframe.ChengGuangYuanJing.Role.find().roleCodeAllConfig[meshIdNew] != undefined
+        ) {
+
+            let roleConfig = this.objIframe.ChengGuangYuanJing.Role.find().roleCodeAllConfig[meshIdNew];
+            // 通过更新的皮肤来得到播放列表
+            let skinUpdate = roleConfig["skinUpdate"];
+
+            if (
+                this.objIframe.ChengGuangYuanJing.Role.find().meshRoleConfig[skinUpdate] != null
+                && this.objIframe.ChengGuangYuanJing.Role.find().meshRoleConfig[skinUpdate] != undefined
+            ) {
+
+                // 得到皮肤的参数
+                let skinJson = this.objIframe.ChengGuangYuanJing.Role.find().meshRoleConfig[skinUpdate];
+                let skinJsonAnimationGroups = skinJson["animationGroups"];
+                let animationGroupsNew = [];
+                for (let i = 0; i < skinJsonAnimationGroups.length; i++) {
+
+                    var thisSkinJsonAnimationGroups = skinJsonAnimationGroups[i];
+                    var json = {
+                        "value" : i,
+                        "name" : thisSkinJsonAnimationGroups.name
+                    };
+
+                    animationGroupsNew.push(json);
+
+                }
+                
+                getMeshAnimationGroups = animationGroupsNew;
+                
+            }
+            
+        }
+        
+        return {
+            "objAnimationGroups" : getMeshIdAnimationGroups,
+            "config" : getMeshAnimationGroups
+        }
+
+    }
+
+    /**
+     * 获取当前操作的角色动画列表
+     * 成功返回列表,否则返回null
+     */
+    getRoleAnimationList() {
+
+        return this.objIframe.ChengGuangYuanJing.Role.find().getRoleAnimationList();
+        
+        // let getRoleCodeSkin = this.getRoleCodeSkin();
+        // if (getRoleCodeSkin == null || getRoleCodeSkin == undefined) {
+        //     return null;
+        // }
+
+        // if (getRoleCodeSkin["meshes"] == null || getRoleCodeSkin["meshes"] == undefined) {
+        //     return null;
+        // }
+
+        // let meshes = getRoleCodeSkin["meshes"];
+        // let objMesh = meshes[0];
+
+        // let meshId = objMesh["myRoleCode"] != null && objMesh["myRoleCode"] != undefined
+        // ? objMesh["myRoleCode"] + "_roleCodeGet_" : objMesh.id;
+
+        // let getMeshIdAnimationGroups = this.getMeshIdAnimationGroups(meshId);
+        // return getMeshIdAnimationGroups;
+        
+    }
+
+    /**
+     * 通过动画的名字,切换当前角色的动画列表【实时通信切换效果】
+     * name     动画名字
+     */
+    roleAnimationNameSocketPlayOrStop(name) {
+
+        // 得到当前控制的玩家的行为配置
+        let roleCode = this.objIframe.ChengGuangYuanJing.Role.find().roleCode;
+
+        // console.log(
+        //     roleCode,
+        //     this.objIframe.ChengGuangYuanJing.Role.find().roleCodeAllConfig,
+        //     this.objIframe.ChengGuangYuanJing.Role.find().roleCodeAllConfig[roleCode]
+        // );
+
+        if (
+            this.objIframe.ChengGuangYuanJing.Role.find().roleCodeAllConfig[roleCode] == null
+            || this.objIframe.ChengGuangYuanJing.Role.find().roleCodeAllConfig[roleCode] == undefined
+        ) {
+            return null;
+        }
+        
+        // 获取当前用户的动画列表
+        let getRoleAnimationList = this.getRoleAnimationList();
+        if (getRoleAnimationList == null || getRoleAnimationList == undefined) {
+            return null;
+        }
+        
+        let objAnimationGroups = getRoleAnimationList["objAnimationGroups"];
+        let config = getRoleAnimationList["config"];
+        for (let i = 0; i < config.length; i++) {
+
+            let thisConfig = config[i];
+            if (thisConfig.name == name) {
+
+                if (objAnimationGroups[i] != null && objAnimationGroups[i] != undefined) {
+
+                    var thisObjAnimationGroups = objAnimationGroups[i];
+                    this.objIframe.ChengGuangYuanJing.Role.find().roleCodeAllConfig[roleCode]["animationGroupsUpdateBool"] = false;
+                    this.objIframe.ChengGuangYuanJing.Role.find().roleCodeAllConfig[roleCode]["animationGroupsUpdate"] = i;
+                    
+                }
+
+                return this;
+            }
+            
+        }
+        
+        return this;
+
+    }
+
+
+    /**
+     * 通过动画的名字,切换当前角色的动画列表,控制播放,还是暂停,不是实时通信
+     * name     动画名字
+     * bool     yes    播放, no    暂停
+     */
+    roleAnimationNamePlayOrStop(name, bool) {
+
+        // 获取当前用户的动画列表
+        let getRoleAnimationList = this.getRoleAnimationList();
+        if (getRoleAnimationList == null || getRoleAnimationList == undefined) {
+            return null;
+        }
+        
+        let objAnimationGroups = getRoleAnimationList["objAnimationGroups"];
+        let config = getRoleAnimationList["config"];
+        for (let i = 0; i < config.length; i++) {
+
+            let thisConfig = config[i];
+            if (thisConfig.name == name) {
+
+                if (objAnimationGroups[i] != null && objAnimationGroups[i] != undefined) {
+
+                    var thisObjAnimationGroups = objAnimationGroups[i];
+                    // 播放动画
+                    if (bool == "yes") {
+
+                        // 第几个动画数组进行播放
+                        thisObjAnimationGroups.start(
+                            // 是否循环【 当不循环的时候,可以再通过 .animationGroups[第几个动画].isStarted 指定是否播放完成了,例如技能【动作必须】使用后,就会切换成别的动作技能,可以这样判断了 】
+                            true, 
+                            // 播放速度
+                            1.0, 
+                            // 不是必填 可以填 动画的 from 属性
+                            thisObjAnimationGroups.from, 
+                            // 不是必填 可以填写 动画的 to 属性
+                            thisObjAnimationGroups.to, 
+                            // 不是必填
+                            false
+                        );
+
+                    } else {
+
+                        // 停止动画
+                        thisObjAnimationGroups.stop();
+
+                    }
+                    
+                }
+
+                return this;
+            }
+            
+        }
+        
+        return this;
+
+    }
+
+
+    /**
+     * 让指定事件范围code配置的物体恢复可见度
+     * likeCode         对应配置距离的 code 参数, 模糊匹配
+     * 返回匹配操作的所有物体id
+     */
+    distanceEventJsonVisibilityResetting(likeCode) {
+
+        return this.objIframe.ChengGuangYuanJing.CommonEventMesh.find().distanceEventJsonVisibilityResetting(likeCode);
+
+    }
+
+    /**
+     * 让指定事件范围code配置的物体隐藏
+     * likeCode         对应配置距离的 code 参数, 模糊匹配
+     * 返回匹配操作的所有物体id
+     */
+    distanceEventJsonVisibilityNo(likeCode) {
+
+        return this.objIframe.ChengGuangYuanJing.CommonEventMesh.find().distanceEventJsonVisibilityNo(likeCode);
+
+    }
+    
+    /**
+     * 除了左侧摇杆其他所有组件隐藏
+     */
+    viewAssemblyVisibility() {
+        
+        this.objIframe.$(".previewRightEye").css("display", "none");
+        this.objIframe.$(".previewList").css("display", "none");
+        this.objIframe.$(".previewRoleAction").css("display", "none");
+        this.objIframe.$(".previewRoleBottomRight").css("display", "none");
+        return this;
+
+    }
+
+    /**
+     * 隐藏角色界面的组件
+     */
+    viewAssemblyVisibilityRole() {
+
+        this.objIframe.$("#loadingRoleTitle").css("display", "none");
+        this.objIframe.$("#loadingRoleSelect").css("display", "none");
+        this.objIframe.$("#loadingRoleBg").css("display", "none");
+        this.objIframe.$("#loadingRoleSelectNickname").css("display", "none");
+        return this;
+
+    }
+
+    /**
+     * 清除背景颜色
+     */
+    viewBackgroundColorClean() {
+
+        this.objIframe.$(".Preview").css("background-color", "transparent");
+        this.objIframe.$("html").css("background-color", "transparent");
+        this.objIframe.$("body").css("background-color", "transparent");
+        return this;
+        
+    }
+
+    /**
+     * 截图
+     * compression  压缩比例, 1 代表没有压缩  0.9 代表保留 90%的质量, 值越小,则图片质量越小,压缩就越多
+     * callback     回调函数 返回 base64 位图片结果
+     */
+    screenshot(compression, callback) {
+
+        var base64 = this.objIframe.ChengGuangYuanJing.CommonVal.find().screenshot();
+        // 图片压缩
+        this.objIframe.ChengGuangYuanJing.CommonVal.find().imgSetBase(base64, compression, function(base64RetMapMax) {
+            callback(base64RetMapMax);
+        });
+        
+        return this;
+    }
+
+    /**
+     * 发起表情
+     * img      网络地址的图片, 例如 https://www.3dyzt.com/main/common/res/img/main/emoj/01.png
+     *                      系统自带的 ../../common/res/img/main/emoj/01.png  到 07
+     */
+    sendExpression(img) {
+
+        var json = {
+            "positionDistanceX" : 0,
+            "positionDistanceY" : 0,
+            "positionDistanceZ" : 0
+        }
+
+        this.objIframe.ChengGuangYuanJing.ParticleSystemAuto.find().followObjMeshAdd(
+            this.objIframe.ChengGuangYuanJing.Role.find().roleCode + "_ParticleSystemAuto",
+            this.objIframe.ChengGuangYuanJing.Role.find().roleCode + "_roleCodeGet_",
+            img,
+            3000,
+            json
+        );
+
+
+        // socket 发送消息,进行同步让别人也看到发出的表情
+        this.objIframe.ChengGuangYuanJing.WebSocketMain.find().sendMessage(
+            this.objIframe.ChengGuangYuanJing.WebSocketMain.find().room,
+            {
+                // 发起粒子表情
+                "type" : "particleSystemAutoFollowObjMeshAdd",
+                // 发送给的目标客户端id 【 群聊,传 房间号,否则传目标 socketId 】
+                "socketIdObj" : this.objIframe.ChengGuangYuanJing.WebSocketMain.find().room,
+                // 唯一的userId
+                "userId" : this.objIframe.ChengGuangYuanJing.WebSocketMain.find().userId,
+                // 表情地址
+                "imgUrl" : img,
+                // 坐标距离
+                "json" : json
+            }
+        );
+
+        return this;
+
+    }
+    
+     /**
+     * 触发通过随机布展进行随机创建物体在世界场景里
+     * exhibitionJsonKey       目标布展的物体key值, this.exhibitionJson 的 key
+     * sum                      创建的数量
+     * 
+     * 如下几个参数存在,则会触发创建对应的距离事件逻辑,用于后续随机创建寻找红包的逻辑
+     * distanceStart            开始距离
+     * distanceEnd              结束距离
+     * code                     特殊code
+     * 
+     * 例如
+     * CommonVal.find().randomExhibitionJson( this.previewJson.exhibitionConfig.id, this.randomExhibitionSum );
+     * CommonVal.find().randomExhibitionJson( this.previewJson.exhibitionConfig.id, this.randomExhibitionSum, 0, 10, "红包" );
+     * 
+     */
+    randomExhibitionJson(exhibitionJsonKey, sum, distanceStart, distanceEnd, code) {
+        // this.objIframe.ChengGuangYuanJing.CommonVal.find().randomGpsVis(true);
+        return this.objIframe.ChengGuangYuanJing.CommonVal.find().randomExhibitionJson(
+            exhibitionJsonKey, sum, distanceStart, distanceEnd, code
+        );
+    }
+
+    /**
+     * 删除目标随机布展生成的物体
+     * exhibitionJsonKey       目标布展的物体key值, this.exhibitionJson 的 key
+     * 
+     */
+    randomExhibitionJsonObjDelAll(exhibitionJsonKey) {
+        return this.objIframe.ChengGuangYuanJing.CommonVal.find().randomExhibitionJsonObjDelAll(exhibitionJsonKey);
+    }
+
+    /**
+     * 获取指定物体
+     * meshId       目标物体id
+     * 成功返回物体对象,否则返回null
+     */
+    getObjMesh(meshId) {
+
+        var objMesh = this.objIframe.ChengGuangYuanJing.CommonVal.find().objScene.getMeshByID(meshId);
+        if (objMesh == null || objMesh == undefined) {
+            return null;
+        }
+
+        return objMesh;
+
+    }
+    
+    /**
+     * 发送烟花
+     * 
+     * type                         sphere - 球体, txt - 文字
+     * code                         生成烟花的唯一id,用于自动创建div使用
+     * txt                          type = txt 才生效,发射的文字
+     * position                     坐标 例如 { "x" : 1, "y" : 2, "z" : 3 }
+     * particleEmitterTypeRadius    球体半径
+     * transmitTime                 发射多少秒后爆炸
+     * moveSpeed                    发射速度
+     * explosionTime                爆炸多少秒
+     * fallingTime                  爆炸后多少秒消失
+     * scaling                      缩放例如 1、 2、 0.1 等
+     * 
+     */
+    transmitFireworksEvent(
+        type,
+        code,
+        txt,
+        position,
+        particleEmitterTypeRadius,
+        transmitTime,
+        moveSpeed,
+        explosionTime,
+        fallingTime,
+        scaling
+    ) {
+
+        return this.objIframe.ChengGuangYuanJing.CommonEventMesh.find().transmitFireworks(
+            type,
+            code,
+            txt,
+            position,
+            particleEmitterTypeRadius,
+            transmitTime,
+            moveSpeed,
+            explosionTime,
+            fallingTime,
+            scaling
+        );
+
+    }
+
+    /**
+     * 以当前玩家释放烟花
+     * type                         sphere - 球体, txt - 文字
+     * txt                          发送文字, / 代表可以换行发送
+     * scaling                      缩放例如 1、 2、 0.1 等
+     * 
+     */
+    roleFireworksTransmit(type, txt, scaling) {
+        return this.objIframe.ChengGuangYuanJing.CommonEventMesh.find().roleFireworksTransmit(
+            type, txt, scaling
+        );
+        
+    }
+    
+    /**
+     * 得到当前是否在自动漫游的逻辑
+     */
+    getAutoRoamBool() {
+        return this.objIframe.ChengGuangYuanJing.CommonVal.find().previewJson.visualAngleRoamPalyBool;
+    }
+
+    /**
+     * 显示或者隐藏可操作的动作
+     * openBool     yes 弹出, no 隐藏
+     */
+    actionTabOpen(openBool) {
+
+        this.objIframe.ChengGuangYuanJing.CommonVal.find().ringMenu(openBool);
+        this.objIframe.ChengGuangYuanJing.CommonVal.find().ringMenu2(openBool);
+
+        return this;
+
+    }
+
+
+    /**
+     * 将目标布展特殊ID,进行生成距离事件的隐藏效果,来实现藏红包逻辑
+     * 通过算法来进行计算随机红包逻辑或者后续的宝箱逻辑
+     * 
+     * specialCode          特殊ID
+     * sumMax               最大数量,类似随机红包的最大数量
+     * step                 第几轮红包,该参数会决定一个随机的固定算法
+     * eventMeshRemoveBool  是否自动移除自带的所有距离事件
+     * eventMeshNoBool      是否设置新的距离事件
+     * visibility           重置可见度,如果是 null, 则不触发重置
+     * eventConfigJson      生成的对应距离事件参数, 如果传null,则不创建距离事件
+     *              例如
+     *              {
+     *                   distanceStart: 开始距离,
+     *                   distanceEnd: 结束距离,
+     *                   distanceY : Y轴高度,0则不限制高度,
+     *                   name: "名字",
+     *                   code: "特殊code",
+     *                   transitionTime : type = 3 物体可见缩放完成的过渡时间,秒,
+     *                   typeVal : 0 不可见, 1 可见,
+     *                   scaling : 缩放,可以通过这里控制烟花的尺寸大小或者控制物体的尺寸,
+     *              }
+     * 
+     */
+    specialCodeAddEventMesh(
+        specialCode,
+        sumMax,
+        step,
+        eventMeshRemoveBool,
+        eventMeshNoBool,
+        visibility,
+        eventConfigJson
+    ) {
+        
+        return this.objIframe.ChengGuangYuanJing.CommonVal.find().specialCodeAddEventMesh(
+            specialCode,
+            sumMax,
+            step,
+            eventMeshRemoveBool,
+            eventMeshNoBool,
+            visibility,
+            eventConfigJson
+        );
+        
+    }
+    
+    /**
+     * 背景音乐开关
+     * openBool     是否开启
+     */
+    musicBgSoundOpenEvent(openBool) {
+        return this.objIframe.ChengGuangYuanJing.CommonVal.find().musicBgSoundOpenEvent(openBool);
+    }
+
+    /**
+     * 全部声音开关的控制
+     * bool     true   开启, false 关闭
+     */
+    soundOpenEvent(bool) {
+        return this.objIframe.ChengGuangYuanJing.CommonVal.find().soundOpenEvent(bool);
+    }
+    
+
+    
+    /**
+     * 获取可进行外部二次开发编辑图片的列表
+     * 浏览器控制台测试案例
+     * ChengGuangYuanJing.CommonVal.find().apiEditStrGetList();
+     */
+    apiEditStrGetList() {
+        return this.objIframe.ChengGuangYuanJing.CommonVal.find().apiEditStrGetList();
+    }
+
+    /**
+     * 触发更新 获取 apiEditStrGetList 的列表,对应的贴图数据
+     * 
+     * tabIndex     第一层的数组下标
+     * imgIndex     对应图片的数组下标
+     * url          图片地址,例如 https://fanyi-cdn.cdn.bcebos.com/static/translation/img/header/logo_e835568.png
+     * 
+     * 因为该参数是提供给外部二次开发使用的。他们可以自定义带有域名图片的地址
+     * 这里的url替换的图片,一定必须是编译成网址格式的
+     * 
+     * 浏览器控制台测试案例
+     * ChengGuangYuanJing.CommonVal.find().apiEditStrGetListImgUrlUpdate(0, 1, "https://www.bejson.com/static/bejson/img/logo.png");
+     * ChengGuangYuanJing.CommonVal.find().apiEditStrGetListImgUrlUpdate(0, 6, "https://fanyi-cdn.cdn.bcebos.com/static/translation/img/header/logo_e835568.png");
+     * 
+     */
+    apiEditStrGetListImgUrlUpdate(tabIndex, imgIndex, url) {
+
+        return this.objIframe.ChengGuangYuanJing.CommonVal.find().apiEditStrGetListImgUrlUpdate(tabIndex, imgIndex, url);
+
+    }
+
+
+
+    /**
+     * 触发更新 获取 apiEditStrGetList 的列表,对应的点击事件逻辑
+     * 
+     * tabIndex     第一层的数组下标
+     * imgIndex     对应图片的数组下标
+     * jsonUpdate   传编辑后的物体事件,json配置
+     *              参数见 src\utils\view\preview\event\CommonEventMesh.js 的 eventEditApiMeshInit()
+     * 
+     * 更新案例见
+     * 
+     * 【弹出图片逻辑】
+     * 
+    ChengGuangYuanJing.CommonVal.find().eventEditApiMeshUpdate(
+        0, 1,
+        {
+            type : 1,
+            openImgUrl : null,
+            openImgUrlList : [
+                { "fileUrl" : "https://www.bejson.com/static/bejson/img/logo.png" },
+                { "fileUrl" : "https://fanyi-cdn.cdn.bcebos.com/static/translation/img/header/logo_e835568.png" }
+            ],
+            openImgStyle : 0,
+            openImgTitle : null,
+            openImgTxt : "我是图片备注的内容",
+            openWebVideoWidth: 1280,
+            openWebVideoHeight: 720,
+        }
+    );
+    
+    【弹出视频逻辑】
+
+    ChengGuangYuanJing.CommonVal.find().eventEditApiMeshUpdate(
+        0, 2,
+        {
+            type : 4,
+            openImgUrl : "https://www.3dyzt.com/CommonAssets/video/mp4/randomReward/AngularParticleRise1.mp4",
+            openImgUrlList : [
+                { "fileUrl" : "https://www.bejson.com/static/bejson/img/logo.png" },
+                { "fileUrl" : "https://fanyi-cdn.cdn.bcebos.com/static/translation/img/header/logo_e835568.png" }
+            ],
+            openImgStyle : 0,
+            openImgTitle : null,
+            openImgTxt : "我是图片备注的内容",
+            openWebVideoWidth: 1280,
+            openWebVideoHeight: 720,
+        }
+    );
+
+     * 
+     */
+    eventEditApiMeshUpdate(tabIndex, imgIndex, jsonUpdate) {
+        
+        return this.objIframe.ChengGuangYuanJing.CommonVal.find().eventEditApiMeshUpdate(tabIndex, imgIndex, jsonUpdate);
+
+    }
+
+
+
+    /**
+     * 得到一个最后存储单独用户 &userconfig= 配置结果的json对象
+     * 这样保存的json保证了后续我们模板更新,用户的模板也会同步更新
+     * 而用户最终只会更新它自己保存存储的模板数据
+     * 
+     * meshListIdToJsonAllBool      true - 解析的 材质 meshListIdToJson 是否是全部json结果,false , 单独,贴图参数
+     * 
+     * 浏览器控制台测试案例
+     * ChengGuangYuanJing.CommonVal.find().getUserconfig(false);
+     * ChengGuangYuanJing.CommonVal.find().getUserconfig(true);
+     * 
+     */
+    getUserconfig(meshListIdToJsonAllBool) {
+    
+        return this.objIframe.ChengGuangYuanJing.CommonVal.find().getUserconfig(meshListIdToJsonAllBool);
+
+    }
+
+    /**
+     * 是否控制二次开发自定义事件后,是否触发内置弹窗
+     * bool     true - 二次开发回调自己控制弹窗, false - 编辑器内置的弹窗
+     */
+    eventEditApiMeshOpenWindowBool(bool) {
+
+        this.objIframe.ChengGuangYuanJing.CommonEventMesh.find().eventEditApiMeshOpenWindowBool = bool;
+        return this;
+
+    }
+
+
+    /**
+     * 更新音乐
+     * url      音乐地址
+     *          例如 https://www.3dyzt.com/musicDemo/1.wav   或   https://www.3dyzt.com/musicDemo/2.wav
+     * 
+     *          也可以传 null
+     */
+    musicBgUrlUpdate(url) {
+
+        this.objIframe.ChengGuangYuanJing.CommonVal.find().musicBg = url;
+        return this;
+
+    }
+
+    /**
+     * 批量将系统的所有Sound的声音调整音量
+     * volume       音量
+     * type         musicBg - 背景音乐, other - 其他
+     */
+    mainSoundTrackUpdateVolume(volume, type) {
+        
+        return this.objIframe.ChengGuangYuanJing.CommonVal.find().mainSoundTrackUpdateVolume(
+            volume, type
+        );
+
+    }
+
+
+    /**
+     * 自动漫游停止
+     */
+    gpsAutoRoamStop() {
+
+        this.objIframe.ChengGuangYuanJing.GpsEvent.find().toPlayUpdate(false);
+
+    }
+
+    /**
+     * 追加模型自带的相机渲染逻辑
+     * name                 目标相机的名字
+     * lockedTargetName     让相机跟随目标物体的名字
+     * 
+     * 如果找不到目标相机的id名字,则不会追加
+     * 
+     * 【由于我们很多逻辑,都固定写在了第一个默认的相机里面了】
+     * 所以后面切换相机渲染,我们不要采用 activeCamera 去改变
+     * 我们可以通过利用
+     * 
+     * CommonVal.find().objScene.activeCameras.push(arcRotateCameraCodeGetObj);
+     * 【 注意这里的相机的添加顺序。 越是后面追加的,则越置顶显示 】
+     * 
+     * 机制进行增加,或者删除渲染的相机,来达到效果
+     * 
+     * ChengGuangYuanJing.CameraArray.find().activeCamerasAddLook('摄像机');
+     */
+    activeCamerasAddLook(name, lockedTargetName) {
+
+        return this.objIframe.ChengGuangYuanJing.CameraArray.find().activeCamerasAddLook(
+            name, lockedTargetName
+        );
+        
+    }
+
+    /**
+     * 删除目标渲染的相机
+     * name       目标相机的名字
+     * 
+     * ChengGuangYuanJing.CameraArray.find().activeCamerasAddDel('摄像机');
+     * 
+     */
+    activeCamerasAddDel(name) {
+        return this.objIframe.ChengGuangYuanJing.CameraArray.find().activeCamerasAddDel(
+            name
+        );
+    }
+    
+    /**
+     * 操作指定的动画
+     * name     动画的名字
+     * speed    速度,默认 1
+     * type     start - 从第一帧开始播放, stop - 停止
+     */
+    animationGroupsEvent(name, speed, type) {
+        return this.objIframe.ChengGuangYuanJing.CommonVal.find().animationGroupsEvent(
+            name, speed, type
+        );
+    }
+
+
+    /**
+     * 操作指定的动画
+     * name     动画的名字
+     * type     start - 从第一帧开始播放, stop - 停止 , getObj - 不做任何操作只返回目标动画对象
+     * speed    速度,默认 1 【 整数,是 正序播放, 负数例如 -1  则为倒序播放 】
+     * forBool  是否循环, true- 循环, false - 不循环,只播放一次
+     * from     从第几帧
+     * to       播放到第几帧
+     * index    第几个动画数组下标,当该参数传了后,则 name 的逻辑不触发
+     * callback 回调函数,如果播放完成了,还是停止了等情况事件进行回调
+     * 
+     * // 只是获取动画对象
+     ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+         "风扇叶001|蔬菜棚-out|BaseLayer", 'getObj', null, null, null, null, null, null
+     );
+     * 
+     * // 自动按照动画帧数播放
+     ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+        "风扇叶001|蔬菜棚-out|BaseLayer", 'start', 1,  null, null, false, null, function(state, objAnimation) {
+            console.log("动画回调", state, objAnimation);
+        }
+     );
+
+     // 数组下标目标动画播放
+     ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+        "风扇叶001|蔬菜棚-out|BaseLayer", 'start', 1,  null, null, false, 65, function(state, objAnimation) {
+            console.log("动画回调", state, objAnimation);
+        }
+     );
+     * 
+     * //  指定目标动画多少帧播放到多少帧
+     ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+        "折帘001|蔬菜棚-out|BaseLayer", 'start', 1,  10, 100, false, null, function(state, objAnimation) {
+            console.log("动画回调", state, objAnimation);
+        }
+     );
+
+     // 停止指定动画播放
+     ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+        "风扇叶001|蔬菜棚-out|BaseLayer", 'stop', null, null, null, null, null, null
+     );
+     *
+     *
+     * 成功回调
+     * function(state, objAnimation) {}
+     * state            播放完成 | 循环完成 | 暂停 | 开始播放
+     * objAnimation     动画对象
+     */
+    animationGroupsEventCallback(name, type, speed, from, to, forBool, index, callback) {
+
+        return this.objIframe.ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+            name, type, speed, from, to, forBool, index, callback
+        );
+        
+    }
+    
+    /**
+     * 获取所有动画列表
+     */
+    getAnimationGroups() {
+        return this.objIframe.ChengGuangYuanJing.CommonVal.find().objScene.animationGroups;
+    }
+
+    /**
+     * 是否被控屏幕
+     * 实时通讯是否允许继续发送消息
+     * 
+     * bool     true - 用户不允许发送自己的坐标消息, false - 可以继续同步发送
+     * 
+     */
+    screenControl(bool) {
+        return this.objIframe.ChengGuangYuanJing.WebSocketMain.find().screenControl = bool;
+    }
+
+
+
+    /**
+     * 是否弹出角色选择
+     * openMain     true - 直接弹出, false - 根据配置和缓存是否选择来弹出
+     * 返回 true - 弹出, false - 没有弹出
+     * 
+     * // 直接弹出
+     * ChengGuangYuanJing.CommonEvent.find().viewScreenRoleSelectOpenEvent(true);
+     * 
+     */
+    viewScreenRoleSelectOpenEvent(openMain) {
+        return this.objIframe.ChengGuangYuanJing.CommonEvent.find().viewScreenRoleSelectOpenEvent(openMain);
+    }
+
+    /**
+     * 是否弹出引导页
+     * openMain     true - 直接弹出, false - 根据配置和缓存是否选择来弹出
+     * 返回 true - 弹出, false - 没有弹出
+     * 
+     * // 直接弹出
+     * ChengGuangYuanJing.CommonEvent.find().viewScreenGuideSelectOpenEvent(true);
+     * 
+     */
+    viewScreenGuideSelectOpenEvent(openMain) {
+        return this.objIframe.ChengGuangYuanJing.CommonEvent.find().viewScreenGuideSelectOpenEvent(openMain);
+    }
+
+
+    /**
+     * 弹出祝福语
+     * nickname     昵称
+     * txt          祝福语
+     * 
+     * ChengGuangYuanJing.KongMingDeng.find().mainKongMingDengDongHuaOpenEvent("昵称", "祝福语");
+     * 
+     */
+    mainKongMingDengDongHuaOpenEvent(nickname, txt) {
+
+        return this.objIframe.ChengGuangYuanJing.KongMingDeng.find().mainKongMingDengDongHuaOpenEvent(
+            nickname, txt
+        );
+
+    }
+
+    /**
+     * 更新自己用户自定义 webSocket 的 myNewCode 数据
+     * val          自定义的参数, 可以是字符串,也可以是对象, 如果是对象,则自定义json数据即可
+     * 
+     * 通过这样外部开发控制
+     * ChengGuangYuanJing.WebSocketMain.find().myNewCodeUpdate("自定义code");
+     * 
+     * 自定义json
+     * ChengGuangYuanJing.WebSocketMain.find().myNewCodeUpdate({ "a" : "我是自定义a", "b" : "我是自定义b" });
+     * 
+     * 定义固定获取指定 【 socketId 】 的用户数据
+     * ChengGuangYuanJing.WebSocketMain.find().myNewCodeUpdate({ "getDbListJson" : { "websocket的id1" : "y", "websocket的id2" : "y" } });
+     * 例如
+     * ChengGuangYuanJing.WebSocketMain.find().myNewCodeUpdate({ "getDbListJson" : { "nEKGmuLPpBRAsS3NAAAB" : "y" } });
+     * 注意这里一定是 "websocket的id1" : "y"  这个 "y" 值,否则会不符合筛选逻辑
+     * 
+     * 可以通过
+     * ChengGuangYuanJing.WebSocketMain.find().thisSocketRoomListJson
+     * 来看到当前房间号的所有用户数据
+     * 
+     */
+    myNewCodeUpdate(val) {
+
+        return this.objIframe.ChengGuangYuanJing.WebSocketMain.find().myNewCodeUpdate(
+            val
+        );
+        
+    }
+
+    /**
+     * 通过自定义的 myNewCode 实现跟随和定位的逻辑
+     * myNewCode            传用户自定义的 myNewCode
+     * type                 moveFollow - 跟随,gpsMove - 定位
+     * 
+     * 前提的用户目标的客户端先执行了
+     * ChengGuangYuanJing.WebSocketMain.find().myNewCodeUpdate("自定义code");
+     * 
+     * 外部开发调用
+     * ChengGuangYuanJing.WebSocketMain.find().moveFollowOrGpsMove("自定义code", "gpsMove");
+     * ChengGuangYuanJing.WebSocketMain.find().moveFollowOrGpsMove("自定义code", "moveFollow");
+     * 
+     */
+    moveFollowOrGpsMove(myNewCode, type) {
+
+        return this.objIframe.ChengGuangYuanJing.WebSocketMain.find().moveFollowOrGpsMove(
+            myNewCode, type
+        );
+
+    }
+
+    /**
+     * 是否弹出,商品点击界面
+     * viewOpen         是否弹出界面
+     * shopImg          商品图片
+     * shopTitle        商品标题
+     * shopSelectTime   倒计时多少秒
+     * 
+     * 外部开发调用案例
+    ChengGuangYuanJing.ShopEvent.find().mainShopSelectOpen(
+        true,
+        "common/res/img/main/people_profile_two.png",
+        "【2024年龙年对联广告企业对联定制烫金春节红包对联大礼包定LOGO】",
+        10
+    );
+     * 
+    ChengGuangYuanJing.ShopEvent.find().mainShopSelectOpen(false);
+     */
+    mainShopSelectOpen(viewOpen, shopImg, shopTitle, shopSelectTime) {
+
+        return this.objIframe.ChengGuangYuanJing.ShopEvent.find().mainShopSelectOpen(
+            viewOpen, shopImg, shopTitle, shopSelectTime
+        );
+        
+    }
+
+    /**
+     * 更新商品详情的显示内容
+     * titleImg     商品详情图片
+     * html         商品详情html内容
+     * copyTxt      被复制的内容
+     * platform     平台
+     * qrCodeUrl    二维码地址
+     * 
+    ChengGuangYuanJing.ShopEvent.find().mainShopUpdate(
+        "common/res/img/main/people_profile_two.png",
+        '<p><img src="https://www.3dyzt.com/meta-meet/files/editor/1197553613048778752.webp" alt="" data-href="null" style=""/></p><p><img src="https://www.3dyzt.com/meta-meet/files/editor/1197553648666808320.png" alt="" data-href="null" style=""/></p>',
+        "被复制的内容",
+        "自定义平台"
+    );
+     */
+    mainShopUpdate(titleImg, html, copyTxt, platform, qrCodeUrl) {
+
+        return this.objIframe.ChengGuangYuanJing.ShopEvent.find().mainShopUpdate(
+            titleImg, html, copyTxt, platform, qrCodeUrl
+        );
+
+    }
+
+    /**
+     * 是否弹出,商品详情界面
+     * viewOpen     是否弹出界面
+     * 
+     * ChengGuangYuanJing.ShopEvent.find().mainShopOpen(true);
+     * 
+     */
+    mainShopOpen(viewOpen) {
+        
+        return this.objIframe.ChengGuangYuanJing.ShopEvent.find().mainShopOpen(
+            viewOpen
+        );
+
+    }
+
+
+
+
+
+    
+
+
+
+
+    
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 26 - 0
src/components/ChengGuangYuanJing/store/CommonVal.js

@@ -0,0 +1,26 @@
+import { defineStore } from 'pinia'
+import { ref, watch } from "vue";
+
+export const CommonVal = defineStore('CommonVal', () => {
+
+    /**
+     * 统一放置全局用到的对象,变量等参数
+     */
+    const obj = ref({
+        /**
+         * 被操作的3d场景的对象,该参数在使用组件 src\components\ChengGuangYuanJing\ThreeWorld.vue
+         * 与自定义 :iframeId="'newIframe'" 传参名字一致即可
+         * */
+        newIframe : null,
+        // 清洗车 和 QV
+        CommonValQingXiCheAndQv : null,
+    });
+
+    const loadSuccess = ref(false);
+
+    return {
+        obj,
+        loadSuccess
+    }
+
+})

+ 137 - 0
src/components/ThreeWorldEventQingXiCheAndQv/DemoEvent.vue

@@ -0,0 +1,137 @@
+<script setup>
+import { QingXiCheAndQvMyThreeWorldStore } from "./store/QingXiCheAndQvMyThreeWorldStore.js";
+import { QingXiCheAndQvCarEvent } from "./js/QingXiCheAndQvCarEvent.js";
+import { QingXiCheAndQvThreeWorldEventMain } from "./js/QingXiCheAndQvThreeWorldEventMain.js";
+import { QingXiCheAndQvProcessEventStore } from "./event/store/QingXiCheAndQvProcessEventStore.js";
+
+/**
+ * 切换菜单,触发不同逻辑
+ * name         切换的菜单
+ */
+const menuEvent = (name) => {
+
+    for (let key in QingXiCheAndQvMyThreeWorldStore().obj.menu) {
+        QingXiCheAndQvMyThreeWorldStore().obj.menu[key] = false;
+    }
+
+    QingXiCheAndQvMyThreeWorldStore().obj.menu[name] = true;
+
+    // console.log(
+    //     "QingXiCheAndQvMyThreeWorldStore().obj.menu", QingXiCheAndQvMyThreeWorldStore().obj.menu
+    // );
+    
+    // 城市供水管道巡查调度虚拟仿真
+    if (QingXiCheAndQvMyThreeWorldStore().obj.menu.mapGps == true) {
+
+        return;
+    }
+
+    // 城市供水管道维护清洗虚拟仿真
+    if (QingXiCheAndQvMyThreeWorldStore().obj.menu.waterPipe == true) {
+        // QingXiCheAndQvCarEvent.find().evnetInit_1();
+
+        // 自动触发到第1个步骤
+        QingXiCheAndQvProcessEventStore().obj.listIndex = 0;
+        // 进入触发当前步骤的逻辑
+        QingXiCheAndQvCarEvent.find().typeEvent(
+            QingXiCheAndQvProcessEventStore().obj.list[QingXiCheAndQvProcessEventStore().obj.listIndex].name
+        );
+
+        // 上一步按钮是否展示
+        QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallback = function(openBool) {
+            QingXiCheAndQvProcessEventStore().obj.btnUp = openBool;
+        };
+
+        // 下一步按钮是否展示
+        QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallback = function(openBool) {
+            QingXiCheAndQvProcessEventStore().obj.btnDown = openBool;
+        };
+
+        setTimeout(function() {
+            QingXiCheAndQvThreeWorldEventMain.find().commonBirthplaceUpdate();
+        }, 1600);
+        
+        return;
+    }
+
+    // 城市供水管道检测虚拟仿真
+    if (QingXiCheAndQvMyThreeWorldStore().obj.menu.look == true) {
+
+        return;
+    }
+
+    // 城市供水管道数智修复虚拟仿真
+    if (QingXiCheAndQvMyThreeWorldStore().obj.menu.repair == true) {
+
+        return;
+    }
+
+    // 回到人物视角
+    if (QingXiCheAndQvMyThreeWorldStore().obj.menu.roleLook == true) {
+        QingXiCheAndQvThreeWorldEventMain.find().toRoleEvent();
+        return;
+    }
+    
+}
+
+</script>
+
+<template>
+    
+    <div class="DemoEvent">
+        
+        <div class="main">
+
+            <div class="btnDemo" v-on:click="menuEvent('mapGps')" >城市供水管道巡查调度虚拟仿真</div>
+            <div class="btnDemo" v-on:click="menuEvent('waterPipe')" >城市供水管道维护清洗虚拟仿真</div>
+            <div class="btnDemo" v-on:click="menuEvent('look')" >城市供水管道检测虚拟仿真</div>
+            <div class="btnDemo" v-on:click="menuEvent('repair')" >城市供水管道数智修复虚拟仿真</div>
+            <div class="btnDemo" v-on:click="menuEvent('roleLook')" >回到人物视角</div>
+
+        </div>
+
+    </div>
+
+</template>
+
+<style lang="less" scoped>
+
+.DemoEvent * {
+    -moz-user-select: none;
+    -webkit-user-select: none;
+    -ms-user-select: none;
+    -khtml-user-select: none;
+    user-select: none;
+}
+
+.DemoEvent {
+
+    position: fixed;
+    top: 0px;
+    right: 0px;
+    width: 0px;
+    height: 0px;
+
+    .main {
+
+        position: fixed;
+        top: 10px;
+        left: 10px;
+        z-index: 30;
+        
+        .btnDemo {
+            float: left;
+            margin: 5px;
+            font-size: 16px;
+            padding: 5px;
+            background-color: #ffffff;
+            border-radius: 3px;
+            display: inline-flex;
+            cursor:pointer;
+        }
+
+    }
+
+}
+
+</style>

+ 186 - 0
src/components/ThreeWorldEventQingXiCheAndQv/EyeTab.vue

@@ -0,0 +1,186 @@
+<script setup>
+import { QingXiCheAndQvMyThreeWorldStore } from "./store/QingXiCheAndQvMyThreeWorldStore.js";
+import { CommonVal } from "@/components/ChengGuangYuanJing/store/CommonVal.js";
+
+/**
+ * 切换到飞行模式
+ */
+const flyModel = () => {
+
+    // 引入的3d对象, 这里的 CommonValQingXiCheAndQv 是你前面自定义的,后续可以自己更换
+    var threeWorld = CommonVal().obj.CommonValQingXiCheAndQv;
+    var objIframeEdit = threeWorld;
+    var objIframe = threeWorld.objIframe;
+    var scene = threeWorld.objIframe.ChengGuangYuanJing.CommonVal.find().objScene;
+    var BABYLON = threeWorld.objIframe.BABYLON;
+
+    objIframeEdit.modelPeopleLook(3);
+
+    QingXiCheAndQvMyThreeWorldStore().meshDbOpen = false;
+
+}
+
+/**
+ * 第一人称
+ */
+const eyeOne = () => {
+
+    // 引入的3d对象, 这里的 CommonValQingXiCheAndQv 是你前面自定义的,后续可以自己更换
+    var threeWorld = CommonVal().obj.CommonValQingXiCheAndQv;
+    var objIframeEdit = threeWorld;
+    var objIframe = threeWorld.objIframe;
+    var scene = threeWorld.objIframe.ChengGuangYuanJing.CommonVal.find().objScene;
+    var BABYLON = threeWorld.objIframe.BABYLON;
+
+    objIframeEdit.modelPeopleLook(0);
+
+    QingXiCheAndQvMyThreeWorldStore().meshDbOpen = false;
+
+}
+
+/**
+ * 第三人称
+ */
+const eyeThree = () => {
+
+    // 引入的3d对象, 这里的 CommonValQingXiCheAndQv 是你前面自定义的,后续可以自己更换
+    var threeWorld = CommonVal().obj.CommonValQingXiCheAndQv;
+    var objIframeEdit = threeWorld;
+    var objIframe = threeWorld.objIframe;
+    var scene = threeWorld.objIframe.ChengGuangYuanJing.CommonVal.find().objScene;
+    var BABYLON = threeWorld.objIframe.BABYLON;
+
+    objIframeEdit.modelPeopleLook(1);
+
+    QingXiCheAndQvMyThreeWorldStore().meshDbOpen = false;
+
+}
+
+/**
+ * 切换指定名字的视角
+ * name     3d编辑器里,定义好的视角名字
+ */
+const eyeNameLook = function(name) {
+
+    // 引入的3d对象, 这里的 CommonValQingXiCheAndQv 是你前面自定义的,后续可以自己更换
+    var threeWorld = CommonVal().obj.CommonValQingXiCheAndQv;
+    var objIframeEdit = threeWorld;
+    var objIframe = threeWorld.objIframe;
+    var scene = threeWorld.objIframe.ChengGuangYuanJing.CommonVal.find().objScene;
+    var BABYLON = threeWorld.objIframe.BABYLON;
+
+    // 切换到指定名字视角
+    objIframeEdit.cameraVisualAngleGetListNameGpsTo(name);
+    // 不显示角色
+    objIframeEdit.roleShow(false);
+
+    QingXiCheAndQvMyThreeWorldStore().meshDbOpen = false;
+
+}
+
+/**
+ * 自动巡检
+ */
+const automaticLookEvent = function() {
+
+    // 引入的3d对象, 这里的 CommonValQingXiCheAndQv 是你前面自定义的,后续可以自己更换
+    var threeWorld = CommonVal().obj.CommonValQingXiCheAndQv;
+    var objIframeEdit = threeWorld;
+    var objIframe = threeWorld.objIframe;
+    var scene = threeWorld.objIframe.ChengGuangYuanJing.CommonVal.find().objScene;
+    var BABYLON = threeWorld.objIframe.BABYLON;
+
+    // 切换到指定名字视角
+    objIframeEdit.cameraVisualAngleGetListNameGpsTo("自动巡检");
+    // 显示角色
+    objIframeEdit.roleShow(true);
+
+    QingXiCheAndQvMyThreeWorldStore().meshDbOpen = false;
+
+}
+
+
+
+</script>
+
+<template>
+    
+    <div class="EyeTab">
+        
+        <div class="title">切换视角</div>
+
+        <div class="list" v-on:click="flyModel()" >
+            <p>飞行模式</p>
+        </div>
+
+        <div class="list" v-on:click="eyeOne()" >
+            <p>第一人称</p>
+        </div>
+
+        <div class="list" v-on:click="eyeThree()" >
+            <p>第三人称</p>
+        </div>
+
+        <div class="list" v-on:click="eyeNameLook('鸟瞰')" >
+            <p>切换视角到 【鸟瞰】</p>
+        </div>
+
+        <div class="list" v-on:click="eyeNameLook('视角1')" >
+            <p>切换视角到 【视角1】</p>
+        </div>
+
+        <div class="list" v-on:click="eyeNameLook('视角2')" >
+            <p>切换视角到 【视角2】</p>
+        </div>
+
+        <div class="list" v-on:click="automaticLookEvent()" >
+            <p>切换视角到 【自动巡检】</p>
+        </div>
+
+    </div>
+
+</template>
+
+<style lang="less" scoped>
+
+.EyeTab * {
+    -moz-user-select: none;
+    -webkit-user-select: none;
+    -ms-user-select: none;
+    -khtml-user-select: none;
+    user-select: none;
+}
+
+.EyeTab {
+
+    position: fixed;
+    top: 0px;
+    right: 0px;
+    width: 300px;
+    padding: 5px;
+    z-index: 1;
+    background-color: #000000;
+    border: 1px solid #ffffff;
+
+    .title {
+
+        width: 100%;
+        padding: 5px;
+        text-align: center;
+        font-size: 14px;
+        border: 1px solid #ffffff;
+        color: #ffffff;
+
+    }
+
+    .list {
+        width: 100%;
+        padding: 3px;
+        border: 1px solid #ffffff;
+        color: #ffffff;
+        cursor:pointer;
+    }
+
+}
+
+</style>

+ 186 - 0
src/components/ThreeWorldEventQingXiCheAndQv/LoadingDemo.vue

@@ -0,0 +1,186 @@
+<script setup>
+import { QingXiCheAndQvMyThreeWorldStore } from "./store/QingXiCheAndQvMyThreeWorldStore.js";
+
+</script>
+
+<template>
+    <div class="LoadingDemo">
+
+        <div class="bgDiv"></div>
+        <div class="main">
+            <!-- 加载进度 {{ QingXiCheAndQvMyThreeWorldStore().loadPercentage }} % -->
+
+            <!-- <img class="logo" src="../../assets/res/img/main/loading/logo.svg" /> -->
+            <img class="logo" src="../../assets/res/img/main/loading/logo_2.svg" />
+            <div class="logoTxt">市政供水仿真平台</div>
+            <div class="loadTxt" >数据加载中Loading...</div>
+
+            <div class="loading">
+
+                <img class="progressImg" src="../../assets/res/img/main/loading/progress.webp" />
+                <div class="loadDiv" :style="'width:' + QingXiCheAndQvMyThreeWorldStore().loadPercentage + '%;'" >
+                    <img
+                    :style="
+                    'width:' + (100 / QingXiCheAndQvMyThreeWorldStore().loadPercentage * 95 )
+                    + '%;left:' + (100 / QingXiCheAndQvMyThreeWorldStore().loadPercentage * 2.5 ) + '%;'
+                    "
+                    class="loadingImg" src="../../assets/res/img/main/loading/loading.webp" />
+                </div>
+
+                <div class="progressTxt" > {{ 
+                    (
+                        (QingXiCheAndQvMyThreeWorldStore().loadPercentage == "" || QingXiCheAndQvMyThreeWorldStore().loadPercentage == undefined || QingXiCheAndQvMyThreeWorldStore().loadPercentage == 0)
+                        ? "0" : QingXiCheAndQvMyThreeWorldStore().loadPercentage
+                    )
+                }} % </div>
+
+            </div>
+
+        </div>
+
+        
+    </div>
+</template>
+
+<style lang="less" scoped>
+
+.LoadingDemo * {
+    -moz-user-select: none;
+    -webkit-user-select: none;
+    -ms-user-select: none;
+    -khtml-user-select: none;
+    user-select: none;
+}
+
+.LoadingDemo {
+
+    position: fixed;
+    top: 0px;
+    left: 0px;
+    width: 100%;
+    height: 100%;
+    z-index: 9;
+    color: #ffffff;
+    font-size: 2.1428rem;
+    
+    // background-image: url("../../assets/res/img/bg.png");
+    // background-position: center;
+    // background-size: 100% 100%;
+    
+    .bgDiv {
+        position: fixed;
+        z-index: 0;
+        width: 100%;
+        height: 100%;
+        top: 0px;
+        left: 0px;
+        background-color: #061f51;
+    }
+
+    .main {
+
+        position: fixed;
+        z-index: 1;
+        width: 100%;
+        height: 100%;
+        top: 0px;
+        left: 0px;
+
+        // display: flex;
+        // flex-direction: column;
+        // justify-content: center;
+        // align-items: center;
+
+        // background: linear-gradient( 164deg, #3A7DC1 0%, rgba(70,148,229,0.61) 39%, rgba(58,125,193,0) 100%), linear-gradient( 197deg, #3A7DC1 0%, rgba(70,148,229,0.63) 63%, rgba(58,125,193,0) 100%);
+        
+        .logo {
+            width: 9.7857rem;
+            left: 50%;
+            top: 50%;
+            margin: -10rem 0px 0px -4.89285rem;
+            position: fixed;
+        }
+
+        .logoTxt {
+            position: fixed;
+            width: 100%;
+            font-size: 2.1rem;
+            color: #98BDDD;
+            text-align: center;
+            top: 50%;
+            margin: 0.5rem 0px 0px 0px;
+        }
+
+        .loadTxt {
+            position: fixed;
+            width: 100%;
+            text-align: center;
+            top: 50%;
+            margin: 9.5rem 0px 0px 0px;
+            color: #9BC0F6;
+            font-size: 1.8rem;
+            font-weight: 400;
+
+        }
+
+        .loading {
+
+            width: 46%;
+            // height: 1.2857rem;
+            height: 3.6rem;
+            position: fixed;
+            top: 50%;
+            left: 27%;
+            margin: 13.5rem 0px 0px 0px;
+
+            .progressImg {
+                position: absolute;
+                top: 0px;
+                left: 0px;
+                width: 100%;
+                height: 100%;
+                z-index: 0;
+            }
+            
+            // background-image: url("../../assets/res/img/main/loading/progress.svg");
+            // background-position: center;
+            // background-size: 100% 100%;
+
+            .loadDiv {
+
+                position: absolute;
+                // width: 100%;
+                width: 0%;
+                top: 0px;
+                left: 0px;
+                height: 100%;
+                overflow: hidden;
+
+                .loadingImg {
+                    
+                    position: absolute;
+                    width: 95%;
+                    left: 2.5%;
+                    top: 50%;
+                    height: 0.8rem;
+                    margin: -0.38rem 0px 0px 0px;
+
+                }
+
+            }
+
+            .progressTxt {
+                color: #9BC0F6;
+                font-size: 1.5714rem;
+                position: absolute;
+                right: 1rem;
+                top: 3rem;
+            }
+
+        }
+
+    }
+
+}
+
+</style>

+ 78 - 0
src/components/ThreeWorldEventQingXiCheAndQv/MapGps.vue

@@ -0,0 +1,78 @@
+<script setup>
+import { watch, ref } from "vue";
+
+let iframeId = ref("mapGpsIframe");
+let url = ref("http://223.83.74.66:18062/nongcun/#/monitorMapLite");
+
+</script>
+
+<template>
+    
+    <div class="MapGps">
+        
+        <div class="main">
+            
+            <!-- <iframe
+                :id="iframeId" :name="iframeId"
+                class="iframeCom"
+                scrolling="auto" frameborder="no" marginwidth="0" marginheight="0"
+                :src="url"
+            >
+            </iframe> -->
+
+        </div>
+
+    </div>
+
+</template>
+
+<style lang="less" scoped>
+
+.MapGps * {
+    -moz-user-select: none;
+    -webkit-user-select: none;
+    -ms-user-select: none;
+    -khtml-user-select: none;
+    user-select: none;
+}
+
+.MapGps {
+
+    position: fixed;
+    top: 0px;
+    right: 0px;
+    width: 0px;
+    height: 0px;
+    
+    .main {
+
+        position: fixed;
+        top: 0px;
+        left: 0px;
+        width: 100%;
+        height: 100%;
+        z-index: 9;
+
+        background-image: url("../../assets/res/img/for.png");
+        -webkit-background-size: cover;
+        -moz-background-size: cover;
+        -o-background-size: cover;
+        background-size: cover;
+        background-position: center center;
+        
+        .iframeCom {
+            width: 100%;
+            height: 100%;
+            position: absolute;
+            left: 0px;
+            top: 0px;
+            z-index: 0;
+            /* 注意这里必须是被允许穿透点击的,否则堆叠高于了  canvas,则会出现无法点击到canvas了。加了这个即可解决这个问题  */
+            // pointer-events: none;
+        }
+        
+    }
+
+}
+
+</style>

+ 62 - 0
src/components/ThreeWorldEventQingXiCheAndQv/MeshDb.vue

@@ -0,0 +1,62 @@
+<script setup>
+import { QingXiCheAndQvMyThreeWorldStore } from "./store/QingXiCheAndQvMyThreeWorldStore.js";
+
+</script>
+
+<template>
+    
+    <div class="MeshDb">
+        
+        <div class="title">自定义显示物体的数据</div>
+        
+        <div class="list" >
+            <p> {{ QingXiCheAndQvMyThreeWorldStore().meshDbOpenMeshId }} 的数据 </p>
+        </div>
+        
+    </div>
+
+</template>
+
+<style lang="less" scoped>
+
+.MeshDb * {
+    -moz-user-select: none;
+    -webkit-user-select: none;
+    -ms-user-select: none;
+    -khtml-user-select: none;
+    user-select: none;
+}
+
+.MeshDb {
+
+    position: fixed;
+    left: 50%;
+    margin: 0px 0px 0px -150px;
+    width: 300px;
+    padding: 5px;
+    z-index: 3;
+    background-color: #000000;
+    border: 1px solid #ffffff;
+
+    .title {
+
+        width: 100%;
+        padding: 5px;
+        text-align: center;
+        font-size: 14px;
+        border: 1px solid #ffffff;
+        color: #ffffff;
+
+    }
+
+    .list {
+        width: 100%;
+        padding: 3px;
+        border: 1px solid #ffffff;
+        color: #ffffff;
+        cursor:pointer;
+    }
+
+}
+
+</style>

+ 119 - 0
src/components/ThreeWorldEventQingXiCheAndQv/MeshEvent.vue

@@ -0,0 +1,119 @@
+<script setup>
+import { QingXiCheAndQvMyThreeWorldStore } from "./store/QingXiCheAndQvMyThreeWorldStore.js";
+import { CommonVal } from "@/components/ChengGuangYuanJing/store/CommonVal.js";
+
+/**
+ * 定位到指定的物体
+ * meshId       物体id
+ */
+const lookMesh = (meshId) => {
+    
+    // 引入的3d对象, 这里的 CommonValQingXiCheAndQv 是你前面自定义的,后续可以自己更换
+    var threeWorld = CommonVal().obj.CommonValQingXiCheAndQv;
+    var objIframeEdit = threeWorld;
+    var objIframe = threeWorld.objIframe;
+    var scene = threeWorld.objIframe.ChengGuangYuanJing.CommonVal.find().objScene;
+    var BABYLON = threeWorld.objIframe.BABYLON;
+
+    // 获取对应物体的配置项和mesh对象
+    let getMeshAndConfigMain = objIframeEdit.getMeshAndConfig(meshId);
+    let config = getMeshAndConfigMain['config'];
+    let objMesh = getMeshAndConfigMain['objMesh'];
+
+    console.log(
+        config, objMesh
+    );
+
+    // 飞到指定物体的视角
+    objIframeEdit.flight(meshId);
+
+    /**
+     * 目前我们飞行过去一般是1.5秒完成,可以自己这里写个延迟后
+     * 去完成,类似飞行到某个物体后,弹出什么数据
+     */
+    setTimeout(function() {
+
+        console.log("我成功飞行到了物体 " + meshId + " 开始弹出对应想要的数据");
+
+        QingXiCheAndQvMyThreeWorldStore().meshDbOpen = true;
+        QingXiCheAndQvMyThreeWorldStore().meshDbOpenMeshId = meshId;
+
+    }, 1500);
+    
+}
+
+</script>
+
+<template>
+    
+    <div class="MeshEvent">
+        
+        <div class="title">操作物体demo</div>
+
+        <div class="list" v-on:click="lookMesh('model_1718949010369H5_Body_4.002')" >
+            <p>定位到 model_1718949010369H5_Body_4.002</p>
+        </div>
+
+        <div class="list" v-on:click="lookMesh('model_1718949010369H9_Body_04.002')" >
+            <p>定位到 model_1718949010369H9_Body_04.002</p>
+        </div>
+
+        <div class="list" v-on:click="lookMesh('model_1718949010369EHS9_Body_02.002')" >
+            <p>定位到 model_1718949010369EHS9_Body_02.002</p>
+        </div>
+
+        <div class="list" v-on:click="lookMesh('model_1718949010369HS7_Body_01.002')" >
+            <p>定位到 model_1718949010369HS7_Body_01.002</p>
+        </div>
+
+        <div class="list" v-on:click="lookMesh('model_1718949010369HS5_Body_01.003')" >
+            <p>定位到 model_1718949010369HS5_Body_01.003</p>
+        </div>
+
+    </div>
+
+</template>
+
+<style lang="less" scoped>
+
+.MeshEvent * {
+    -moz-user-select: none;
+    -webkit-user-select: none;
+    -ms-user-select: none;
+    -khtml-user-select: none;
+    user-select: none;
+}
+
+.MeshEvent {
+
+    position: fixed;
+    top: 0px;
+    left: 0px;
+    width: 300px;
+    padding: 5px;
+    z-index: 1;
+    background-color: #000000;
+    border: 1px solid #ffffff;
+
+    .title {
+
+        width: 100%;
+        padding: 5px;
+        text-align: center;
+        font-size: 14px;
+        border: 1px solid #ffffff;
+        color: #ffffff;
+
+    }
+
+    .list {
+        width: 100%;
+        padding: 3px;
+        border: 1px solid #ffffff;
+        color: #ffffff;
+        cursor:pointer;
+    }
+
+}
+
+</style>

+ 412 - 0
src/components/ThreeWorldEventQingXiCheAndQv/ThreeWorldEventMainQingXiCheAndQv.vue

@@ -0,0 +1,412 @@
+<script setup>
+import { watch } from "vue";
+import { CommonVal } from "@/components/ChengGuangYuanJing/store/CommonVal.js";
+import { QingXiCheAndQvMyThreeWorldStore } from "./store/QingXiCheAndQvMyThreeWorldStore.js";
+import ThreeWorldQingXiCheAndQv from "./ThreeWorldQingXiCheAndQv.vue";
+import { QingXiCheAndQvThreeWorldEventMain } from "./js/QingXiCheAndQvThreeWorldEventMain.js";
+import { QingXiCheAndQvCarEvent } from "./js/QingXiCheAndQvCarEvent.js";
+import { QingXiCheAndQvCarEventClick } from "./js/QingXiCheAndQvCarEventClick.js";
+import { QingXiCheAndQvComHighlightLayer } from "./js/QingXiCheAndQvComHighlightLayer.js";
+import { QingXiCheAndQvThreeWorldCamera } from "./js/QingXiCheAndQvThreeWorldCamera.js";
+import { WindowTxtStore } from "@/components/WindowQingXiCheAndQv/store/WindowTxtStore.js";
+import { WindowVideoStore } from "@/components/WindowQingXiCheAndQv/store/WindowVideoStore.js";
+import { WindowCountdownStore } from "@/components/WindowQingXiCheAndQv/store/WindowCountdownStore.js";
+import { ComMusic } from "../../utils/common/ComMusic.js";
+import { QingXiCheAndQvComRes } from "./js/QingXiCheAndQvComRes.js";
+import { WindowEvent } from "../WindowQingXiCheAndQv/js/WindowEvent.js";
+import { WindowVideoRemoveColorStore } from "@/components/WindowQingXiCheAndQv/store/WindowVideoRemoveColorStore.js";
+import { QingXiCheAndQvComClipPlaneMeshEvent } from "./js/QingXiCheAndQvComClipPlaneMeshEvent.js";
+
+
+/**
+ * 平时开发3d代码逻辑可以写这里
+ * 更多的代码逻辑,建议用面向对象的方式去开发
+ * 不然后面的逻辑会越来越复杂
+ */
+
+/**
+ * 举个例子,我们oss文件上传了,编辑器打包后的代码
+ * 地址为 https://**.com/3dmodel/index.html
+ * 
+ * 我们将对应的项目的3d模型,在了同域的地址是
+ * https://**.com/自定义目录1/自定义目录2/model/
+ * 
+ */
+
+// // 拼接出进入3d场景的地址,用于后续发布
+// let threeWorldUrl = "https://**.com/3dmodel/index.html#/main?id=zidingyi&user=zidingyi"
+// + '&commonconfig=https://**.com/自定义目录1/自定义目录2/model/'
+// + '&commonmodel=https://**.com/自定义目录1/自定义目录2/model/';
+
+
+// /**
+//  * 本地开发调试固定地址
+//  */
+// let threeWorldUrl = "3dmodel/index.html#/main?id=zidingyi";
+
+
+// let commonconfig = "http://localhost:5678/3dmodel/model_water_car_2/";
+// let commonmodel = "http://localhost:5678/3dmodel/model_water_car_2/";
+
+// let threeWorldUrl = "3dmodel/index.html#/main?id=zidingyi_lu_cun&user=zidingyi"
+// + '&commonconfig=' + commonconfig
+// + '&commonmodel=' + commonmodel;
+
+
+// // let commonconfig = "https://www.3dyzt.com/GongShuiGuanWang/main/3dmodel/model_water_car_2/";
+// // let commonmodel = "https://www.3dyzt.com/GongShuiGuanWang/main/3dmodel/model_water_car_2/";
+
+// // let threeWorldUrl = "3dmodel/index.html#/main?id=zidingyi_lu_cun&user=zidingyi"
+// // + '&commonconfig=' + commonconfig
+// // + '&commonmodel=' + commonmodel;
+
+
+let commonconfig = "http://localhost:5678/3dmodel/model_water_car_3/";
+let commonmodel = "http://localhost:5678/3dmodel/model_water_car_3/";
+
+let threeWorldUrl = "3dmodel/index.html#/main?id=zidingyi_lu_cun&user=zidingyi"
++ '&commonconfig=' + commonconfig
++ '&commonmodel=' + commonmodel;
+
+
+// let commonconfig = "https://www.3dyzt.com/GongShuiGuanWang/main/3dmodel/model_water_car_3/";
+// let commonmodel = "https://www.3dyzt.com/GongShuiGuanWang/main/3dmodel/model_water_car_3/";
+
+// let threeWorldUrl = "3dmodel/index.html#/main?id=zidingyi_lu_cun&user=zidingyi"
+// + '&commonconfig=' + commonconfig
+// + '&commonmodel=' + commonmodel;
+
+
+/**
+ * 回调加载百分比
+ */
+const callbackLoadPercentageEvent = (json) => {
+    // console.log("回调加载百分比", json);
+
+    let loadPercentage = parseFloat(json["loadPercentage"]);
+    if (loadPercentage == null || loadPercentage == undefined || loadPercentage < 0) {
+        loadPercentage = 0;
+    }
+
+    QingXiCheAndQvMyThreeWorldStore().loadPercentage = loadPercentage;
+    // 加载小于百分比
+    if (loadPercentage < 100) {
+
+        // ##############################【这里只做控制】隐藏其他按钮界面等
+        CommonVal().loadSuccess = false;
+        return;
+
+    }
+  
+}
+
+/**
+ * 回调加载完成
+ */
+const callbackLoadEndEvent = (json) => {
+    // console.log("回调加载完成", json);
+
+    QingXiCheAndQvMyThreeWorldStore().loadPercentage = 100;
+    
+    // 此时是显示角色的界面
+    if (json["roleChoiceOpenBool"] === true) {
+        // ############################## 隐藏其他按钮界面等
+        CommonVal().loadSuccess = false;
+        return;
+    }
+    
+    // ############################## 这个时候,是真正的进入3d画面了,才显示其他按钮界面等
+    CommonVal().loadSuccess = true;
+
+    // 初始化操作3d的类对象,后续代码在这里面操作
+    QingXiCheAndQvThreeWorldEventMain.find().initObj(
+        CommonVal().obj.CommonValQingXiCheAndQv,
+        CommonVal().obj.CommonValQingXiCheAndQv.objIframe,
+        CommonVal().obj.CommonValQingXiCheAndQv.objIframe.ChengGuangYuanJing.CommonVal.find().objScene,
+        CommonVal().obj.CommonValQingXiCheAndQv.objIframe.BABYLON
+    );
+
+    QingXiCheAndQvComHighlightLayer.find().init(
+        QingXiCheAndQvThreeWorldEventMain.find()
+    );
+
+    QingXiCheAndQvThreeWorldCamera.find().initObj(
+        CommonVal().obj.CommonValQingXiCheAndQv,
+        CommonVal().obj.CommonValQingXiCheAndQv.objIframe,
+        CommonVal().obj.CommonValQingXiCheAndQv.objIframe.ChengGuangYuanJing.CommonVal.find().objScene,
+        CommonVal().obj.CommonValQingXiCheAndQv.objIframe.BABYLON
+    );
+
+    QingXiCheAndQvThreeWorldCamera.find().addConfig();
+
+    QingXiCheAndQvCarEvent.find().objThreeWorldEventMain = QingXiCheAndQvThreeWorldEventMain.find();
+    QingXiCheAndQvCarEventClick.find().objThreeWorldEventMain = QingXiCheAndQvThreeWorldEventMain.find();
+    QingXiCheAndQvComClipPlaneMeshEvent.find().objThreeWorldEventMain = QingXiCheAndQvThreeWorldEventMain.find();
+
+    QingXiCheAndQvComClipPlaneMeshEvent.find().updateConfig();
+
+    // 新增被操作的 Store
+    QingXiCheAndQvCarEvent.find().ComStore["WindowTxtStore"] = WindowTxtStore;
+    QingXiCheAndQvCarEvent.find().ComStore["WindowVideoStore"] = WindowVideoStore;
+    QingXiCheAndQvCarEvent.find().ComStore["WindowCountdownStore"] = WindowCountdownStore;
+
+    WindowEvent.find().ComStore["WindowTxtStore"] = WindowTxtStore;
+    WindowEvent.find().ComStore["WindowVideoStore"] = WindowVideoStore;
+    WindowEvent.find().ComStore["WindowCountdownStore"] = WindowCountdownStore;
+    WindowEvent.find().ComStore["WindowVideoRemoveColorStore"] = WindowVideoRemoveColorStore;
+
+    configMusicEvent();
+    configVideoEvent();
+    
+    setTimeout(function() {
+
+        QingXiCheAndQvCarEvent.find().evnetInit_1();
+        
+        // QingXiCheAndQvThreeWorldEventMain.find().toFlyModel();
+        QingXiCheAndQvThreeWorldEventMain.find().groundNoRemove();
+        // QingXiCheAndQvThreeWorldEventMain.find().eyeNameLook("实验");
+        
+        // 自动触发模拟点击,解决加载完成后,在点击下,重新设置了材质,感觉会有问题
+        CommonVal().obj.CommonValQingXiCheAndQv.objIframe.ChengGuangYuanJing.CommonVal.find().screenClickNumEvent();
+        
+    }, 1000);
+    // }, 300);
+  
+}
+
+
+/**
+ * 配置用到的声音文件
+ */
+const configMusicEvent = () => {
+
+    ComMusic.find().codeJson["lightningOne"] = new URL("../../assets/res/music/lightningOne.mp3", import.meta.url).href;
+    ComMusic.find().codeJson["lightningTwo"] = new URL("../../assets/res/music/lightningTwo.mp3", import.meta.url).href;
+    ComMusic.find().codeJson["lightningThree"] = new URL("../../assets/res/music/lightningThree.mp3", import.meta.url).href;
+
+    // ComMusic.find().play("lightningThree");
+
+}
+
+/**
+ * 配置用到的视频地址文件 等其他文件
+ */
+const configVideoEvent = () => {
+
+    QingXiCheAndQvCarEvent.find().videoJson["02"] = new URL("../../assets/res/video/02.mp4", import.meta.url).href;
+    QingXiCheAndQvCarEvent.find().videoJson["03"] = new URL("../../assets/res/video/03.mp4", import.meta.url).href;
+    QingXiCheAndQvCarEvent.find().videoJson["04"] = new URL("../../assets/res/video/04.mp4", import.meta.url).href;
+
+    QingXiCheAndQvCarEvent.find().videoJson["videw_liu_cheng_1"] = new URL("../../assets/res/video/videw_liu_cheng_1.mp4", import.meta.url).href;
+    QingXiCheAndQvCarEvent.find().videoJson["videw_liu_cheng_2"] = new URL("../../assets/res/video/videw_liu_cheng_2.mp4", import.meta.url).href;
+
+
+    QingXiCheAndQvComRes.find().resJson["img_shuang"] = new URL("../../assets/res/img/texture/shuang_shan.jpg", import.meta.url).href;
+
+    // 打开车辆双闪,同时开启工作双闪灯
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_01"] = new URL("../../assets/res/mp4/01.mp4", import.meta.url).href;
+    // 按下取力器开关
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_02"] = new URL("../../assets/res/mp4/02.mp4", import.meta.url).href;
+    // 从水管固定座上拧下高压水管
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_03"] = new URL("../../assets/res/mp4/03.mp4", import.meta.url).href;
+    // 确认手刹已拉起,档位是空档,然后发动车辆
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_04"] = new URL("../../assets/res/mp4/04.mp4", import.meta.url).href;
+    // 取出高压水管并放入布管器内
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_05"] = new URL("../../assets/res/mp4/05.mp4", import.meta.url).href;
+    // 在触屏操作面板上将管长清零
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_06"] = new URL("../../assets/res/mp4/06.mp4", import.meta.url).href;
+    // 拆卸高压喷头放入喷头机箱内
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_07"] = new URL("../../assets/res/mp4/07.mp4", import.meta.url).href;
+    // 关闭车辆双闪和工作双闪箭头灯
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_08"] = new URL("../../assets/res/mp4/08.mp4", import.meta.url).href;
+    // 关闭取力器开关
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_09"] = new URL("../../assets/res/mp4/09.mp4", import.meta.url).href;
+    // 将车辆正常熄火,恭喜你完成全部操作
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_10"] = new URL("../../assets/res/mp4/10.mp4", import.meta.url).href;
+    // 调整卷筒器到合适位置
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_11"] = new URL("../../assets/res/mp4/11.mp4", import.meta.url).href;
+    // 至触摸屏关闭冲水开关
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_12"] = new URL("../../assets/res/mp4/12.mp4", import.meta.url).href;
+    // 打开车门进入驾驶室
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_13"] = new URL("../../assets/res/mp4/13.mp4", import.meta.url).href;
+    // 疏通管道后减小油门到初始状态
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_14"] = new URL("../../assets/res/mp4/14.mp4", import.meta.url).href;
+    // 踩下车辆离合器5秒
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_15"] = new URL("../../assets/res/mp4/15.mp4", import.meta.url).href;
+    // 在施工范围放置警示标识
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_16"] = new URL("../../assets/res/mp4/16.mp4", import.meta.url).href;
+    // 套上高压水管护管器
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_17"] = new URL("../../assets/res/mp4/17.mp4", import.meta.url).href;
+    // 将高压水管放入待施工的管道内
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_18"] = new URL("../../assets/res/mp4/18.mp4", import.meta.url).href;
+    // 回到驾驶室踩下车辆离合器5秒
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_19"] = new URL("../../assets/res/mp4/19.mp4", import.meta.url).href;
+    // 安装合适的高压喷头
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_20"] = new URL("../../assets/res/mp4/20.mp4", import.meta.url).href;
+    // 在安全的情况开启冲水开关
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_21"] = new URL("../../assets/res/mp4/21.mp4", import.meta.url).href;
+    // 缓慢抬起离合器
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_22"] = new URL("../../assets/res/mp4/22.mp4", import.meta.url).href;
+    // 下车确定安全灯显示是否正常
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_23"] = new URL("../../assets/res/mp4/23.mp4", import.meta.url).href;
+    // 根据现场工况调节冲水压力
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_24"] = new URL("../../assets/res/mp4/24.mp4", import.meta.url).href;
+    // 带压收回高压水管
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_25"] = new URL("../../assets/res/mp4/25.mp4", import.meta.url).href;
+    // 将高压水管拧到水管固定座
+    QingXiCheAndQvComRes.find().resJson["QingXiChe_26"] = new URL("../../assets/res/mp4/26.mp4", import.meta.url).href;
+
+    
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_01"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_02"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_03"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_04"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_05"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_06"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_07"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_08"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_09"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_10"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_11"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_12"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_13"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_14"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_15"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_16"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_17"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_18"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_19"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_20"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_21"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_22"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_23"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_24"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_25"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+    // QingXiCheAndQvComRes.find().resJson["QingXiChe_26"] = new URL("../../assets/res/mp4/demo/01.mp4", import.meta.url).href;
+
+}
+
+
+/**
+ * 回调距离范围内
+ */
+const callbackDistanceYesEvent = (json) => {
+    // console.log("回调距离范围内", json);
+}
+
+/**
+ * 回调距离范围外
+ */
+const callbackDistanceNoEvent = (json) => {
+    // console.log("回调距离范围外", json);
+}
+
+/**
+ * 回调视角切换完成
+ */
+const callbackCameraVisualAngleJsonToLookEvent = (json) => {
+
+    console.log("视角触发完成", json);
+
+    let objIframeEdit = CommonVal().obj.CommonValQingXiCheAndQv;
+
+    if (json.name == '绕车1') {
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("绕车2");
+    }
+
+    if (json.name == '绕车2') {
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("绕车3");
+    }
+
+    if (json.name == '绕车3') {
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("绕车4");
+    }
+
+    if (json.name == '绕车4') {
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("绕车5");
+    }
+
+    if (json.name == '绕车5') {
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("绕车6");
+    }
+
+    if (json.name == '绕车6') {
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("清洗车-开门");
+    }
+
+    if (json.name == '调整坐姿') {
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("手握方向盘");
+    }
+
+    if (json.name == '手握方向盘') {
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("踩下离合器踏板");
+    }
+
+
+    if (json.name == '回到驾驶室踩下车辆离合器5秒1') {
+        QingXiCheAndQvCarEventClick.find().openCarMen(function() {
+            objIframeEdit.cameraVisualAngleGetListNameGpsTo("回到驾驶室踩下车辆离合器5秒2");
+        });
+    }
+
+    if (json.name == '清洗车流程完成') {
+        QingXiCheAndQvCarEventClick.find().closeCarMen(function() {});
+    }
+    
+
+}
+
+
+</script>
+
+<template>
+    <div class="ThreeWorldEventMain">
+
+        <ThreeWorldQingXiCheAndQv
+        :iframeId="'CommonValQingXiCheAndQv'"
+        :url="threeWorldUrl"
+        @callbackLoadPercentage="callbackLoadPercentageEvent"
+        @callbackLoadEnd="callbackLoadEndEvent"
+        @callbackDistanceYes="callbackDistanceYesEvent"
+        @callbackDistanceNo="callbackDistanceNoEvent"
+        @callbackCameraVisualAngleJsonToLook="callbackCameraVisualAngleJsonToLookEvent"
+        ></ThreeWorldQingXiCheAndQv>
+
+        <img class="mengBan" src="../../assets/res/img/com/meng_ban.webp" />
+
+    </div>
+</template>
+
+<style lang="less" scoped>
+
+.ThreeWorldEventMain * {
+    -moz-user-select: none;
+    -webkit-user-select: none;
+    -ms-user-select: none;
+    -khtml-user-select: none;
+    user-select: none;
+}
+
+.ThreeWorldEventMain {
+    position: fixed;
+    top: 0px;
+    left: 0px;
+    width: 100%;
+    height: 100%;
+    z-index: 0;
+
+    .mengBan {
+        position: fixed;
+        top: 0px;
+        left: 0px;
+        width: 100%;
+        height: 100%;
+        z-index: 1000;
+        /* 注意这里必须是被允许穿透点击的,否则堆叠高于了  canvas,则会出现无法点击到canvas了。加了这个即可解决这个问题  */
+        pointer-events: none;
+        opacity: 0.2;
+    }
+
+}
+
+</style>

+ 252 - 0
src/components/ThreeWorldEventQingXiCheAndQv/ThreeWorldQingXiCheAndQv.vue

@@ -0,0 +1,252 @@
+<script setup>
+import { watch } from "vue";
+import { CommonVal } from "@/components/ChengGuangYuanJing/store/CommonVal.js";
+import { IframeEdit } from '@/components/ChengGuangYuanJing/js/IframeEdit.js'
+
+// 固定操作3d的代码。可以不做其他修改
+
+// 接收参数
+const props = defineProps({
+    iframeId: {
+        type: String
+    },
+    url: {
+        type: String
+    },
+});
+
+
+// 定义发射给父组件的方法
+const emits = defineEmits([
+    'callbackObjIframeEdit',
+    'callbackLoadPercentage',
+    'callbackLoadEnd',
+    'callbackDistanceYes',
+    'callbackDistanceNo',
+    'callbackCameraVisualAngleJsonToLook'
+])
+
+
+/**
+ * 回调加载百分比
+ */
+const callbackLoadPercentageEvent = (json) => {
+    emits('callbackLoadPercentage', json);
+}
+
+/**
+ * 回调加载完成
+ */
+const callbackLoadEndEvent = (json) => {
+    emits('callbackLoadEnd', json);
+}
+
+/**
+ * 回调距离范围内
+ */
+const callbackDistanceYesEvent = (json) => {
+    emits('callbackDistanceYes', json);
+}
+
+/**
+ * 回调距离范围外
+ */
+const callbackDistanceNoEvent = (json) => {
+    emits('callbackDistanceNo', json);
+}
+
+/**
+ * 回调视角切换完成
+ */
+const callbackCameraVisualAngleJsonToLookEvent = (json) => {
+    emits('callbackCameraVisualAngleJsonToLook', json);
+}
+
+/**
+ * 页面初始化
+ */
+const viewInit = () => {
+
+    // 判断是否成功找到摇杆才触发
+    var viewTimeBool = setInterval(function () {
+
+        try {
+
+            var objPreviewBtnMove = objIframeEdit.objIframe.$("#previewBtnMove");
+            if (objPreviewBtnMove != null && objPreviewBtnMove != undefined) {
+                viewAssemblyVisibilityMain();
+                // clearInterval(viewTimeBool);
+                // viewTimeBool = null;
+            }
+
+        } catch (e) {
+        }
+
+    }, 1000 / 3);
+
+}
+
+/**
+ * 隐藏页面组件
+ */
+const viewAssemblyVisibilityMain = () => {
+
+    objIframeEdit.viewAssemblyVisibility();
+    objIframeEdit.viewAssemblyVisibilityRole();
+    objIframeEdit.viewBackgroundColorClean();
+    // 额外隐藏其他的组件
+    objIframeEdit.objIframe.$("#edit3DActionTab").css("display", "none");
+    objIframeEdit.objIframe.$(".previewRoleChatMain").css("display", "none");
+    objIframeEdit.objIframe.$(".previewBtnMove").css("display", "none");
+    objIframeEdit.objIframe.$(".previewBtnAction").css("display", "none");
+    
+}
+
+// 如果是多个iframe,则new 出多个即可。 后续对应的iframe,单独对应的对象去触发封装好的方法
+let objIframeEdit = new IframeEdit();
+CommonVal().obj[props.iframeId] = objIframeEdit;
+
+/**
+ * 初始化应用
+ */
+const appInit = () => {
+
+    objIframeEdit.loading(
+        // html iframe 的 唯一 id, 也就是对应 html id="" 的参数
+        props.iframeId,
+        // 加载完成回调
+        function (roleChoiceOpenBool) {
+
+            callbackLoadEndEvent({
+                "roleChoiceOpenBool": roleChoiceOpenBool
+            });
+
+            // 如果是角色选择
+            if (roleChoiceOpenBool === true) {
+
+                try {
+                    objIframeEdit.objIframe.$(".weiXinSaoYiSao").css("display", "none");
+                } catch (e) {
+                }
+
+                try {
+                    objIframeEdit.objIframe.$(".qrContainerMainLogin").css("display", "none");
+                } catch (e) {
+                }
+
+                try {
+                    objIframeEdit.objIframe.$(".mainLoginSubmitWeiXin").css("display", "none");
+                } catch (e) {
+                }
+
+                try {
+
+                    let btnAll = objIframeEdit.objIframe.$(".btn");
+                    for (let btnAllI = 0; btnAllI < btnAll.length; btnAllI++) {
+
+                        if (btnAll[btnAllI].innerText == "微信登录") {
+                            // console.log(btnAll[btnAllI].innerText);
+                            btnAll[btnAllI].style.display = "none";
+                        }
+
+                    }
+
+                } catch (e) {
+
+                }
+
+            // console.log("加载完成,当前是选择角色页面");
+            } else {
+
+                // console.log("加载完成,当前是3d场景页面");
+                // 某个视角切换完成回调逻辑
+                objIframeEdit.objIframe.window.CameraVisualAngleJsonToLookEvent = function (json) {
+                callbackCameraVisualAngleJsonToLookEvent(json);
+                
+            };
+
+            // 初始化被操作的页面
+            viewInit();
+            
+        }
+
+        },
+        // 加载百分比
+        function (
+            // 加载百分比
+            loadPercentage,
+            // 是否需要触发点击进入的逻辑
+            clickIntoBool
+        ) {
+
+            // console.log( "当前加载百分比", loadPercentage, clickIntoBool );
+            callbackLoadPercentageEvent({
+                "loadPercentage": loadPercentage,
+                "clickIntoBool": clickIntoBool
+            });
+            
+        }
+    );
+
+    // 回调距离事件
+    objIframeEdit.distanceEventJsonCallback = function (distanceEventJson) {
+
+        // console.log("回调距离事件", distanceEventJson);
+        callbackDistanceYesEvent(distanceEventJson["yes"]);
+        callbackDistanceNoEvent(distanceEventJson["no"]);
+
+    };
+
+}
+
+appInit();
+
+</script>
+
+<template>
+    <div class="threeWorldIframeContent" >
+
+        <iframe
+            :id="iframeId" :name="iframeId"
+            class="threeWorldIframe"
+            scrolling="auto" frameborder="no" marginwidth="0" marginheight="0"
+            :src="url"
+        >
+        </iframe>
+
+    </div>
+</template>
+
+<style lang="less" scoped>
+
+.threeWorldIframeContent * {
+    -moz-user-select: none;
+    -webkit-user-select: none;
+    -ms-user-select: none;
+    -khtml-user-select: none;
+    user-select: none;
+}
+
+.threeWorldIframeContent {
+    width: 100%;
+    height: 100%;
+    // position: fixed;
+    position: absolute;
+    left: 0px;
+    top: 0px;
+    z-index: 0;
+    /* 注意这里必须是被允许穿透点击的,否则堆叠高于了  canvas,则会出现无法点击到canvas了。加了这个即可解决这个问题  */
+    // pointer-events: none;
+}
+
+.threeWorldIframe {
+    width: 100%;
+    height: 100%;
+    position: absolute;
+    left: 0px;
+    top: 0px;
+    z-index: 0;
+    /* 注意这里必须是被允许穿透点击的,否则堆叠高于了  canvas,则会出现无法点击到canvas了。加了这个即可解决这个问题  */
+    // pointer-events: none;
+}
+</style>

+ 156 - 0
src/components/ThreeWorldEventQingXiCheAndQv/common/ComVal.js

@@ -0,0 +1,156 @@
+/**
+ * 通用会用到的一些函数
+ */
+export class ComVal {
+    
+    // 每次 new 出对象则会调用这个构造函数
+    constructor() {
+        
+        /**
+         * 追加自定义的帧事件
+         */
+        this.fpsEvent = [
+            // {
+            //     "code" : "自定义code,后续用于删除指定的code",
+            //     "myDb" : "自定义的回调的数据",
+            //     "callback" : "自定义回调的方法",
+            // }
+        ];
+    }
+
+    // 实现单例模式
+    static find() {
+        if (!ComVal.instance) {
+            ComVal.instance = new ComVal();
+        }
+        return ComVal.instance;
+    }
+
+    /**
+     * 该方法每帧会被执行
+     * 用于处理自定义的 this.fpsEvent json列表
+     */
+    fpsEventMain = () => {
+        
+        var thisTime = new Date().getTime();
+
+        for (let i = 0; i < this.fpsEvent.length; i++) {
+
+            let obj = this.fpsEvent[i];
+            let code = obj["code"];
+            let myDb = obj["myDb"];
+            let time = obj["time"];
+            let timeEnd = obj["timeEnd"];
+            let callback = obj["callback"];
+
+            // 是否触发回调
+            let callbackBool = false;
+
+            if (time == null || time == undefined) {
+                callbackBool = true;
+            } else {
+
+                let timeNew = parseFloat(time);
+                if (thisTime - timeEnd >= timeNew) {
+                    callbackBool = true;
+                    this.fpsEvent[i]["timeEnd"] = thisTime;
+                }
+                
+            }
+            
+            if (callbackBool == true) {
+                callback({
+                    "code" : code,
+                    "myDb" : myDb,
+                    "time" : time,
+                    "timeEnd" : timeEnd
+                });
+            }
+            
+        }
+
+        return this;
+
+    }
+
+
+    /**
+     * 新增一个自定义的帧事件
+     * code         自定义的唯一code值
+     * myDb         自定义回调的数据,可以是字符串,也可以是json对象等方式
+     * time         间隔多少毫秒执行一次,如果传null则为每帧执行
+     * callback     自定义的回调方法
+     * 
+     * ########## 使用案例 ##########
+     * 
+     *  // 每帧执行案例
+     *  ComVal.find().fpsEventAdd(
+     *      "code111", "自定义返回111", null, function(fpsEventAddRet) {
+     *          console.log(
+     *              "fpsEventAddRet", fpsEventAddRet
+     *          );
+     *      }
+     *  );
+     * 
+     *  // 每次2秒执行案例
+     *  ComVal.find().fpsEventAdd(
+     *      "code222", "自定义返回222", 2000, function(fpsEventAddRet) {
+     *          console.log(
+     *              "fpsEventAddRet", fpsEventAddRet
+     *          );
+     * 
+     *          // 删除释放帧事件
+     *          ComVal.find().fpsEventDel(fpsEventAddRet.code);
+     * 
+     *      }
+     *  );
+     * 
+     */
+    fpsEventAdd = (code, myDb, time, callback) => {
+        
+        var thisTime = new Date().getTime();
+
+        let addJson = {
+            "code" : code,
+            "myDb" : myDb,
+            "time" : time,
+            // 记录最后一次执行的时间戳, 与 time 配合执行
+            "timeEnd" : thisTime,
+            "callback" : callback,
+        }
+
+        this.fpsEvent.push(addJson);
+
+        return this;
+    }
+
+    /**
+     * 删除自定义回调帧事件
+     * objCode          自定义的 this.fpsEvent 唯一code值
+     */
+    fpsEventDel = (objCode) => {
+
+        for (let i = 0; i < this.fpsEvent.length; i++) {
+            let obj = this.fpsEvent[i];
+            let code = obj["code"];
+            if (code == objCode) {
+                this.fpsEvent.splice(i, 1);
+                // return this;
+            }
+        }
+
+        return this;
+    }
+    
+}
+
+
+
+
+
+
+
+
+
+
+

+ 148 - 0
src/components/ThreeWorldEventQingXiCheAndQv/event/QingXiCheAndQvProcessEvent.vue

@@ -0,0 +1,148 @@
+<script setup>
+import { QingXiCheAndQvProcessEventStore } from "../event/store/QingXiCheAndQvProcessEventStore.js";
+
+// 定义发射给父组件的方法
+const emits = defineEmits([
+    // 实时回调当前对话的内容
+    'callbackProcess',
+]);
+
+/**
+ * 回调接下来的进度
+ * type         up - 上一步, down - 下一步
+ * json         返回的参数, 如果是 null ,说明不触发生成
+ */
+const callbackProcessEvent = (type, json) => {
+    
+    emits('callbackProcess', {
+        "type" : type,
+        "config" : json,
+    });
+    
+}
+
+/**
+ * 下一步逻辑触发
+ */
+const downEvent = () => {
+    
+    QingXiCheAndQvProcessEventStore().obj.listIndex += 1;
+    // 说明执行到最后一步了
+    if (QingXiCheAndQvProcessEventStore().obj.listIndex >= QingXiCheAndQvProcessEventStore().obj.list.length) {
+        QingXiCheAndQvProcessEventStore().obj.listIndex -= 1;
+        return;
+    }
+
+    QingXiCheAndQvProcessEventStore().obj.btnUp = false;
+    QingXiCheAndQvProcessEventStore().obj.btnDown = false;
+
+    let thisJson = QingXiCheAndQvProcessEventStore().obj.list[QingXiCheAndQvProcessEventStore().obj.listIndex];
+
+    callbackProcessEvent("down", thisJson);
+    // console.log("下一步", thisJson);
+
+}
+
+</script>
+
+<template>
+    
+    <div class="ProcessEvent">
+        
+        <img class="role" src="../../../assets/res/img/main/processEvent/role.png" />
+
+        <div
+        v-if="
+            QingXiCheAndQvProcessEventStore().obj.list[QingXiCheAndQvProcessEventStore().obj.listIndex] != null
+            && QingXiCheAndQvProcessEventStore().obj.list[QingXiCheAndQvProcessEventStore().obj.listIndex] != undefined
+        "
+        class="main">
+            
+            <div class="txt">{{ QingXiCheAndQvProcessEventStore().obj.list[QingXiCheAndQvProcessEventStore().obj.listIndex].note }}</div>
+            <div class="comBtn" v-show="QingXiCheAndQvProcessEventStore().obj.btnUp == true" >上一步</div>
+            <div class="comBtn" v-show="QingXiCheAndQvProcessEventStore().obj.btnDown == true" v-on:click="downEvent()" >下一步</div>
+            
+            <img class="downPrompt" v-show="QingXiCheAndQvProcessEventStore().obj.btnDown == true"
+            src="../../../assets/res/img/main/processEvent/prompt.png" />
+            
+        </div>
+
+    </div>
+
+</template>
+
+<style lang="less" scoped>
+
+.ProcessEvent * {
+    -moz-user-select: none;
+    -webkit-user-select: none;
+    -ms-user-select: none;
+    -khtml-user-select: none;
+    user-select: none;
+}
+
+.ProcessEvent {
+
+    position: fixed;
+    top: 0px;
+    right: 0px;
+    width: 0px;
+    height: 0px;
+
+    .role {
+        position: relative;
+        width: 6.42rem;
+        position: fixed;
+        left: 5rem;
+        bottom: 5rem;
+        z-index: 31;
+    }
+
+    .main {
+
+        position: fixed;
+        z-index: 30;
+        width: 100%;
+        height: 4.285rem;
+        background: linear-gradient(86deg, #3a649642, #3a6496 17%, #3a6496 59%, #3a649600 90%);
+        padding: 0px 0px 0px 13rem;
+        bottom: 5rem;
+        left: 0px;
+        float: left;
+
+        .txt {
+            height: 4.285rem;
+            line-height: 4.285rem;
+            font-size: 1.5rem;
+            color: #ffffff;
+            font-weight: 500;
+            margin: 0px 0.71rem 0px 0.71rem;
+            float: left;
+        }
+
+        .comBtn {
+
+            margin: 0.75rem;
+            font-size: 1.3rem;
+            background-color: #3583d1;
+            color: #ffffff;
+            padding: 0.35rem 2rem 0.35rem 2rem;
+            border-radius: 0.35rem;
+            // 手势
+            cursor:pointer;
+            float: left;
+
+        }
+
+        .downPrompt {
+            width: 7.14rem;
+            position: relative;
+            left: -8rem;
+            top: -7rem;
+        }
+        
+    }
+
+}
+
+</style>

+ 228 - 0
src/components/ThreeWorldEventQingXiCheAndQv/event/store/QingXiCheAndQvProcessEventStore.js

@@ -0,0 +1,228 @@
+import { defineStore } from 'pinia'
+import { ref, watch } from "vue";
+
+export const QingXiCheAndQvProcessEventStore = defineStore('QingXiCheAndQvProcessEventStore', () => {
+
+    /**
+     * 统一放置全局用到的对象,变量等参数
+     */
+    const obj = ref({
+        
+        // 当前的进度 -1 说明没有进入该流程
+        listIndex : -1,
+
+        // 进度列表
+        list : [
+
+            // ############################## 清洗车的步骤流程
+
+            {
+                "note" : "点击下一步开始仿真实验",
+                "name" : "仿真模拟",
+            },
+
+            {
+                "note" : "打开车门进入驾驶室",
+                "name" : "打开车门进入驾驶室",
+            },
+
+            {
+                "note" : "确认手刹已拉起,档位是P档,然后发动车辆",
+                "name" : "确认手刹已拉起档位是P档然后发动车辆",
+            },
+
+            {
+                "note" : "打开车辆双闪,同时开启工作双闪灯",
+                "name" : "打开车辆双闪同时开启工作双闪灯",
+            },
+
+            {
+                "note" : "踩下车辆离合器5秒",
+                "name" : "踩下车辆离合器5秒",
+            },
+
+            {
+                "note" : "按下取力器开关",
+                "name" : "按下取力器开关",
+            },
+
+            {
+                "note" : "缓慢抬起离合器",
+                "name" : "缓慢抬起离合器",
+            },
+
+            {
+                "note" : "下车确定安全灯显示是否正常(请点击地面触发)",
+                "name" : "下车确定安全灯显示是否正常",
+            },
+
+            {
+                "note" : "在施工范围放置警示标识(请点击地面触发)",
+                "name" : "在施工范围放置警示标识",
+            },
+
+            {
+                "note" : "从水管固定座上拧下高压水管",
+                "name" : "从水管固定座上拧下高压水管",
+            },
+
+            {
+                "note" : "调整卷筒器到合适位置",
+                "name" : "调整卷筒器到合适位置",
+            },
+
+            {
+                "note" : "取出高压水管并放入布管器内",
+                "name" : "取出高压水管并放入布管器内",
+            },
+
+            {
+                "note" : "套上高压水管护管器(请点击高压水管护管器触发)",
+                "name" : "套上高压水管护管器",
+            },
+
+            {
+                "note" : "安装合适的高压喷头(请点击箱子触发)",
+                "name" : "安装合适的高压喷头",
+            },
+
+            {
+                "note" : "将高压水管放入待施工的管道内(请点击高压水管或管道触发)",
+                "name" : "将高压水管放入待施工的管道内",
+            },
+
+            {
+                "note" : "在触屏操作面板上将管长清零(请点击操作面板触发)",
+                "name" : "在触屏操作面板上将管长清零",
+            },
+
+            {
+                "note" : "在安全的情况开启冲水开关(请点击操作面板触发)",
+                "name" : "在安全的情况开启冲水开关",
+            },
+
+            {
+                "note" : "根据现场工况调节冲水压力(请点击管道触发)",
+                "name" : "根据现场工况调节冲水压力",
+            },
+
+            {
+                "note" : "疏通管道后减小油门到初始状态(请点击管道或操作面板触发)",
+                "name" : "疏通管道后减小油门到初始状态",
+            },
+
+            {
+                "note" : "带压收回高压水管(请点击操作面板触发)",
+                "name" : "带压收回高压水管",
+            },
+
+            {
+                "note" : "至触摸屏关闭冲水开关(请点击操作面板触发)",
+                "name" : "至触摸屏关闭冲水开关",
+            },
+
+            {
+                "note" : "缓慢收回高压水管(请点击管道或水管触发)",
+                "name" : "缓慢收回高压水管",
+            },
+
+            {
+                "note" : "拆卸高压喷头放入喷头机箱内(请点击喷头或水管触发)",
+                "name" : "拆卸高压喷头放入喷头机箱内",
+            },
+
+            {
+                "note" : "收起高压水管,将卷筒恢复到初始状态(请点击水管或操作面板触发)",
+                "name" : "收起高压水管将卷筒恢复到初始状态",
+            },
+
+            {
+                "note" : "将高压水管拧到水管固定座",
+                "name" : "将高压水管拧到水管固定座",
+            },
+
+            {
+                "note" : "回到驾驶室踩下车辆离合器5秒",
+                "name" : "回到驾驶室踩下车辆离合器5秒",
+            },
+
+            {
+                "note" : "关闭取力器开关",
+                "name" : "关闭取力器开关",
+            },
+
+            {
+                "note" : "关闭车辆双闪和工作双闪箭头灯",
+                "name" : "关闭车辆双闪和工作双闪箭头灯",
+            },
+
+            {
+                "note" : "车辆正常熄火",
+                "name" : "车辆正常熄火",
+            },
+
+            // {
+            //     "note" : "",
+            //     "name" : "",
+            // },
+
+            // {
+            //     "note" : "",
+            //     "name" : "",
+            // },
+
+            // {
+            //     "note" : "",
+            //     "name" : "",
+            // },
+
+            {
+                "note" : "已完成所有任务",
+                "name" : "equipmentRepositioningWork",
+            },
+
+
+            // ############################## 拖拽修复水管的流程
+            {
+                "note" : "将阀门关闭停止水流",
+                "name" : "数字修复虚拟仿真-将阀门关闭停止水流",
+            },
+            {
+                "note" : "将橡胶垫片放置到正确的位置",
+                "name" : "数字修复虚拟仿真-将橡胶垫片放置到正确的位置",
+            },
+            {
+                "note" : "将抱箍放置到正确的位置",
+                "name" : "数字修复虚拟仿真-将抱箍放置到正确的位置",
+            },
+            {
+                "note" : "将插销安装到正确的位置",
+                "name" : "数字修复虚拟仿真-将插销安装到正确的位置",
+            },
+            {
+                "note" : "将螺丝安装到正确的位置",
+                "name" : "数字修复虚拟仿真-将螺丝安装到正确的位置",
+            },
+            {
+                "note" : "用扳手将螺丝旋紧螺丝",
+                "name" : "数字修复虚拟仿真-用扳手将螺丝旋紧螺丝",
+            },
+            {
+                "note" : "已完成所有任务",
+                "name" : "数字修复虚拟仿真-已完成所有任务",
+            },
+            
+        ],
+
+        // 点击下一步的按钮是否展示
+        btnDown : true,
+        // 点击上一步的按钮是否展示
+        btnUp : false,
+
+    });
+    
+    return {
+        obj,
+    }
+
+})

+ 2346 - 0
src/components/ThreeWorldEventQingXiCheAndQv/js/QingXiCheAndQvCarEvent.js

@@ -0,0 +1,2346 @@
+import { QingXiCheAndQvComHighlightLayer } from './QingXiCheAndQvComHighlightLayer.js';
+import { QingXiCheAndQvCarEventClick } from './QingXiCheAndQvCarEventClick.js';
+import { WindowEvent } from '../../WindowQingXiCheAndQv/js/WindowEvent.js';
+import { QingXiCheAndQvComRes } from '../js/QingXiCheAndQvComRes.js';
+import { QingXiCheAndQvComClipPlaneMeshEvent } from '../js/QingXiCheAndQvComClipPlaneMeshEvent.js';
+
+/**
+ * 操作清洗车仿真逻辑
+ */
+export class QingXiCheAndQvCarEvent {
+    
+    // 每次 new 出对象则会调用这个构造函数
+    constructor() {
+        /**
+         * 三维世界对象 src\components\ThreeWorldEvent\js\QingXiCheAndQvThreeWorldEventMain.js
+         */
+        this.objThreeWorldEventMain = null;
+
+        /**
+         * 回调控制 上一步是否显示
+         */
+        this.tipsBtnsUpOpenEventCallback = null;
+
+        /**
+         * 回调控制 下一步是否显示
+         */
+        this.tipsBtnsDownOpenEventCallback = null;
+
+        /**
+         * 记录当前的事件名字
+         */
+        this.eventName = null;
+
+        /**
+         * 当前事件是否处理完成
+         * 0 - 未完成 , 1 - 处理中, 2 - 处理完成
+         */
+        this.eventEnd = 0;
+
+        /**
+         * 对应可以操作的 store,控制其他组件实验
+         */
+        this.ComStore = {};
+
+        /**
+         * 记录可以弹出的视频
+         */
+        this.videoJson = {
+            // "唯一code" : "对应的视频地址",
+        };
+
+
+        /**
+         * 用于记录一些粒子的操作的球体
+         * 有的粒子停止的时候比较奇怪
+         * 所以有些粒子的停止和开启,是通过移动坐标实现的
+         */
+        this.particleSystemAutoSphere = {
+
+        };
+
+
+    }
+
+    // 实现单例模式
+    static find() {
+        if (!QingXiCheAndQvCarEvent.instance) {
+            QingXiCheAndQvCarEvent.instance = new QingXiCheAndQvCarEvent();
+        }
+        return QingXiCheAndQvCarEvent.instance;
+    }
+
+
+    /**
+     * 初始化第一个步骤视角
+     */
+    evnetInit_1 = () => {
+
+        let thisClass = this;
+        thisClass.work_1();
+        
+    }
+
+    /**
+     * 控制水流粒子
+     * open         true - 开启, false - 关闭
+     */
+    waterEvent = (open) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        let ParticleSystemAuto = ChengGuangYuanJing.ParticleSystemAuto.find();
+        let list = ParticleSystemAuto.list;
+        
+        for (let i = 0; i < list.length; i++) {
+            let objList = list[i];
+
+            // 控制指定的具体的粒子,并不是所有的粒子的会被操作
+            // if (objList.name == '水管水流' || objList.name == '水汽') {
+            // if (objList.name == '水泥管粒子') {
+            if (objList.name == '水泥管粒子' || objList.name == '水汽') {
+                
+                // 获取粒子对象
+                let objParticle = ChengGuangYuanJing.ParticleSystemAuto.find().objParticleSystemCreateOrUpdate(objList.code);
+                // // 没有停止
+                // if (objParticle.isStopping() == false) {
+                    
+                // }
+
+                if (open == true) {
+                    objParticle.start();
+                } else {
+                    objParticle.stop();
+                }
+
+            }
+
+        }
+        
+        return this;
+
+    }
+
+    /**
+     * 控制 水管流水逻辑
+     * open         true - 开启, false - 关闭
+     * qiBool       true - 全部水汽和漏水, 否则,开启
+     */
+    waterGuanEvent = (open, qiBool) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        let ParticleSystemAuto = ChengGuangYuanJing.ParticleSystemAuto.find();
+        let list = ParticleSystemAuto.list;
+        
+        for (let i = 0; i < list.length; i++) {
+            let objList = list[i];
+
+            let thisCode = objList.code;
+
+            // 控制指定的具体的粒子,并不是所有的粒子的会被操作
+            // if (objList.name == '水管水流' || objList.name == '水汽') {
+            if (objList.name == 'PVC管漏水' || objList.name == 'PVC管水流' || objList.name == "水管水汽") {
+                
+                // 获取粒子对象
+                let objParticle = ChengGuangYuanJing.ParticleSystemAuto.find().objParticleSystemCreateOrUpdate(objList.code);
+                // // 没有停止
+                // if (objParticle.isStopping() == false) {
+                    
+                // }
+
+                // // 一些特殊的粒子,需要单独另外进行处理
+                // if (objList.name == "水管水汽") {
+
+                //     if (
+                //         thisClass.particleSystemAutoSphere[thisCode] == null
+                //         || thisClass.particleSystemAutoSphere[thisCode] == undefined
+                //     ) {
+                //         thisClass.particleSystemAutoSphere[thisCode] = ChengGuangYuanJing.ParticleSystemAuto.find().editSphere(objList.code, false);
+                //     }
+
+                //     let objEditSphere = thisClass.particleSystemAutoSphere[thisCode];
+                    
+                //     if (open == true) {
+
+                //         objList["capacity"] = 3000;
+                //         // objList["gravityY"] = -0.3;
+
+                //         // objList["minSize"] = 0.15;
+                //         // objList["maxSize"] = 0.35;
+                //         // objList["minLifeTime"] = 3;
+                //         // objList["maxLifeTime"] = 5;
+                        
+                //         // objList["emitterPositionX"] = -0.005484189372509718;
+                //         objList["emitterPositionY"] = -0.2426731139421463;
+                //         // objList["emitterPositionZ"] = 35.98605728149414;
+                        
+                //     } else {
+
+                //         objList["capacity"] = 1000;
+                //         // objList["gravityY"] = -10;
+
+                //         // objList["minSize"] = 0.15 * 0.3;
+                //         // objList["maxSize"] = 0.35 * 0.3;
+                //         // objList["minLifeTime"] = 3 * 0.05;
+                //         // objList["maxLifeTime"] = 5 * 0.05;
+
+                //         // objList["emitterPositionX"] = -0.005484189372509718;
+                //         objList["emitterPositionY"] = -10.2426731139421463;
+                //         // objList["emitterPositionZ"] = 35.98605728149414;
+                        
+                //     }
+                    
+                //     ChengGuangYuanJing.ParticleSystemAuto.find().updateConfig(objList.code, objList);
+                    
+                //     // if (open == true) {
+                //     //     objEditSphere.position.y = parseFloat(-0.2426731139421463);
+                //     // } else {
+                //     //     objEditSphere.position.y = parseFloat(-10.2426731139421463);
+                //     // }
+                    
+                //     continue;
+                // }
+
+                if (qiBool == true) {
+
+                    if (objList.name == 'PVC管漏水' || objList.name == "水管水汽") {
+                        objParticle.stop();
+                        continue;
+                    }
+
+                }
+
+                if (open == true) {
+                    objParticle.start();
+                } else {
+                    objParticle.stop();
+                }
+
+            }
+
+        }
+        
+        return this;
+
+    }
+
+    /**
+     * 根据类别,控制哪些物体的显示和隐藏
+     * type         类别
+     * lookBool     true 显示, false 隐藏
+     */
+    meshVisibility = function(type, lookBool) {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        let meshList = [
+            // "model_1733897636373喷枪水面",
+            // "model_1733897636373喷水面.001"
+        ];
+        
+        switch (type) {
+
+            case "all":
+
+                meshList = [
+                    "exhibition_html_1746603426219_hua_",
+                    "exhibition_html_1746603575580_hua_",
+                    "exhibition_html_1746603607208_hua_",
+                    "exhibition_html_1746603654775_hua_",
+                    "exhibition_html_1746603686745_hua_",
+                    "exhibition_html_1746603707760_hua_",
+                    "exhibition_html_1746603846735_hua_",
+                    "exhibition_html_1746603894815_hua_",
+                    "exhibition_html_1746603926412_hua_",
+                    "exhibition_html_1746604047427_hua_",
+                    "exhibition_html_1746604108744_hua_",
+                    "exhibition_html_1746604171611_hua_",
+                    "exhibition_html_1746604199620_hua_",
+                    "exhibition_html_1746604263314_hua_",
+                ];
+
+                break;
+
+            case "打开车门进入驾驶室":
+
+                meshList = [
+                    "exhibition_html_1746603426219_hua_",
+                ];
+
+                break;
+
+            case "确认手刹已拉起档位是P档然后发动车辆":
+
+                meshList = [
+                    "exhibition_html_1746604047427_hua_",
+                    "exhibition_html_1746604199620_hua_",
+                ];
+
+                break;
+
+            case "打开车辆双闪同时开启工作双闪灯":
+
+                meshList = [
+                    "exhibition_html_1746604171611_hua_",
+                    "exhibition_html_1746604108744_hua_",
+                ];
+
+                break;
+
+            case "踩下车辆离合器5秒":
+
+                meshList = [
+                    "exhibition_html_1746604263314_hua_",
+                ];
+
+                break;
+
+            case "按下取力器开关":
+
+                meshList = [
+                    "exhibition_html_1746604047427_hua_",
+                ];
+
+                break;
+
+            case "缓慢抬起离合器":
+
+                meshList = [
+                    "exhibition_html_1746604263314_hua_",
+                ];
+
+                break;
+
+            case "从水管固定座上拧下高压水管":
+
+                meshList = [
+                    "exhibition_html_1746603894815_hua_",
+                ];
+                break;
+
+            case "调整卷筒器到合适位置":
+
+                meshList = [
+                    "exhibition_html_1746603846735_hua_",
+                ];
+                break;
+
+            case "取出高压水管并放入布管器内":
+
+                meshList = [
+                    "exhibition_html_1746603926412_hua_",
+                ];
+                break;
+
+            case "将高压水管拧到水管固定座":
+
+                meshList = [
+                    "exhibition_html_1746603894815_hua_",
+                ];
+                break;
+
+            case "回到驾驶室踩下车辆离合器5秒":
+
+                meshList = [
+                    "exhibition_html_1746604263314_hua_",
+                ];
+                break;
+
+            case "关闭取力器开关":
+
+                meshList = [
+                    "exhibition_html_1746604047427_hua_",
+                ];
+                break;
+
+            case "关闭车辆双闪和工作双闪箭头灯":
+
+                meshList = [
+                    "exhibition_html_1746604171611_hua_",
+                    "exhibition_html_1746604108744_hua_",
+                ];
+                break;
+
+            case "车辆正常熄火":
+
+                meshList = [
+                    "exhibition_html_1746604047427_hua_",
+                    "exhibition_html_1746604199620_hua_",
+                ];
+                break;
+                
+        }
+        
+        for (let i = 0; i < meshList.length; i++) {
+            let meshId = meshList[i];
+            let objMesh = objScene.getMeshById(meshId);
+            if (objMesh != null && objMesh != undefined) {
+                objMesh.visibility = 0;
+
+                if (lookBool == false) {
+                    objMesh.visibility = 0;
+                    objMesh.isPickable = false;
+                } else {
+                    objMesh.visibility = 1;
+                    objMesh.isPickable = true;
+                }
+
+            }
+
+        }
+
+
+    }
+
+    /**
+     * 切换对应的动画结果
+     * type     类型
+     */
+    animationAllTypeUpdate = function(type) {
+    
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        // 通过配置来更新动画
+        let list = [];
+
+        switch (type) {
+
+            // 停止所有动画放到对应的合理位置
+            case 'stopAll':
+                
+                list = [
+                    
+                    { "name" : "QV-电池.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "QV-电池架", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "QV-相机.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "U型杆.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "井盖002.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "伸缩杆", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "伸缩杆节1.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "伸缩杆节2.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "伸缩杆节3.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "伸缩杆节4.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "伸缩杆节5.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "相机箱盖.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "上箍", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "下箍.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "坑顶.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "扳手.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "插销1.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "插销2.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "插销轴.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "橡胶垫.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "紧箍螺丝01.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "紧箍螺丝02.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "紧箍螺丝03|", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "相机箱盖001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "喷头001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "车厢侧门.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "波纹管.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "卷帘门01-1.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "卷帘门01-2.002", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "卷帘门01-3.002", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "卷帘门02-1.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "卷帘门02-2.002", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "卷帘门02-3.002", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "水枪.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "离合.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "钥匙.001", "speed" : 1, "from" : 0, "to" : 0 },
+                    { "name" : "Armature.001", "speed" : 1, "from" : 0, "to" : 0 },
+
+                    
+                ];
+
+                break;
+
+            // 数字修复虚拟仿真-将橡胶垫片放置到正确的位置
+            case '数字修复虚拟仿真-将橡胶垫片放置到正确的位置':
+
+                list = [
+
+                    { "name" : "坑顶.001", "speed" : 1, "from" : 0, "to" : 60 },
+                    
+                ];
+                
+                break;
+                
+            // case '':
+            //     break;
+
+            // case '':
+            //     break;
+            
+        }
+        
+        for (let i = 0; i < list.length; i++) {
+
+            let thisList = list[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisList.name, 'start', thisList.speed, thisList.from, thisList.to, false, null, function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    };
+    
+    /**
+     * 回调控制 上一步是否显示
+     * open         true - 显示, false 隐藏
+     */
+    tipsBtnsUpOpenEventCallbackMain = function(open) {
+
+        if (this.tipsBtnsUpOpenEventCallback == null || this.tipsBtnsUpOpenEventCallback == undefined) {
+            return;
+        }
+        this.tipsBtnsUpOpenEventCallback(open);
+
+    }
+
+    /**
+     * 回调控制 下一步是否显示
+     * open         true - 显示, false 隐藏
+     */
+    tipsBtnsDownOpenEventCallbackMain = (open) => {
+
+        if (this.tipsBtnsDownOpenEventCallback == null || this.tipsBtnsDownOpenEventCallback == undefined) {
+            return;
+        }
+        this.tipsBtnsDownOpenEventCallback(open);
+
+    }
+
+
+
+    /**
+     * 关闭或开启车子
+     * open         true - 开启, false - 关闭
+     */
+    carOpen = function(open) {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        let level = open == true ? 12 : 0.1;
+
+        // 更新对应模型的参数
+        objIframeEdit.objOneMeshListIdToJsonUpdate(
+            "model_1746598895147控制台_primitive6",
+            {
+                "levelAlbedoTexture" : level,
+                "levelDiffuseTexture" : level,
+            }
+        );
+
+
+    }
+
+
+    /**
+     * 关闭或开启双闪
+     * open         true - 开启, false - 关闭
+     */
+    carShuangShanOpen = function(open) {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        let glowLayerOpen = open;
+
+        // 更新对应模型的参数
+        objIframeEdit.objOneMeshListIdToJsonUpdate(
+            "model_1746598895147控制台_primitive7",
+            {
+                "glowLayerOpen" : glowLayerOpen,
+                "glowLayerColor" : "rgb(255,50,0)",
+                "glowLayerAlpha" : "1.0"
+            }
+        );
+
+        // let albedoTextureNew = open == true ? "animationImgList_e90269b2-7940-445f-93a2-327033791563" : QingXiCheAndQvComRes.find().resJson["img_shuang"];
+        // console.log(
+        //     " ========== 切换双闪贴图 albedoTextureNew ========== ", albedoTextureNew
+        // );
+
+        // 更新对应模型的参数
+        objIframeEdit.objOneMeshListIdToJsonUpdate(
+            "model_1746598895147控制台_primitive8",
+            {
+                // "albedoTexture" : albedoTextureNew,
+                // "diffuseTexture" : albedoTextureNew,
+                "levelAlbedoTexture" : open == true ? 3 : 0.1,
+                "levelEmissiveTexture" : open == true ? 0 : 0.2,
+                "emissiveColor" : open == true ? "rgb(0, 0, 0)" : "rgb(121,121,121)",
+            }
+        );
+        
+
+    }
+
+
+
+    /**
+     * 根据不同的类型,操作不同的三维
+     * type         自定义类型
+     */
+    typeEvent = function(type) {
+
+        let thisClass = this;
+
+        console.log(
+            "根据不同的类型,切换对应的3d逻辑", type
+        );
+
+        // if (typeof type != 'string' && type != '' && type != ' ' && type != '  ') {
+        //     this.storesObj.courseChapter3dShow.show.threeWorldMask = false;
+        //     return this;
+        // }
+        
+        // this.storesObj.courseChapter3dShow.show.threeWorldMask = true;
+        
+        // 进入新的流程,默认没有完成
+        this.eventName = type;
+        this.eventEnd = 0;
+
+        // 优先关闭弹窗文本窗口
+        WindowEvent.find().WindowTxtViewOpenExit();
+        WindowEvent.find().WindowVideoViewOpenExit();
+        
+        switch(type) {
+            
+            // 仿真模拟
+            case '仿真模拟':
+                thisClass.work_1();
+                break;
+
+            // // 点击管道开始清洗
+            // case '点击管道开始清洗':
+            //     thisClass.work_7();
+            //     break;
+
+            // 打开车门进入驾驶室
+            case '打开车门进入驾驶室':
+                thisClass.work_new_1();
+                break;
+
+            case '确认手刹已拉起档位是P档然后发动车辆':
+                thisClass.work_new_2();
+                break;
+
+            // 打开车辆双闪同时开启工作双闪灯
+            case '打开车辆双闪同时开启工作双闪灯':
+                thisClass.work_new_3();
+                break;
+
+            // 踩下车辆离合器5秒
+            case '踩下车辆离合器5秒':
+                thisClass.work_new_4();
+                break;
+
+            // 按下取力器开关
+            case '按下取力器开关':
+                thisClass.work_new_5();
+                break;
+
+            // 缓慢抬起离合器
+            case '缓慢抬起离合器':
+                thisClass.work_new_6();
+                break;
+
+            // 下车确定安全灯显示是否正常
+            case '下车确定安全灯显示是否正常':
+                thisClass.work_new_7();
+                break;
+
+            // 在施工范围放置警示标识
+            case '在施工范围放置警示标识':
+                thisClass.work_new_8();
+                break;
+
+            // 从水管固定座上拧下高压水管
+            case '从水管固定座上拧下高压水管':
+                thisClass.work_new_9();
+                break;
+
+            // 调整卷筒器到合适位置
+            case '调整卷筒器到合适位置':
+                thisClass.work_new_10();
+                break;
+
+            // 取出高压水管并放入布管器内
+            case '取出高压水管并放入布管器内':
+                thisClass.work_new_11();
+                break;
+
+            // 套上高压水管护管器
+            case '套上高压水管护管器':
+                thisClass.work_new_12();
+                break;
+
+            // 安装合适的高压喷头
+            case '安装合适的高压喷头':
+                thisClass.work_new_13();
+                break;
+
+            // 将高压水管放入待施工的管道内
+            case '将高压水管放入待施工的管道内':
+                thisClass.work_new_14();
+                break;
+
+            // 在触屏操作面板上将管长清零
+            case '在触屏操作面板上将管长清零':
+                thisClass.work_new_15();
+                break;
+
+            // 在安全的情况开启冲水开关
+            case '在安全的情况开启冲水开关':
+                thisClass.work_new_16();
+                break;
+
+            // 根据现场工况调节冲水压力
+            case '根据现场工况调节冲水压力':
+                thisClass.work_new_17();
+                break;
+
+            // 疏通管道后减小油门到初始状态
+            case '疏通管道后减小油门到初始状态':
+                thisClass.work_new_18();
+                break;
+
+            // 带压收回高压水管
+            case '带压收回高压水管':
+                thisClass.work_new_19();
+                break;
+
+            // 至触摸屏关闭冲水开关
+            case '至触摸屏关闭冲水开关':
+                thisClass.work_new_20();
+                break;
+
+            // 缓慢收回高压水管
+            case '缓慢收回高压水管':
+                thisClass.work_new_21();
+                break;
+
+            // 拆卸高压喷头放入喷头机箱内
+            case '拆卸高压喷头放入喷头机箱内':
+                thisClass.work_new_22();
+                break;
+
+            // 收起高压水管将卷筒恢复到初始状态
+            case '收起高压水管将卷筒恢复到初始状态':
+                thisClass.work_new_23();
+                break;
+
+            // 将高压水管拧到水管固定座
+            case '将高压水管拧到水管固定座':
+                thisClass.work_new_24();
+                break;
+
+            // 回到驾驶室踩下车辆离合器5秒
+            case '回到驾驶室踩下车辆离合器5秒':
+                thisClass.work_new_25();
+                break;
+
+            // 关闭取力器开关
+            case '关闭取力器开关':
+                thisClass.work_new_26();
+                break;
+
+            // 关闭车辆双闪和工作双闪箭头灯
+            case '关闭车辆双闪和工作双闪箭头灯':
+                thisClass.work_new_27();
+                break;
+
+            // 车辆正常熄火
+            case '车辆正常熄火':
+                thisClass.work_new_28();
+                break;
+
+            // // 
+            // case '':
+                
+            //     break;
+
+            // // 
+            // case '':
+                
+            //     break;
+
+             // // 
+            // case '':
+                
+            //     break;
+
+            // // 
+            // case '':
+                
+            //     break;
+
+            // // 
+            // case '':
+                
+            //     break;
+
+            // // 
+            // case '':
+                
+            //     break;
+
+             // // 
+            // case '':
+                
+            //     break;
+
+            // // 
+            // case '':
+                
+            //     break;
+
+            // // 
+            // case '':
+                
+            //     break;
+                
+            // 已完成所有任务
+            case 'equipmentRepositioningWork':
+                thisClass.work_new_29();
+                break;
+
+            // 数字修复虚拟仿真-将阀门关闭停止水流
+            case '数字修复虚拟仿真-将阀门关闭停止水流':
+                thisClass.shuZiXiuFuWork_0();
+                break;
+                
+            // 数字修复虚拟仿真-将橡胶垫片放置到正确的位置
+            case '数字修复虚拟仿真-将橡胶垫片放置到正确的位置':
+                thisClass.shuZiXiuFuWork_1();
+                break;
+
+            // 数字修复虚拟仿真-将抱箍放置到正确的位置
+            case '数字修复虚拟仿真-将抱箍放置到正确的位置':
+                thisClass.shuZiXiuFuWork_2();
+                break;
+                
+            // 数字修复虚拟仿真-将插销安装到正确的位置
+            case '数字修复虚拟仿真-将插销安装到正确的位置':
+                thisClass.shuZiXiuFuWork_3();
+                break;
+
+            // 数字修复虚拟仿真-将螺丝安装到正确的位置
+            case '数字修复虚拟仿真-将螺丝安装到正确的位置':
+                thisClass.shuZiXiuFuWork_4();
+                break;
+
+            // 数字修复虚拟仿真-用扳手将螺丝旋紧螺丝
+            case '数字修复虚拟仿真-用扳手将螺丝旋紧螺丝':
+                thisClass.shuZiXiuFuWork_5();
+                break;
+
+            // 数字修复虚拟仿真-已完成所有任务
+            case '数字修复虚拟仿真-已完成所有任务':
+                thisClass.shuZiXiuFuWork_6();
+                break;
+
+            // // 
+            // case '':
+                
+            //     break;
+                
+            default:
+                
+                break;
+                
+        }
+        
+    }
+
+    /**
+     * 仿真模拟开始先进行初始化
+     */
+    work_1 = () => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        WindowEvent.find().WindowVideoRemoveColorExit();
+
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("清洗车");
+
+        QingXiCheAndQvComHighlightLayer.find().objJsonDelAll();
+        QingXiCheAndQvComClipPlaneMeshEvent.find().carMeshClipNo();
+
+        thisClass.waterEvent(false);
+        thisClass.meshVisibility("all", false);
+        thisClass.animationAllTypeUpdate('stopAll');
+
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(true);
+
+    }
+    
+    /**
+     * 已完成所有任务
+     */
+    work_8 = function() {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        // thisClass.meshVisibility("点击模拟踩离合", true);
+
+        // 关闭清洗水流
+        thisClass.waterEvent(false);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("清洗车-喷枪");
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+    
+
+    /**
+     * 打开车门进入驾驶室
+     */
+    work_new_1 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("打开车门进入驾驶室", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("绕车1");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "上车前,先绕车一周,观察车辆前后有无障碍物,留意周边行人、车辆动态。" + "\n"
+            + "确认无异常后,拉开车门,侧身坐入驾驶室。"
+            
+        );
+
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_13"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+
+        // 初始化重置一些物体的材质
+        thisClass.carOpen(false);
+        thisClass.carShuangShanOpen(false);
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+    /**
+     * 确认手刹已拉起档位是P档然后发动车辆
+     */
+    work_new_2 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("确认手刹已拉起档位是P档然后发动车辆", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("手刹和空挡");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "观察驾驶室挡位状态,确认手刹处于拉起状态,挡位状态切换至P挡位置。" + "\n"
+            + "拧动启动钥匙,发动车辆。"
+        );
+        
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_04"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+    /**
+     * 打开车辆双闪同时开启工作双闪灯
+     */
+    work_new_3 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("打开车辆双闪同时开启工作双闪灯", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("开启双闪");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "按下车辆双闪按钮,打开车辆双闪,同时,按下工作双闪按钮,打开工作双闪箭头灯。" + "\n"
+            // + "拧动启动钥匙,发动车辆。"
+        );
+
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_01"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+    /**
+     * 踩下车辆离合器5秒
+     */
+    work_new_4 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("踩下车辆离合器5秒", true);
+
+        // objIframeEdit.cameraVisualAngleGetListNameGpsTo("调整坐姿");
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("手握方向盘");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "调整坐姿,双手稳握方向盘。" + "\n"
+            + "用脚掌平稳且有力地踩下车辆离合器踏板,保持5秒,为后续操作做好准备。"
+        );
+
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_15"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+
+    /**
+     * 按下取力器开关
+     */
+    work_new_5 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("按下取力器开关", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("观察仪表盘指示灯");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "目视仪表盘指示灯,确认车辆处于合适工况后,用手指轻稳按下取力器开关,稍作停顿,观察仪表状态,确保取力器顺利接合。" + "\n"
+        );
+
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_02"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+    /**
+     * 缓慢抬起离合器
+     */
+    work_new_6 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("缓慢抬起离合器", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("抬起离合器踏板");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "手肘轻靠座椅,以脚跟为支点,脚掌缓慢上抬离合器踏板,力度由重渐轻,同时感受车辆动力衔接,避免急抬引发顿挫。" + "\n"
+        );
+
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_22"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+    /**
+     * 下车确定安全灯显示是否正常
+     */
+    work_new_7 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        // thisClass.meshVisibility("下车确定安全灯显示是否正常", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("下车观察各项灯光0");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "下车并确认车辆双闪灯快速交替闪烁,工作箭头清晰明亮,各项灯光显示均正常无误。" + "\n"
+        );
+
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_23"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+
+    /**
+     * 在施工范围放置警示标识
+     */
+    work_new_8 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        // thisClass.meshVisibility("在施工范围放置警示标识", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("在施工范围放置警示标识1");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "携带反光锥、警示牌等安全设备,沿施工场地边缘,间隔适当距离摆放。确保警示标识醒目稳固,全方位提醒过往人员注意安全。" + "\n"
+        );
+
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_16"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+
+    /**
+     * 从水管固定座上拧下高压水管
+     */
+    work_new_9 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("从水管固定座上拧下高压水管", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("从水管固定座上拧下高压水管1");
+
+        WindowEvent.find().WindowVideoViewOpenEvent(
+            QingXiCheAndQvCarEvent.find().videoJson["videw_liu_cheng_1"],
+            null,
+            function() {}
+        );
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "到车后查看水管固定座高压水管的螺栓位置,双手握紧扳手,按逆时针方向缓慢拧松固定螺栓,顺势取下高压水管并妥善放置。" + "\n"
+        );
+
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_03"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+    /**
+     * 调整卷筒器到合适位置
+     */
+    work_new_10 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("调整卷筒器到合适位置", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("调整卷筒器到合适位置1");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "找到卷筒锁开关,轻轻按下开启,依照现场作业需求,缓慢转动卷筒调整至合适角度,确认无误后,再次按下开关将卷筒牢牢锁住。" + "\n"
+        );
+
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_11"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+    /**
+     * 取出高压水管并放入布管器内
+     */
+    work_new_11 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("取出高压水管并放入布管器内", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("取出高压水管并放入布管器内1");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "缓慢取出高压水管,随后将水管一端小心送入布管器内,整个过程保持轻拿轻放,不要损坏设备。" + "\n"
+        );
+
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_05"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+    /**
+     * 套上高压水管护管器
+     */
+    work_new_12 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("套上高压水管护管器", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("套上高压水管护管器1");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "为延长高压水管使用寿命、有效减少磨损,需要套上高压水管护管器,先将护管器开口对准水管端口,再沿管壁缓慢滑动套入。" + "\n"
+        );
+
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_17"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+    /**
+     * 安装合适的高压喷头
+     */
+    work_new_13 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("安装合适的高压喷头", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("安装合适的高压喷头1");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "仔细评估现场施工的压力需求、喷射范围等工况,挑选适配规格的高压喷头,用扳手将其与高压水管牢固拧紧,确保连接紧密无渗漏。" + "\n"
+        );
+
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_20"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+    /**
+     * 将高压水管放入待施工的管道内
+     */
+    work_new_14 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("将高压水管放入待施工的管道内", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("将高压水管放入待施工的管道内1");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "双手握紧高压水管,缓慢、匀速地将其送入施工管道,同时注意观察送入长度,使水管前端深入管道内保持在0.5至1米的合适位置。" + "\n"
+        );
+
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_18"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+    /**
+     * 在触屏操作面板上将管长清零
+     */
+    work_new_15 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("在触屏操作面板上将管长清零", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("在触屏操作面板上将管长清零1");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "走近触屏操作面板,点击功能菜单找到管长设置选项,在确认无运行指令干扰后,按下清零按键,使显示屏管长数值归零并完成初始化。" + "\n"
+        );
+
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_06"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+
+    /**
+     * 在安全的情况开启冲水开关
+     */
+    work_new_16 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("在安全的情况开启冲水开关", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("在安全的情况开启冲水开关1");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "全面检查周边环境,确认无人员靠近、设备无异常后,在触屏操作面板上,精准按下冲水开关,同时密切观察设备运行状态。" + "\n"
+        );
+
+        WindowEvent.find().WindowVideoViewOpenEvent(
+            QingXiCheAndQvCarEvent.find().videoJson["videw_liu_cheng_2"],
+            null,
+            function() {}
+        );
+
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_21"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+    /**
+     * 根据现场工况调节冲水压力
+     */
+    work_new_17 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("根据现场工况调节冲水压力", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("根据现场工况调节冲水压力1");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "时刻留意现场施工情况,依据作业强度与进度,适时调节油门控制水压;同步灵活收放高压水管,保障施工高效、稳定推进。" + "\n"
+        );
+
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_24"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+
+    /**
+     * 疏通管道后减小油门到初始状态
+     */
+    work_new_18 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("疏通管道后减小油门到初始状态", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("疏通管道后减小油门到初始状态1");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "确认管道疏通彻底、水流顺畅后,缓慢平稳地减小油门,密切注视仪表盘参数,直至油门恢复至作业前的初始设定状态。" + "\n"
+        );
+
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_14"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+    /**
+     * 带压收回高压水管
+     */
+    work_new_19 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("带压收回高压水管", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("带压收回高压水管1");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "为防止喷头堵塞,在收回高压水管过程中保持冲水开关开启状态,以缓慢匀速的方式将水管回收到距管口2米处。" + "\n"
+            + "收回水管过程中采用带压回收的方式,主要为了借助高压水流将管道内污泥冲刷至沉井口。"
+        );
+
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_25"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+    /**
+     * 至触摸屏关闭冲水开关
+     */
+    work_new_20 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("至触摸屏关闭冲水开关", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("至触摸屏关闭冲水开关1");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "完成管道疏通作业后,仔细确认现场无异常水流需求,走到触屏操作面板前,点击对应图标,缓慢关闭冲水开关,确保水流完全停止。" + "\n"
+        );
+
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_12"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+    /**
+     * 缓慢收回高压水管
+     */
+    work_new_21 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("缓慢收回高压水管", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("缓慢收回高压水管1");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "施工完毕后,从管道拉出水管,同步检查管身有无破损。" + "\n"
+        );
+
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_25"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+    /**
+     * 拆卸高压喷头放入喷头机箱内
+     */
+    work_new_22 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("拆卸高压喷头放入喷头机箱内", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("拆卸高压喷头放入喷头机箱内1");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "使用专用扳手,按照规范操作流程,小心拧松高压喷头与水管接口,取下喷头后仔细擦拭,确认无污渍残留,再轻放入喷头机箱内妥善归置。" + "\n"
+        );
+
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_07"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+    /**
+     * 收起高压水管将卷筒恢复到初始状态
+     */
+    work_new_23 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("收起高压水管将卷筒恢复到初始状态", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("收起高压水管将卷筒恢复到初始状态1");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "按下卷筒解锁按钮,双手扶住高压水管引导其整齐缠绕,匀速转动卷筒手柄,密切观察缠绕状态,直至将水管完全收回并固定妥当后关闭卷筒锁。" + "\n"
+        );
+
+        WindowEvent.find().WindowVideoRemoveColorOpen(
+            QingXiCheAndQvComRes.find().resJson["QingXiChe_25"],
+            "top:auto;left:auto;bottom:5%;right:10%;",
+            null,
+            null
+        );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+
+    /**
+     * 将高压水管拧到水管固定座
+     */
+    work_new_24 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("将高压水管拧到水管固定座", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("将高压水管拧到水管固定座1");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "拿起高压水管对准固定座接口,顺时针缓慢旋转,同时确保水管与接口紧密贴合,直至完全拧紧,使高压水管稳固固定在固定座上。" + "\n"
+        );
+
+        // WindowEvent.find().WindowVideoRemoveColorOpen(
+        //     QingXiCheAndQvComRes.find().resJson["QingXiChe_25"],
+        //     "top:auto;left:auto;bottom:5%;right:10%;",
+        //     null,
+        //     null
+        // );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+    /**
+     * 回到驾驶室踩下车辆离合器5秒
+     */
+    work_new_25 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("回到驾驶室踩下车辆离合器5秒", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("回到驾驶室踩下车辆离合器5秒1");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "完成设备收尾工作后,稳步返回驾驶室,坐定并调整坐姿,将右脚平稳置于离合器踏板上,匀速下压车辆离合器并持续保持5秒钟。" + "\n"
+        );
+
+        // WindowEvent.find().WindowVideoRemoveColorOpen(
+        //     QingXiCheAndQvComRes.find().resJson["QingXiChe_25"],
+        //     "top:auto;left:auto;bottom:5%;right:10%;",
+        //     null,
+        //     null
+        // );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+
+    /**
+     * 关闭取力器开关
+     */
+    work_new_26 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("关闭取力器开关", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("观察仪表盘指示灯");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "关闭取力器开关" + "\n"
+        );
+
+        // WindowEvent.find().WindowVideoRemoveColorOpen(
+        //     QingXiCheAndQvComRes.find().resJson["QingXiChe_25"],
+        //     "top:auto;left:auto;bottom:5%;right:10%;",
+        //     null,
+        //     null
+        // );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+
+    /**
+     * 关闭车辆双闪和工作双闪箭头灯
+     */
+    work_new_27 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("关闭车辆双闪和工作双闪箭头灯", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("开启双闪");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "关闭车辆双闪和工作双闪箭头灯" + "\n"
+        );
+
+        // WindowEvent.find().WindowVideoRemoveColorOpen(
+        //     QingXiCheAndQvComRes.find().resJson["QingXiChe_25"],
+        //     "top:auto;left:auto;bottom:5%;right:10%;",
+        //     null,
+        //     null
+        // );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+    /**
+     * 车辆正常熄火
+     */
+    work_new_28 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("车辆正常熄火", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("熄火_1");
+
+        WindowEvent.find().WindowTxtViewOpenEvent(
+            "车辆正常熄火" + "\n"
+        );
+
+        // WindowEvent.find().WindowVideoRemoveColorOpen(
+        //     QingXiCheAndQvComRes.find().resJson["QingXiChe_25"],
+        //     "top:auto;left:auto;bottom:5%;right:10%;",
+        //     null,
+        //     null
+        // );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+
+    /**
+     * 清洗车已完成所有任务
+     */
+    work_new_29 = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        thisClass.meshVisibility("all", false);
+        thisClass.meshVisibility("清洗车已完成所有任务", true);
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("清洗车流程完成");
+
+        // WindowEvent.find().WindowTxtViewOpenEvent(
+        //     "车辆正常熄火" + "\n"
+        // );
+
+        // WindowEvent.find().WindowVideoRemoveColorOpen(
+        //     QingXiCheAndQvComRes.find().resJson["QingXiChe_25"],
+        //     "top:auto;left:auto;bottom:5%;right:10%;",
+        //     null,
+        //     null
+        // );
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+        
+    }
+
+
+    /**
+     * 数字修复虚拟仿真-将阀门关闭停止水流
+     */
+    shuZiXiuFuWork_0 = function() {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        WindowEvent.find().WindowVideoRemoveColorExit();
+
+        thisClass.meshVisibility("all", false);
+        // 重置所有动画原始位置
+        thisClass.animationAllTypeUpdate('stopAll');
+
+        // 开启水流
+        thisClass.waterGuanEvent(true);
+        
+        QingXiCheAndQvComHighlightLayer.find().delAll("自定义");
+        QingXiCheAndQvCarEventClick.find().meshListComHighlightEvent("数字修复虚拟仿真-将阀门关闭停止水流");
+        
+        setTimeout(function() {
+            
+            // 将地面挪到合适的位置
+            thisClass.animationAllTypeUpdate('数字修复虚拟仿真-将橡胶垫片放置到正确的位置');
+            
+        }, 300);
+        
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("关闭阀门");
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+
+
+    }
+    
+
+
+    /**
+     * 数字修复虚拟仿真-将橡胶垫片放置到正确的位置
+     */
+    shuZiXiuFuWork_1 = function() {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+        
+        thisClass.meshVisibility("all", false);
+        
+        QingXiCheAndQvComHighlightLayer.find().delAll("自定义");
+        QingXiCheAndQvCarEventClick.find().meshListComHighlightEvent("数字修复虚拟仿真-将橡胶垫片放置到正确的位置");
+        
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("将橡胶垫片放置到正确的位置_准备安装");
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+
+
+    }
+
+    /**
+     * 数字修复虚拟仿真-将抱箍放置到正确的位置
+     */
+    shuZiXiuFuWork_2 = function() {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        // thisClass.meshVisibility("all", false);
+        
+        QingXiCheAndQvComHighlightLayer.find().delAll("自定义");
+        QingXiCheAndQvCarEventClick.find().meshListComHighlightEvent("数字修复虚拟仿真-将抱箍放置到正确的位置");
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("将抱箍放置到正确的位置_准备安装");
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+
+
+    }
+
+    /**
+     * 数字修复虚拟仿真-将插销安装到正确的位置
+     */
+    shuZiXiuFuWork_3 = function() {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        // thisClass.meshVisibility("all", false);
+
+        QingXiCheAndQvComHighlightLayer.find().delAll("自定义");
+        QingXiCheAndQvCarEventClick.find().meshListComHighlightEvent("数字修复虚拟仿真-将插销安装到正确的位置");
+        
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("将插销安装到正确的位置_准备安装");
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+
+
+    }
+
+    /**
+     * 数字修复虚拟仿真-将螺丝安装到正确的位置
+     */
+    shuZiXiuFuWork_4 = function() {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        // thisClass.meshVisibility("all", false);
+        
+        QingXiCheAndQvComHighlightLayer.find().delAll("自定义");
+        QingXiCheAndQvCarEventClick.find().meshListComHighlightEvent("数字修复虚拟仿真-将螺丝安装到正确的位置");
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("将螺丝安装到正确的位置_准备安装");
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+
+
+    }
+    
+
+    /**
+     * 数字修复虚拟仿真-用扳手将螺丝旋紧螺丝
+     */
+    shuZiXiuFuWork_5 = function() {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        // thisClass.meshVisibility("all", false);
+        
+        QingXiCheAndQvComHighlightLayer.find().delAll("自定义");
+        QingXiCheAndQvCarEventClick.find().meshListComHighlightEvent("数字修复虚拟仿真-用扳手将螺丝旋紧螺丝");
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("用扳手将螺丝旋紧螺丝_准备安装");
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+
+
+    }
+
+     /**
+     * 数字修复虚拟仿真-已完成所有任务
+     */
+     shuZiXiuFuWork_6 = function() {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        objIframeEdit.modelPeopleLook(3);
+        objIframeEdit.roleShow(false);
+
+        // thisClass.meshVisibility("all", false);
+        
+        QingXiCheAndQvComHighlightLayer.find().delAll("自定义");
+
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo("数字修复虚拟仿真-已完成所有任务");
+
+        setTimeout(function() {
+            // 启动水流
+            QingXiCheAndQvCarEvent.find().waterGuanEvent(true, true);
+        }, 1500);
+
+        
+        
+        thisClass.tipsBtnsUpOpenEventCallbackMain(false);
+        thisClass.tipsBtnsDownOpenEventCallbackMain(false);
+
+
+    }
+    
+}
+
+
+
+
+
+
+
+
+
+
+

+ 3329 - 0
src/components/ThreeWorldEventQingXiCheAndQv/js/QingXiCheAndQvCarEventClick.js

@@ -0,0 +1,3329 @@
+import { QingXiCheAndQvCarEvent } from "./QingXiCheAndQvCarEvent.js";
+import { QingXiCheAndQvComHighlightLayer } from "./QingXiCheAndQvComHighlightLayer.js";
+import { ComVal } from "../common/ComVal.js";
+import { WindowEvent } from "../../WindowQingXiCheAndQv/js/WindowEvent.js";
+import { QingXiCheAndQvComRes } from '../js/QingXiCheAndQvComRes.js';
+import { QingXiCheAndQvComClipPlaneMeshEvent } from './QingXiCheAndQvComClipPlaneMeshEvent.js';
+
+/**
+ * 操作清洗车仿真 点击物体的时候触发 逻辑
+ */
+export class QingXiCheAndQvCarEventClick {
+    
+    // 每次 new 出对象则会调用这个构造函数
+    constructor() {
+        /**
+         * 三维世界对象 src\components\ThreeWorldEvent\js\QingXiCheAndQvThreeWorldEventMain.js
+         */
+        this.objThreeWorldEventMain = null;
+
+        /**
+         * 当前移动的物体列表,和对应的参数
+         * 当数组存在目标的时候,则 拖拽的时候,目标物体跟着鼠标移动
+         */
+        this.moveMeshList = [];
+        // 记录第一次点击拖拽时候的坐标
+        this.moveMeshListClick = {
+            "x" : 0, "y" : 0, "z" : 0
+        };
+
+        /**
+         * 当前这些参数不等于null的时候,则说明再拖拽移动目标物体
+         * 此时固定相机的坐标,和视角
+         */
+        this.moveCameraRadius = null;
+        this.moveCameraAlpha = null;
+        this.moveCameraBeta = null;
+
+        // 记录最后因为 this.moveMeshList 逻辑,鼠标移动的坐标
+        this.moveCoordinate = {
+            "x" : 0, "y" : 0, "z" : 0
+        };
+
+    }
+
+    // 实现单例模式
+    static find() {
+        if (!QingXiCheAndQvCarEventClick.instance) {
+            QingXiCheAndQvCarEventClick.instance = new QingXiCheAndQvCarEventClick();
+        }
+        return QingXiCheAndQvCarEventClick.instance;
+    }
+
+    /**
+     * 鼠标点击的时候
+     * pickResult       点击的具体坐标,物体等信息
+     */
+    clickMeshEvent = function(pickResult) {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        // console.log(
+        //     "鼠标点击的时候", pickResult
+        // );
+
+        // 处理中则不做处理
+        if (QingXiCheAndQvCarEvent.find().eventEnd != 0) {
+            return this;
+        }
+
+        let type = QingXiCheAndQvCarEvent.find().eventName;
+        let meshMoveConfig = thisClass.meshMoveConfig(type);
+
+        if (meshMoveConfig == null) {
+            thisClass.moveMeshListReset();
+            return;
+        }
+
+        // 目标物体
+        let pickedMesh = pickResult["pickedMesh"];
+
+        if (typeof pickedMesh["id"] != "string") {
+            return;
+        }
+
+        let meshId = pickedMesh["id"];
+        // 点击的坐标
+        let pickedPoint = pickResult["pickedPoint"];
+        
+        let meshList = meshMoveConfig["meshList"];
+        let meshJson = meshMoveConfig["meshJson"];
+
+        // 点击的不是在物体的列表里的时候
+        if (meshJson[meshId] == null || meshJson[meshId] == undefined) {
+            thisClass.moveMeshListReset();
+            return;
+        }
+        
+
+        let objSceneActiveCamera = ChengGuangYuanJing.CommonVal.find().objSceneActiveCamera;
+        thisClass.moveCameraRadius = objSceneActiveCamera.radius;
+        thisClass.moveCameraAlpha = objSceneActiveCamera.alpha;
+        thisClass.moveCameraBeta = objSceneActiveCamera.beta;
+
+        thisClass.moveMeshListClick = {
+            "x" : pickedPoint.x, "y" : pickedPoint.y, "z" : pickedPoint.z
+        };
+
+        console.log(
+            "thisClass.moveMeshListClick",
+            thisClass.moveMeshListClick
+        );
+
+        thisClass.moveMeshList = [];
+
+        // 记录点击的时候的物体的坐标
+        for (let i = 0; i < meshList.length; i++) {
+
+            let thisMeshId = meshList[i];
+            let thisObjMesh = objScene.getMeshById(thisMeshId);
+            if (thisObjMesh != null && thisObjMesh != undefined) {
+                // 设置为不可选中
+                thisObjMesh.isPickable = false;
+
+                let addJson = {
+                    "meshId" : thisObjMesh.id,
+                    "x" : thisObjMesh.absolutePosition.x,
+                    "y" : thisObjMesh.absolutePosition.y,
+                    "z" : thisObjMesh.absolutePosition.z,
+                };
+
+                thisClass.moveMeshList.push(
+                    // 必须转换下,这样就是独立的对象
+                    JSON.parse(JSON.stringify(addJson))
+                );
+
+            }
+
+        }
+        
+        return thisClass;
+
+    }
+
+    /**
+     * 重置为不是拖拽逻辑
+     */
+    moveMeshListReset = function() {
+
+        let thisClass = this;
+        
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 先将对应的物体,恢复可以选中
+        if (thisClass.moveMeshList.length > 0) {
+            for (let i = 0; i < thisClass.moveMeshList.length; i++) {
+                let thisConfig = thisClass.moveMeshList[i];
+                let thisMeshId = thisConfig["meshId"];
+
+                let thisObjMesh = objScene.getMeshById(thisMeshId);
+                if (thisObjMesh != null && thisObjMesh != undefined) {
+                    // 设置为可选中
+                    thisObjMesh.isPickable = true;
+                }
+            }
+        }
+
+        thisClass.moveMeshList = [];
+        thisClass.moveCameraRadius = null;
+        thisClass.moveCameraAlpha = null;
+        thisClass.moveCameraBeta = null;
+
+    }
+    
+    /**
+     * 更新被拖拽物体的位置
+     */
+    moveMeshListCoordinateUpdate = function() {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        if (thisClass.moveMeshList.length > 0) {
+
+            // 追加的xyz坐标
+            var addPosition = {
+                "x" : thisClass.moveCoordinate.x - thisClass.moveMeshListClick.x,
+                "y" : thisClass.moveCoordinate.y - thisClass.moveMeshListClick.y,
+                "z" : thisClass.moveCoordinate.z - thisClass.moveMeshListClick.z,
+            };
+            
+            for (let i = 0; i < thisClass.moveMeshList.length; i++) {
+                let thisConfig = thisClass.moveMeshList[i];
+                let thisMeshId = thisConfig["meshId"];
+
+                let thisObjMesh = objScene.getMeshById(thisMeshId);
+                if (thisObjMesh != null && thisObjMesh != undefined) {
+                    
+                    // 一定要用绝对坐标更新,这样才可以解决不同模型轴向,问题导致设置 position 会各种出错
+                    thisObjMesh.setAbsolutePosition(
+                        new BABYLON.Vector3(
+                            parseFloat(thisConfig["x"]) + addPosition.x,
+                            parseFloat(thisConfig["y"]) + addPosition.y,
+                            parseFloat(thisConfig["z"]) + addPosition.z
+                        )
+                    );
+                    
+                }
+            }
+        }
+
+    }
+    
+
+    /**
+     * 将当前的物体列表,回归到最初原始的坐标位置
+     */
+    moveMeshListResetPosition = function () {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        if (thisClass.moveMeshList.length > 0) {
+            
+            for (let i = 0; i < thisClass.moveMeshList.length; i++) {
+                let thisConfig = thisClass.moveMeshList[i];
+                let thisMeshId = thisConfig["meshId"];
+
+                let thisObjMesh = objScene.getMeshById(thisMeshId);
+                if (thisObjMesh != null && thisObjMesh != undefined) {
+                    
+                    // 一定要用绝对坐标更新,这样才可以解决不同模型轴向,问题导致设置 position 会各种出错
+                    thisObjMesh.setAbsolutePosition(
+                        new BABYLON.Vector3(
+                            parseFloat(thisConfig["x"]),
+                            parseFloat(thisConfig["y"]),
+                            parseFloat(thisConfig["z"])
+                        )
+                    );
+                    
+                }
+            }
+        }
+
+    }
+    
+    /**
+     * 鼠标移动的时候
+     * pickResult       点击的具体坐标,物体等信息
+     */
+    clickMoveMeshEvent = function(pickResult) {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        // console.log(
+        //     "鼠标移动的时候", pickResult
+        // );
+
+        // 处理中则不做处理
+        if (QingXiCheAndQvCarEvent.find().eventEnd != 0) {
+            return this;
+        }
+
+        // 此时移动的坐标
+        let pickedPoint = pickResult["pickedPoint"];
+
+        thisClass.moveCoordinate = {
+            "x" : pickedPoint.x, "y" : pickedPoint.y, "z" : pickedPoint.z
+        };
+
+        thisClass.moveMeshListCoordinateUpdate();
+        
+        return thisClass;
+
+    }
+
+
+    /**
+     * 判断是否拖拽到指定的坐标范围了
+     * 范围内 返回 true , 否则返回 false
+     */
+    dragBool = function() {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        // 当没有被点击的物体的时候,说明该逻辑是没有拖拽到附近的
+        if (thisClass.moveMeshList.length <= 0) {
+            return false;
+        }
+
+        // 最终应该拖拽到哪个坐标附近
+        let targetPosition = {
+            "x" : -0.00247241766192019,
+            "y" : -0.8081836700439453,
+            "z" : 36.005401611328125,
+        }
+
+        // 得到两点之间的距离
+        let thisVector3distanceTo = BABYLON.Vector3.Distance(
+            new BABYLON.Vector3(parseFloat(targetPosition.x), parseFloat(targetPosition.y), parseFloat(targetPosition.z)),
+            new BABYLON.Vector3(parseFloat(thisClass.moveCoordinate.x), parseFloat(thisClass.moveCoordinate.y), parseFloat(thisClass.moveCoordinate.z))
+        );
+
+        // console.log(
+        //     "拖拽后的距离", thisVector3distanceTo
+        // );
+
+        if (thisVector3distanceTo <= 0.5) {
+            return true;
+        }
+        return false;
+
+    }
+
+    /**
+     * 鼠标弹起的时候
+     * 根据点击到的物体,和当前的流程,触发对应的逻辑
+     * pickResult       点击的具体坐标,物体等信息
+     */
+    main = (pickResult) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        
+        console.log("typeClick 111111", QingXiCheAndQvCarEvent.find().eventName, QingXiCheAndQvCarEvent.find().eventEnd);
+
+        if (QingXiCheAndQvCarEvent.find().eventEnd != 0) {
+            return this;
+        }
+        
+        console.log("typeClick 222222", QingXiCheAndQvCarEvent.find().eventName, QingXiCheAndQvCarEvent.find().eventEnd);
+
+        var objMesh = pickResult.pickedMesh;
+        var objPosition = pickResult.pickedPoint;
+        // 获取点击对象的方向【 一定要加上 true,否则载入的获取模型的方向,会有问题 】
+        // eslint-disable-next-line no-unused-vars
+        var getNormal = pickResult.getNormal(true);
+        
+        let type = QingXiCheAndQvCarEvent.find().eventName;
+        
+        let dragBool = thisClass.dragBool();
+
+        switch(type) {
+            
+            // 仿真模拟
+            case '仿真模拟':
+                
+                break;
+                
+            // 打开车门进入驾驶室
+            case '打开车门进入驾驶室':
+                
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+
+                    thisClass.openCarMen(function() {
+                        
+                        // 切换视角
+                        objIframeEdit.modelPeopleLook(3);
+                        objIframeEdit.cameraVisualAngleGetListNameGpsTo("侧身进入驾驶室");
+                        objIframeEdit.roleShow(false);
+
+                        let thisTime = new Date().getTime();
+                        // 控制延迟逻辑
+                        ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                            ComVal.find().fpsEventDel(fpsEventAddRet.code);
+                            
+                            QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                            QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                            QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                            
+                        });
+                        
+                    });
+                    
+                }
+
+                break;
+
+            // 确认手刹已拉起档位是P档然后发动车辆
+            case '确认手刹已拉起档位是P档然后发动车辆':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("拧动钥匙发动车辆");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+                        thisClass.openYaoShi(function() {
+
+                            QingXiCheAndQvCarEvent.find().carOpen(true);
+
+                            // 切换视角
+                            objIframeEdit.modelPeopleLook(3);
+                            objIframeEdit.cameraVisualAngleGetListNameGpsTo("拧动钥匙发动车辆向上");
+                            objIframeEdit.roleShow(false);
+
+                            thisTime = new Date().getTime();
+                            // 控制延迟逻辑
+                            ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                                ComVal.find().fpsEventDel(fpsEventAddRet.code);
+                                
+                                QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                                QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                                QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+
+                            });
+
+                        });
+                        
+                    });
+                    
+                }
+                break;
+
+
+
+            // 打开车辆双闪同时开启工作双闪灯
+            case '打开车辆双闪同时开启工作双闪灯':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    QingXiCheAndQvCarEvent.find().carShuangShanOpen(true);
+
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("打开工作双闪箭头灯");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+                        
+                        QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                        QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                        QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                        
+                    });
+                    
+                    
+                }
+
+                break;
+
+            // 踩下车辆离合器5秒
+            case '踩下车辆离合器5秒':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    thisClass.openCaiLiHe(function() {
+
+                        WindowEvent.find().WindowCountdownOpen(5, "自定义返回数据", function(WindowCountdownOpenRes) {
+                            QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                            QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                            QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                        });
+                        
+                    });
+                    
+                }
+                break;
+
+            // 按下取力器开关
+            case '按下取力器开关':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("观察仪表盘指示目视");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+                        
+                        QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                        QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                        QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                        
+                    });
+                    
+                }
+
+                break;
+
+            // 缓慢抬起离合器
+            case '缓慢抬起离合器':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("抬起离合器踏板2");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+                        thisClass.openCaiLiHeTaiQi(function() {
+                            
+                            QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                            QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                            QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                            
+                        });
+                        
+                    });
+                    
+                }
+                
+                break;
+
+            // 下车确定安全灯显示是否正常
+            case '下车确定安全灯显示是否正常':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+
+                    thisClass.closeCarMen(function() {
+                        
+                        // 切换视角
+                        objIframeEdit.modelPeopleLook(3);
+                        objIframeEdit.cameraVisualAngleGetListNameGpsTo("下车观察各项灯光");
+                        objIframeEdit.roleShow(false);
+
+                        let thisTime = new Date().getTime();
+                        // 控制延迟逻辑
+                        ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                            ComVal.find().fpsEventDel(fpsEventAddRet.code);
+                            
+                            QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                            QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                            QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                            
+                        });
+
+                    });
+                    
+                }
+
+                break;
+
+            // 在施工范围放置警示标识
+            case '在施工范围放置警示标识':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("在施工范围放置警示标识2");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+                        QingXiCheAndQvComClipPlaneMeshEvent.find().anQuanZhuangLookYes(function() {
+
+                            QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                            QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                            QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                            
+                        });
+                        
+                    });
+                    
+                }
+
+                break;
+
+            // 从水管固定座上拧下高压水管
+            case '从水管固定座上拧下高压水管':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("从水管固定座上拧下高压水管2");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+                        QingXiCheAndQvComClipPlaneMeshEvent.find().jieKaiLookYes(function() {
+
+                            QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                            QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                            QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                            
+                        });
+                        
+                    });
+                    
+                }
+
+                break;
+
+            // 调整卷筒器到合适位置
+            case '调整卷筒器到合适位置':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("调整卷筒器到合适位置2");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+                        thisClass.tiaoZhengJuanPan(function() {
+
+                            QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                            QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                            QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                            
+                        });
+                        
+                    });
+                    
+                }
+
+                break;
+
+            // 取出高压水管并放入布管器内
+            case '取出高压水管并放入布管器内':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("取出高压水管并放入布管器内2");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+                        QingXiCheAndQvComClipPlaneMeshEvent.find().zhuanDaoWeiLookYes(function() {
+
+                            QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                            QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                            QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                            
+                        });
+                        
+                    });
+                    
+                }
+                
+                break;
+
+            // 套上高压水管护管器
+            case '套上高压水管护管器':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("套上高压水管护管器2");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+                        thisClass.taoShangGaoYaShuiGuan_1(function() {
+
+                            QingXiCheAndQvComClipPlaneMeshEvent.find().ruanGuanLookYes_1(function() {
+                                
+                                QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                                QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                                QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                                
+                            });
+
+                        });
+                        
+                    });
+                    
+                }
+
+                break;
+
+            // 安装合适的高压喷头
+            case '安装合适的高压喷头':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("安装合适的高压喷头2");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+                        
+                        thisClass.gaoYaPengTouXiangZiDaKai(function() {
+
+                            thisClass.gaoYaPengTou_1(function() {
+
+                                QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                                QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                                QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+
+                            });
+                            
+                        });
+                        
+                        
+                    });
+                    
+                }
+                
+                break;
+
+            // 将高压水管放入待施工的管道内
+            case '将高压水管放入待施工的管道内':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("将高压水管放入待施工的管道内2");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+                        
+                        thisClass.taoShangGaoYaShuiGuan_2(function() {
+                            
+                        });
+
+                        thisClass.gaoYaPengTou_2(function() {
+                            
+                        });
+
+                        QingXiCheAndQvComClipPlaneMeshEvent.find().ruanGuanLookYes_2(function() {
+
+                            QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                            QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                            QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                            
+                        });
+                        
+                    });
+                    
+                }
+
+                break;
+
+            // 在触屏操作面板上将管长清零
+            case '在触屏操作面板上将管长清零':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("在触屏操作面板上将管长清零2");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+                        
+                        QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                        QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                        QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                        
+                    });
+                    
+                }
+                
+                break;
+
+            // 在安全的情况开启冲水开关
+            case '在安全的情况开启冲水开关':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("在安全的情况开启冲水开关2");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+                        
+                        QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                        QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                        QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                        
+                    });
+                    
+                }
+
+                break;
+                
+            // 根据现场工况调节冲水压力
+            case '根据现场工况调节冲水压力':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("根据现场工况调节冲水压力2");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+                        QingXiCheAndQvCarEvent.find().waterEvent(true);
+                        
+                        QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                        QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                        QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                        
+                    });
+                    
+                }
+
+                break;
+
+            // 疏通管道后减小油门到初始状态
+            case '疏通管道后减小油门到初始状态':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("疏通管道后减小油门到初始状态2");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+                        QingXiCheAndQvCarEvent.find().waterEvent(false);
+                        
+                        QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                        QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                        QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                        
+                    });
+                    
+                }
+
+                break;
+
+            // 带压收回高压水管
+            case '带压收回高压水管':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("带压收回高压水管2");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+                        
+                        QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                        QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                        QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                        
+                    });
+                    
+                }
+
+
+                break;
+
+            // 至触摸屏关闭冲水开关
+            case '至触摸屏关闭冲水开关':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("至触摸屏关闭冲水开关2");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+                        
+                        QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                        QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                        QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                        
+                    });
+                    
+                }
+
+                
+                break;
+            
+            // 缓慢收回高压水管
+            case '缓慢收回高压水管':
+                
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("缓慢收回高压水管2");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+                        
+                        thisClass.taoShangGaoYaShuiGuan_3(function() {
+                            
+                        });
+
+                        thisClass.gaoYaPengTou_3(function() {
+                            
+                        });
+
+                        QingXiCheAndQvComClipPlaneMeshEvent.find().ruanGuanLookYes_3(function() {
+
+                            QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                            QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                            QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                            
+                        });
+                        
+                    });
+                    
+                }
+                
+                break;
+
+            // 拆卸高压喷头放入喷头机箱内
+            case '拆卸高压喷头放入喷头机箱内':
+                
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("拆卸高压喷头放入喷头机箱内2");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+                        
+                        thisClass.gaoYaPengTou_4(function() {
+
+                            thisClass.gaoYaPengTouXiangZiDaKai_2(function() {
+
+                                QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                                QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                                QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+
+                            });
+                            
+                        });
+                        
+                        
+                    });
+                    
+                }
+
+                break;
+            
+            // 收起高压水管将卷筒恢复到初始状态
+            case '收起高压水管将卷筒恢复到初始状态':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("收起高压水管将卷筒恢复到初始状态2");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+                        QingXiCheAndQvComClipPlaneMeshEvent.find().ruanGuanLookYes_4(function() {
+
+                            thisClass.taoShangGaoYaShuiGuan_4(function() {
+
+                                QingXiCheAndQvComClipPlaneMeshEvent.find().zhuanDaoWeiLookYes_2(function() {
+
+                                    thisClass.tiaoZhengJuanPan_2(function() {
+
+                                        QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                                        QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                                        QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+
+                                    });
+
+                                });
+                                
+                            });
+
+                        });
+                        
+                    });
+                    
+                }
+
+                break;
+
+            // 将高压水管拧到水管固定座
+            case '将高压水管拧到水管固定座':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("将高压水管拧到水管固定座2");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+                        QingXiCheAndQvComClipPlaneMeshEvent.find().jieKaiLookYes_2(function() {
+
+                            QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                            QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                            QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                            
+                        });
+                        
+                    });
+                    
+                }
+
+                break;
+            
+            // 回到驾驶室踩下车辆离合器5秒
+            case '回到驾驶室踩下车辆离合器5秒':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    thisClass.openCaiLiHe(function() {
+
+                        WindowEvent.find().WindowCountdownOpen(5, "自定义返回数据", function(WindowCountdownOpenRes) {
+                            QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                            QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                            QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                        });
+                        
+                    });
+                    
+                }
+                break;
+
+            // 关闭取力器开关
+            case '关闭取力器开关':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("观察仪表盘指示目视");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+                        
+                        QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                        QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                        QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                        
+                    });
+                    
+                }
+
+                break;
+
+            // 关闭车辆双闪和工作双闪箭头灯
+            case '关闭车辆双闪和工作双闪箭头灯':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    QingXiCheAndQvCarEvent.find().carShuangShanOpen(false);
+
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("打开工作双闪箭头灯");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+                        
+                        QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                        QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                        QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                        
+                    });
+                    
+                    
+                }
+
+                break;
+
+            // 车辆正常熄火
+            case '车辆正常熄火':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    QingXiCheAndQvCarEvent.find().meshVisibility("all", false);
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("拧动钥匙发动车辆");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+                        thisClass.openYaoShi_2(function() {
+
+                            QingXiCheAndQvCarEvent.find().carOpen(false);
+
+                            // 切换视角
+                            objIframeEdit.modelPeopleLook(3);
+                            objIframeEdit.cameraVisualAngleGetListNameGpsTo("拧动钥匙发动车辆向上");
+                            objIframeEdit.roleShow(false);
+
+                            thisTime = new Date().getTime();
+                            // 控制延迟逻辑
+                            ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                                ComVal.find().fpsEventDel(fpsEventAddRet.code);
+                                
+                                QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                                QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                                QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+
+                            });
+
+                        });
+                        
+                    });
+                    
+                }
+
+                break;
+
+            // // 
+            // case '':
+
+            //     break;
+
+            // // 
+            // case '':
+
+            //     break;
+
+            // 已完成所有任务
+            case 'equipmentRepositioningWork':
+    
+            break;
+
+            // 数字修复虚拟仿真-将阀门关闭停止水流
+            case '数字修复虚拟仿真-将阀门关闭停止水流':
+
+                if (thisClass.meshListBool(type, objMesh.id) == true) {
+
+                    // 切换成正在处理中
+                    QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("关闭阀门完成");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+                        // 停止水流
+                        QingXiCheAndQvCarEvent.find().waterGuanEvent(false);
+                        
+                        QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                        QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                        QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+                        
+                    });
+                    
+                }
+                break;
+
+            // 数字修复虚拟仿真-将橡胶垫片放置到正确的位置
+            case '数字修复虚拟仿真-将橡胶垫片放置到正确的位置':
+                
+                // 切换成正在处理中
+                QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                // 范围内
+                if (dragBool == true) {
+                    
+                    // 回到原始位置
+                    thisClass.moveMeshListResetPosition();
+
+                    WindowEvent.find().WindowTxtViewOpenEvent(
+                        // "现在播放橡胶垫片安装过程\n"
+                        // + 
+                        "各类机械设备的法兰连接、轴承密封、泵体密封等部位都需要使用橡胶垫片,以保证设备的正常运行,防止润滑油、液压油等泄漏"
+                    );
+
+                    // WindowEvent.find().WindowVideoViewOpenEvent(
+                    //     QingXiCheAndQvCarEvent.find().videoJson["02"],
+                    //     { "自定义回调的字段" : "自定义回调的字段111" },
+                    //     function(WindowVideoViewOpenEventRes) {
+                    //         console.log(
+                    //             "WindowVideoViewOpenEventRes", WindowVideoViewOpenEventRes
+                    //         );
+                    //     }
+                    // );
+
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("将橡胶垫片放置到正确的位置_完成");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+                        thisClass.xiangJiaoDianPianOk(function() {
+                            
+                            QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                            QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                            QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+    
+                        });
+
+                    });
+                    
+                } else {
+
+                    // 回到原始位置
+                    thisClass.moveMeshListResetPosition();
+                    // 范围外
+                    QingXiCheAndQvCarEvent.find().eventEnd = 0;
+
+                }
+                
+                break;
+
+
+            // 数字修复虚拟仿真-将抱箍放置到正确的位置
+            case '数字修复虚拟仿真-将抱箍放置到正确的位置':
+
+                // 切换成正在处理中
+                QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                
+                // 范围内
+                if (dragBool == true) {
+
+                    // 回到原始位置
+                    thisClass.moveMeshListResetPosition();
+
+                    WindowEvent.find().WindowTxtViewOpenEvent(
+                        // "现在播放橡抱箍安装过程\n"
+                        // + 
+                        "抱箍是一种用于抱住或箍住其他材料的紧固件,通过将两个或多个部件紧紧固定在一起,起到连接、支撑或加固的作用."
+                        + "通常由箍板、翼板、拉结筋板、螺栓及内衬垫构成。其中,箍板是主要的抱紧部件,翼板用于增加连接面积或提供额外的支撑点,拉结筋板则增强箍板的强度和稳定性,螺栓用于将抱箍紧固,内衬垫则可增加摩擦力或保护被箍物体的表面"
+                    );
+                    
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("将抱箍放置到正确的位置_完成");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+                        thisClass.baoGuOk(function() {
+                            
+                            QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                            QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                            QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+    
+                        });
+
+                    });
+                    
+                } else {
+
+                    // 回到原始位置
+                    thisClass.moveMeshListResetPosition();
+                    // 范围外
+                    QingXiCheAndQvCarEvent.find().eventEnd = 0;
+
+                }
+
+                break;
+
+            // 数字修复虚拟仿真-将插销安装到正确的位置
+            case '数字修复虚拟仿真-将插销安装到正确的位置':
+
+                // 切换成正在处理中
+                QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                    
+                // 范围内
+                if (dragBool == true) {
+
+                    // 回到原始位置
+                    thisClass.moveMeshListResetPosition();
+
+                    WindowEvent.find().WindowTxtViewOpenEvent(
+                        // "现在播放插销安装过程\n"
+                        // + 
+                        "通过将销杆插入对应的销孔中,实现物体之间的连接或锁定。利用销杆与销孔之间的配合精度和摩擦力,保持连接的稳定性。带有锁止机构的插销,通过特定的操作(如旋转、按压等)使锁止部件卡住销杆,防止其意外拔出,增强锁定效果。"
+                    );
+
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("将插销安装到正确的位置_完成");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+                        thisClass.chaXiaoOk(function() {
+                            
+                            QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                            QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                            QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+
+                        });
+
+                    });
+                    
+                } else {
+
+                    // 回到原始位置
+                    thisClass.moveMeshListResetPosition();
+                    // 范围外
+                    QingXiCheAndQvCarEvent.find().eventEnd = 0;
+
+                }
+
+                break;
+
+            // 数字修复虚拟仿真-将螺丝安装到正确的位置
+            case '数字修复虚拟仿真-将螺丝安装到正确的位置':
+
+                // 切换成正在处理中
+                QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                        
+                // 范围内
+                if (dragBool == true) {
+
+                    // 回到原始位置
+                    thisClass.moveMeshListResetPosition();
+
+                    WindowEvent.find().WindowTxtViewOpenEvent(
+                        // "现在播放螺丝安装过程\n"
+                        // + 
+                        "螺丝通常由头部和螺纹杆两部分组成。头部有不同的形状,如圆形、方形、六角形等,以便使用相应的工具进行拧紧或松开操作。螺纹杆上有螺旋状的螺纹,用于与螺母或带有内螺纹的部件配合。"
+                    );
+
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("将螺丝安装到正确的位置_完成");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+                        thisClass.luoSiOk(function() {
+                            
+                            QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                            QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                            QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+
+                        });
+
+                    });
+                    
+                } else {
+
+                    // 回到原始位置
+                    thisClass.moveMeshListResetPosition();
+                    // 范围外
+                    QingXiCheAndQvCarEvent.find().eventEnd = 0;
+
+                }
+
+                break;
+
+            // 数字修复虚拟仿真-用扳手将螺丝旋紧螺丝
+            case '数字修复虚拟仿真-用扳手将螺丝旋紧螺丝':
+                
+                // 切换成正在处理中
+                QingXiCheAndQvCarEvent.find().eventEnd = 1;
+                            
+                // 范围内
+                if (dragBool == true) {
+
+                    // 回到原始位置
+                    thisClass.moveMeshListResetPosition();
+
+                    WindowEvent.find().WindowTxtViewOpenEvent(
+                        // "现在播放扳手使用过程\n"
+                        // + 
+                        "扳手通常由头部和手柄两部分组成。头部是与螺栓或螺母接触并施加扭矩的部分,根据不同的类型有各种形状和结构;手柄则用于握持和施加力,一般为杆状,以提供足够的杠杆作用。"
+                    );
+
+                    // 切换视角
+                    objIframeEdit.modelPeopleLook(3);
+                    objIframeEdit.cameraVisualAngleGetListNameGpsTo("用扳手将螺丝旋紧螺丝_完成");
+                    objIframeEdit.roleShow(false);
+
+                    let thisTime = new Date().getTime();
+                    // 控制延迟逻辑
+                    ComVal.find().fpsEventAdd("type_click_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+                        ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+                        thisClass.banShouOk(function() {
+                            
+                            QingXiCheAndQvCarEvent.find().eventEnd = 2;
+                            QingXiCheAndQvCarEvent.find().tipsBtnsUpOpenEventCallbackMain(false);
+                            QingXiCheAndQvCarEvent.find().tipsBtnsDownOpenEventCallbackMain(true);
+
+                        });
+
+                    });
+                    
+                } else {
+
+                    // 回到原始位置
+                    thisClass.moveMeshListResetPosition();
+                    // 范围外
+                    QingXiCheAndQvCarEvent.find().eventEnd = 0;
+
+                }
+                
+                break;
+
+            // // 
+            // case '':
+
+            //     break;
+
+            // // 
+            // case '':
+
+            //     break;
+
+                
+            default:
+                
+                break;
+                
+        }
+
+        // 上面执行完成,固定执行如下逻辑
+        thisClass.moveMeshListReset();
+        
+    }
+    
+    /**
+     * 根据物体id 和 类型,判断是否在物体列表中
+     * type             类型
+     * meshId           目标物体id
+     */
+    meshListBool = (type, meshId) => {
+
+        if (typeof type != 'string' || typeof meshId != 'string') {
+            return this;
+        }
+        
+        let json = {
+            
+            "打开车门进入驾驶室" : {
+                "exhibition_html_1746603426219_hua_" : "exhibition_html_1746603426219_hua_",
+                "model_1746598895147左门_primitive0" : "model_1746598895147左门_primitive0",
+                "model_1746598895147左门_primitive1" : "model_1746598895147左门_primitive1",
+                "model_1746598895147左门_primitive2" : "model_1746598895147左门_primitive2",
+                "model_1746598895147左门_primitive3" : "model_1746598895147左门_primitive3",
+                "model_1746598895147左门_primitive4" : "model_1746598895147左门_primitive4",
+                "model_1746598895147左门_primitive5" : "model_1746598895147左门_primitive5",
+                "model_1746598895147右门_primitive0" : "model_1746598895147右门_primitive0",
+                "model_1746598895147右门_primitive1" : "model_1746598895147右门_primitive1",
+                "model_1746598895147右门_primitive2" : "model_1746598895147右门_primitive2",
+                "model_1746598895147右门_primitive3" : "model_1746598895147右门_primitive3",
+                "model_1746598895147右门_primitive4" : "model_1746598895147右门_primitive4",
+                "model_1746598895147右门_primitive5" : "model_1746598895147右门_primitive5",
+            },
+            "确认手刹已拉起档位是P档然后发动车辆" : {
+                "exhibition_html_1746604047427_hua_" : "exhibition_html_1746604047427_hua_",
+                "exhibition_html_1746604199620_hua_" : "exhibition_html_1746604199620_hua_",
+                "model_1746598895147控制台_primitive5" : "model_1746598895147控制台_primitive5",
+                "model_1746598895147驾驶室底座_primitive1" : "model_1746598895147驾驶室底座_primitive1",
+                "model_1746598895147驾驶室底座_primitive2" : "model_1746598895147驾驶室底座_primitive2",
+                "model_1746598895147钥匙_primitive0" : "model_1746598895147钥匙_primitive0",
+                "model_1746598895147钥匙_primitive1" : "model_1746598895147钥匙_primitive1",
+                "model_1746598895147控制台_primitive6" : "model_1746598895147控制台_primitive6",
+            },
+            "打开车辆双闪同时开启工作双闪灯" : {
+                "exhibition_html_1746604108744_hua_" : "exhibition_html_1746604108744_hua_",
+                "exhibition_html_1746604171611_hua_" : "exhibition_html_1746604171611_hua_",
+                "model_1746598895147控制台_primitive1" : "model_1746598895147控制台_primitive1",
+                "model_1746598895147控制台_primitive8" : "model_1746598895147控制台_primitive8",
+                "model_1746598895147控制台_primitive7" : "model_1746598895147控制台_primitive7",
+            },
+            "踩下车辆离合器5秒" : {
+                "exhibition_html_1746604263314_hua_" : "exhibition_html_1746604263314_hua_",
+                "model_1746598895147离合" : "model_1746598895147离合",
+                "model_1746598895147左门_primitive0" : "model_1746598895147左门_primitive0",
+                "model_1746598895147左门_primitive1" : "model_1746598895147左门_primitive1",
+                "model_1746598895147左门_primitive2" : "model_1746598895147左门_primitive2",
+                "model_1746598895147左门_primitive3" : "model_1746598895147左门_primitive3",
+                "model_1746598895147左门_primitive4" : "model_1746598895147左门_primitive4",
+                "model_1746598895147左门_primitive5" : "model_1746598895147左门_primitive5",
+            },
+            "按下取力器开关" : {
+                "exhibition_html_1746604047427_hua_" : "exhibition_html_1746604047427_hua_",
+                "model_1746598895147控制台_primitive5" : "model_1746598895147控制台_primitive5",
+            },
+            "数字修复虚拟仿真-将阀门关闭停止水流" : {
+                "model_1746598895146阀门_primitive0" : "model_1746598895146阀门_primitive0",
+                "model_1746598895146阀门_primitive1" : "model_1746598895146阀门_primitive1",
+            },
+            "缓慢抬起离合器" : {
+                "exhibition_html_1746604263314_hua_" : "exhibition_html_1746604263314_hua_",
+                "model_1746598895147离合" : "model_1746598895147离合",
+                "model_1746598895147左门_primitive0" : "model_1746598895147左门_primitive0",
+                "model_1746598895147左门_primitive1" : "model_1746598895147左门_primitive1",
+                "model_1746598895147左门_primitive2" : "model_1746598895147左门_primitive2",
+                "model_1746598895147左门_primitive3" : "model_1746598895147左门_primitive3",
+                "model_1746598895147左门_primitive4" : "model_1746598895147左门_primitive4",
+                "model_1746598895147左门_primitive5" : "model_1746598895147左门_primitive5",
+            },
+            "下车确定安全灯显示是否正常" : {
+                "model_1746598895147离合" : "model_1746598895147离合",
+                "model_1746598895147左门_primitive0" : "model_1746598895147左门_primitive0",
+                "model_1746598895147左门_primitive1" : "model_1746598895147左门_primitive1",
+                "model_1746598895147左门_primitive2" : "model_1746598895147左门_primitive2",
+                "model_1746598895147左门_primitive3" : "model_1746598895147左门_primitive3",
+                "model_1746598895147左门_primitive4" : "model_1746598895147左门_primitive4",
+                "model_1746598895147左门_primitive5" : "model_1746598895147左门_primitive5",
+                "model_1746598895147车架_primitive3" : "model_1746598895147车架_primitive3",
+                "model_1746598860388地面_primitive1" : "model_1746598860388地面_primitive1",
+            },
+            "在施工范围放置警示标识" : {
+                "model_1746598860388地面_primitive1" : "model_1746598860388地面_primitive1",
+            },
+            "从水管固定座上拧下高压水管" : {
+                "exhibition_html_1746603894815_hua_" : "exhibition_html_1746603894815_hua_",
+                "model_1746598895151转到位_primitive0" : "model_1746598895151转到位_primitive0",
+                "model_1746598895151转到位_primitive1" : "model_1746598895151转到位_primitive1",
+                "model_1746598895147大卷盘_primitive0" : "model_1746598895147大卷盘_primitive0",
+                "model_1746598895147大卷盘_primitive1" : "model_1746598895147大卷盘_primitive1",
+                "model_1746598895147大卷盘_primitive2" : "model_1746598895147大卷盘_primitive2",
+                "model_1746598895147大卷盘_primitive3" : "model_1746598895147大卷盘_primitive3",
+                "model_1746598895147大卷盘_primitive4" : "model_1746598895147大卷盘_primitive4",
+                "model_1746598895147大卷盘_primitive5" : "model_1746598895147大卷盘_primitive5",
+                "model_1746598895147大卷盘_primitive6" : "model_1746598895147大卷盘_primitive6",
+                "model_1746598895147大卷盘_primitive7" : "model_1746598895147大卷盘_primitive7",
+                "model_1746598895147大卷盘_primitive8" : "model_1746598895147大卷盘_primitive8",
+                "model_1746598895147大卷盘_primitive9" : "model_1746598895147大卷盘_primitive9",
+                "model_1746598895147大卷盘_primitive10" : "model_1746598895147大卷盘_primitive10",
+                "model_1746598895147大卷盘_primitive11" : "model_1746598895147大卷盘_primitive11",
+            },
+            "调整卷筒器到合适位置" : {
+
+                "exhibition_html_1746603846735_hua_" : "exhibition_html_1746603846735_hua_",
+                "model_1746598895147大卷盘开关盖板_primitive0" : "model_1746598895147大卷盘开关盖板_primitive0",
+                "model_1746598895147大卷盘开关盖板_primitive1" : "model_1746598895147大卷盘开关盖板_primitive1",
+                "model_1746598895147大卷盘_primitive0" : "model_1746598895147大卷盘_primitive0",
+                "model_1746598895147大卷盘_primitive1" : "model_1746598895147大卷盘_primitive1",
+                "model_1746598895147大卷盘_primitive2" : "model_1746598895147大卷盘_primitive2",
+                "model_1746598895147大卷盘_primitive3" : "model_1746598895147大卷盘_primitive3",
+                "model_1746598895147大卷盘_primitive4" : "model_1746598895147大卷盘_primitive4",
+                "model_1746598895147大卷盘_primitive5" : "model_1746598895147大卷盘_primitive5",
+                "model_1746598895147大卷盘_primitive6" : "model_1746598895147大卷盘_primitive6",
+                "model_1746598895147大卷盘_primitive7" : "model_1746598895147大卷盘_primitive7",
+                "model_1746598895147大卷盘_primitive8" : "model_1746598895147大卷盘_primitive8",
+                "model_1746598895147大卷盘_primitive9" : "model_1746598895147大卷盘_primitive9",
+                "model_1746598895147大卷盘_primitive10" : "model_1746598895147大卷盘_primitive10",
+                "model_1746598895147大卷盘_primitive11" : "model_1746598895147大卷盘_primitive11",
+
+            },
+            "取出高压水管并放入布管器内" : {
+
+                "exhibition_html_1746603926412_hua_" : "exhibition_html_1746603926412_hua_",
+                "model_1746598895147大卷盘开关盖板_primitive0" : "model_1746598895147大卷盘开关盖板_primitive0",
+                "model_1746598895147大卷盘开关盖板_primitive1" : "model_1746598895147大卷盘开关盖板_primitive1",
+                "model_1746598895147大卷盘_primitive0" : "model_1746598895147大卷盘_primitive0",
+                "model_1746598895147大卷盘_primitive1" : "model_1746598895147大卷盘_primitive1",
+                "model_1746598895147大卷盘_primitive2" : "model_1746598895147大卷盘_primitive2",
+                "model_1746598895147大卷盘_primitive3" : "model_1746598895147大卷盘_primitive3",
+                "model_1746598895147大卷盘_primitive4" : "model_1746598895147大卷盘_primitive4",
+                "model_1746598895147大卷盘_primitive5" : "model_1746598895147大卷盘_primitive5",
+                "model_1746598895147大卷盘_primitive6" : "model_1746598895147大卷盘_primitive6",
+                "model_1746598895147大卷盘_primitive7" : "model_1746598895147大卷盘_primitive7",
+                "model_1746598895147大卷盘_primitive8" : "model_1746598895147大卷盘_primitive8",
+                "model_1746598895147大卷盘_primitive9" : "model_1746598895147大卷盘_primitive9",
+                "model_1746598895147大卷盘_primitive10" : "model_1746598895147大卷盘_primitive10",
+                "model_1746598895147大卷盘_primitive11" : "model_1746598895147大卷盘_primitive11",
+
+            },
+            "套上高压水管护管器" : {
+                "model_1746598895147波纹管_primitive0" : "model_1746598895147波纹管_primitive0",
+                "model_1746598895147波纹管_primitive1" : "model_1746598895147波纹管_primitive1",
+            },
+            "安装合适的高压喷头" : {
+                "model_1746598895147相机箱盖001_primitive0" : "model_1746598895147相机箱盖001_primitive0",
+                "model_1746598895147相机箱盖001_primitive1" : "model_1746598895147相机箱盖001_primitive1",
+                "model_1746598895147相机箱盖001_primitive2" : "model_1746598895147相机箱盖001_primitive2",
+                "model_1746598895147相机箱001_primitive0" : "model_1746598895147相机箱001_primitive0",
+                "model_1746598895147相机箱001_primitive1" : "model_1746598895147相机箱001_primitive1",
+                "model_1746598895147相机箱001_primitive2" : "model_1746598895147相机箱001_primitive2",
+            },
+            "将高压水管放入待施工的管道内" : {
+                "model_1746598895147波纹管_primitive0" : "model_1746598895147波纹管_primitive0",
+                "model_1746598895147波纹管_primitive1" : "model_1746598895147波纹管_primitive1",
+                "model_1746598895147喷头001" : "model_1746598895147喷头001",
+                "model_1746598895147喷头002" : "model_1746598895147喷头002",
+                "model_1746598895147喷头003" : "model_1746598895147喷头003",
+                "model_1746598895147喷头004" : "model_1746598895147喷头004",
+                "model_1746598895147水泥管" : "model_1746598895147水泥管",
+                "model_1746598895149软管" : "model_1746598895149软管",
+                "model_1746598895147相机箱001_primitive0" : "model_1746598895147相机箱001_primitive0",
+                "model_1746598895147相机箱001_primitive1" : "model_1746598895147相机箱001_primitive1",
+                "model_1746598895147相机箱001_primitive2" : "model_1746598895147相机箱001_primitive2",
+            },
+            "在触屏操作面板上将管长清零" : {
+                "model_1746598895147大卷盘开关盖板_primitive0" : "model_1746598895147大卷盘开关盖板_primitive0",
+                "model_1746598895147大卷盘开关盖板_primitive1" : "model_1746598895147大卷盘开关盖板_primitive1",
+                "model_1746598895147大卷盘_primitive0" : "model_1746598895147大卷盘_primitive0",
+                "model_1746598895147大卷盘_primitive1" : "model_1746598895147大卷盘_primitive1",
+                "model_1746598895147大卷盘_primitive2" : "model_1746598895147大卷盘_primitive2",
+                "model_1746598895147大卷盘_primitive3" : "model_1746598895147大卷盘_primitive3",
+                "model_1746598895147大卷盘_primitive4" : "model_1746598895147大卷盘_primitive4",
+                "model_1746598895147大卷盘_primitive5" : "model_1746598895147大卷盘_primitive5",
+                "model_1746598895147大卷盘_primitive6" : "model_1746598895147大卷盘_primitive6",
+                "model_1746598895147大卷盘_primitive7" : "model_1746598895147大卷盘_primitive7",
+                "model_1746598895147大卷盘_primitive8" : "model_1746598895147大卷盘_primitive8",
+                "model_1746598895147大卷盘_primitive9" : "model_1746598895147大卷盘_primitive9",
+                "model_1746598895147大卷盘_primitive10" : "model_1746598895147大卷盘_primitive10",
+                "model_1746598895147大卷盘_primitive11" : "model_1746598895147大卷盘_primitive11",
+                "model_1746598895147车厢_primitive0" : "model_1746598895147车厢_primitive0",
+                "model_1746598895147车厢_primitive1" : "model_1746598895147车厢_primitive1",
+                "model_1746598895147车厢_primitive2" : "model_1746598895147车厢_primitive2",
+                "model_1746598895147车厢_primitive3" : "model_1746598895147车厢_primitive3",
+                "model_1746598895147车厢_primitive4" : "model_1746598895147车厢_primitive4",
+                "model_1746598895147车厢_primitive5" : "model_1746598895147车厢_primitive5",
+            },
+            "在安全的情况开启冲水开关" : {
+                "model_1746598895147大卷盘开关盖板_primitive0" : "model_1746598895147大卷盘开关盖板_primitive0",
+                "model_1746598895147大卷盘开关盖板_primitive1" : "model_1746598895147大卷盘开关盖板_primitive1",
+                "model_1746598895147大卷盘_primitive0" : "model_1746598895147大卷盘_primitive0",
+                "model_1746598895147大卷盘_primitive1" : "model_1746598895147大卷盘_primitive1",
+                "model_1746598895147大卷盘_primitive2" : "model_1746598895147大卷盘_primitive2",
+                "model_1746598895147大卷盘_primitive3" : "model_1746598895147大卷盘_primitive3",
+                "model_1746598895147大卷盘_primitive4" : "model_1746598895147大卷盘_primitive4",
+                "model_1746598895147大卷盘_primitive5" : "model_1746598895147大卷盘_primitive5",
+                "model_1746598895147大卷盘_primitive6" : "model_1746598895147大卷盘_primitive6",
+                "model_1746598895147大卷盘_primitive7" : "model_1746598895147大卷盘_primitive7",
+                "model_1746598895147大卷盘_primitive8" : "model_1746598895147大卷盘_primitive8",
+                "model_1746598895147大卷盘_primitive9" : "model_1746598895147大卷盘_primitive9",
+                "model_1746598895147大卷盘_primitive10" : "model_1746598895147大卷盘_primitive10",
+                "model_1746598895147大卷盘_primitive11" : "model_1746598895147大卷盘_primitive11",
+                "model_1746598895147车厢_primitive0" : "model_1746598895147车厢_primitive0",
+                "model_1746598895147车厢_primitive1" : "model_1746598895147车厢_primitive1",
+                "model_1746598895147车厢_primitive2" : "model_1746598895147车厢_primitive2",
+                "model_1746598895147车厢_primitive3" : "model_1746598895147车厢_primitive3",
+                "model_1746598895147车厢_primitive4" : "model_1746598895147车厢_primitive4",
+                "model_1746598895147车厢_primitive5" : "model_1746598895147车厢_primitive5",
+            },
+            "根据现场工况调节冲水压力" : {
+                "model_1746598895147波纹管_primitive0" : "model_1746598895147波纹管_primitive0",
+                "model_1746598895147波纹管_primitive1" : "model_1746598895147波纹管_primitive1",
+                "model_1746598895147喷头001" : "model_1746598895147喷头001",
+                "model_1746598895147喷头002" : "model_1746598895147喷头002",
+                "model_1746598895147喷头003" : "model_1746598895147喷头003",
+                "model_1746598895147喷头004" : "model_1746598895147喷头004",
+                "model_1746598895147水泥管" : "model_1746598895147水泥管",
+                "model_1746598895149软管" : "model_1746598895149软管",
+            },
+            "疏通管道后减小油门到初始状态" : {
+                "model_1746598895147波纹管_primitive0" : "model_1746598895147波纹管_primitive0",
+                "model_1746598895147波纹管_primitive1" : "model_1746598895147波纹管_primitive1",
+                "model_1746598895147喷头001" : "model_1746598895147喷头001",
+                "model_1746598895147喷头002" : "model_1746598895147喷头002",
+                "model_1746598895147喷头003" : "model_1746598895147喷头003",
+                "model_1746598895147喷头004" : "model_1746598895147喷头004",
+                "model_1746598895147水泥管" : "model_1746598895147水泥管",
+                "model_1746598895149软管" : "model_1746598895149软管",
+                "model_1746598895147大卷盘开关盖板_primitive0" : "model_1746598895147大卷盘开关盖板_primitive0",
+                "model_1746598895147大卷盘开关盖板_primitive1" : "model_1746598895147大卷盘开关盖板_primitive1",
+                "model_1746598895147大卷盘_primitive0" : "model_1746598895147大卷盘_primitive0",
+                "model_1746598895147大卷盘_primitive1" : "model_1746598895147大卷盘_primitive1",
+                "model_1746598895147大卷盘_primitive2" : "model_1746598895147大卷盘_primitive2",
+                "model_1746598895147大卷盘_primitive3" : "model_1746598895147大卷盘_primitive3",
+                "model_1746598895147大卷盘_primitive4" : "model_1746598895147大卷盘_primitive4",
+                "model_1746598895147大卷盘_primitive5" : "model_1746598895147大卷盘_primitive5",
+                "model_1746598895147大卷盘_primitive6" : "model_1746598895147大卷盘_primitive6",
+                "model_1746598895147大卷盘_primitive7" : "model_1746598895147大卷盘_primitive7",
+                "model_1746598895147大卷盘_primitive8" : "model_1746598895147大卷盘_primitive8",
+                "model_1746598895147大卷盘_primitive9" : "model_1746598895147大卷盘_primitive9",
+                "model_1746598895147大卷盘_primitive10" : "model_1746598895147大卷盘_primitive10",
+                "model_1746598895147大卷盘_primitive11" : "model_1746598895147大卷盘_primitive11",
+                "model_1746598895147车厢_primitive0" : "model_1746598895147车厢_primitive0",
+                "model_1746598895147车厢_primitive1" : "model_1746598895147车厢_primitive1",
+                "model_1746598895147车厢_primitive2" : "model_1746598895147车厢_primitive2",
+                "model_1746598895147车厢_primitive3" : "model_1746598895147车厢_primitive3",
+                "model_1746598895147车厢_primitive4" : "model_1746598895147车厢_primitive4",
+                "model_1746598895147车厢_primitive5" : "model_1746598895147车厢_primitive5",
+            },
+            "带压收回高压水管" : {
+                "model_1746598895147大卷盘开关盖板_primitive0" : "model_1746598895147大卷盘开关盖板_primitive0",
+                "model_1746598895147大卷盘开关盖板_primitive1" : "model_1746598895147大卷盘开关盖板_primitive1",
+                "model_1746598895147大卷盘_primitive0" : "model_1746598895147大卷盘_primitive0",
+                "model_1746598895147大卷盘_primitive1" : "model_1746598895147大卷盘_primitive1",
+                "model_1746598895147大卷盘_primitive2" : "model_1746598895147大卷盘_primitive2",
+                "model_1746598895147大卷盘_primitive3" : "model_1746598895147大卷盘_primitive3",
+                "model_1746598895147大卷盘_primitive4" : "model_1746598895147大卷盘_primitive4",
+                "model_1746598895147大卷盘_primitive5" : "model_1746598895147大卷盘_primitive5",
+                "model_1746598895147大卷盘_primitive6" : "model_1746598895147大卷盘_primitive6",
+                "model_1746598895147大卷盘_primitive7" : "model_1746598895147大卷盘_primitive7",
+                "model_1746598895147大卷盘_primitive8" : "model_1746598895147大卷盘_primitive8",
+                "model_1746598895147大卷盘_primitive9" : "model_1746598895147大卷盘_primitive9",
+                "model_1746598895147大卷盘_primitive10" : "model_1746598895147大卷盘_primitive10",
+                "model_1746598895147大卷盘_primitive11" : "model_1746598895147大卷盘_primitive11",
+                "model_1746598895147车厢_primitive0" : "model_1746598895147车厢_primitive0",
+                "model_1746598895147车厢_primitive1" : "model_1746598895147车厢_primitive1",
+                "model_1746598895147车厢_primitive2" : "model_1746598895147车厢_primitive2",
+                "model_1746598895147车厢_primitive3" : "model_1746598895147车厢_primitive3",
+                "model_1746598895147车厢_primitive4" : "model_1746598895147车厢_primitive4",
+                "model_1746598895147车厢_primitive5" : "model_1746598895147车厢_primitive5",
+            },
+            "至触摸屏关闭冲水开关" : {
+                "model_1746598895147大卷盘开关盖板_primitive0" : "model_1746598895147大卷盘开关盖板_primitive0",
+                "model_1746598895147大卷盘开关盖板_primitive1" : "model_1746598895147大卷盘开关盖板_primitive1",
+                "model_1746598895147大卷盘_primitive0" : "model_1746598895147大卷盘_primitive0",
+                "model_1746598895147大卷盘_primitive1" : "model_1746598895147大卷盘_primitive1",
+                "model_1746598895147大卷盘_primitive2" : "model_1746598895147大卷盘_primitive2",
+                "model_1746598895147大卷盘_primitive3" : "model_1746598895147大卷盘_primitive3",
+                "model_1746598895147大卷盘_primitive4" : "model_1746598895147大卷盘_primitive4",
+                "model_1746598895147大卷盘_primitive5" : "model_1746598895147大卷盘_primitive5",
+                "model_1746598895147大卷盘_primitive6" : "model_1746598895147大卷盘_primitive6",
+                "model_1746598895147大卷盘_primitive7" : "model_1746598895147大卷盘_primitive7",
+                "model_1746598895147大卷盘_primitive8" : "model_1746598895147大卷盘_primitive8",
+                "model_1746598895147大卷盘_primitive9" : "model_1746598895147大卷盘_primitive9",
+                "model_1746598895147大卷盘_primitive10" : "model_1746598895147大卷盘_primitive10",
+                "model_1746598895147大卷盘_primitive11" : "model_1746598895147大卷盘_primitive11",
+                "model_1746598895147车厢_primitive0" : "model_1746598895147车厢_primitive0",
+                "model_1746598895147车厢_primitive1" : "model_1746598895147车厢_primitive1",
+                "model_1746598895147车厢_primitive2" : "model_1746598895147车厢_primitive2",
+                "model_1746598895147车厢_primitive3" : "model_1746598895147车厢_primitive3",
+                "model_1746598895147车厢_primitive4" : "model_1746598895147车厢_primitive4",
+                "model_1746598895147车厢_primitive5" : "model_1746598895147车厢_primitive5",
+            },
+            "缓慢收回高压水管" : {
+                "model_1746598895147波纹管_primitive0" : "model_1746598895147波纹管_primitive0",
+                "model_1746598895147波纹管_primitive1" : "model_1746598895147波纹管_primitive1",
+                "model_1746598895147喷头001" : "model_1746598895147喷头001",
+                "model_1746598895147喷头002" : "model_1746598895147喷头002",
+                "model_1746598895147喷头003" : "model_1746598895147喷头003",
+                "model_1746598895147喷头004" : "model_1746598895147喷头004",
+                "model_1746598895147水泥管" : "model_1746598895147水泥管",
+                "model_1746598895149软管" : "model_1746598895149软管",
+            },
+            "拆卸高压喷头放入喷头机箱内" : {
+                "model_1746598895147波纹管_primitive0" : "model_1746598895147波纹管_primitive0",
+                "model_1746598895147波纹管_primitive1" : "model_1746598895147波纹管_primitive1",
+                "model_1746598895147喷头001" : "model_1746598895147喷头001",
+                "model_1746598895147喷头002" : "model_1746598895147喷头002",
+                "model_1746598895147喷头003" : "model_1746598895147喷头003",
+                "model_1746598895147喷头004" : "model_1746598895147喷头004",
+                "model_1746598895147水泥管" : "model_1746598895147水泥管",
+                "model_1746598895149软管" : "model_1746598895149软管",
+                "model_1746598895147相机箱盖001_primitive0" : "model_1746598895147相机箱盖001_primitive0",
+                "model_1746598895147相机箱盖001_primitive1" : "model_1746598895147相机箱盖001_primitive1",
+                "model_1746598895147相机箱盖001_primitive2" : "model_1746598895147相机箱盖001_primitive2",
+                "model_1746598895147相机箱001_primitive0" : "model_1746598895147相机箱001_primitive0",
+                "model_1746598895147相机箱001_primitive1" : "model_1746598895147相机箱001_primitive1",
+                "model_1746598895147相机箱001_primitive2" : "model_1746598895147相机箱001_primitive2",
+            },
+            "收起高压水管将卷筒恢复到初始状态" : {
+                "model_1746598895147波纹管_primitive0" : "model_1746598895147波纹管_primitive0",
+                "model_1746598895147波纹管_primitive1" : "model_1746598895147波纹管_primitive1",
+                "model_1746598895147喷头001" : "model_1746598895147喷头001",
+                "model_1746598895147喷头002" : "model_1746598895147喷头002",
+                "model_1746598895147喷头003" : "model_1746598895147喷头003",
+                "model_1746598895147喷头004" : "model_1746598895147喷头004",
+                "model_1746598895147水泥管" : "model_1746598895147水泥管",
+                "model_1746598895149软管" : "model_1746598895149软管",
+
+                "model_1746598895147大卷盘开关盖板_primitive0" : "model_1746598895147大卷盘开关盖板_primitive0",
+                "model_1746598895147大卷盘开关盖板_primitive1" : "model_1746598895147大卷盘开关盖板_primitive1",
+                "model_1746598895147大卷盘_primitive0" : "model_1746598895147大卷盘_primitive0",
+                "model_1746598895147大卷盘_primitive1" : "model_1746598895147大卷盘_primitive1",
+                "model_1746598895147大卷盘_primitive2" : "model_1746598895147大卷盘_primitive2",
+                "model_1746598895147大卷盘_primitive3" : "model_1746598895147大卷盘_primitive3",
+                "model_1746598895147大卷盘_primitive4" : "model_1746598895147大卷盘_primitive4",
+                "model_1746598895147大卷盘_primitive5" : "model_1746598895147大卷盘_primitive5",
+                "model_1746598895147大卷盘_primitive6" : "model_1746598895147大卷盘_primitive6",
+                "model_1746598895147大卷盘_primitive7" : "model_1746598895147大卷盘_primitive7",
+                "model_1746598895147大卷盘_primitive8" : "model_1746598895147大卷盘_primitive8",
+                "model_1746598895147大卷盘_primitive9" : "model_1746598895147大卷盘_primitive9",
+                "model_1746598895147大卷盘_primitive10" : "model_1746598895147大卷盘_primitive10",
+                "model_1746598895147大卷盘_primitive11" : "model_1746598895147大卷盘_primitive11",
+                "model_1746598895147车厢_primitive0" : "model_1746598895147车厢_primitive0",
+                "model_1746598895147车厢_primitive1" : "model_1746598895147车厢_primitive1",
+                "model_1746598895147车厢_primitive2" : "model_1746598895147车厢_primitive2",
+                "model_1746598895147车厢_primitive3" : "model_1746598895147车厢_primitive3",
+                "model_1746598895147车厢_primitive4" : "model_1746598895147车厢_primitive4",
+                "model_1746598895147车厢_primitive5" : "model_1746598895147车厢_primitive5",
+            },
+            "将高压水管拧到水管固定座" : {
+                "exhibition_html_1746603894815_hua_" : "exhibition_html_1746603894815_hua_",
+                "model_1746598895151转到位_primitive0" : "model_1746598895151转到位_primitive0",
+                "model_1746598895151转到位_primitive1" : "model_1746598895151转到位_primitive1",
+                "model_1746598895147大卷盘_primitive0" : "model_1746598895147大卷盘_primitive0",
+                "model_1746598895147大卷盘_primitive1" : "model_1746598895147大卷盘_primitive1",
+                "model_1746598895147大卷盘_primitive2" : "model_1746598895147大卷盘_primitive2",
+                "model_1746598895147大卷盘_primitive3" : "model_1746598895147大卷盘_primitive3",
+                "model_1746598895147大卷盘_primitive4" : "model_1746598895147大卷盘_primitive4",
+                "model_1746598895147大卷盘_primitive5" : "model_1746598895147大卷盘_primitive5",
+                "model_1746598895147大卷盘_primitive6" : "model_1746598895147大卷盘_primitive6",
+                "model_1746598895147大卷盘_primitive7" : "model_1746598895147大卷盘_primitive7",
+                "model_1746598895147大卷盘_primitive8" : "model_1746598895147大卷盘_primitive8",
+                "model_1746598895147大卷盘_primitive9" : "model_1746598895147大卷盘_primitive9",
+                "model_1746598895147大卷盘_primitive10" : "model_1746598895147大卷盘_primitive10",
+                "model_1746598895147大卷盘_primitive11" : "model_1746598895147大卷盘_primitive11",
+            },
+            "回到驾驶室踩下车辆离合器5秒" : {
+
+                "exhibition_html_1746604263314_hua_" : "exhibition_html_1746604263314_hua_",
+                "model_1746598895147离合" : "model_1746598895147离合",
+                "model_1746598895147左门_primitive0" : "model_1746598895147左门_primitive0",
+                "model_1746598895147左门_primitive1" : "model_1746598895147左门_primitive1",
+                "model_1746598895147左门_primitive2" : "model_1746598895147左门_primitive2",
+                "model_1746598895147左门_primitive3" : "model_1746598895147左门_primitive3",
+                "model_1746598895147左门_primitive4" : "model_1746598895147左门_primitive4",
+                "model_1746598895147左门_primitive5" : "model_1746598895147左门_primitive5",
+
+            },
+            "关闭取力器开关" : {
+                "exhibition_html_1746604047427_hua_" : "exhibition_html_1746604047427_hua_",
+                "model_1746598895147控制台_primitive5" : "model_1746598895147控制台_primitive5",
+            },
+            "关闭车辆双闪和工作双闪箭头灯" : {
+                "exhibition_html_1746604108744_hua_" : "exhibition_html_1746604108744_hua_",
+                "exhibition_html_1746604171611_hua_" : "exhibition_html_1746604171611_hua_",
+                "model_1746598895147控制台_primitive1" : "model_1746598895147控制台_primitive1",
+                "model_1746598895147控制台_primitive8" : "model_1746598895147控制台_primitive8",
+                "model_1746598895147控制台_primitive7" : "model_1746598895147控制台_primitive7",
+            },
+            "车辆正常熄火" : {
+                "exhibition_html_1746604047427_hua_" : "exhibition_html_1746604047427_hua_",
+                "exhibition_html_1746604199620_hua_" : "exhibition_html_1746604199620_hua_",
+                "model_1746598895147控制台_primitive5" : "model_1746598895147控制台_primitive5",
+                "model_1746598895147驾驶室底座_primitive1" : "model_1746598895147驾驶室底座_primitive1",
+                "model_1746598895147驾驶室底座_primitive2" : "model_1746598895147驾驶室底座_primitive2",
+                "model_1746598895147钥匙_primitive0" : "model_1746598895147钥匙_primitive0",
+                "model_1746598895147钥匙_primitive1" : "model_1746598895147钥匙_primitive1",
+                "model_1746598895147控制台_primitive6" : "model_1746598895147控制台_primitive6",
+            },
+        };
+        
+        if (json[type] == null || json[type] == undefined) {
+            return false;
+        }
+
+        let objJson = json[type];
+        
+        if (objJson[meshId] == null || objJson[meshId] == undefined) {
+            return false;
+        }
+
+        return true;
+
+    }
+
+    /**
+     * 根据不同类型,触发对应物体列表高亮逻辑
+     * type         对应类型操作高亮
+     */
+    meshListComHighlightEvent = (type) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        let meshList = [];
+
+        // QingXiCheAndQvComHighlightLayer.find().delAll("自定义");
+
+        // 默认不闪烁
+        QingXiCheAndQvComHighlightLayer.find().flickerBool = false;
+
+        switch (type) {
+            
+            case "数字修复虚拟仿真-将阀门关闭停止水流":
+
+                meshList = [
+                    "model_1746598895146阀门_primitive0",
+                    "model_1746598895146阀门_primitive1",
+                ];
+
+                // 开启闪烁逻辑
+                QingXiCheAndQvComHighlightLayer.find().flickerBool = true;
+                break;
+
+            case "数字修复虚拟仿真-将橡胶垫片放置到正确的位置":
+
+                meshList = [
+                    "model_1746598895146橡胶垫",
+                ];
+
+                // 开启闪烁逻辑
+                QingXiCheAndQvComHighlightLayer.find().flickerBool = true;
+
+                break;
+
+            case "数字修复虚拟仿真-将抱箍放置到正确的位置":
+
+                meshList = [
+                    "model_1746598895146上箍",
+                    "model_1746598895146插销轴",
+                    "model_1746598895146下箍",
+                ];
+
+                // 开启闪烁逻辑
+                QingXiCheAndQvComHighlightLayer.find().flickerBool = true;
+
+                break;
+
+            case "数字修复虚拟仿真-将插销安装到正确的位置":
+
+                meshList = [
+                    "model_1746598895146插销1",
+                    "model_1746598895146插销2",
+                ];
+
+                // 开启闪烁逻辑
+                QingXiCheAndQvComHighlightLayer.find().flickerBool = true;
+
+                break;
+
+            case "数字修复虚拟仿真-将螺丝安装到正确的位置":
+
+                meshList = [
+                    "model_1746598895146紧箍螺丝01",
+                    "model_1746598895146紧箍螺丝02",
+                    "model_1746598895146紧箍螺丝03",
+                ];
+
+                // 开启闪烁逻辑
+                QingXiCheAndQvComHighlightLayer.find().flickerBool = true;
+
+                break;
+
+            case "数字修复虚拟仿真-用扳手将螺丝旋紧螺丝":
+
+                meshList = [
+                    "model_1746598895146扳手",
+                ];
+
+                // 开启闪烁逻辑
+                QingXiCheAndQvComHighlightLayer.find().flickerBool = true;
+
+                break;
+
+            case "":
+
+                break;
+
+        }
+
+
+        for (let i = 0; i < meshList.length; i++) {
+            let meshId = meshList[i];
+            let objMesh = objScene.getMeshById(meshId);
+            if (objMesh != null && objMesh != undefined) {
+
+                // console.log(
+                //     "添加发光的物体", meshId, objMesh
+                // );
+
+                // 先去除
+                QingXiCheAndQvComHighlightLayer.find().delMesh("自定义", objMesh);
+                // 在添加
+                QingXiCheAndQvComHighlightLayer.find().addMesh("自定义", objMesh, "rgb(79, 185, 255)");
+
+            }
+        }
+
+
+    }
+
+    /**
+     * 配置被拖拽物体的列表
+     * type         类型,根据不同类型进行获取
+     */
+    meshMoveConfig = function(type) {
+
+        let meshList = [];
+
+        switch(type) {
+            case "数字修复虚拟仿真-将橡胶垫片放置到正确的位置":
+                meshList = [
+                    "model_1746598895146橡胶垫",
+                ];
+                break;
+
+            case "数字修复虚拟仿真-将抱箍放置到正确的位置":
+                meshList = [
+                    "model_1746598895146上箍",
+                    "model_1746598895146插销轴",
+                    "model_1746598895146下箍",
+                ];
+                break;
+
+            case "数字修复虚拟仿真-将插销安装到正确的位置":
+                meshList = [
+                    "model_1746598895146插销1",
+                    "model_1746598895146插销2",
+                ];
+                break;
+
+            case "数字修复虚拟仿真-将螺丝安装到正确的位置":
+                meshList = [
+                    "model_1746598895146紧箍螺丝01",
+                    "model_1746598895146紧箍螺丝02",
+                    "model_1746598895146紧箍螺丝03",
+                ];
+                break;
+
+            case "数字修复虚拟仿真-用扳手将螺丝旋紧螺丝":
+                meshList = [
+                    "model_1746598895146扳手",
+                ];
+                break;
+
+            case "":
+                break;
+        }
+
+        if (meshList.length <= 0) {
+            return null;
+        }
+
+        let meshJson = {};
+        for (let i = 0; i < meshList.length; i++) {
+            let meshId = meshList[i];
+            meshJson[meshId] = meshId;
+        }
+
+        return {
+            "meshList" : meshList,
+            "meshJson" : meshJson,
+        };
+
+    }
+
+
+
+    /**
+     * 开启车门
+     * callback     开启完成回调
+     */
+    openCarMen = (callback) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "Armature.001", "speed" : 2, "from" : 0, "to" : 120 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+
+    /**
+     * 模拟踩离合
+     * callback     开启完成回调
+     */
+    openCaiLiHe = (callback) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "离合.001", "speed" : 2, "from" : 0, "to" : 200 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+
+    /**
+     * 模拟离合抬起
+     * callback     开启完成回调
+     */
+    openCaiLiHeTaiQi = (callback) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "离合.001", "speed" : 2, "from" : 200, "to" : 0 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+
+    /**
+     * 关闭车门
+     * callback     开启完成回调
+     */
+    closeCarMen = (callback) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "Armature.001", "speed" : 2, "from" : 120, "to" : 0 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+
+    /**
+     * 调整卷筒器到合适位置
+     * callback     开启完成回调
+     */
+    tiaoZhengJuanPan = (callback) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "Armature.001", "speed" : 2, "from" : 0, "to" : 200 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+
+    /**
+     * 调整卷筒器到合适位置 回收
+     * callback     开启完成回调
+     */
+    tiaoZhengJuanPan_2 = (callback) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "Armature.001", "speed" : 2, "from" : 200, "to" : 0 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+
+
+    /**
+     * 套上高压水管护管器
+     * callback     开启完成回调
+     */
+    taoShangGaoYaShuiGuan_1 = (callback) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "波纹管.001", "speed" : 2, "from" : 200, "to" : 340 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+
+    /**
+     * 套上高压水管护管器
+     * callback     开启完成回调
+     */
+    taoShangGaoYaShuiGuan_2 = (callback) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "波纹管.001", "speed" : 2, "from" : 340, "to" : 401 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+
+    /**
+     * 套上高压水管护管器 拉回
+     * callback     开启完成回调
+     */
+    taoShangGaoYaShuiGuan_3 = (callback) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "波纹管.001", "speed" : 2, "from" : 401, "to" : 340 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+
+     /**
+     * 套上高压水管护管器 回收
+     * callback     开启完成回调
+     */
+     taoShangGaoYaShuiGuan_4 = (callback) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "波纹管.001", "speed" : 2, "from" : 340, "to" : 200 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+
+
+    /**
+     * 安装合适的高压喷头箱子打开
+     * callback     开启完成回调
+     */
+    gaoYaPengTouXiangZiDaKai = (callback) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "相机箱盖001", "speed" : 2, "from" : 0, "to" : 41 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+
+    /**
+     * 安装合适的高压喷头箱子打开 回收
+     * callback     开启完成回调
+     */
+    gaoYaPengTouXiangZiDaKai_2 = (callback) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "相机箱盖001", "speed" : 2, "from" : 41, "to" : 0 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+
+    /**
+     * 安装合适的高压喷头安装
+     * callback     开启完成回调
+     */
+    gaoYaPengTou_1 = (callback) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "喷头001", "speed" : 2, "from" : 270, "to" : 330 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+
+    /**
+     * 安装合适的高压喷头安装
+     * callback     开启完成回调
+     */
+    gaoYaPengTou_2 = (callback) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "喷头001", "speed" : 2, "from" : 330, "to" : 400 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+
+     /**
+     * 安装合适的高压喷头安装 拉回
+     * callback     开启完成回调
+     */
+     gaoYaPengTou_3 = (callback) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "喷头001", "speed" : 2, "from" : 400, "to" : 330 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+
+    /**
+     * 安装合适的高压喷头 回收
+     * callback     开启完成回调
+     */
+    gaoYaPengTou_4 = (callback) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "喷头001", "speed" : 2, "from" : 330, "to" : 270 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+
+    /**
+     * 数字修复虚拟仿真-将橡胶垫片放置到正确的位置
+     * callback     开启完成回调
+     */
+    xiangJiaoDianPianOk = (callback) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "橡胶垫.001", "speed" : 2, "from" : 0, "to" : 200 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+
+
+    /**
+     * 数字修复虚拟仿真-将抱箍放置到正确的位置
+     * callback     开启完成回调
+     */
+    baoGuOk = (callback) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "上箍", "speed" : 2, "from" : 0, "to" : 300 },
+            { "name" : "插销轴.001", "speed" : 2, "from" : 0, "to" : 200 },
+            { "name" : "下箍.001", "speed" : 2, "from" : 0, "to" : 300 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+
+    /**
+     * 数字修复虚拟仿真-将插销安装到正确的位置
+     * callback     开启完成回调
+     */
+    chaXiaoOk = function(callback) {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "插销1.001", "speed" : 2, "from" : 300, "to" : 400 },
+            { "name" : "插销2.001", "speed" : 2, "from" : 300, "to" : 400 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+
+    /**
+     * 数字修复虚拟仿真-将螺丝安装到正确的位置
+     * callback     开启完成回调
+     */
+    luoSiOk = function(callback) {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "紧箍螺丝01.001", "speed" : 2, "from" : 400, "to" : 502 },
+            { "name" : "紧箍螺丝02.001", "speed" : 2, "from" : 400, "to" : 502 },
+            { "name" : "紧箍螺丝03|", "speed" : 2, "from" : 400, "to" : 502 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+
+     /**
+     * 数字修复虚拟仿真-用扳手将螺丝旋紧螺丝
+     * callback     开启完成回调
+     */
+    banShouOk = function(callback) {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "扳手.001", "speed" : 2, "from" : 500, "to" : 802 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+
+    /**
+     * 拧动钥匙
+     * callback     开启完成回调
+     */
+    openYaoShi = (callback) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "钥匙.001", "speed" : 2, "from" : 0, "to" : 102 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+
+    /**
+     * 拧动钥匙 熄火
+     * callback     开启完成回调
+     */
+    openYaoShi_2 = (callback) => {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 播放动画列表
+        let playList = [
+            { "name" : "钥匙.001", "speed" : 2, "from" : 102, "to" : 0 },
+        ];
+        // 动画播放完成次数
+        let playEndNum = 0;
+        for (let i = 0; i < playList.length; i++) {
+
+            let thisPlayList = playList[i];
+            ChengGuangYuanJing.CommonVal.find().animationGroupsEventCallback(
+                thisPlayList.name, 'start', thisPlayList.speed, thisPlayList.from, thisPlayList.to, false, null,
+                function(state, objAnimation) {
+
+                    if (state == "播放完成") {
+
+                        playEndNum += 1;
+                        if (playEndNum >= playList.length) {
+                            callback("yes");
+                        }
+                        
+                    }
+                    
+                }
+            );
+
+        }
+
+    }
+    
+    
+}
+
+
+
+
+
+
+
+
+
+
+

+ 598 - 0
src/components/ThreeWorldEventQingXiCheAndQv/js/QingXiCheAndQvComClipPlaneMeshEvent.js

@@ -0,0 +1,598 @@
+import { ComVal } from "../common/ComVal.js";
+
+/**
+ * 用于处理裁切动画
+ */
+export class QingXiCheAndQvComClipPlaneMeshEvent {
+    
+    // 每次 new 出对象则会调用这个构造函数
+    constructor() {
+        
+        /**
+         * 三维世界对象 src\components\ThreeWorldEvent\js\QingXiCheAndQvThreeWorldEventMain.js
+         */
+        this.objThreeWorldEventMain = null;
+
+    }
+
+    // 实现单例模式
+    static find() {
+        if (!QingXiCheAndQvComClipPlaneMeshEvent.instance) {
+            QingXiCheAndQvComClipPlaneMeshEvent.instance = new QingXiCheAndQvComClipPlaneMeshEvent();
+        }
+        return QingXiCheAndQvComClipPlaneMeshEvent.instance;
+    }
+
+
+    /**
+     * 统一配置裁切参数,因为编辑器有时候会重新新建物体
+     * 所以这里可以把对应的参数写好保留
+     */
+    updateConfig = function() {
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        ChengGuangYuanJing.ComClipPlaneMesh.find().list = [
+            {
+                "name": "软管",
+                "code": "1746598961053",
+                "groupName": "软管",
+                "proportion": 100,
+                "position": {
+                    "x": 1.903181552886963,
+                    "y": -0.937729001045227,
+                    "z": -13.710371971130371
+                },
+                "positionTarget": {
+                    "x": 1.5947152376174927,
+                    "y": 3.605771780014038,
+                    "z": -5.793443202972412
+                },
+                "animationListEdite": [
+                    {
+                        "code": "1746598961053_1746606763557",
+                        "name": "软管",
+                        "proportionStart": 100,
+                        "proportionEnd": 31,
+                        "timeEnd": 1.5
+                    },
+                    {
+                        "code": "1746598961053_1746689739706",
+                        "name": "软管2",
+                        "proportionStart": 31,
+                        "proportionEnd": 0,
+                        "timeEnd": 1.5
+                    },
+                    {
+                        "code": "1746598961053_1746756045455",
+                        "name": "软管3",
+                        "proportionStart": 0,
+                        "proportionEnd": 31,
+                        "timeEnd": 0.25
+                    },
+                    {
+                        "code": "1746598961053_1746756063793",
+                        "name": "软管4",
+                        "proportionStart": 31,
+                        "proportionEnd": 100,
+                        "timeEnd": 1.5
+                    }
+                ]
+            },
+            {
+                "name": "解开",
+                "code": "1746599197585",
+                "groupName": "解开",
+                "proportion": 100,
+                "position": {
+                    "x": -0.4331572949886322,
+                    "y": -0.47012007236480713,
+                    "z": -3.224975824356079
+                },
+                "positionTarget": {
+                    "x": -0.4331572949886322,
+                    "y": 2.944892644882202,
+                    "z": -3.224975824356079
+                },
+                "animationListEdite": [
+                    {
+                        "code": "1746599197585_1746606802725",
+                        "name": "解开",
+                        "proportionStart": 100,
+                        "proportionEnd": 0,
+                        "timeEnd": 1.5
+                    },
+                    {
+                        "code": "1746599197585_1746755998967",
+                        "name": "解开2",
+                        "proportionStart": 0,
+                        "proportionEnd": 100,
+                        "timeEnd": 1.5
+                    }
+                ]
+            },
+            {
+                "name": "转到位",
+                "code": "1746599391870",
+                "groupName": "转到位",
+                "proportion": 100,
+                "position": {
+                    "x": 0.3794446289539337,
+                    "y": 0.09109125286340714,
+                    "z": -3.786313772201538
+                },
+                "positionTarget": {
+                    "x": 0.3794446289539337,
+                    "y": 2.7674410343170166,
+                    "z": -3.786313772201538
+                },
+                "animationListEdite": [
+                    {
+                        "code": "1746599391870_1746606821433",
+                        "name": "转到位",
+                        "proportionStart": 100,
+                        "proportionEnd": 0,
+                        "timeEnd": 1.5
+                    },
+                    {
+                        "code": "1746599391870_1746755972111",
+                        "name": "转到位2",
+                        "proportionStart": 0,
+                        "proportionEnd": 100,
+                        "timeEnd": 1.5
+                    }
+                ]
+            },
+            {
+                "name": "水枪管",
+                "code": "1746599498542",
+                "groupName": "水枪管",
+                "proportion": 100,
+                "position": {
+                    "x": 1.187269687652588,
+                    "y": 0.3563695549964905,
+                    "z": 1.5486046075820923
+                },
+                "positionTarget": {
+                    "x": 1.187269687652588,
+                    "y": 2.1758973598480225,
+                    "z": 1.5486046075820923
+                },
+                "animationListEdite": [
+                    {
+                        "code": "1746599498542_1746599872465",
+                        "name": "水枪管",
+                        "proportionStart": 100,
+                        "proportionEnd": 0,
+                        "timeEnd": 1.5
+                    }
+                ]
+            },
+            {
+                "name": "安全桩",
+                "code": "1746689811446",
+                "groupName": "安全桩",
+                "proportion": 100,
+                "position": {
+                    "x": 1.386452078819275,
+                    "y": 0.9578046202659607,
+                    "z": -29.669233322143555
+                },
+                "positionTarget": {
+                    "x": 1.719199538230896,
+                    "y": -0.8174868822097778,
+                    "z": 8.426508903503418
+                },
+                "animationListEdite": [
+                    {
+                        "code": "1746689811446_1746689949084",
+                        "name": "安全桩摆放",
+                        "proportionStart": 100,
+                        "proportionEnd": 0,
+                        "timeEnd": 1.5
+                    },
+                    {
+                        "code": "1746689811446_1746756017025",
+                        "name": "安全桩回收",
+                        "proportionStart": 0,
+                        "proportionEnd": 100,
+                        "timeEnd": 1.5
+                    }
+                ]
+            }
+        ];
+
+        return thisClass;
+
+    }
+
+
+    /**
+     * 隐藏车辆相关的裁切物体
+     */
+    carMeshClipNo = function() {
+
+        
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        thisClass.anQuanZhuangLookNo();
+        thisClass.ruanGuanLookNo();
+        thisClass.jieKaiLookNo();
+        thisClass.zhuanDaoWeiLookNo();
+        thisClass.shuiQiangGuanLookNo();
+        
+    }
+
+
+    /**
+     * 安全桩 裁切隐藏
+     */
+    anQuanZhuangLookNo = function() {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        ChengGuangYuanJing.ComClipPlaneMesh.find().clipPlaneEvent("1746689811446", 100);
+
+    }
+
+    /**
+     * 安全桩 可见动画
+     * callback     执行完成回调
+     */
+    anQuanZhuangLookYes = function(callback) {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        ChengGuangYuanJing.ComClipPlaneMesh.find().animationListEditePlay("1746689811446", "1746689811446_1746689949084");
+        
+        let thisTime = new Date().getTime();
+        // 控制延迟逻辑
+        ComVal.find().fpsEventAdd("type_clip_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+            ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+            callback("yes");
+            
+        });
+
+    }
+
+
+    /**
+     * 软管 裁切隐藏
+     */
+    ruanGuanLookNo = function() {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        ChengGuangYuanJing.ComClipPlaneMesh.find().clipPlaneEvent("1746598961053", 100);
+
+    }
+
+    /**
+     * 软管 可见动画
+     * callback     执行完成回调
+     */
+    ruanGuanLookYes_1 = function(callback) {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        ChengGuangYuanJing.ComClipPlaneMesh.find().animationListEditePlay("1746598961053", "1746598961053_1746606763557");
+        
+        let thisTime = new Date().getTime();
+        // 控制延迟逻辑
+        ComVal.find().fpsEventAdd("type_clip_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+            ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+            callback("yes");
+            
+        });
+
+    }
+    
+    /**
+     * 软管 可见动画
+     * callback     执行完成回调
+     */
+    ruanGuanLookYes_2 = function(callback) {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        ChengGuangYuanJing.ComClipPlaneMesh.find().animationListEditePlay("1746598961053", "1746598961053_1746689739706");
+        
+        let thisTime = new Date().getTime();
+        // 控制延迟逻辑
+        ComVal.find().fpsEventAdd("type_clip_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+            ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+            callback("yes");
+            
+        });
+
+    }
+
+    /**
+     * 软管 可见动画 拉回
+     * callback     执行完成回调
+     */
+    ruanGuanLookYes_3 = function(callback) {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        ChengGuangYuanJing.ComClipPlaneMesh.find().animationListEditePlay("1746598961053", "1746598961053_1746756045455");
+        
+        let thisTime = new Date().getTime();
+        // 控制延迟逻辑
+        ComVal.find().fpsEventAdd("type_clip_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+            ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+            callback("yes");
+            
+        });
+
+    }
+
+    /**
+     * 软管 可见动画 回收
+     * callback     执行完成回调
+     */
+    ruanGuanLookYes_4 = function(callback) {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        ChengGuangYuanJing.ComClipPlaneMesh.find().animationListEditePlay("1746598961053", "1746598961053_1746756063793");
+        
+        let thisTime = new Date().getTime();
+        // 控制延迟逻辑
+        ComVal.find().fpsEventAdd("type_clip_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+            ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+            callback("yes");
+            
+        });
+
+    }
+
+    /**
+     * 解开 裁切隐藏
+     */
+    jieKaiLookNo = function() {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        ChengGuangYuanJing.ComClipPlaneMesh.find().clipPlaneEvent("1746599197585", 100);
+
+    }
+
+    /**
+     * 解开 可见动画
+     * callback     执行完成回调
+     */
+    jieKaiLookYes = function(callback) {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        ChengGuangYuanJing.ComClipPlaneMesh.find().animationListEditePlay("1746599197585", "1746599197585_1746606802725");
+        
+        let thisTime = new Date().getTime();
+        // 控制延迟逻辑
+        ComVal.find().fpsEventAdd("type_clip_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+            ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+            callback("yes");
+            
+        });
+
+    }
+
+    /**
+     * 解开 可见动画 收回
+     * callback     执行完成回调
+     */
+    jieKaiLookYes_2 = function(callback) {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        ChengGuangYuanJing.ComClipPlaneMesh.find().animationListEditePlay("1746599197585", "1746599197585_1746755998967");
+        
+        let thisTime = new Date().getTime();
+        // 控制延迟逻辑
+        ComVal.find().fpsEventAdd("type_clip_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+            ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+            callback("yes");
+            
+        });
+
+    }
+
+    /**
+     * 转到位 裁切隐藏
+     */
+    zhuanDaoWeiLookNo = function() {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        ChengGuangYuanJing.ComClipPlaneMesh.find().clipPlaneEvent("1746599391870", 100);
+
+    }
+
+    /**
+     * 转到位 可见动画
+     * callback     执行完成回调
+     */
+    zhuanDaoWeiLookYes = function(callback) {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        ChengGuangYuanJing.ComClipPlaneMesh.find().animationListEditePlay("1746599391870", "1746599391870_1746606821433");
+        
+        let thisTime = new Date().getTime();
+        // 控制延迟逻辑
+        ComVal.find().fpsEventAdd("type_clip_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+            ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+            callback("yes");
+            
+        });
+
+    }
+
+    /**
+     * 转到位 可见动画 回收
+     * callback     执行完成回调
+     */
+    zhuanDaoWeiLookYes_2 = function(callback) {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        ChengGuangYuanJing.ComClipPlaneMesh.find().animationListEditePlay("1746599391870", "1746599391870_1746755972111");
+        
+        let thisTime = new Date().getTime();
+        // 控制延迟逻辑
+        ComVal.find().fpsEventAdd("type_clip_" + thisTime, {}, 1500, function(fpsEventAddRet) {
+            ComVal.find().fpsEventDel(fpsEventAddRet.code);
+
+            callback("yes");
+            
+        });
+
+    }
+
+    /**
+     * 水枪管 裁切隐藏
+     */
+    shuiQiangGuanLookNo = function() {
+
+        let thisClass = this;
+        let objThreeWorldEventMain = this.objThreeWorldEventMain;
+
+        let objIframeEdit = objThreeWorldEventMain.objIframeEdit;
+        let objIframe = objThreeWorldEventMain.objIframe;
+        let objScene = objThreeWorldEventMain.objScene;
+        let BABYLON = objThreeWorldEventMain.BABYLON;
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        ChengGuangYuanJing.ComClipPlaneMesh.find().clipPlaneEvent("1746599498542", 100);
+
+    }
+
+
+    
+    
+}
+
+
+
+
+
+
+
+
+
+
+

+ 398 - 0
src/components/ThreeWorldEventQingXiCheAndQv/js/QingXiCheAndQvComHighlightLayer.js

@@ -0,0 +1,398 @@
+/*eslint-disable*/
+
+/**
+ * 测试demo
+
+var objMesh = ChengGuangYuanJing.CommonVal.find().objScene.getMeshById("model_1725285426250机械臂_primitive0");
+console.log(objMesh);
+ChengGuangYuanJing.QingXiCheAndQvComHighlightLayer.find().addMesh("自定义", objMesh, "rgb(79, 185, 255)");
+console.log(ChengGuangYuanJing.QingXiCheAndQvComHighlightLayer.find().objJson);
+
+
+var objMesh = ChengGuangYuanJing.CommonVal.find().objScene.getMeshById("model_1725285426250机械臂_primitive0");
+console.log(objMesh);
+ChengGuangYuanJing.QingXiCheAndQvComHighlightLayer.find().delMesh("自定义", objMesh);
+console.log(ChengGuangYuanJing.QingXiCheAndQvComHighlightLayer.find().objJson);
+
+
+ChengGuangYuanJing.QingXiCheAndQvComHighlightLayer.find().delAll("自定义");
+console.log(ChengGuangYuanJing.QingXiCheAndQvComHighlightLayer.find().objJson);
+
+
+ChengGuangYuanJing.QingXiCheAndQvComHighlightLayer.find().objJsonDelAll();
+console.log(ChengGuangYuanJing.QingXiCheAndQvComHighlightLayer.find().objJson);
+
+ * 
+ */
+
+
+/**
+ * 操作高光效果
+ */
+export class QingXiCheAndQvComHighlightLayer {
+    
+    // 每次 new 出对象则会调用这个构造函数
+    constructor() {
+        
+        /**
+         * 三维世界对象,该对象会带有统一用到的对象
+         * 例如 
+         * // canvas 对象
+         * this.objCanvas = null;
+         * // BABYLON 3D engine
+         * this.objEngine = null;
+         * // 场景
+         * this.objScene = null;
+         * 
+         * 或者其他统一对象的参数
+         * 
+         */
+        this.objViewThreeWorld = null;
+        // BABYLON 3D engine
+        this.engine = null;
+        // 场景对象
+        this.scene = null;
+
+        this.BABYLON = null;
+
+        /**
+         * 记录 HighlightLayer 对象
+         * 每个唯一code 记录单独的 HighlightLayer 对象
+         */
+        this.objJson = {
+            // "code" : "HighlightLayer对象",
+            // "code2" : "HighlightLayer对象2"
+        };
+
+        /**
+         * 是否触发高亮闪烁逻辑
+         */
+        this.flickerBool = false;
+
+        /**
+         * 记录当前高光的变化参数
+         */
+        this.sizeThis = 1;
+
+        /**
+         * 当前高光变化模式
+         * 1 - 从小到大变化
+         * 2 - 从大到小变化
+         */
+        this.sizeModel = 1;
+        /**
+         * 高光的最小变化尺寸
+         */
+        this.sizeMin = 0.05;
+        // this.sizeMin = 0.001;
+        /**
+         * 高光的最大变化尺寸
+         */
+        this.sizeMax = 1.8;
+        // this.sizeMax = 0.5;
+
+        /**
+         * 高光的变化速度
+         */
+        // this.sizeSpeed = 0.01;
+        // this.sizeSpeed = 0.05;
+        this.sizeSpeed = 0.05;
+
+        
+    }
+
+    // 实现单例模式
+    static find() {
+        if (!QingXiCheAndQvComHighlightLayer.instance) {
+            QingXiCheAndQvComHighlightLayer.instance = new QingXiCheAndQvComHighlightLayer();
+        }
+        return QingXiCheAndQvComHighlightLayer.instance;
+    }
+    
+    /**
+     * 初始化,在使用该对象的时候,优先初始化该对象的该方法
+     * 之后才可以调用其他方法
+     * objViewThreeWorld        三维世界对象
+     */
+    init = function(objViewThreeWorld) {
+
+        this.objViewThreeWorld = objViewThreeWorld;
+        this.engine = this.objViewThreeWorld.objEngine;
+        this.scene = this.objViewThreeWorld.objScene;
+
+        this.BABYLON = objViewThreeWorld.BABYLON;
+
+        return this;
+
+    }
+    
+    /**
+     * 根据code 获取统一的一个 code名字
+     * code         自定义唯一code
+     */
+    getCode = function(code) {
+        var name = "comHighlightLayer_" + code;
+        return name;
+    }
+
+    /**
+     * 去除 getCode 自带前缀的 code, 用于删除的时候调用
+     * code         自定义唯一code
+     */
+    getCodeOld = function(code) {
+        
+        var codeArray = code.split("comHighlightLayer_");
+        var codeNew = "";
+        for (var i = 0; i < codeArray.length; i++) {
+            if (i == 0) {
+                continue;
+            }
+            codeNew += codeArray[i];
+        }
+        return codeNew;
+
+    }
+
+    
+    /**
+     * 根据自定义code获取 HighlightLayer 对象
+     * 如果不存在则会自动创建
+     * code         自定义唯一code
+     */
+    getCodeObj = function(code) {
+
+        var BABYLON = this.BABYLON;
+
+        var getCode = this.getCode(code);
+
+        if (this.objJson[getCode] != null && this.objJson[getCode] != undefined) {
+            return this.objJson[getCode];
+        }
+        
+        console.log("getCodeObj = function(code) { 创建");
+
+        var scene = this.scene;
+        var objHighlightLayer = new BABYLON.HighlightLayer(getCode, scene);
+
+        // 指定边界框是应正常渲染还是应受到层的影响【可以通过修改看看效果理解】
+        objHighlightLayer.disableBoundingBoxesFromEffectLayer = true;
+        // 指定层中的外部辉光是否处于活动状态。【可以通过修改看看效果理解】
+        objHighlightLayer.outerGlow = true;
+        // 指定层中的内部辉光是否处于活动状态。【可以通过修改看看效果理解】
+        objHighlightLayer.innerGlow = true;
+
+        // // 高光横向模糊度
+        // objHighlightLayer.blurHorizontalSize = 10;
+        // // 高光纵向模糊的
+        // objHighlightLayer.blurVerticalSize = 10;
+
+        // 高光横向模糊度
+        objHighlightLayer.blurHorizontalSize = 1;
+        // 高光纵向模糊的
+        objHighlightLayer.blurVerticalSize = 1;
+        
+        this.objJson[getCode] = objHighlightLayer;
+
+        return objHighlightLayer;
+    }
+
+    /**
+     * 将 rbg [ rgb(0, 0, 0) ] 字符串格式,转换成 new BABYLON.Color3(0, 0, 0)
+     * rbg  被转换的 rgb字符串,例如 rgb(0, 0, 0)
+     */
+    rgbToColor3(rbg) {
+
+        var BABYLON = this.BABYLON;
+
+        rbg = this.strNullDel(rbg);
+
+        if (rbg.indexOf("rgb(") >= 0) {
+            rbg = rbg.replaceAll("rgb(", "").replaceAll(")", "");
+        } else if (rbg.indexOf("rgba(") >= 0) {
+            rbg = rbg.replaceAll("rgba(", "").replaceAll(")", "");
+        }
+        
+        var rbgArrays = rbg.split(",");
+
+        // 经过论坛里面找到原因,这里的 实际取的 rgb的值,必须 除以 / 255 才算是正确的 【 官方文档没有给予正确的参数 】
+        return new BABYLON.Color3(
+            parseFloat(rbgArrays[0]) / 255,
+            parseFloat(rbgArrays[1]) / 255,
+            parseFloat(rbgArrays[2]) / 255
+        );
+    }
+
+    /**
+     * 去除字符串全部空
+     * str  被操作的字符串
+     * 返回字符串
+     */
+    strNullDel(str) {
+        
+        var ret = "";
+        for (var i = 0; i <= str.length; i++) {
+            if (str.charAt(i) != " ") {
+                ret = ret + str.charAt(i);
+            }
+        }
+
+        return ret;
+    }
+
+    /**
+     * 添加目标物体高光效果
+     * code             自定义唯一code
+     * objMesh          目标物体对象
+     * color            颜色值,传 rgb 的参数,例如 rgb(79, 185, 255)
+     */
+    addMesh = function(code, objMesh, color) {
+        
+        var BABYLON = this.BABYLON;
+        if (objMesh == null || objMesh == undefined) {
+            return this;
+        }
+        
+        var scene = this.scene;
+        var objHighlightLayer = this.getCodeObj(code);
+        try {
+            // 首先先删除
+            objHighlightLayer.removeMesh(objMesh);
+        } catch (e) {
+
+        }
+
+        var objColor3 = this.rgbToColor3(color);
+
+        try {
+            // 在添加
+            objHighlightLayer.addMesh(objMesh, objColor3);
+        } catch (e) {
+
+        }
+        
+        return this;
+
+    }
+    
+    /**
+     * 删除指定物体的高光效果
+     * code             自定义唯一code
+     * objMesh          目标物体对象
+     */
+    delMesh = function(code, objMesh) {
+
+        var BABYLON = this.BABYLON;
+        if (objMesh == null || objMesh == undefined) {
+            return this;
+        }
+
+        var scene = this.scene;
+        var objHighlightLayer = this.getCodeObj(code);
+        // 删除
+        objHighlightLayer.removeMesh(objMesh);
+        
+        return this;
+
+    }
+
+
+    /**
+     * 清除整个高光所有效果,释放内存
+     * code             自定义唯一code
+     */
+    delAll = function(code) {
+
+        var BABYLON = this.BABYLON;
+        var objHighlightLayer = this.getCodeObj(code);
+        // 一次性删除所有物体的高光
+        objHighlightLayer.removeAllMeshes();
+        objHighlightLayer.dispose();
+
+        var getCode = this.getCode(code);
+        this.objJson[getCode] = null;
+        delete this.objJson[getCode];
+        return this;
+
+    }
+    
+    /**
+     * 删除所有高光
+     */
+    objJsonDelAll = function() {
+        
+        var BABYLON = this.BABYLON;
+        for (var key in this.objJson) {
+
+            var code = this.getCodeOld(key);
+            this.delAll(code);
+        }
+
+        return this;
+
+    }
+
+    /**
+     * 高亮闪烁逻辑,每帧执行
+     */
+    flickerBoolEvent = function() {
+
+        let thisClass = this;
+        
+        if (this.sizeModel == 1) {
+
+            this.sizeThis += this.sizeSpeed;
+            if (this.sizeThis >= this.sizeMax) {
+                this.sizeThis = this.sizeMax;
+                this.sizeModel = 2;
+            }
+
+        } else if (this.sizeModel == 2) {
+
+            this.sizeThis -= this.sizeSpeed;
+            if (this.sizeThis <= this.sizeMin) {
+                this.sizeThis = this.sizeMin;
+                this.sizeModel = 1;
+            }
+
+        }
+
+        for (let key in thisClass.objJson) {
+
+            let objHighlightLayer = thisClass.objJson[key];
+            if (this.flickerBool == false) {
+            
+                // 高光横向模糊度
+                objHighlightLayer.blurHorizontalSize = 1;
+                // 高光纵向模糊的
+                objHighlightLayer.blurVerticalSize = 1;
+
+            } else {
+                
+                // 高光横向模糊度
+                objHighlightLayer.blurHorizontalSize = this.sizeThis;
+                // 高光纵向模糊的
+                objHighlightLayer.blurVerticalSize = this.sizeThis;
+                
+            }
+
+        }
+        
+        return thisClass;
+
+    }
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+

+ 40 - 0
src/components/ThreeWorldEventQingXiCheAndQv/js/QingXiCheAndQvComRes.js

@@ -0,0 +1,40 @@
+/**
+ * 通用资源文件地址放置
+ */
+export class QingXiCheAndQvComRes {
+    
+    // 每次 new 出对象则会调用这个构造函数
+    constructor() {
+        
+        /**
+         * 配置对应的文件地址
+         * 例如再 vue 中
+         * new URL("../../assets/res/music/lightningOne.mp3", import.meta.url).href
+         */
+        this.resJson = {
+            // "自定义唯一code" : "对应的文件地址",
+        };
+
+    }
+
+    // 实现单例模式
+    static find() {
+        if (!QingXiCheAndQvComRes.instance) {
+            QingXiCheAndQvComRes.instance = new QingXiCheAndQvComRes();
+        }
+        return QingXiCheAndQvComRes.instance;
+    }
+    
+    
+}
+
+
+
+
+
+
+
+
+
+
+

+ 3169 - 0
src/components/ThreeWorldEventQingXiCheAndQv/js/QingXiCheAndQvThreeWorldCamera.js

@@ -0,0 +1,3169 @@
+/**
+ * 操作相机
+ */
+export class QingXiCheAndQvThreeWorldCamera {
+    
+    // 每次 new 出对象则会调用这个构造函数
+    constructor() {
+
+        // 已经封装好的,编辑器的类对象,内置可以直接调用的代码
+        this.objIframeEdit = null;
+        // iframe对象
+        this.objIframe = null;
+        // 3d世界的场景,后续要操作3d世界常用的对象
+        this.objScene = null;
+        // babylon 对象,懂babylon,就可以使用babylon的api去操作
+        this.BABYLON = null;
+        
+        
+    }
+
+    // 实现单例模式
+    static find() {
+
+        if (typeof QingXiCheAndQvThreeWorldCamera.instance == 'undefined') {
+            QingXiCheAndQvThreeWorldCamera.instance = {};
+        }
+
+        if (!QingXiCheAndQvThreeWorldCamera.instance["WaterCar"]) {
+            QingXiCheAndQvThreeWorldCamera.instance["WaterCar"] = new QingXiCheAndQvThreeWorldCamera();
+        }
+        return QingXiCheAndQvThreeWorldCamera.instance["WaterCar"];
+    }
+    
+    /**
+     * 初始化方法
+     * objIframeEdit    已经封装好的,编辑器的类对象,内置可以直接调用的代码
+     * objIframe        iframe对象
+     * objScene         场景对象
+     * BABYLON          babylon.js对象,用于后续调用babylon的代码去创建更新等操作
+     */
+    initObj = function (objIframeEdit, objIframe, objScene, BABYLON) {
+        
+        if (this.objIframe != null && this.objIframe != undefined) {
+            return this;
+        }
+
+        this.objIframeEdit = objIframeEdit;
+        this.objIframe = objIframe;
+        this.objScene = objScene;
+        this.BABYLON = BABYLON;
+
+        return this;
+
+    }
+
+
+    /**
+     * 新增固定的几个视角,后续切换视角使用
+     */
+    addConfig = function() {
+
+        let ChengGuangYuanJing = this.objIframe.ChengGuangYuanJing;
+        // 获取视角配置列表
+        let cameraVisualAngleJson = ChengGuangYuanJing.CameraArray.find().cameraVisualAngleJson;
+        // console.log(
+        //     "cameraVisualAngleJson", cameraVisualAngleJson
+        // );
+
+        // 配置视角,不存在的视角才会追加
+        let addConfig = [
+            {
+                "id": 1745805995184,
+                "name": "将橡胶垫片放置到正确的位置_完成",
+                "positionX": 3.434790083674414,
+                "positionY": 0.9720892267284371,
+                "positionZ": 37.99214046097584,
+                "alpha": 0.5194800210282284,
+                "beta": 1.1461776083159434,
+                "radius": 4.22354522062491,
+                "positionTargetX": 0.0940140691735647,
+                "positionTargetY": -0.7678990137187822,
+                "positionTargetZ": 36.081645557893204,
+                "type": "orbit",
+                "img": "1745910083684.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": false,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 3.14,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "sort": 13,
+                "index": 13
+            },
+            {
+                "id": 1745805995184,
+                "name": "将橡胶垫片放置到正确的位置_准备安装",
+                "positionX": -2.2629155672393884,
+                "positionY": 1.4749063046946154,
+                "positionZ": 39.224416650833874,
+                "alpha": 1.9280622806058043,
+                "beta": 0.9419693219172275,
+                "radius": 4.118776027172311,
+                "positionTargetX": -1.0980428318611053,
+                "positionTargetY": -0.94774350569121,
+                "positionTargetZ": 36.10381488697178,
+                "type": "orbit",
+                "img": "1745910123195.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": false,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 3.14,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "sort": 14,
+                "index": 14
+            },
+            {
+                "id": 1745805995184,
+                "name": "将抱箍放置到正确的位置_准备安装",
+                "positionX": -0.40277961624320235,
+                "positionY": 1.6882738079553017,
+                "positionZ": 39.87918948918772,
+                "alpha": 1.395939138449596,
+                "beta": 0.9378108539098189,
+                "radius": 4.300807389227797,
+                "positionTargetX": -1.0060277055876485,
+                "positionTargetY": -0.8558880408227536,
+                "positionTargetZ": 36.46447479698269,
+                "type": "orbit",
+                "img": "1745910646690.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": false,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 3.14,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "sort": 15,
+                "index": 15
+            },
+            {
+                "id": 1745805995184,
+                "name": "将抱箍放置到正确的位置_完成",
+                "positionX": -1.3594907241267253,
+                "positionY": -0.5010031869200811,
+                "positionZ": 38.267595721843286,
+                "alpha": 2.091196737931491,
+                "beta": 1.3624784578651505,
+                "radius": 2.5692327002414026,
+                "positionTargetX": -0.10961652650195848,
+                "positionTargetY": -1.0323575820919717,
+                "positionTargetZ": 36.08667076558434,
+                "type": "orbit",
+                "img": "1745910681835.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": false,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 3.14,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "sort": 16,
+                "index": 16
+            },
+            {
+                "id": 1745805995184,
+                "name": "将插销安装到正确的位置_准备安装",
+                "positionX": -2.664366545750399,
+                "positionY": 0.7517457499982818,
+                "positionZ": 38.82128776372133,
+                "alpha": 1.9433858706314908,
+                "beta": 1.0271700478651544,
+                "radius": 3.651483203488157,
+                "positionTargetX": -1.5267481406459806,
+                "positionTargetY": -1.136957994463293,
+                "positionTargetZ": 35.9106259634806,
+                "type": "orbit",
+                "img": "1745912507208.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": false,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 3.14,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "sort": 17,
+                "index": 17
+            },
+            {
+                "id": 1745805995184,
+                "name": "将插销安装到正确的位置_完成",
+                "positionX": -1.6254706763437103,
+                "positionY": -0.5825438438258441,
+                "positionZ": 37.43231995683984,
+                "alpha": 2.442806008233992,
+                "beta": 1.4829387851484381,
+                "radius": 2.012108843672751,
+                "positionTargetX": -0.0908950494568953,
+                "positionTargetY": -0.7590954435551248,
+                "positionTargetZ": 36.14294445808703,
+                "type": "orbit",
+                "img": "1745912590667.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": false,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 3.14,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "sort": 18,
+                "index": 18
+            },
+            {
+                "id": 1745805995184,
+                "name": "将螺丝安装到正确的位置_准备安装",
+                "positionX": -3.3555666635398174,
+                "positionY": 0.38692847221648186,
+                "positionZ": 39.39068253820953,
+                "alpha": 1.935258654062315,
+                "beta": 1.1843123211484419,
+                "radius": 4.537360789920926,
+                "positionTargetX": -1.8575320944088423,
+                "positionTargetY": -1.3233575190250157,
+                "positionTargetZ": 35.46404820385097,
+                "type": "orbit",
+                "img": "1745915164913.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": false,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 3.14,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "sort": 19,
+                "index": 19
+            },
+            {
+                "id": 1745805995184,
+                "name": "将螺丝安装到正确的位置_完成",
+                "positionX": -2.688735486661406,
+                "positionY": -0.2739742266559021,
+                "positionZ": 35.475265448906526,
+                "alpha": 3.332337466236297,
+                "beta": 1.36521209956586,
+                "radius": 2.66348889726007,
+                "positionTargetX": -0.12862428855217933,
+                "positionTargetY": -0.8176965041878008,
+                "positionTargetZ": 35.96960323226819,
+                "type": "orbit",
+                "img": "1745915201663.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": false,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 3.14,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "sort": 20,
+                "index": 20
+            },
+            {
+                "id": 1745805995184,
+                "name": "用扳手将螺丝旋紧螺丝_准备安装",
+                "positionX": -2.9087627587511626,
+                "positionY": 0.8788380240538635,
+                "positionZ": 32.395869332712856,
+                "alpha": 4.181934149314756,
+                "beta": 1.1124475695658598,
+                "radius": 2.66348889726007,
+                "positionTargetX": -1.7003211617337737,
+                "positionTargetY": -0.2996703208339272,
+                "positionTargetZ": 34.45619942603663,
+                "type": "orbit",
+                "img": "1745915340527.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": false,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 3.14,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "sort": 21,
+                "index": 21
+            },
+            {
+                "id": 1745805995184,
+                "name": "用扳手将螺丝旋紧螺丝_完成",
+                "positionX": -1.6999125144922638,
+                "positionY": -0.04076731030340641,
+                "positionZ": 34.779136140798485,
+                "alpha": 3.768027236059811,
+                "beta": 1.2204406375355275,
+                "radius": 2.111543710084692,
+                "positionTargetX": -0.09322094558480298,
+                "positionTargetY": -0.7655164921088837,
+                "positionTargetZ": 35.94184748308091,
+                "type": "orbit",
+                "img": "1745915383288.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": false,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 3.14,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "sort": 22,
+                "index": 22
+            },
+            {
+                "id": 1745805995184,
+                "name": "数字修复虚拟仿真-已完成所有任务",
+                "positionX": 1.2180107786719965,
+                "positionY": 1.0112048718627056,
+                "positionZ": 38.703846006943756,
+                "alpha": 1.124438263238479,
+                "beta": 1.003091197785263,
+                "radius": 3.2086889018015605,
+                "positionTargetX": 0.05015001569666078,
+                "positionTargetY": -0.7141025793381803,
+                "positionTargetZ": 36.263538668578796,
+                "type": "orbit",
+                "img": "1745918192443.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": false,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 3.14,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "sort": 23,
+                "index": 23
+            },
+        ];
+
+
+        let addConfig_2 = [
+            {
+                "id": 1746545118254,
+                "name": "关闭阀门",
+                "positionX": -3.856503256601191,
+                "positionY": 0.5861278336063765,
+                "positionZ": 37.66840479204506,
+                "alpha": -3.9540208025290005,
+                "beta": 1.3209129237567865,
+                "radius": 5.665806887671409,
+                "positionTargetX": -0.08093726016554409,
+                "positionTargetY": -0.8149751343260953,
+                "positionTargetZ": 33.683009006405385,
+                "type": "orbit",
+                "img": "1746606150372.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": false,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 3.14,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "sort": 25,
+                "index": 25
+            },
+            {
+                "id": 1746545118254,
+                "name": "关闭阀门完成",
+                "positionX": 3.2278214337122306,
+                "positionY": -0.2817695029302182,
+                "positionZ": 34.60857435281672,
+                "alpha": -0.4295854791858332,
+                "beta": 1.4198943509354505,
+                "radius": 3.4806245422817303,
+                "positionTargetX": 0.09941200887318447,
+                "positionTargetY": -0.805011509161382,
+                "positionTargetZ": 36.04175943431433,
+                "type": "orbit",
+                "img": "1746606191478.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": false,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 3.14,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "sort": 26,
+                "index": 26
+            }
+        ];
+
+        for (let i = 0; i < addConfig_2.length; i++) {
+            addConfig.push(addConfig_2[i]);
+        }
+
+
+        let addConfig_3 = [
+            {
+                "id": 1745805891376,
+                "name": "清洗车-清洗水管",
+                "positionX": 6.480992498185938,
+                "positionY": 3.297662059580573,
+                "positionZ": 0.1003637903898067,
+                "alpha": -4.977626690402628,
+                "beta": 1.3999832070173772,
+                "radius": 15.44664986529636,
+                "positionTargetX": 2.4907561934409577,
+                "positionTargetY": 0.671983493915179,
+                "positionTargetZ": -14.589184138772632,
+                "type": "orbit",
+                "img": "1746001449818.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 7,
+                "sort": 7
+            },
+            {
+                "id": 1745805891376,
+                "name": "清洗车-清洗水管开始",
+                "positionX": 3.774838700080793,
+                "positionY": 1.4212449159650464,
+                "positionZ": 1.996681615645393,
+                "alpha": -4.8266077603599715,
+                "beta": 1.4361372592002462,
+                "radius": 10.586359313445815,
+                "positionTargetX": 2.579227601848682,
+                "positionTargetY": 0,
+                "positionTargetZ": -8.425486129310965,
+                "type": "orbit",
+                "img": "1746001491945.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 8,
+                "sort": 8
+            },
+        ];
+
+        for (let i = 0; i < addConfig_3.length; i++) {
+            addConfig.push(addConfig_3[i]);
+        }
+        
+        let addConfig_4 = [
+            {
+                "id": 1745805891376,
+                "name": "清洗车",
+                "positionX": 5.590449190585221,
+                "positionY": 3.4614088519821156,
+                "positionZ": 14.230074640037618,
+                "alpha": 1.0881811663342376,
+                "beta": 1.3843029779311389,
+                "radius": 12.92143774006853,
+                "positionTargetX": -0.30237242197890274,
+                "positionTargetY": 1.0655908802455767,
+                "positionTargetZ": 2.9829299819802353,
+                "type": "orbit",
+                "img": "1745827435536.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 0,
+                "sort": 0
+            },
+            {
+                "id": 1745805891376,
+                "name": "绕车1",
+                "positionX": -0.5585661839595921,
+                "positionY": 2.8117313570142795,
+                "positionZ": 11.082589241205365,
+                "alpha": 1.5149729495510371,
+                "beta": 1.3999403139331077,
+                "radius": 7.117813107406664,
+                "positionTargetX": -0.9499177768869979,
+                "positionTargetY": 1.6015183487897056,
+                "positionTargetZ": 4.079340578091416,
+                "type": "orbit",
+                "img": "1746501660816.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 1,
+                "sort": 1
+            },
+            {
+                "id": 1745805891376,
+                "name": "绕车2",
+                "positionX": -7.524563953703335,
+                "positionY": 1.9984386949014747,
+                "positionZ": 5.55736139492158,
+                "alpha": 2.708457997050701,
+                "beta": 1.5148533058319302,
+                "radius": 7.087403474534943,
+                "positionTargetX": -1.101713686691788,
+                "positionTargetY": 1.6021547124009832,
+                "positionTargetZ": 2.587303910021123,
+                "type": "orbit",
+                "img": "1746501684413.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 2,
+                "sort": 2
+            },
+            {
+                "id": 1745805891376,
+                "name": "绕车3",
+                "positionX": -4.236590610507967,
+                "positionY": 1.5335260761782796,
+                "positionZ": -9.406407393646152,
+                "alpha": -2.005041179214031,
+                "beta": 1.4951272701245604,
+                "radius": 7.864776247523191,
+                "positionTargetX": -0.9371475755462959,
+                "positionTargetY": 0.9389736378512127,
+                "positionTargetZ": -2.2919932588963903,
+                "type": "orbit",
+                "img": "1746501712326.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 3,
+                "sort": 3
+            },
+            {
+                "id": 1745805891376,
+                "name": "绕车4",
+                "positionX": 6.0905566382574055,
+                "positionY": 1.4263537349093198,
+                "positionZ": -7.315888858637495,
+                "alpha": 5.47265993322065,
+                "beta": 1.5363391730488518,
+                "radius": 7.2816542110873685,
+                "positionTargetX": 1.0756175707062954,
+                "positionTargetY": 1.1754983030277955,
+                "positionTargetZ": -2.0423752528058428,
+                "type": "orbit",
+                "img": "1746501739637.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 4,
+                "sort": 4
+            },
+            {
+                "id": 1745805891376,
+                "name": "绕车5",
+                "positionX": 6.503197240901487,
+                "positionY": 1.3874146016254998,
+                "positionZ": 6.600756049408774,
+                "alpha": 6.897459390763552,
+                "beta": 1.499964949812847,
+                "radius": 6.597312504384009,
+                "positionTargetX": 1.125444452973845,
+                "positionTargetY": 0.920508519038628,
+                "positionTargetZ": 2.807827636891414,
+                "type": "orbit",
+                "img": "1746501756019.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 5,
+                "sort": 5
+            },
+            {
+                "id": 1745805891376,
+                "name": "绕车6",
+                "positionX": -3.5192088660039684,
+                "positionY": 1.0244965268346524,
+                "positionZ": 7.720747264857602,
+                "alpha": 2.208403070466835,
+                "beta": 1.54145802385265,
+                "radius": 4.498501241247363,
+                "positionTargetX": -0.8425199080793071,
+                "positionTargetY": 0.8925370669107235,
+                "positionTargetZ": 4.10765491328882,
+                "type": "orbit",
+                "img": "1746501797503.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 6,
+                "sort": 6
+            },
+            {
+                "id": 1745805891376,
+                "name": "清洗车-开门",
+                "positionX": -3.895054338929728,
+                "positionY": 2.5123213427682756,
+                "positionZ": 0.9677759996615007,
+                "alpha": 3.704097248025584,
+                "beta": 1.4318661279691425,
+                "radius": 4.364935967281041,
+                "positionTargetX": -0.23823605309437662,
+                "positionTargetY": 1.9078488564429987,
+                "positionTargetZ": 3.273195492100918,
+                "type": "orbit",
+                "img": "1745827429454.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 7,
+                "sort": 7
+            },
+            {
+                "id": 1745805891376,
+                "name": "侧身进入驾驶室",
+                "positionX": -0.5921475695063789,
+                "positionY": 2.375144217646059,
+                "positionZ": 3.032626130286855,
+                "alpha": 4.624437363694188,
+                "beta": 1.2178419979207662,
+                "radius": 0.5339949436191825,
+                "positionTargetX": -0.5481338211813366,
+                "positionTargetY": 2.190557372246977,
+                "positionTargetZ": 3.5317664775588917,
+                "type": "orbit",
+                "img": "1746501968242.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 8,
+                "sort": 8
+            },
+            {
+                "id": 1745805891376,
+                "name": "手刹和空挡",
+                "positionX": -0.4521551899735941,
+                "positionY": 2.2810237803038085,
+                "positionZ": 3.0184823916642074,
+                "alpha": 4.170200488824776,
+                "beta": 0.9491287946019453,
+                "radius": 0.853376728173305,
+                "positionTargetX": -0.09418892876535845,
+                "positionTargetY": 1.7840244099344726,
+                "positionTargetZ": 3.612707619904187,
+                "type": "orbit",
+                "img": "1746502072134.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 9,
+                "sort": 9
+            },
+            {
+                "id": 1745805891376,
+                "name": "拧动钥匙发动车辆",
+                "positionX": -0.33989579966765077,
+                "positionY": 2.041838310337772,
+                "positionZ": 3.1144160287866653,
+                "alpha": 5.002160957440672,
+                "beta": 1.4152930183811843,
+                "radius": 0.5406859899115197,
+                "positionTargetX": -0.49252386810633353,
+                "positionTargetY": 1.9580982947495884,
+                "positionTargetZ": 3.626308226617974,
+                "type": "orbit",
+                "img": "1746502206636.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 10,
+                "sort": 10
+            },
+            {
+                "id": 1745805891376,
+                "name": "拧动钥匙发动车辆向上",
+                "positionX": -0.31920975247761196,
+                "positionY": 2.7682146420275253,
+                "positionZ": 2.849357096499734,
+                "alpha": 4.689187841295316,
+                "beta": 0.8659756972500438,
+                "radius": 1.2295240049883365,
+                "positionTargetX": -0.2974823830143538,
+                "positionTargetY": 1.9716094714108434,
+                "positionTargetZ": 3.785667623197759,
+                "type": "orbit",
+                "img": "1746511306517.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 11,
+                "sort": 11
+            },
+            {
+                "id": 1745805891376,
+                "name": "开启双闪",
+                "positionX": -0.32621508921223064,
+                "positionY": 2.4569363208822557,
+                "positionZ": 2.8796120819590945,
+                "alpha": 4.726367836157696,
+                "beta": 1.046784273949118,
+                "radius": 0.9672959542364216,
+                "positionTargetX": -0.3379220404184866,
+                "positionTargetY": 1.9729421815409236,
+                "positionTargetZ": 3.717033172843989,
+                "type": "orbit",
+                "img": "1746511367633.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 12,
+                "sort": 12
+            },
+            {
+                "id": 1745805891376,
+                "name": "打开工作双闪箭头灯",
+                "positionX": -0.20861115928703733,
+                "positionY": 2.6447076764088004,
+                "positionZ": 2.861457073344257,
+                "alpha": 4.854089015249778,
+                "beta": 0.8301640586435702,
+                "radius": 1.1742611302659505,
+                "positionTargetX": -0.33100552714135323,
+                "positionTargetY": 1.8523694750353992,
+                "positionTargetZ": 3.719425018791739,
+                "type": "orbit",
+                "img": "1746511409060.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 13,
+                "sort": 13
+            },
+            {
+                "id": 1745805891376,
+                "name": "调整坐姿",
+                "positionX": -1.933156452436931,
+                "positionY": 2.5292001611003765,
+                "positionZ": 3.291682395585083,
+                "alpha": 3.022381634415069,
+                "beta": 1.0963751733032594,
+                "radius": 0.9864299421939656,
+                "positionTargetX": -1.0618982081553225,
+                "positionTargetY": 2.07857567724691,
+                "positionTargetZ": 3.1873239882576603,
+                "type": "orbit",
+                "img": "1746502468215.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 14,
+                "sort": 14
+            },
+            {
+                "id": 1745805891376,
+                "name": "手握方向盘",
+                "positionX": -0.6341796979001858,
+                "positionY": 2.425132318290067,
+                "positionZ": 2.9282759470876485,
+                "alpha": 4.561745157730889,
+                "beta": 1.2078058197407788,
+                "radius": 0.6580825342456778,
+                "positionTargetX": -0.5418535469345116,
+                "positionTargetY": 2.1914659920943356,
+                "positionTargetZ": 3.5365099084292257,
+                "type": "orbit",
+                "img": "1746502540418.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 15,
+                "sort": 15
+            },
+            {
+                "id": 1745805891376,
+                "name": "踩下离合器踏板",
+                "positionX": -1.3156184802683595,
+                "positionY": 2.073496581950657,
+                "positionZ": 3.1181357693037155,
+                "alpha": 4.025797928391837,
+                "beta": 0.9767935320610817,
+                "radius": 0.443807473742096,
+                "positionTargetX": -1.082477098037569,
+                "positionTargetY": 1.8251052425511305,
+                "positionTargetZ": 3.4025859620478354,
+                "type": "orbit",
+                "img": "1746502660192.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 16,
+                "sort": 16
+            },
+            {
+                "id": 1745805891376,
+                "name": "观察仪表盘指示灯",
+                "positionX": -0.5172300454778831,
+                "positionY": 2.4182882664998067,
+                "positionZ": 2.9377716274357564,
+                "alpha": 4.275640311352618,
+                "beta": 0.9393987729389793,
+                "radius": 0.9350120856018798,
+                "positionTargetX": -0.19797629694976848,
+                "positionTargetY": 1.8663754623735733,
+                "positionTargetZ": 3.621669939258386,
+                "type": "orbit",
+                "img": "1746511697773.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 17,
+                "sort": 17
+            },
+            {
+                "id": 1745805891376,
+                "name": "观察仪表盘指示目视",
+                "positionX": -0.512327148490185,
+                "positionY": 2.325530911160376,
+                "positionZ": 3.154906533986564,
+                "alpha": 4.053572358479869,
+                "beta": 0.9040002498767067,
+                "radius": 0.762083011187161,
+                "positionTargetX": -0.14572201070556356,
+                "positionTargetY": 1.8542042882901288,
+                "positionTargetZ": 3.6284278148850437,
+                "type": "orbit",
+                "img": "1746523786113.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 18,
+                "sort": 18
+            },
+            {
+                "id": 1745805891376,
+                "name": "抬起离合器踏板",
+                "positionX": -1.206958147723764,
+                "positionY": 1.704145301012155,
+                "positionZ": 3.404971773453761,
+                "alpha": 3.7408274323533988,
+                "beta": 1.2772288174051163,
+                "radius": 0.15269515024457178,
+                "positionTargetX": -1.0862619196771273,
+                "positionTargetY": 1.6599600669061438,
+                "positionTargetZ": 3.487408989142572,
+                "type": "orbit",
+                "img": "1746502873254.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 19,
+                "sort": 19
+            },
+            {
+                "id": 1745805891376,
+                "name": "抬起离合器踏板2",
+                "positionX": -0.9654356936340003,
+                "positionY": 1.808252665139647,
+                "positionZ": 3.1973049561627698,
+                "alpha": 4.286279169806221,
+                "beta": 1.132792658225874,
+                "radius": 0.6707316566462338,
+                "positionTargetX": -0.7143719962963588,
+                "positionTargetY": 1.5237736154969268,
+                "positionTargetZ": 3.750404988183135,
+                "type": "orbit",
+                "img": "1746525075138.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 20,
+                "sort": 20
+            },
+            {
+                "id": 1745805891376,
+                "name": "下车观察各项灯光0",
+                "positionX": -3.1453131370450436,
+                "positionY": 2.9444385414411554,
+                "positionZ": 1.320281966433725,
+                "alpha": 3.952628950806684,
+                "beta": 0.9485930798787515,
+                "radius": 5.051994717557702,
+                "positionTargetX": -0.3178447052273006,
+                "positionTargetY": 0,
+                "positionTargetZ": 4.296580770146302,
+                "type": "orbit",
+                "img": "1746525107655.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 21,
+                "sort": 21
+            },
+            {
+                "id": 1745805891376,
+                "name": "下车观察各项灯光",
+                "positionX": 0.1334707812659611,
+                "positionY": 2.153480823577081,
+                "positionZ": -8.190246378070967,
+                "alpha": 4.662953565989618,
+                "beta": 1.4806251368647954,
+                "radius": 4.363280827791526,
+                "positionTargetX": 0.3482075678349779,
+                "positionTargetY": 1.7605715521468148,
+                "positionTargetZ": -3.8500009934076473,
+                "type": "orbit",
+                "img": "1746509534204.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 22,
+                "sort": 22
+            },
+            {
+                "id": 1745805891376,
+                "name": "放置警示标识",
+                "positionX": -10.641530296263998,
+                "positionY": 2.7606817554455483,
+                "positionZ": 14.425243399990027,
+                "alpha": 2.1229545994754178,
+                "beta": 1.4705266903790521,
+                "radius": 18.004760280408522,
+                "positionTargetX": -1.2450006241743097,
+                "positionTargetY": 0.95837460058915,
+                "positionTargetZ": -0.8269142111831487,
+                "type": "orbit",
+                "img": "1746509593091.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.62,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 23,
+                "sort": 23
+            },
+        ];
+
+        for (let i = 0; i < addConfig_4.length; i++) {
+            addConfig.push(addConfig_4[i]);
+        }
+
+        let addConfig_5 = [
+            {
+                "id": 1746599976770,
+                "name": "在施工范围放置警示标识1",
+                "positionX": -11.062909651580956,
+                "positionY": 1.567312740754828,
+                "positionZ": -0.6596702102399319,
+                "alpha": 3.168546818577674,
+                "beta": 1.4341249348333405,
+                "radius": 10.84540675866095,
+                "positionTargetX": -0.32253914123361405,
+                "positionTargetY": 0.08966612453935285,
+                "positionTargetZ": -0.37010236178851963,
+                "type": "orbit",
+                "img": "1746686260862.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 0,
+                "sort": 0
+            },
+            {
+                "id": 1746599976770,
+                "name": "在施工范围放置警示标识2",
+                "positionX": 5.895140974775633,
+                "positionY": 2.003112837228017,
+                "positionZ": 17.20076096104638,
+                "alpha": 1.153349136368594,
+                "beta": 1.4358386809047132,
+                "radius": 14.887681299717682,
+                "positionTargetX": -0.08586050761077768,
+                "positionTargetY": 0,
+                "positionTargetZ": 3.7152793340896526,
+                "type": "orbit",
+                "img": "1746686295062.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 1,
+                "sort": 1
+            },
+            {
+                "id": 1746599976770,
+                "name": "从水管固定座上拧下高压水管1",
+                "positionX": -4.5305148502358765,
+                "positionY": 1.7923679325345554,
+                "positionZ": -3.670284516675792,
+                "alpha": 3.1233953420442013,
+                "beta": 1.5430879677413454,
+                "radius": 3.8126092595593106,
+                "positionTargetX": -0.7200000665331707,
+                "positionTargetY": 1.686740303441562,
+                "positionTargetZ": -3.7396332962808416,
+                "type": "orbit",
+                "img": "1746686385279.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 2,
+                "sort": 2
+            },
+            {
+                "id": 1746599976770,
+                "name": "从水管固定座上拧下高压水管2",
+                "positionX": -6.104309159459012,
+                "positionY": 2.6469427446994276,
+                "positionZ": -7.086133701775275,
+                "alpha": 3.735201858811502,
+                "beta": 1.424440874044431,
+                "radius": 6.494968687462418,
+                "positionTargetX": -0.7780106580477684,
+                "positionTargetY": 1.6997585658066499,
+                "positionTargetZ": -3.4919711211124542,
+                "type": "orbit",
+                "img": "1746686752906.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 3,
+                "sort": 3
+            },
+            {
+                "id": 1746599976770,
+                "name": "调整卷筒器到合适位置1",
+                "positionX": -3.424078575576579,
+                "positionY": 1.8273008980576617,
+                "positionZ": -5.453580030536131,
+                "alpha": 3.629108403319293,
+                "beta": 1.5299485884386548,
+                "radius": 3.4261451965791268,
+                "positionTargetX": -0.3996067145173394,
+                "positionTargetY": 1.6873895309716658,
+                "positionTargetZ": -3.8500010087653878,
+                "type": "orbit",
+                "img": "1746686818616.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 4,
+                "sort": 4
+            },
+            {
+                "id": 1746599976770,
+                "name": "调整卷筒器到合适位置2",
+                "positionX": 0.19868423801128515,
+                "positionY": 1.9589971443693381,
+                "positionZ": -8.781399724441162,
+                "alpha": 4.664974594276554,
+                "beta": 1.5274100195306544,
+                "radius": 5.943758110049632,
+                "positionTargetX": 0.48013319390126474,
+                "positionTargetY": 1.7012003247054017,
+                "positionTargetZ": -2.8499085328620675,
+                "type": "orbit",
+                "img": "1746686935670.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 5,
+                "sort": 5
+            },
+            {
+                "id": 1746599976770,
+                "name": "取出高压水管并放入布管器内1",
+                "positionX": 0.6629657921466616,
+                "positionY": 1.5692312580966463,
+                "positionZ": -6.828280184583496,
+                "alpha": 4.839036459313707,
+                "beta": 1.487335884629589,
+                "radius": 3.9434782842581577,
+                "positionTargetX": 0.16660203004028384,
+                "positionTargetY": 1.2404887777940823,
+                "positionTargetZ": -2.9300020549822,
+                "type": "orbit",
+                "img": "1746687140294.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 6,
+                "sort": 6
+            },
+            {
+                "id": 1746599976770,
+                "name": "取出高压水管并放入布管器内2",
+                "positionX": -0.23526922388289473,
+                "positionY": 1.3872147104622783,
+                "positionZ": -7.076661431452244,
+                "alpha": 4.475796901980985,
+                "beta": 1.5431595546231793,
+                "radius": 2.282496750326612,
+                "positionTargetX": 0.2995231922264596,
+                "positionTargetY": 1.3241418975826582,
+                "positionTargetZ": -4.85859689064219,
+                "type": "orbit",
+                "img": "1746687166703.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 7,
+                "sort": 7
+            },
+            {
+                "id": 1746599976770,
+                "name": "套上高压水管护管器1",
+                "positionX": -5.831117367968357,
+                "positionY": 2.115304308630285,
+                "positionZ": -4.97612204024316,
+                "alpha": 2.4985574202378373,
+                "beta": 1.234810019005932,
+                "radius": 6.006066237914218,
+                "positionTargetX": -1.2933404494964043,
+                "positionTargetY": 0.13510133270264468,
+                "positionTargetZ": -8.376152696946649,
+                "type": "orbit",
+                "img": "1746687243589.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 8,
+                "sort": 8
+            },
+            {
+                "id": 1746599976770,
+                "name": "套上高压水管护管器2",
+                "positionX": 6.823439499756979,
+                "positionY": 1.235535629379917,
+                "positionZ": -6.956429622098076,
+                "alpha": 0.450113719533185,
+                "beta": 1.382424687370492,
+                "radius": 5.350251714471787,
+                "positionTargetX": 2.0913022823136878,
+                "positionTargetY": 0.23364969593819507,
+                "positionTargetZ": -9.242976219014038,
+                "type": "orbit",
+                "img": "1746687361885.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 9,
+                "sort": 9
+            },
+            {
+                "id": 1746599976770,
+                "name": "安装合适的高压喷头1",
+                "positionX": -5.720105584296169,
+                "positionY": 1.412619445812376,
+                "positionZ": -4.585766388678934,
+                "alpha": -3.5466875271952745,
+                "beta": 1.322972831951808,
+                "radius": 4.848680088787752,
+                "positionTargetX": -1.3999980986118317,
+                "positionTargetY": 0.22326473242437883,
+                "positionTargetZ": -6.438279622446162,
+                "type": "orbit",
+                "img": "1746687853777.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 10,
+                "sort": 10
+            },
+            {
+                "id": 1746599976770,
+                "name": "安装合适的高压喷头2",
+                "positionX": 4.719260357345139,
+                "positionY": 1.3013592690517888,
+                "positionZ": -12.799136302211721,
+                "alpha": -0.5930994522776689,
+                "beta": 1.307277670223053,
+                "radius": 3.3610638748995,
+                "positionTargetX": 2.0284350122959074,
+                "positionTargetY": 0.4258715427528267,
+                "positionTargetZ": -10.98537485850006,
+                "type": "orbit",
+                "img": "1746687932270.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 11,
+                "sort": 11
+            },
+            {
+                "id": 1746599976770,
+                "name": "将高压水管放入待施工的管道内1",
+                "positionX": 4.562701305773981,
+                "positionY": 1.236191384607752,
+                "positionZ": -6.7019612343293975,
+                "alpha": 1.1573424663689522,
+                "beta": 1.4167367118216148,
+                "radius": 6.959983926730568,
+                "positionTargetX": 1.7994760319325516,
+                "positionTargetY": 0.1681754484412592,
+                "positionTargetZ": -13.000000953674316,
+                "type": "orbit",
+                "img": "1746688550851.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 12,
+                "sort": 12
+            },
+            {
+                "id": 1746599976770,
+                "name": "将高压水管放入待施工的管道内2",
+                "positionX": 0.03754516797396912,
+                "positionY": 1.1727222680329779,
+                "positionZ": -5.71966699001836,
+                "alpha": -4.46206360214299,
+                "beta": 1.4374943719576005,
+                "radius": 7.596652229792342,
+                "positionTargetX": 1.9026870292275289,
+                "positionTargetY": 0.16307004036189332,
+                "positionTargetZ": -13.014252195289965,
+                "type": "orbit",
+                "img": "1746688572392.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 13,
+                "sort": 13
+            },
+            {
+                "id": 1746599976770,
+                "name": "在触屏操作面板上将管长清零1",
+                "positionX": 1.2682423048456481,
+                "positionY": 1.4553934125650863,
+                "positionZ": -5.904580751283442,
+                "alpha": -1.280675713042418,
+                "beta": 1.592,
+                "radius": 3.197310319409803,
+                "positionTargetX": 0.3538003776516659,
+                "positionTargetY": 1.5231830557907036,
+                "positionTargetZ": -2.841576702205884,
+                "type": "orbit",
+                "img": "1746688184600.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 14,
+                "sort": 14
+            },
+            {
+                "id": 1746599976770,
+                "name": "在触屏操作面板上将管长清零2",
+                "positionX": 1.0101177117062945,
+                "positionY": 1.6266403818535176,
+                "positionZ": -5.504921826305079,
+                "alpha": -1.4210483282579907,
+                "beta": 1.516000000000003,
+                "radius": 1.7914786507264282,
+                "positionTargetX": 0.7432500374603505,
+                "positionTargetY": 1.5285230512633183,
+                "positionTargetZ": -3.736150956494917,
+                "type": "orbit",
+                "img": "1746688208764.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 15,
+                "sort": 15
+            },
+            {
+                "id": 1746599976770,
+                "name": "在安全的情况开启冲水开关1",
+                "positionX": 1.2592122729535424,
+                "positionY": 1.432036919628543,
+                "positionZ": -5.523214934103283,
+                "alpha": -1.2174913714947737,
+                "beta": 1.5026406614818708,
+                "radius": 1.8745114352476004,
+                "positionTargetX": 0.612136164587445,
+                "positionTargetY": 1.3043772332274102,
+                "positionTargetZ": -3.768567210107446,
+                "type": "orbit",
+                "img": "1746688683284.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 16,
+                "sort": 16
+            },
+            {
+                "id": 1746599976770,
+                "name": "在安全的情况开启冲水开关2",
+                "positionX": 0.7397286259322479,
+                "positionY": 1.2205219952352808,
+                "positionZ": -5.6346223800560225,
+                "alpha": -1.661809575342634,
+                "beta": 1.6,
+                "radius": 2.0244463273767774,
+                "positionTargetX": 0.9236473404537421,
+                "positionTargetY": 1.2796348609192814,
+                "positionTargetZ": -3.619414572412179,
+                "type": "orbit",
+                "img": "1746688726919.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 17,
+                "sort": 17
+            },
+            {
+                "id": 1746599976770,
+                "name": "根据现场工况调节冲水压力1",
+                "positionX": 3.7988549378995575,
+                "positionY": 1.8772374028001477,
+                "positionZ": 1.0004246048827188,
+                "alpha": -4.826087362335187,
+                "beta": 1.4641545405125986,
+                "radius": 15.727587381429045,
+                "positionTargetX": 2.0246406140023434,
+                "positionTargetY": 0.20319660210869173,
+                "positionTargetZ": -14.536845289502988,
+                "type": "orbit",
+                "img": "1746688850886.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 86,
+                "sort": 86
+            },
+            {
+                "id": 1746599976770,
+                "name": "根据现场工况调节冲水压力2",
+                "positionX": 2.39443815080495,
+                "positionY": 1.1168919402995516,
+                "positionZ": 1.0986762276259778,
+                "alpha": 1.5831749543714657,
+                "beta": 1.5381374715913803,
+                "radius": 14.107280173026712,
+                "positionTargetX": 2.5689693395414293,
+                "positionTargetY": 0.656246217522052,
+                "positionTargetZ": -13.000000953674316,
+                "type": "orbit",
+                "img": "1746752537208.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 87,
+                "sort": 87
+            },
+            {
+                "id": 1746599976770,
+                "name": "疏通管道后减小油门到初始状态1",
+                "positionX": -1.3596407462728872,
+                "positionY": 1.6299720697763749,
+                "positionZ": -19.853212003382247,
+                "alpha": 4.298788776638211,
+                "beta": 1.4250044107529123,
+                "radius": 7.196700239699566,
+                "positionTargetX": 1.502089535165604,
+                "positionTargetY": 0.5844643182872985,
+                "positionTargetZ": -13.333249758248765,
+                "type": "orbit",
+                "img": "1746689025287.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 88,
+                "sort": 88
+            },
+            {
+                "id": 1746599976770,
+                "name": "疏通管道后减小油门到初始状态2",
+                "positionX": -2.7192456557044022,
+                "positionY": 1.8953201738342385,
+                "positionZ": -19.02439368671931,
+                "alpha": 4.085226744002013,
+                "beta": 1.410747390577734,
+                "radius": 7.312189385195736,
+                "positionTargetX": 1.5170651275652935,
+                "positionTargetY": 0.7300020155410099,
+                "positionTargetZ": -13.179411382000659,
+                "type": "orbit",
+                "img": "1746752571420.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 89,
+                "sort": 89
+            },
+            {
+                "id": 1746599976770,
+                "name": "带压收回高压水管1",
+                "positionX": -0.28205701654946524,
+                "positionY": 1.6690068948005208,
+                "positionZ": -8.17522957888866,
+                "alpha": 4.538358644957363,
+                "beta": 1.5226012863870042,
+                "radius": 3.527358701413789,
+                "positionTargetX": 0.3280072319044798,
+                "positionTargetY": 1.4990715040602938,
+                "positionTargetZ": -4.705185921501643,
+                "type": "orbit",
+                "img": "1746754963083.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 90,
+                "sort": 90
+            },
+            {
+                "id": 1746599976770,
+                "name": "带压收回高压水管2",
+                "positionX": 1.6548928758242871,
+                "positionY": 1.4953834554684096,
+                "positionZ": -9.031185842377536,
+                "alpha": 5.014898233150312,
+                "beta": 1.5042889329914026,
+                "radius": 4.3728201101621424,
+                "positionTargetX": 0.3550379011300058,
+                "positionTargetY": 1.2047729366723592,
+                "positionTargetZ": -4.866155435889958,
+                "type": "orbit",
+                "img": "1746755106437.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 91,
+                "sort": 91
+            },
+            {
+                "id": 1746599976770,
+                "name": "至触摸屏关闭冲水开关1",
+                "positionX": 0.7190571142202778,
+                "positionY": 1.4799850580535199,
+                "positionZ": -6.5202733511553586,
+                "alpha": 4.817593884737548,
+                "beta": 1.5870027598860856,
+                "radius": 3.1744592608027564,
+                "positionTargetX": 0.38574793173663147,
+                "positionTargetY": 1.5314294676294764,
+                "positionTargetZ": -3.3637800341828914,
+                "type": "orbit",
+                "img": "1746755183176.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 92,
+                "sort": 92
+            },
+            {
+                "id": 1746599976770,
+                "name": "至触摸屏关闭冲水开关2",
+                "positionX": 0.5830194258566432,
+                "positionY": 1.3559107523398541,
+                "positionZ": -5.853801530058806,
+                "alpha": 4.55689867109179,
+                "beta": 1.6,
+                "radius": 2.5892537873473933,
+                "positionTargetX": 0.9838319717938847,
+                "positionTargetY": 1.431515726047201,
+                "positionTargetZ": -3.2968759608912497,
+                "type": "orbit",
+                "img": "1746755204933.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 93,
+                "sort": 93
+            },
+            {
+                "id": 1746599976770,
+                "name": "缓慢收回高压水管1",
+                "positionX": -3.786920602018834,
+                "positionY": 1.6960154328001418,
+                "positionZ": -4.7053610749896455,
+                "alpha": 2.2795383114086194,
+                "beta": 1.3793941305168516,
+                "radius": 8.915338637688388,
+                "positionTargetX": 1.909919831001642,
+                "positionTargetY": -4.440892098500626e-16,
+                "positionTargetZ": -11.350118689610834,
+                "type": "orbit",
+                "img": "1746755265063.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 94,
+                "sort": 94
+            },
+            {
+                "id": 1746599976770,
+                "name": "缓慢收回高压水管2",
+                "positionX": 4.3951077522666955,
+                "positionY": 1.931317540306294,
+                "positionZ": -2.5458786229722463,
+                "alpha": 1.2894307021230345,
+                "beta": 1.3288487730900762,
+                "radius": 8.060795710700454,
+                "positionTargetX": 2.2220763928642397,
+                "positionTargetY": 0,
+                "positionTargetZ": -10.064148022189435,
+                "type": "orbit",
+                "img": "1746755286020.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 95,
+                "sort": 95
+            },
+            {
+                "id": 1746599976770,
+                "name": "拆卸高压喷头放入喷头机箱内1",
+                "positionX": 8.017935975870355,
+                "positionY": 2.2509378150372545,
+                "positionZ": -8.927157017665118,
+                "alpha": 0.09103825508263663,
+                "beta": 1.2110167918426156,
+                "radius": 6.3934765567909055,
+                "positionTargetX": 2.0585861831249996,
+                "positionTargetY": 0,
+                "positionTargetZ": -9.47118962953327,
+                "type": "orbit",
+                "img": "1746755335055.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 96,
+                "sort": 96
+            },
+            {
+                "id": 1746599976770,
+                "name": "拆卸高压喷头放入喷头机箱内2",
+                "positionX": -6.279086751205123,
+                "positionY": 2.9809455507240066,
+                "positionZ": -8.515554735076401,
+                "alpha": -3.106977405284071,
+                "beta": 1.1040425001899148,
+                "radius": 6.624474792772449,
+                "positionTargetX": -0.3667511762984672,
+                "positionTargetY": -4.440892098500626e-16,
+                "positionTargetZ": -8.310815990844858,
+                "type": "orbit",
+                "img": "1746755360902.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 97,
+                "sort": 97
+            },
+            {
+                "id": 1746599976770,
+                "name": "收起高压水管将卷筒恢复到初始状态1",
+                "positionX": 0.5548920751164333,
+                "positionY": 1.754754551898562,
+                "positionZ": -7.9526634800357145,
+                "alpha": -1.5545286800032727,
+                "beta": 1.4426559020309617,
+                "radius": 5.450505995235012,
+                "positionTargetX": 0.4669560057494953,
+                "positionTargetY": 1.0582341967232167,
+                "positionTargetZ": -2.5475601279596862,
+                "type": "orbit",
+                "img": "1746755453049.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 98,
+                "sort": 98
+            },
+            {
+                "id": 1746599976770,
+                "name": "收起高压水管将卷筒恢复到初始状态2",
+                "positionX": -0.09672950328291925,
+                "positionY": 1.6439510324179925,
+                "positionZ": -12.4041449094317,
+                "alpha": -1.5757666688074996,
+                "beta": 1.51387120450038,
+                "radius": 9.489631158557,
+                "positionTargetX": -0.04963938525325218,
+                "positionTargetY": 1.104044320339225,
+                "positionTargetZ": -2.930002056988946,
+                "type": "orbit",
+                "img": "1746755485215.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 99,
+                "sort": 99
+            },
+            {
+                "id": 1746599976770,
+                "name": "将高压水管拧到水管固定座1",
+                "positionX": -5.208483678842242,
+                "positionY": 2.1882611826888225,
+                "positionZ": -4.950115882511206,
+                "alpha": 3.4644260040729247,
+                "beta": 1.44913731723133,
+                "radius": 4.6303557399345765,
+                "positionTargetX": -0.84978705937765,
+                "positionTargetY": 1.62632528104186,
+                "positionTargetZ": -3.491971136522925,
+                "type": "orbit",
+                "img": "1746761789151.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 100,
+                "sort": 100
+            },
+            {
+                "id": 1746599976770,
+                "name": "将高压水管拧到水管固定座2",
+                "positionX": -5.4089956938307155,
+                "positionY": 2.0793723468834946,
+                "positionZ": -4.116415368800677,
+                "alpha": 3.2737222394543917,
+                "beta": 1.4781750952874053,
+                "radius": 4.76018137187443,
+                "positionTargetX": -0.7105316978174105,
+                "positionTargetY": 1.639108597828778,
+                "positionTargetZ": -3.4919711338402584,
+                "type": "orbit",
+                "img": "1746761804382.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 101,
+                "sort": 101
+            },
+            {
+                "id": 1746599976770,
+                "name": "回到驾驶室踩下车辆离合器5秒1",
+                "positionX": -3.8424759987192645,
+                "positionY": 1.8882831106629554,
+                "positionZ": -1.6524464627046407,
+                "alpha": 4.17865082922461,
+                "beta": 1.4938815242557493,
+                "radius": 5.403928837187472,
+                "positionTargetX": -1.1013278122715016,
+                "positionTargetY": 1.473050685302538,
+                "positionTargetZ": 2.9861023976879912,
+                "type": "orbit",
+                "img": "1746761869197.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 102,
+                "sort": 102
+            },
+            {
+                "id": 1746599976770,
+                "name": "回到驾驶室踩下车辆离合器5秒2",
+                "positionX": -0.8603617608644331,
+                "positionY": 1.8159110697667655,
+                "positionZ": 3.38847550261531,
+                "alpha": 4.342912918309821,
+                "beta": 0.9057430293675385,
+                "radius": 0.4812415736543647,
+                "positionTargetX": -0.7236097766634045,
+                "positionTargetY": 1.5189363785369938,
+                "positionTargetZ": 3.7416020802038465,
+                "type": "orbit",
+                "img": "1746761961783.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 103,
+                "sort": 103
+            },
+            {
+                "id": 1746599976770,
+                "name": "清洗车流程完成",
+                "positionX": -7.665433020454429,
+                "positionY": 2.862935561446686,
+                "positionZ": 10.767434468394168,
+                "alpha": -4.038972745070587,
+                "beta": 1.4501597474185424,
+                "radius": 10.601517397789964,
+                "positionTargetX": -1.1017424986262299,
+                "positionTargetY": 1.587104595823422,
+                "positionTargetZ": 2.5405034964908078,
+                "type": "orbit",
+                "img": "1746755852186.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 105,
+                "sort": 105
+            },
+            {
+                "id": 1746599976770,
+                "name": "熄火_1",
+                "positionX": -0.05129395338658049,
+                "positionY": 2.212228649658209,
+                "positionZ": 3.3144660438385642,
+                "alpha": 5.700783364829707,
+                "beta": 1.140892418268333,
+                "radius": 0.5839955629338291,
+                "positionTargetX": -0.49463457421542817,
+                "positionTargetY": 1.9688289602723985,
+                "positionTargetZ": 3.6064532056391867,
+                "type": "orbit",
+                "img": "1746771660194.png",
+                "stopTime": 1,
+                "toTime": 1.5,
+                "listHide": false,
+                "fpsExcessiveBool": false,
+                "lookMeshListBool": false,
+                "lookMeshList": "",
+                "lookMeshListHideBool": false,
+                "lookMeshListHide": "",
+                "loadingFirstOneLook": false,
+                "toRoleEyeOpen": false,
+                "activeCameraRadiusRegularOpen": false,
+                "activeCameraConfigOpen": true,
+                "activeCameraLowerBetaLimit": 0,
+                "activeCameraUpperBetaLimit": 1.6,
+                "gpsEventOpen": false,
+                "gpsEventSpeedMove": 0.15,
+                "gpsEventIndex": -1,
+                "gpsEventFor": true,
+                "gpsEventCameraVisualAngle": 1,
+                "gpsEventToGpsDownTime": 5,
+                "resetClipMeshAllOpen": false,
+                "clipMeshAnimationList": [],
+                "index": 104,
+                "sort": 104
+            },
+        ];
+
+        for (let i = 0; i < addConfig_5.length; i++) {
+            addConfig.push(addConfig_5[i]);
+        }
+
+        // 是否增加对应的视角
+        let addArrayJson = {};
+        for (let i = 0; i < addConfig.length; i++) {
+            // 默认增加
+            addArrayJson[i] = true;
+        }
+
+        // 循环遍历,判断是否不可增加
+        for (let i = 0; i < cameraVisualAngleJson.length; i++) {
+
+            let objJson = cameraVisualAngleJson[i];
+            
+            for (let key in addArrayJson) {
+
+                let arrJson = addConfig[key];
+                // console.log(
+                //     "objJson", objJson, arrJson
+                // );
+
+                if (objJson.name == arrJson.name) {
+                    // 不可添加
+                    addArrayJson[key] = false;
+                }
+
+            }
+
+        }
+        
+        // 开始添加视角
+        for (let key in addArrayJson) {
+
+            let bool = addArrayJson[key];
+            if (bool == true) {
+                let arrJson = addConfig[key];
+                ChengGuangYuanJing.CameraArray.find().cameraVisualAngleJson.push(arrJson);
+            }
+            
+        }
+
+        // console.log(
+        //     "ChengGuangYuanJing.CameraArray.find().cameraVisualAngleJson",
+        //     ChengGuangYuanJing.CameraArray.find().cameraVisualAngleJson
+        // );
+
+        return this;
+
+    }
+
+
+    
+
+    
+}
+
+
+
+
+
+
+
+
+
+
+

+ 277 - 0
src/components/ThreeWorldEventQingXiCheAndQv/js/QingXiCheAndQvThreeWorldEvent.js

@@ -0,0 +1,277 @@
+import { ComVal } from "../common/ComVal.js";
+import { QingXiCheAndQvCarEventClick } from "../js/QingXiCheAndQvCarEventClick.js";
+import { QingXiCheAndQvComHighlightLayer } from "../js/QingXiCheAndQvComHighlightLayer.js";
+
+/**
+ * 操作 3d场景 相关事件
+ */
+export class QingXiCheAndQvThreeWorldEvent {
+    
+    // 每次 new 出对象则会调用这个构造函数
+    constructor() {
+
+        // 已经封装好的,编辑器的类对象,内置可以直接调用的代码
+        this.objIframeEdit = null;
+        // iframe对象
+        this.objIframe = null;
+        // 3d世界的场景,后续要操作3d世界常用的对象
+        this.objScene = null;
+        // babylon 对象,懂babylon,就可以使用babylon的api去操作
+        this.BABYLON = null;
+
+        // 操作 Cesium 的类
+        this.objCesiumMain = null;
+
+        // 当前鼠标是否按住
+        this.clickPressBool = false;
+        // 记录鼠标最后一次点击的时间戳
+        this.clickTime = 0;
+        
+    }
+
+    /**
+     * 初始化方法
+     * objIframeEdit    已经封装好的,编辑器的类对象,内置可以直接调用的代码
+     * objIframe        iframe对象
+     * objScene         场景对象
+     * BABYLON          babylon.js对象,用于后续调用babylon的代码去创建更新等操作
+     * objCesiumMain    操作 Cesium 的类
+     */
+    initObj = function (objIframeEdit, objIframe, objScene, BABYLON, objCesiumMain) {
+        
+        if (this.objIframe != null && this.objIframe != undefined) {
+            return this;
+        }
+
+        this.objIframeEdit = objIframeEdit;
+        this.objIframe = objIframe;
+        this.objScene = objScene;
+        this.BABYLON = BABYLON;
+        
+        this.pointerEvent();
+        this.renderEvent();
+        
+        return this;
+
+    }
+    
+    /**
+     * 鼠标事件
+     */
+    pointerEvent = function() {
+
+        var thisClass = this;
+        var BABYLON = this.BABYLON;
+        var objScene = this.objScene;
+        
+        objScene.onPointerObservable.add(
+            (pointerInfo) => {
+                
+                
+                if (
+                    // 鼠标按住
+                    thisClass.clickPressBool == true
+                ) {
+
+                    // 获取选择的对象, 通过测试  scene.pick() 方法是非常消耗性能的
+                    let pickResultMove = objScene.pick(
+                        objScene.pointerX,
+                        objScene.pointerY
+                    );
+
+                    if (pickResultMove.hit) {
+
+                        // console.log(
+                        //     "鼠标按住移动触发逻辑",
+                        //     "pickResultMove", pickResultMove
+                        // );
+                        thisClass.clickMoveEvent(pickResultMove);
+                        
+                    }
+                    
+                }
+                
+                // 如果点击到3d世界里的物体的时候
+                if (pointerInfo.pickInfo.hit) {
+                    
+                    var pickResult = pointerInfo.pickInfo;
+                    switch (pointerInfo.type) {
+
+                        case BABYLON.PointerEventTypes.POINTERDOWN:
+                            // console.log("clickType 鼠标按下");
+                            thisClass.clickEvent(pickResult);
+                            break;
+                        case BABYLON.PointerEventTypes.POINTERUP:
+                            // console.log("clickType 鼠标弹起");
+                            thisClass.clickUpEvent(pickResult);
+                            break;
+                        case BABYLON.PointerEventTypes.POINTERMOVE:
+                            // console.log("clickType 鼠标移动中");
+                            
+                            break;
+                        case BABYLON.PointerEventTypes.POINTERWHEEL:
+                            // console.log("clickType 鼠标滚轮滚动中");
+                            break;
+                        case BABYLON.PointerEventTypes.POINTERPICK:
+                            // console.log("clickType 鼠标指针选中事件");
+                            break;
+                        case BABYLON.PointerEventTypes.POINTERTAP:
+                            // console.log("clickType 当对象被触摸并在没有拖动的情况下释放时,触发指针触发事件。");
+                            break;
+                        case BABYLON.PointerEventTypes.POINTERDOUBLETAP:
+                            // console.log("clickType 鼠标双击");
+                            break;
+                    }
+
+                }
+            
+            }
+
+        );
+        
+    }
+    
+    /**
+     * 点击事件
+     * pickResult       返回的鼠标参数
+     */
+    clickEvent = function(pickResult) {
+        
+        var thisClass = this;
+        var BABYLON = this.BABYLON;
+        var objScene = this.objScene;
+
+        this.clickPressBool = true;
+        this.clickTime = new Date().getTime();
+        
+        var objMesh = pickResult.pickedMesh;
+        var objPosition = pickResult.pickedPoint;
+        // 获取点击对象的方向【 一定要加上 true,否则载入的获取模型的方向,会有问题 】
+        // eslint-disable-next-line no-unused-vars
+        var getNormal = pickResult.getNormal(true);
+
+        // console.log(
+        //     "鼠标点击事件",
+        //     // pickResult
+        //     objMesh, objPosition, getNormal
+        // );
+
+        QingXiCheAndQvCarEventClick.find().clickMeshEvent(pickResult);
+
+    }
+    
+    /**
+     * 鼠标弹起事件
+     * pickResult       返回的鼠标参数
+     */
+    clickUpEvent = function(pickResult) {
+        
+        var thisClass = this;
+        var objScene = this.objScene;
+        var objIframe = this.objIframe;
+        var BABYLON = this.BABYLON;
+
+        this.clickPressBool = false;
+        var thisTime = new Date().getTime();
+        // 与点击相差时间
+        var upTime = thisTime - this.clickTime;
+        
+        var objMesh = pickResult.pickedMesh;
+        var objPosition = pickResult.pickedPoint;
+        // 获取点击对象的方向【 一定要加上 true,否则载入的获取模型的方向,会有问题 】
+        // eslint-disable-next-line no-unused-vars
+        var getNormal = pickResult.getNormal(true);
+
+        // console.log(
+        //     "鼠标弹起事件", upTime,
+        //     // pickResult
+        //     objMesh, objPosition, getNormal
+        // );
+        
+        QingXiCheAndQvCarEventClick.find().main(pickResult);
+        
+    }
+
+
+    /**
+     * 鼠标按住并且拖拽事件
+     * pickResult       返回的鼠标参数
+     */
+    clickMoveEvent = function(pickResult) {
+
+        // 不存在要拖拽移动的物体,则不触发后面逻辑,要不然一直触后面逻辑,会影响性能
+        if (QingXiCheAndQvCarEventClick.find().moveMeshList.length <= 0) {
+            return;
+        }
+        
+        var thisClass = this;
+        var objScene = this.objScene;
+        var objIframe = this.objIframe;
+        var BABYLON = this.BABYLON;
+
+        var objMesh = pickResult.pickedMesh;
+        var objPosition = pickResult.pickedPoint;
+        // 获取点击对象的方向【 一定要加上 true,否则载入的获取模型的方向,会有问题 】
+        // eslint-disable-next-line no-unused-vars
+        var getNormal = pickResult.getNormal(true);
+
+        // console.log(
+        //     "鼠标按住拖拽事件",
+        //     // pickResult
+        //     objMesh, objPosition, getNormal
+        // );
+
+        QingXiCheAndQvCarEventClick.find().clickMoveMeshEvent(pickResult);
+        
+    
+    }
+
+    /**
+     * 帧事件
+     */
+    renderEvent = function() {
+        
+        var thisClass = this;
+        var objScene = this.objScene;
+        var objIframe = this.objIframe;
+        var BABYLON = this.BABYLON;
+        
+        // 添加帧事件
+        objScene.onBeforeRenderObservable.add(function() {
+            
+            // console.log("帧事件触发");
+            ComVal.find().fpsEventMain();
+
+            QingXiCheAndQvComHighlightLayer.find().flickerBoolEvent();
+
+            if (
+                QingXiCheAndQvCarEventClick.find().moveCameraRadius != null && QingXiCheAndQvCarEventClick.find().moveCameraRadius != undefined
+                && QingXiCheAndQvCarEventClick.find().moveCameraAlpha != null && QingXiCheAndQvCarEventClick.find().moveCameraAlpha != undefined
+                && QingXiCheAndQvCarEventClick.find().moveCameraBeta != null && QingXiCheAndQvCarEventClick.find().moveCameraBeta != undefined
+            ) {
+
+                let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+                let objSceneActiveCamera = ChengGuangYuanJing.CommonVal.find().objSceneActiveCamera;
+                objSceneActiveCamera.radius = QingXiCheAndQvCarEventClick.find().moveCameraRadius;
+                objSceneActiveCamera.alpha = QingXiCheAndQvCarEventClick.find().moveCameraAlpha;
+                objSceneActiveCamera.beta = QingXiCheAndQvCarEventClick.find().moveCameraBeta;
+                
+            }
+            
+        });
+        
+    }
+    
+    
+}
+
+
+
+
+
+
+
+
+
+
+

+ 267 - 0
src/components/ThreeWorldEventQingXiCheAndQv/js/QingXiCheAndQvThreeWorldEventMain.js

@@ -0,0 +1,267 @@
+import { QingXiCheAndQvThreeWorldEvent } from './QingXiCheAndQvThreeWorldEvent.js';
+
+/**
+ * 操作3d世界的,单例模式的类对象
+ */
+export class QingXiCheAndQvThreeWorldEventMain {
+    
+    // 每次 new 出对象则会调用这个构造函数
+    constructor() {
+
+        // 已经封装好的,编辑器的类对象,内置可以直接调用的代码
+        this.objIframeEdit = null;
+        // iframe对象
+        this.objIframe = null;
+        // 3d世界的场景,后续要操作3d世界常用的对象
+        this.objScene = null;
+        // babylon 对象,懂babylon,就可以使用babylon的api去操作
+        this.BABYLON = null;
+
+        // 渲染引擎babylon
+        this.objEngine = null;
+
+        // 处理3d世界的各种事件
+        this.objThreeWorldEvent = null;
+
+    }
+
+    // 实现单例模式
+    static find() {
+        if (!QingXiCheAndQvThreeWorldEventMain.instance) {
+            QingXiCheAndQvThreeWorldEventMain.instance = new QingXiCheAndQvThreeWorldEventMain();
+        }
+        return QingXiCheAndQvThreeWorldEventMain.instance;
+    }
+
+    /**
+     * 初始化方法
+     * objIframeEdit    已经封装好的,编辑器的类对象,内置可以直接调用的代码
+     * objIframe        iframe对象
+     * objScene         场景对象
+     * BABYLON          babylon.js对象,用于后续调用babylon的代码去创建更新等操作
+     */
+    initObj = function (objIframeEdit, objIframe, objScene, BABYLON) {
+        
+        if (this.objIframe != null && this.objIframe != undefined) {
+            return this;
+        }
+        
+        this.objIframeEdit = objIframeEdit;
+        this.objIframe = objIframe;
+        this.objScene = objScene;
+        this.BABYLON = BABYLON;
+
+        let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+        this.objEngine = ChengGuangYuanJing.CommonVal.find().objEngine;
+        
+        this.initClass();
+        
+        return this;
+
+    }
+
+    /**
+     * 初始化其他会用到的类对象
+     */
+    initClass = function() {
+
+        this.objThreeWorldEvent = new QingXiCheAndQvThreeWorldEvent();
+        this.objThreeWorldEvent.initObj(
+            this.objIframeEdit,
+            this.objIframe,
+            this.objScene,
+            this.BABYLON
+        );
+        
+        return this;
+
+    }
+
+    /**
+     * 切换到飞行模式,切换到指定的视角
+     */
+    toFlyModel = function() {
+
+        this.objIframeEdit.modelPeopleLook(3);
+        return this;
+
+    }
+
+    /**
+     * 切换到第三人称
+     */
+    toRoleEvent = function() {
+        
+        var thisClass = this;
+
+        this.objIframeEdit.modelPeopleLook(1);
+
+        setTimeout(function() {
+
+            thisClass.coordinateMoveSphereFollowUpdate();
+
+        }, 1500);
+
+        return this;
+
+    }
+
+    /**
+     * 将当前移动的视角,切换成角色所在视角
+     */
+    coordinateMoveSphereFollowUpdate = function() {
+        
+        var objIframeEdit = this.objIframeEdit;
+        var objIframe = this.objIframe;
+        var scene = this.objScene;
+        var BABYLON = this.BABYLON;
+
+        var ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
+
+        // 解决后续切换相机是同名字的时候,视角变成直接跳转的问题
+        ChengGuangYuanJing.CommonVal.find().cameraConfigUpdateOrRecord('record');
+
+        // // 将当前移动的视角,切换成角色所在视角
+        // ChengGuangYuanJing.EventMoveRole.find().coordinateMoveSphereFollow.position
+        // = new BABYLON.Vector3(
+        //     ChengGuangYuanJing.Role.find().objRole.position.x,
+        //     ChengGuangYuanJing.Role.find().objRole.position.y,
+        //     ChengGuangYuanJing.Role.find().objRole.position.z
+        // );
+        
+        return this;
+
+    }
+
+
+    
+    /**
+     * 将所有设置为地面的,改为不设置为地面
+     */
+    groundNoRemove = function() {
+        
+        var ChengGuangYuanJing = this.objIframe.ChengGuangYuanJing;
+
+        for (const key in ChengGuangYuanJing.ModelObjEdit.find().meshListIdToJson) {
+            
+            if (
+                ChengGuangYuanJing.ModelObjEdit.find().meshListIdToJson[key]['isGround'] == true
+            ) {
+                // 通过更新材质的参数,来更新
+                ChengGuangYuanJing.ModelObjEdit.find().objOneMeshListIdToJsonUpdate(
+                    key,
+                    {
+                        
+                        "isGround" : false,
+                    }
+                );
+            }
+            
+        }
+        
+        for (let i = 0; i < ChengGuangYuanJing.CommonVal.find().objScene.meshes.length; i++) {
+            
+            let objMesh = ChengGuangYuanJing.CommonVal.find().objScene.meshes[i];
+            // console.log(
+            //     "myIsGround",
+            //     objMesh["myIsGround"]
+            // );
+            // if (objMesh["myIsGround"] == true) {
+            //     delete objMesh["myIsGround"];
+            // }
+
+            delete objMesh["myIsGround"];
+        }
+        
+        ChengGuangYuanJing.Role.find().isGroundList = {};
+        ChengGuangYuanJing.ModelObjEdit.find().myIsGroundConfigNum = 0;
+
+        return this;
+
+    }
+
+
+
+    /**
+     * 切换指定名字的视角
+     * name     3d编辑器里,定义好的视角名字
+     */
+    eyeNameLook = function(name) {
+
+        var objIframeEdit = this.objIframeEdit;
+        var objIframe = this.objIframe;
+        var scene = this.objScene;
+        var BABYLON = this.BABYLON;
+        
+        // 切换到指定名字视角
+        objIframeEdit.cameraVisualAngleGetListNameGpsTo(name);
+        // 不显示角色
+        objIframeEdit.roleShow(false);
+        
+    }
+
+
+    /**
+     * 因为进入更换视角后
+     * 然后又要回到人物视角,之前会根据出生地来回去
+     * 
+     * 所以
+     * 将人物的出生地更新到,最后一次人物的坐标
+     */
+    commonBirthplaceUpdate = function() {
+
+        var objIframeEdit = this.objIframeEdit;
+        var objIframe = this.objIframe;
+        var scene = this.objScene;
+        var BABYLON = this.BABYLON;
+        var ChengGuangYuanJing = this.objIframe.ChengGuangYuanJing;
+
+        var absolutePosition = ChengGuangYuanJing.Role.find().objRole._absolutePosition;
+        var absolutePositionNew = JSON.parse(JSON.stringify({
+            "x" : absolutePosition.x,
+            "y" : absolutePosition.y,
+            "z" : absolutePosition.z,
+        }));
+
+        for (var i = 0; i < ChengGuangYuanJing.CommonBirthplace.find().list.length; i++) {
+
+            var thisList = ChengGuangYuanJing.CommonBirthplace.find().list[i];
+            // console.log(
+            //     "thisList", thisList, absolutePositionNew
+            // );
+
+            thisList.position.x = absolutePositionNew.x;
+            thisList.position.y = absolutePositionNew.y;
+            thisList.position.z = absolutePositionNew.z;
+
+            thisList.positionTarget.x = absolutePositionNew.x;
+            thisList.positionTarget.y = absolutePositionNew.y;
+            thisList.positionTarget.z = absolutePositionNew.z;
+
+        }
+
+        // ChengGuangYuanJing.CommonVal.find().roleConfig.position.x = absolutePositionNew.x;
+        // ChengGuangYuanJing.CommonVal.find().roleConfig.position.y = absolutePositionNew.y;
+        // ChengGuangYuanJing.CommonVal.find().roleConfig.position.z = absolutePositionNew.z;
+
+        ChengGuangYuanJing.CommonVal.find().roleConfig.positionTarget.x = absolutePositionNew.x;
+        ChengGuangYuanJing.CommonVal.find().roleConfig.positionTarget.y = absolutePositionNew.y;
+        ChengGuangYuanJing.CommonVal.find().roleConfig.positionTarget.z = absolutePositionNew.z;
+        
+    }
+
+
+    
+
+}
+
+
+
+
+
+
+
+
+
+
+

+ 61 - 0
src/components/ThreeWorldEventQingXiCheAndQv/store/QingXiCheAndQvMyThreeWorldStore.js

@@ -0,0 +1,61 @@
+import { defineStore } from 'pinia'
+import { ref, watch } from "vue";
+
+export const QingXiCheAndQvMyThreeWorldStore = defineStore('QingXiCheAndQvMyThreeWorldStore', () => {
+
+    /**
+     * 统一放置全局用到的对象,变量等参数
+     */
+    const obj = ref({
+
+        // 加载百分比
+        loadPercentage : 0,
+        // 计时器
+        thisTimeObj : null,
+        // 记录当前时间
+        thisTime : "0000-00-00 00:00:00",
+
+        // 菜单
+        menu : {
+
+            // 1、城市供水管道巡查调度虚拟仿真
+            mapGps : false,
+            // 2、城市供水管道维护清洗虚拟仿真
+            waterPipe : true,
+            // 3、城市供水管道检测虚拟仿真
+            look : false,
+            // 4、城市供水管道数智修复虚拟仿真
+            repair : false,
+            // 回到人物视角
+            roleLook : false,
+
+        },
+
+        // 首页选择菜单
+        SelectEventViewOpen : true,
+        // 对应选择的菜单配置
+        SelectEventConfig : null,
+
+        // 对应选择的类别
+        SelectTypeEventViewOpen : false,
+        // 对应选择的类别配置
+        SelectTypeEventConfig : null,
+
+        // 进入三维试验后,弹出的固定返回按钮
+        ComReturnViewOpen : false,
+
+        // 弹出显示的视频
+        VideoViewOpen : false,
+
+        // 弹出PDF预览
+        LookPdfViewOpen : false,
+
+
+        
+    });
+    
+    return {
+        obj,
+    }
+
+})

+ 130 - 0
src/components/WindowQingXiCheAndQv/WindowCountdown.vue

@@ -0,0 +1,130 @@
+<script setup>
+import dayjs from "dayjs";
+import { computed, onMounted, onUnmounted, ref } from "vue";
+import { WindowCountdownStore } from "@/components/WindowQingXiCheAndQv/store/WindowCountdownStore.js";
+import { ComVal } from "../ThreeWorldEventQingXiCheAndQv/common/ComVal.js";
+
+
+let txtCode = "WindowCountdown";
+
+/**
+ * 退出的逻辑
+ */
+const exitEvent = () => {
+    ComVal.find().fpsEventDel(txtCode);
+
+    if (typeof WindowCountdownStore().obj.callbackEvent == "function") {
+        WindowCountdownStore().obj.callbackEvent(
+            WindowCountdownStore().obj.myJson
+        );
+    }
+
+    WindowCountdownStore().obj.viewOpen = false;
+    WindowCountdownStore().obj.callbackEvent = null;
+    WindowCountdownStore().obj.myJson = null;
+}
+
+onMounted(() => {
+    txtEvent();
+});
+
+
+/**
+ * 倒计时展示的逻辑
+ */
+const txtEvent = () => {
+    
+    ComVal.find().fpsEventDel(txtCode);
+    ComVal.find().fpsEventAdd(txtCode, null, (1000 / 1), function(fpsEventAddRet) {
+        
+        WindowCountdownStore().obj.num = parseInt(WindowCountdownStore().obj.num) - 1;
+        if (WindowCountdownStore().obj.num <= 0) {
+            ComVal.find().fpsEventDel(fpsEventAddRet.code);
+            exitEvent();
+        }
+
+    });
+    
+}
+
+</script>
+
+<template>
+    <div class="WindowCountdown">
+        
+        <div class="main">
+            
+            <div class="yuan">
+                {{ WindowCountdownStore().obj.num }}
+            </div>
+
+        </div>
+
+    </div>
+</template>
+
+<style lang="less" >
+* {
+    box-sizing:border-box;
+    -moz-box-sizing:border-box; /* Firefox */
+    -webkit-box-sizing:border-box; /* Safari */
+}
+</style>
+
+<style lang="less" scoped>
+.WindowCountdown * {
+    -moz-user-select: none;
+    -webkit-user-select: none;
+    -ms-user-select: none;
+    -khtml-user-select: none;
+    user-select: none;
+}
+
+.WindowCountdown {
+    position: fixed;
+    z-index: 0;
+    width: 0px;
+    height: 0px;
+    top: 0px;
+    left: 0px;
+    z-index: 1000;
+
+    .main {
+
+        position: fixed;
+        width: 100%;
+        height: 100%;
+        top: 0px;
+        left: 0px;
+        background-color: #00000050;
+
+        .yuan {
+            
+            position: fixed;
+            width: 15rem;
+            height: 15rem;
+            border-radius: 50%;
+            top: 50%;
+            left: 50%;
+            margin: -7.5rem 0px 0px -7.5rem;
+
+            background-image: url("../../assets/res/img/window/yuan.svg");
+            background-position: center;
+            background-size: 100% 100%;
+
+            display: flex;
+            flex-direction: column;
+            justify-content: center;
+            align-items: center;
+
+            font-size: 10rem;
+            font-weight: 500;
+            color: #ffffff;
+
+        }
+
+    }
+
+    
+}
+</style>

+ 183 - 0
src/components/WindowQingXiCheAndQv/WindowTxt.vue

@@ -0,0 +1,183 @@
+<script setup>
+import dayjs from "dayjs";
+import { computed, onMounted, onUnmounted, ref } from "vue";
+import { WindowTxtStore } from "@/components/WindowQingXiCheAndQv/store/WindowTxtStore.js";
+import { ComVal } from "../ThreeWorldEventQingXiCheAndQv/common/ComVal.js";
+
+// 当前展示的内容
+let txt = ref("");
+
+let txtCode = "WindowTxt";
+
+/**
+ * 退出的逻辑
+ */
+const exitEvent = () => {
+    ComVal.find().fpsEventDel(txtCode);
+    WindowTxtStore().obj.WindowTxtViewOpen = false;
+}
+
+onMounted(() => {
+    txtEvent();
+});
+
+
+/**
+ * 一个一个字展示的逻辑
+ */
+const txtEvent = () => {
+
+    // console.log(
+    //     "WindowTxtStore().obj.WindowTxtViewTxt 开始展示文字",
+    //     WindowTxtStore().obj.WindowTxtViewTxt
+    // );
+
+    if (typeof WindowTxtStore().obj.WindowTxtViewTxt != "string") {
+        return;
+    }
+
+    // 分割字符串
+    var txtArray = WindowTxtStore().obj.WindowTxtViewTxt.split("");
+    // 开始从第一个文字写入
+    var txtArrayIndex = -1;
+    
+    ComVal.find().fpsEventDel(txtCode);
+    ComVal.find().fpsEventAdd(txtCode, null, (1000 / 15), function(fpsEventAddRet) {
+
+        try {
+
+            // 写入完成了
+            if (txtArrayIndex > txtArray.length) {
+                ComVal.find().fpsEventDel(fpsEventAddRet.code);
+                return;
+            }
+
+            var editTxt = "";
+            for (var i = 0; i < txtArrayIndex; i++) {
+                if (txtArray[i] == null || txtArray[i] == undefined) {
+                    continue;
+                }
+
+                editTxt += txtArray[i];
+            }
+
+            txtArrayIndex += 1;
+
+            // console.log("本次写入的文字", editTxt);
+            txt.value = editTxt;
+
+        } catch (e) {
+            ComVal.find().fpsEventDel(fpsEventAddRet.code);
+            return;
+        }
+
+
+    });
+    
+}
+
+</script>
+
+<template>
+    <div class="WindowTxt">
+        
+        <div class="main">
+            <img class="exit" v-on:click="exitEvent()" src="../../assets/res/img/window/exit.png" />
+            <!-- <div class="title" >文字信息</div> -->
+            <div class="title" >操作事项</div>
+            <div class="content commonsScrollbar">
+                {{ txt }}
+            </div>
+
+        </div>
+
+    </div>
+</template>
+
+<style lang="less" >
+* {
+    box-sizing:border-box;
+    -moz-box-sizing:border-box; /* Firefox */
+    -webkit-box-sizing:border-box; /* Safari */
+}
+</style>
+
+<style lang="less" scoped>
+@import "./css/commonsScrollbar.less";
+
+.WindowTxt * {
+    -moz-user-select: none;
+    -webkit-user-select: none;
+    -ms-user-select: none;
+    -khtml-user-select: none;
+    user-select: none;
+}
+
+.WindowTxt {
+    position: fixed;
+    z-index: 0;
+    width: 0px;
+    height: 0px;
+    top: 0px;
+    left: 0px;
+    z-index: 1000;
+
+    .main {
+
+        position: fixed;
+        width: 35.4285rem;
+        height: 21.8571rem;
+        top: 25%;
+        left: 10%;
+
+        background-image: url("../../assets/res/img/window/bg.png");
+        background-position: center;
+        background-size: 100% 100%;
+
+        .exit {
+
+            position: absolute;
+            width: 1.4285rem;
+            top: 3.0714rem;
+            right: 3.2142rem;
+            // 手势
+            cursor:pointer;
+
+        }
+
+        .title {
+            position: absolute;
+            color: #FEFEFE;
+            font-size: 1.4285rem;
+            font-weight: 500;
+            top: 2.65rem;
+            left: 5.428rem;
+        }
+
+        .content {
+
+            position: absolute;
+            top: 5rem;
+            left: 3.5714rem;
+            right: 3.5714rem;
+            bottom: 3rem;
+            color: #FEFEFE;
+            font-size: 1.2857rem;
+            font-weight: 400;
+            line-height: 2.15rem;
+
+            // 换行
+            word-break: break-all;
+            /** 让文本带有 \n 自动换行 */
+            white-space: pre-wrap;
+            // text-wrap: normal;
+            // white-space: normal;
+
+        }
+
+
+    }
+
+    
+}
+</style>

+ 138 - 0
src/components/WindowQingXiCheAndQv/WindowVideo.vue

@@ -0,0 +1,138 @@
+<script setup>
+import dayjs from "dayjs";
+import { computed, onMounted, onUnmounted, ref } from "vue";
+import { WindowVideoStore } from "@/components/WindowQingXiCheAndQv/store/WindowVideoStore.js";
+/**
+ * 退出的逻辑
+ */
+const exitEvent = () => {
+
+    if (typeof WindowVideoStore().obj.callbackEvent == 'function') {
+        WindowVideoStore().obj.callbackEvent(
+            WindowVideoStore().obj.myJson
+        );
+    }
+    WindowVideoStore().obj.callbackEvent = null;
+    WindowVideoStore().obj.WindowVideoViewOpen = false;
+}
+
+onMounted(() => {
+});
+
+</script>
+
+<template>
+    <div class="WindowVideo">
+        
+        <div class="main">
+            <img class="exit" v-on:click="exitEvent()" src="../../assets/res/img/window/exit.png" />
+            <div class="title" >视频</div>
+            <div class="content">
+                <video class="mainVideo" controls >
+                    <source :src="WindowVideoStore().obj.WindowVideoUrl" type="video/mp4" >
+                </video>
+            </div>
+
+        </div>
+
+    </div>
+</template>
+
+<style lang="less" >
+* {
+    box-sizing:border-box;
+    -moz-box-sizing:border-box; /* Firefox */
+    -webkit-box-sizing:border-box; /* Safari */
+}
+</style>
+
+<style lang="less" scoped>
+
+.WindowVideo * {
+    -moz-user-select: none;
+    -webkit-user-select: none;
+    -ms-user-select: none;
+    -khtml-user-select: none;
+    user-select: none;
+}
+
+.WindowVideo {
+    position: fixed;
+    z-index: 0;
+    width: 0px;
+    height: 0px;
+    top: 0px;
+    left: 0px;
+    z-index: 1000;
+
+    .main {
+
+        position: fixed;
+        width: 35.4285rem;
+        height: 21.8571rem;
+        
+        top: 50%;
+        left: 50%;
+        margin: -10.92855rem 0px 0px -17.71425rem;
+
+        background-image: url("../../assets/res/img/window/bg.png");
+        background-position: center;
+        background-size: 100% 100%;
+
+        .exit {
+
+            position: absolute;
+            width: 1.4285rem;
+            top: 3.0714rem;
+            right: 3.2142rem;
+            // 手势
+            cursor:pointer;
+
+        }
+
+        .title {
+            position: absolute;
+            color: #FEFEFE;
+            font-size: 1.4285rem;
+            font-weight: 500;
+            top: 2.65rem;
+            left: 5.428rem;
+        }
+
+        .content {
+
+            position: absolute;
+            top: 5rem;
+            left: 3.5714rem;
+            right: 3.5714rem;
+            bottom: 3rem;
+            color: #FEFEFE;
+            font-size: 1.2857rem;
+            font-weight: 400;
+
+            background-color: #000000;
+
+            // 换行
+            word-break: break-all;
+            /** 让文本带有 \n 自动换行 */
+            white-space: pre-wrap;
+            // text-wrap: normal;
+            // white-space: normal;
+
+            .mainVideo {
+                position: absolute;
+                top: 1%;
+                left: 1%;
+                width: 98%;
+                height: 98%;
+                
+            }
+
+        }
+
+
+    }
+
+    
+}
+</style>

+ 105 - 0
src/components/WindowQingXiCheAndQv/WindowVideoRemoveColor.vue

@@ -0,0 +1,105 @@
+<script setup>
+import dayjs from "dayjs";
+import { computed, onMounted, onUnmounted, ref } from "vue";
+import { WindowVideoRemoveColorStore } from "@/components/WindowQingXiCheAndQv/store/WindowVideoRemoveColorStore.js";
+import { WindowEvent } from "./js/WindowEvent.js";
+
+
+let htmlMain = ref(null);
+
+/**
+ * 退出的逻辑
+ */
+const exitEvent = () => {
+    WindowEvent.find().WindowVideoRemoveColorExit();
+}
+
+onMounted(() => {
+    addCanvasEvent();
+});
+
+
+/**
+ * 触发添加canvas元素来展示
+ */
+const addCanvasEvent = () => {
+
+    let objVideoAndCanvasToImg = WindowVideoRemoveColorStore().obj.objVideoAndCanvasToImg;
+
+    // 这次采用将 canvas 添加到元素渲染,不进行回调返回 base64图
+    // 将 canvas 添加渲染,性能会更好
+    htmlMain.value.appendChild(objVideoAndCanvasToImg.objCanvas);
+    objVideoAndCanvasToImg.objCanvas.style.width = "100%";
+    objVideoAndCanvasToImg.objCanvas.style.height = "100%";
+
+}
+
+
+
+</script>
+
+<template>
+    <div class="WindowVideoRemoveColor">
+        
+        <div class="mainBorder" :style="WindowVideoRemoveColorStore().obj.style">
+
+            <div ref="htmlMain" class="main" >
+
+            </div>
+
+        </div>
+        
+    </div>
+</template>
+
+<style lang="less" >
+* {
+    box-sizing:border-box;
+    -moz-box-sizing:border-box; /* Firefox */
+    -webkit-box-sizing:border-box; /* Safari */
+}
+</style>
+
+<style lang="less" scoped>
+
+@myScale: 0.18;
+// @myScale: 0.5;
+// @myScale: 0.2;
+
+.WindowVideoRemoveColor * {
+    -moz-user-select: none;
+    -webkit-user-select: none;
+    -ms-user-select: none;
+    -khtml-user-select: none;
+    user-select: none;
+}
+
+.WindowVideoRemoveColor {
+    position: fixed;
+    z-index: 0;
+    width: 0px;
+    height: 0px;
+    top: 0px;
+    left: 0px;
+    z-index: 1000;
+    
+    .mainBorder {
+        position: fixed;
+        width: 54.8571rem * @myScale;
+        height: 80rem * @myScale;
+        background-color: transparent;
+        overflow: hidden;
+
+        .main {
+            width: 54.8571rem * @myScale;
+            height: 83.4285rem * @myScale;
+            background-color: transparent;
+            position: absolute;
+            top: -0.4285rem;
+            left: 0px;
+        }
+
+    }
+    
+}
+</style>

+ 123 - 0
src/components/WindowQingXiCheAndQv/css/commonsScrollbar.css

@@ -0,0 +1,123 @@
+/* 滚动 */
+.commonsScrollbar {
+  overflow-y: scroll;
+  overflow-x: visible;
+}
+/* 滚动条整体样式 */
+.commonsScrollbar::-webkit-scrollbar {
+  width: 2px;
+  height: 2px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.commonsScrollbar::scrollbar {
+  width: 2px;
+  height: 2px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.commonsScrollbar::-moz-scrollbar {
+  width: 2px;
+  height: 2px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.commonsScrollbar::-ms-scrollbar {
+  width: 2px;
+  height: 2px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.commonsScrollbar::-o-scrollbar {
+  width: 2px;
+  height: 2px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+/* 滚动条里面小方块 */
+.commonsScrollbar::-webkit-scrollbar-thumb {
+  /* background-color: #EAEAEA;*/
+  background-color: #cccccc;
+  background-clip: padding-box;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+  min-height: 1px;
+}
+.commonsScrollbar::scrollbar-thumb {
+  /* background-color: #EAEAEA;*/
+  background-color: #cccccc;
+  background-clip: padding-box;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+  min-height: 1px;
+}
+.commonsScrollbar::-moz-scrollbar-thumb {
+  /* background-color: #EAEAEA;*/
+  background-color: #cccccc;
+  background-clip: padding-box;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+  min-height: 1px;
+}
+.commonsScrollbar::-ms-scrollbar-thumb {
+  /* background-color: #EAEAEA;*/
+  background-color: #cccccc;
+  background-clip: padding-box;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+  min-height: 1px;
+}
+.commonsScrollbar::-o-scrollbar-thumb {
+  /* background-color: #EAEAEA;*/
+  background-color: #cccccc;
+  background-clip: padding-box;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+  min-height: 1px;
+}
+/* 滚动条里面轨道 */
+.commonsScrollbar::-webkit-scrollbar-thumb:hover {
+  /* background-color: #EAEAEA;*/
+  background-color: #cccccc;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.commonsScrollbar::scrollbar-thumb:hover {
+  /* background-color: #EAEAEA;*/
+  background-color: #cccccc;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.commonsScrollbar::-moz-scrollbar-thumb:hover {
+  /* background-color: #EAEAEA;*/
+  background-color: #cccccc;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.commonsScrollbar::-ms-scrollbar-thumb:hover {
+  /* background-color: #EAEAEA;*/
+  background-color: #cccccc;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.commonsScrollbar::-o-scrollbar-thumb:hover {
+  /* background-color: #EAEAEA;*/
+  background-color: #cccccc;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}

+ 144 - 0
src/components/WindowQingXiCheAndQv/css/commonsScrollbar.less

@@ -0,0 +1,144 @@
+
+/* 滚动 */
+.commonsScrollbar {
+    overflow-y: scroll;
+    overflow-x: visible;
+}
+
+/* 滚动条整体样式 */
+.commonsScrollbar::-webkit-scrollbar {
+    width: 2px;
+    height: 2px;
+    -webkit-border-radius: 5px;
+    -moz-border-radius: 5px;
+    border-radius: 5px;
+}
+
+.commonsScrollbar::scrollbar {
+    width: 2px;
+    height: 2px;
+    -webkit-border-radius: 5px;
+    -moz-border-radius: 5px;
+    border-radius: 5px;
+}
+
+.commonsScrollbar::-moz-scrollbar {
+    width: 2px;
+    height: 2px;
+    -webkit-border-radius: 5px;
+    -moz-border-radius: 5px;
+    border-radius: 5px;
+}
+
+.commonsScrollbar::-ms-scrollbar {
+    width: 2px;
+    height: 2px;
+    -webkit-border-radius: 5px;
+    -moz-border-radius: 5px;
+    border-radius: 5px;
+}
+
+.commonsScrollbar::-o-scrollbar {
+    width: 2px;
+    height: 2px;
+    -webkit-border-radius: 5px;
+    -moz-border-radius: 5px;
+    border-radius: 5px;
+}
+
+/* 滚动条里面小方块 */
+.commonsScrollbar::-webkit-scrollbar-thumb {
+    /* background-color: #EAEAEA;*/
+    background-color: #cccccc;
+    background-clip: padding-box;
+    -webkit-border-radius: 5px;
+    -moz-border-radius: 5px;
+    border-radius: 5px;
+    min-height: 1px;
+}
+
+.commonsScrollbar::scrollbar-thumb {
+    /* background-color: #EAEAEA;*/
+    background-color: #cccccc;
+    background-clip: padding-box;
+    -webkit-border-radius: 5px;
+    -moz-border-radius: 5px;
+    border-radius: 5px;
+    min-height: 1px;
+}
+
+.commonsScrollbar::-moz-scrollbar-thumb {
+    /* background-color: #EAEAEA;*/
+    background-color: #cccccc;
+    background-clip: padding-box;
+    -webkit-border-radius: 5px;
+    -moz-border-radius: 5px;
+    border-radius: 5px;
+    min-height: 1px;
+}
+
+.commonsScrollbar::-ms-scrollbar-thumb {
+    /* background-color: #EAEAEA;*/
+    background-color: #cccccc;
+    background-clip: padding-box;
+    -webkit-border-radius: 5px;
+    -moz-border-radius: 5px;
+    border-radius: 5px;
+    min-height: 1px;
+}
+
+.commonsScrollbar::-o-scrollbar-thumb {
+    /* background-color: #EAEAEA;*/
+    background-color: #cccccc;
+    background-clip: padding-box;
+    -webkit-border-radius: 5px;
+    -moz-border-radius: 5px;
+    border-radius: 5px;
+    min-height: 1px;
+}
+
+/* 滚动条里面轨道 */
+.commonsScrollbar::-webkit-scrollbar-thumb:hover {
+    /* background-color: #EAEAEA;*/
+    background-color: #cccccc;
+    -webkit-border-radius: 5px;
+    -moz-border-radius: 5px;
+    border-radius: 5px;
+}
+
+.commonsScrollbar::scrollbar-thumb:hover {
+    /* background-color: #EAEAEA;*/
+    background-color: #cccccc;
+    -webkit-border-radius: 5px;
+    -moz-border-radius: 5px;
+    border-radius: 5px;
+}
+
+.commonsScrollbar::-moz-scrollbar-thumb:hover {
+    /* background-color: #EAEAEA;*/
+    background-color: #cccccc;
+    -webkit-border-radius: 5px;
+    -moz-border-radius: 5px;
+    border-radius: 5px;
+}
+
+.commonsScrollbar::-ms-scrollbar-thumb:hover {
+    /* background-color: #EAEAEA;*/
+    background-color: #cccccc;
+    -webkit-border-radius: 5px;
+    -moz-border-radius: 5px;
+    border-radius: 5px;
+}
+
+.commonsScrollbar::-o-scrollbar-thumb:hover {
+    /* background-color: #EAEAEA;*/
+    background-color: #cccccc;
+    -webkit-border-radius: 5px;
+    -moz-border-radius: 5px;
+    border-radius: 5px;
+}
+
+
+
+
+

+ 453 - 0
src/components/WindowQingXiCheAndQv/js/VideoAndCanvasToImg.js

@@ -0,0 +1,453 @@
+/**
+ * 专门处理视频抠像的类
+ */
+export class VideoAndCanvasToImg {
+    
+    // 每次 new 出对象则会调用这个构造函数
+    constructor() {
+        
+        /**
+         * 视频播放对象
+         */
+        this.objVideo = null;
+
+        /**
+         * 当前播放的视频地址
+         */
+        this.url = null;
+
+        /**
+         * 画布
+         */
+        this.objCanvas = null;
+
+        /**
+         * 画布内容
+         */
+        this.objCtx = null;
+
+        // 视频地址
+        this.url = null;
+        // 宽度,建议填写视频的尺寸比例
+        this.width = 375;
+        // 高度,建议填写视频的尺寸比例
+        this.height = 667;
+        // 将指定范围像素点颜色值变成透明
+        this.colorList = [];
+        // 回调方法,每帧回调返回的帧图片结果
+        this.callbackEvent = null;
+        // 是否循环播放
+        this.circulateBool = true;
+
+        // 是否已经主动触发 this.renderEvent 方法了
+        this.renderEventMainBool = false;
+
+    }
+
+
+    /**
+     * url              视频地址,可以是相对路径,例如 ./mp4/demo.mp4
+     *                  也可以是网址,例如 https://.../demo.mp4
+     * 
+     * width            宽度,建议填写视频的尺寸比例
+     * height           高度,建议填写视频的尺寸比例
+     * circulateBool    是否循环播放
+     * 
+     * colorList        将指定范围像素点颜色值变成透明
+     * 例如
+     * [
+     *      {
+     *           "colorMin" : { "r" : 0, "g" : 120, "b" : 0 },
+     *           "colorMax" : { "r" : 100, "g" : 255, "b" : 100 },
+     *      },
+     *      {
+     *           "colorMin" : { "r" : 100, "g" : 120, "b" : 100 },
+     *           "colorMax" : { "r" : 200, "g" : 255, "b" : 200 },
+     *      }
+     * ]
+     * 
+     * callback         回调方法,每帧回调返回的帧图片结果
+     * 
+     */
+    renderToImg = function(url, width, height, circulateBool, colorList, callback) {
+
+        // 当前对象本身
+        var thisClass = this;
+        thisClass.url = url;
+        thisClass.width = width;
+        thisClass.height = height;
+        thisClass.circulateBool = circulateBool;
+        thisClass.colorList = colorList;
+        thisClass.callbackEvent = callback;
+        thisClass.initObj();
+        
+        // 播放视频
+        thisClass.objVideo.src = thisClass.url;
+        thisClass.videoPlayNew();
+        
+        // 解决重复触发,导致卡顿
+        if (this.renderEventMainBool == false) {
+             // 每帧渲染结果返回
+            thisClass.renderEvent();
+            this.renderEventMainBool = true;
+        }
+        
+        return this;
+
+    }
+
+    /**
+     * 初始化会用到的对象
+     */
+    initObj = function() {
+
+        // 当前对象本身
+        var thisClass = this;
+
+        thisClass.initVideo();
+
+        if (thisClass.objCanvas == null || thisClass.objCanvas == undefined) {
+
+            thisClass.objCanvas = document.createElement("canvas");
+
+            // 解决 drawImage 绘制 video 的时候模糊,这里一定要设置canvas的宽高与视频的宽高一致
+            // thisClass.objCanvas.width = thisClass.objVideo.videoWidth;
+            // thisClass.objCanvas.height = thisClass.objVideo.videoHeight;
+
+            thisClass.objCanvas.width = thisClass.width;
+            thisClass.objCanvas.height = thisClass.height;
+
+            if (thisClass.objCtx == null || thisClass.objCtx == undefined) {
+                thisClass.objCtx = thisClass.objCanvas.getContext("2d");
+            }
+            
+        }
+        
+        return this;
+
+    }
+
+    /**
+     * 初始化视频对象
+     */
+    initVideo = function() {
+
+        // 当前对象本身
+        var thisClass = this;
+
+        if (thisClass.objVideo != null && thisClass.objVideo != undefined) {
+            return this;
+        }
+
+        thisClass.objVideo = document.createElement("video");
+        thisClass.objVideo.style.width = thisClass.width + "px";
+        thisClass.objVideo.style.height = thisClass.height + "px";
+        thisClass.objVideo.style.objectFit = "fill";
+        thisClass.objVideo.setAttribute("crossOrigin", "anonymous");
+        // thisClass.getAttribute("crossOrigin");
+        // 浏览器总是报错 Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.
+        // 经过多方查阅资料,发现是资源跨域的问题引起的(视频与页面不在一个域名下),所以在引用视频资源之前需要打开跨域资源允许权限crossOrigin="anonymous"
+
+        // console.log(
+        //     "thisClass.objVideo.style",
+        //     thisClass.objVideo.style,
+        //     thisClass.objVideo,
+        //     thisClass.objVideo.getAttribute("crossOrigin")
+        // );
+        
+        this.videoEvent();
+        
+        return this;
+        
+    }
+
+    // 视频事件
+    videoEvent = function() {
+        
+        // 当前对象本身
+        var thisClass = this;
+
+        // 设置或返回视频是否应该显示控件(比如播放/暂停等)。
+        thisClass.objVideo.controls = false;
+
+        // 视频已加载时
+        thisClass.objVideo.onloadedmetadata = function() {
+
+            // document.getElementById("mainVideoStatus").value = "准备就绪";
+            // // 返回当前视频的长度【单位 秒】
+            // document.getElementById("mainVideoDuration").value = thisClass.objVideo.duration;
+            thisClass.videoPlayNew();
+
+        }
+
+        // 视频正在播放
+        thisClass.objVideo.ontimeupdate = function() {
+
+            // document.getElementById("mainVideoStatus").value = "播放中";
+            // // 返回当前播放的位置 【 单位 秒 】
+            // document.getElementById("mainVideoCurrentTime").value = thisClass.objVideo.currentTime;
+
+        }
+
+        // 视频暂停播放
+        thisClass.objVideo.onpause = function() {
+
+            // document.getElementById("mainVideoStatus").value = "暂停播放";
+            // // 返回当前播放的位置 【 单位 秒 】
+            // document.getElementById("mainVideoCurrentTime").value = thisClass.objVideo.currentTime;
+
+        }
+
+        // 视频播放完成事件
+        thisClass.objVideo.onended = function() {
+
+            // document.getElementById("mainVideoStatus").value = "播放完成";
+            console.log(
+                "重新播放"
+            );
+
+            if (thisClass.circulateBool == true) {
+                thisClass.videoPlayNew();
+            }
+            
+        }
+
+        return this;
+
+    }
+
+    // 重头开始播放
+    videoPlayNew = function() {
+
+        // 当前对象本身
+        var thisClass = this;
+
+        if (thisClass.objVideo == null || thisClass.objVideo == undefined) {
+            return this;
+        }
+            
+        // 设置播放的位置,0 则为从头开始【 单位 秒 】
+        thisClass.objVideo.currentTime = 0;
+        thisClass.objVideo.play();
+
+        return this;
+
+    }
+
+
+
+    /**
+     * 每帧渲染结果返回
+     */
+    renderEvent = function() {
+
+        // 当前对象本身
+        var thisClass = this;
+
+        if (
+            thisClass.objCanvas == null || thisClass.objCanvas == undefined
+            || thisClass.objVideo == null || thisClass.objVideo == undefined
+            || thisClass.objCtx == null || thisClass.objCtx == undefined
+        ) {
+            return this;
+        }
+
+        // 帧事件
+        window.requestAnimationFrame(function() {
+            thisClass.renderEvent();
+        });
+
+        // console.log(
+        //     "当前播放的视频是否暂停", thisClass.objVideo.paused
+        // );
+
+        /**
+         * 如果视频是暂停的时候
+         * 后面的抠像逻辑就不触发,这样可以提高性能
+         */
+        if (thisClass.objVideo.paused == true) {
+            return this;
+        }
+
+        // 解决 drawImage 绘制 video 的时候模糊,这里一定要设置canvas的宽高与视频的宽高一致
+        // thisClass.objCanvas.width = thisClass.objVideo.videoWidth;
+        // thisClass.objCanvas.height = thisClass.objVideo.videoHeight;
+
+        thisClass.objCanvas.width = thisClass.width;
+        thisClass.objCanvas.height = thisClass.height;
+
+        if (
+            thisClass.objCanvas.width <= 0
+            || thisClass.objCanvas.height <= 0
+        ) {
+            return this;
+        }
+        
+        // 刷新矩形区域的画布
+        thisClass.objCtx.clearRect(
+            0,
+            0,
+            thisClass.objCanvas.width,
+            thisClass.objCanvas.height
+        );
+
+        // 解决 drawImage 绘制 video 的时候模糊,关闭图像平滑处理
+        thisClass.objCtx.imageSmoothingEnabled = false;
+
+        // 绘制图片
+        thisClass.objCtx.drawImage(
+            thisClass.objVideo,
+            0,
+            0,
+            thisClass.objCanvas.width,
+            thisClass.objCanvas.height
+        );
+
+        // 最后实现的效果每个点之间有一定的距离,gap 就是控制这个距离的,如果要减少像素点的返回,可以通过这个来控制
+        var gap = 1;
+
+        /**
+         * 注意该方法,一定是在 http web服务启动才会有效果,例如页面要这样浏览
+         * http://127.0.0.1/index.html
+         * 或者
+         * http://www.***.com/index.html
+         * 复制画布上指定矩形的像素数据
+         * */
+        var imageData = thisClass.objCtx.getImageData(0, 0, thisClass.objCanvas.width, thisClass.objCanvas.height);
+        
+        // 通过 width 和 height 遍历 imgData 对象,每隔 gap 个点取一次像素,找到红色的像素,
+        // 每找到一个红色点,就创建一个 Dot 对象,并添加到 dotList 数组中
+        for (var x = 0; x < imageData.width; x += gap) {
+
+            for (var y = 0; y < imageData.height; y += gap) {
+
+                var i = (y * imageData.width + x) * 4;
+
+                // 获取当前像素点的颜色值
+                // R - 红色 (0-255)
+                var red = imageData.data[i];
+                // G - 绿色 (0-255)
+                var green = imageData.data[i + 1];
+                // B - 蓝色 (0-255)
+                var blue = imageData.data[i + 2];
+                // alpha 通道 (0-255; 0 是透明的,255 是完全可见的)
+                var alpha = imageData.data[i + 3];
+                
+                for (var colorListI = 0; colorListI < thisClass.colorList.length; colorListI++) {
+
+                    var thisColorList = thisClass.colorList[colorListI];
+
+                    // console.log(
+                    //     "thisColorList", thisColorList
+                    // );
+
+                    // 将指定范围颜色值变成透明
+                    if (
+                        (red >= thisColorList.colorMin.r && red <= thisColorList.colorMax.r)
+                        && (green >= thisColorList.colorMin.g && green <= thisColorList.colorMax.g)
+                        && (blue >= thisColorList.colorMin.b && blue <= thisColorList.colorMax.b)
+                    ) {
+
+                        // 新增返回的结果点
+                        var newList = {
+                            "x" : x, "y" : y,
+                            "r" : red,
+                            "g" : green,
+                            "b" : blue,
+                            "alpha" : alpha
+                        };
+                        // console.log(
+                        //     "newList", newList
+                        // );
+
+                        // 0 则为透明了
+                        imageData.data[i + 3] = 0;
+                        
+                    }
+                    
+                }
+                
+            }
+
+        }
+
+        // 重新绘制到canvas中显示
+        thisClass.objCtx.putImageData(imageData, 0, 0);
+        
+        /**
+         * 进行回调图片结果
+         * 这里进行控制,因为每帧返回 base64 貌似会有点很细节的卡顿
+         * 除非确实需要,就回调返回
+         * 
+         * 那么不回调渲染的话
+         * 
+         * 可以通过 该类对象的
+         * thisClass.objCanvas
+         * 添加渲染到 元素里
+         * 
+         * 例如
+         * 
+         * document.getElementById('demo').appendChild(objVideoColorRemoveNewImg.objCanvas);
+         * // 然后你可以再自定义样式
+         * objVideoColorRemoveNewImg.objCanvas.style.width = "100%";
+         * objVideoColorRemoveNewImg.objCanvas.style.height = "100%";
+         * 
+         * canvas 外出的 div 你再定义尺寸,就可以自适应渲染了
+         * 
+         */
+        if (thisClass.callbackEvent != null && thisClass.callbackEvent != undefined) {
+            // 得到base64位图片地址。这个时候,是不会增加内存的
+            var dataURL = thisClass.objCanvas.toDataURL("image/png");
+            thisClass.callbackEvent(dataURL);
+        }
+        
+        return this;
+
+    }
+
+    /**
+     * 停止释放内存
+     */
+    stop = function() {
+
+        if (this.objVideo != null && this.objVideo != undefined) {
+            
+            // 暂停播放
+            this.objVideo.pause();
+            // 视频已加载时
+            this.objVideo.onloadedmetadata = null;
+            // 视频正在播放
+            this.objVideo.ontimeupdate = null;
+            // 视频暂停播放
+            this.objVideo.onpause = null;
+            // 视频播放完成事件
+            this.objVideo.onended = null;
+            this.objVideo = null;
+
+        }
+        
+        for (var key in this) {
+
+            if (typeof this[key] != 'function') {
+                this[key] = null;
+            }
+            
+        }
+
+        return null;
+
+    }
+    
+    
+}
+
+
+
+
+
+
+
+
+
+
+

+ 272 - 0
src/components/WindowQingXiCheAndQv/js/WindowEvent.js

@@ -0,0 +1,272 @@
+import { VideoAndCanvasToImg } from "./VideoAndCanvasToImg.js";
+
+/**
+ * 触发各种弹出逻辑
+ */
+export class WindowEvent {
+    
+    // 每次 new 出对象则会调用这个构造函数
+    constructor() {
+        
+        /**
+         * 对应可以操作的 store,控制其他组件实验
+         */
+        this.ComStore = {};
+
+    }
+
+    // 实现单例模式
+    static find() {
+        if (!WindowEvent.instance) {
+            WindowEvent.instance = new WindowEvent();
+        }
+        return WindowEvent.instance;
+    }
+
+    /**
+     * 关闭弹出提示
+     */
+    WindowTxtViewOpenExit = function() {
+        let thisClass = this;
+        thisClass.ComStore["WindowTxtStore"]().obj.WindowTxtViewOpen = false;
+    }
+
+    /**
+     * 统一弹出文本窗口逻辑
+     * txt          弹出的文字
+     */
+    WindowTxtViewOpenEvent = function(txt) {
+
+        let thisClass = this;
+        
+        thisClass.WindowTxtViewOpenExit();
+
+        setTimeout(function() {
+            // 设置要弹出的窗口的文本
+            thisClass.ComStore["WindowTxtStore"]().obj.WindowTxtViewTxt = txt;
+            // 然后再重新弹出
+            thisClass.ComStore["WindowTxtStore"]().obj.WindowTxtViewOpen = true;
+        }, 300);
+        
+    }
+
+
+    /**
+     * 关闭弹出视频
+     */
+    WindowVideoViewOpenExit = function() {
+        let thisClass = this;
+
+        if (typeof thisClass.ComStore["WindowVideoStore"]().obj.callbackEvent == 'function') {
+            thisClass.ComStore["WindowVideoStore"]().obj.callbackEvent(
+                thisClass.ComStore["WindowVideoStore"]().obj.myJson
+            );
+        }
+        thisClass.ComStore["WindowVideoStore"]().obj.callbackEvent = null;
+        thisClass.ComStore["WindowVideoStore"]().obj.WindowVideoViewOpen = false;
+    }
+
+    /**
+     * 弹出视频
+     * url              视频地址
+     * myJson           自定义回调的数据,可以是null 也可以是json对象
+     * callbackEvent    自定义回调事件
+     */
+    WindowVideoViewOpenEvent = function(url, myJson, callbackEvent) {
+
+        let thisClass = this;
+        thisClass.WindowVideoViewOpenExit();
+
+        if (typeof url != 'string') {
+            return;
+        }
+        
+        thisClass.ComStore["WindowVideoStore"]().obj.WindowVideoUrl = url;
+        
+        if (typeof callbackEvent == "function") {
+            thisClass.ComStore["WindowVideoStore"]().obj.callbackEvent = callbackEvent;
+        } else {
+            thisClass.ComStore["WindowVideoStore"]().obj.callbackEvent = null;
+        }
+
+        thisClass.ComStore["WindowVideoStore"]().obj.myJson = myJson;
+
+        thisClass.ComStore["WindowVideoStore"]().obj.WindowVideoViewOpen = true;
+        
+        return thisClass;
+
+    }
+
+
+    /**
+     * 倒计时关闭
+     */
+    WindowCountdownExit = function() {
+
+        let thisClass = this;
+        thisClass.ComStore["WindowCountdownStore"]().obj.viewOpen = false;
+
+        if (typeof thisClass.ComStore["WindowCountdownStore"]().obj.callbackEvent == "function") {
+            thisClass.ComStore["WindowCountdownStore"]().obj.callbackEvent(
+                thisClass.ComStore["WindowCountdownStore"]().obj.myJson
+            );
+        }
+
+        thisClass.ComStore["WindowCountdownStore"]().obj.myJson = null;
+        thisClass.ComStore["WindowCountdownStore"]().obj.callbackEvent = null;
+
+    }
+
+
+    /**
+     * 弹出倒计时
+     * num          自定义秒数
+     * myJson           自定义回调的数据,可以是null 也可以是json对象
+     * callbackEvent    自定义回调事件
+     */
+    WindowCountdownOpen = function(num, myJson, callbackEvent) {
+
+        if (num == null || num == undefined) {
+            num = 5;
+        }
+
+        let thisClass = this;
+        thisClass.WindowCountdownExit();
+        setTimeout(function() {
+
+            thisClass.ComStore["WindowCountdownStore"]().obj.num = num;
+            thisClass.ComStore["WindowCountdownStore"]().obj.myJson = myJson;
+            thisClass.ComStore["WindowCountdownStore"]().obj.callbackEvent = callbackEvent;
+            thisClass.ComStore["WindowCountdownStore"]().obj.viewOpen = true;
+
+        }, 300);
+
+    }
+
+    /**
+     * 抠像视频关闭
+     */
+    WindowVideoRemoveColorExit = function() {
+
+        let thisClass = this;
+        thisClass.ComStore["WindowVideoRemoveColorStore"]().obj.viewOpen = false;
+
+        thisClass.WindowVideoRemoveColorStop();
+
+        if (typeof thisClass.ComStore["WindowVideoRemoveColorStore"]().obj.callbackEvent == "function") {
+            thisClass.ComStore["WindowVideoRemoveColorStore"]().obj.callbackEvent(
+                thisClass.ComStore["WindowVideoRemoveColorStore"]().obj.myJson
+            );
+        }
+
+        thisClass.ComStore["WindowVideoRemoveColorStore"]().obj.myJson = null;
+        thisClass.ComStore["WindowVideoRemoveColorStore"]().obj.callbackEvent = null;
+
+    }
+
+    /**
+     * 停止抠像视频的播放
+     */
+    WindowVideoRemoveColorStop = function() {
+
+        let thisClass = this;
+        if (
+            thisClass.ComStore["WindowVideoRemoveColorStore"]().obj.objVideoAndCanvasToImg == null
+            || thisClass.ComStore["WindowVideoRemoveColorStore"]().obj.objVideoAndCanvasToImg == undefined
+        ) {
+            return thisClass;
+        }
+
+        let objVideoAndCanvasToImg = thisClass.ComStore["WindowVideoRemoveColorStore"]().obj.objVideoAndCanvasToImg;
+        // 暂停播放
+        objVideoAndCanvasToImg.objVideo.pause();
+
+        return thisClass;
+
+    }
+    
+    /**
+     * 弹出倒计时
+     * videoUrl         播放的视频地址
+     * style            自定义的css样式
+     *                  例如 top:10%;left:auto;bottom:auto;right:10%;
+     *                       top:10%;left:10%;bottom:auto;right:auto;
+     * 
+     * myJson           自定义回调的数据,可以是null 也可以是json对象
+     * callbackEvent    自定义回调事件
+     */
+    WindowVideoRemoveColorOpen = function(videoUrl, style, myJson, callbackEvent) {
+        
+        let thisClass = this;
+        // thisClass.WindowVideoRemoveColorExit();
+
+        // setTimeout(function() {
+
+            // 当存在视频播放的对象的时候
+            if (
+                thisClass.ComStore["WindowVideoRemoveColorStore"]().obj.objVideoAndCanvasToImg == null
+                || thisClass.ComStore["WindowVideoRemoveColorStore"]().obj.objVideoAndCanvasToImg == undefined
+            ) {
+                thisClass.ComStore["WindowVideoRemoveColorStore"]().obj.objVideoAndCanvasToImg = new VideoAndCanvasToImg();
+            }
+
+            let objVideoAndCanvasToImg = thisClass.ComStore["WindowVideoRemoveColorStore"]().obj.objVideoAndCanvasToImg;
+
+            objVideoAndCanvasToImg.renderToImg(
+                videoUrl,
+                768 * 0.18,
+                1168 * 0.18,
+
+                // 768 * 0.2,
+                // 1168 * 0.2,
+
+                false,
+                [
+                    {
+                        "colorMin" : { "r" : 0, "g" : 70, "b" : 0 },
+                        "colorMax" : { "r" : 50, "g" : 250, "b" : 180 },
+                    },
+                ],
+                // function(base64) {
+
+                //     /**
+                //      * 代码发布后
+                //      * 注意不要F12 开启开发者工具
+                //      * 因为每帧打印出数据,会内存溢出
+                //      * 正常运行是不会内存溢出的
+                //      */
+                //     // console.log(
+                //     //     "每帧返回base64", base64
+                //     // );
+
+                //     objImgNew.src = base64;
+
+                // }
+            );
+
+            // 可以这样直接设置 video 的样式
+            objVideoAndCanvasToImg.objVideo.setAttribute("muted", "true");
+
+
+            thisClass.ComStore["WindowVideoRemoveColorStore"]().obj.videoUrl = videoUrl;
+            thisClass.ComStore["WindowVideoRemoveColorStore"]().obj.style = style;
+            thisClass.ComStore["WindowVideoRemoveColorStore"]().obj.myJson = myJson;
+            thisClass.ComStore["WindowVideoRemoveColorStore"]().obj.callbackEvent = callbackEvent;
+            thisClass.ComStore["WindowVideoRemoveColorStore"]().obj.viewOpen = true;
+            
+        // }, 100);
+
+    }
+
+}
+
+
+
+
+
+
+
+
+
+
+

+ 28 - 0
src/components/WindowQingXiCheAndQv/store/WindowCountdownStore.js

@@ -0,0 +1,28 @@
+import { defineStore } from 'pinia'
+import { ref, watch } from "vue";
+
+export const WindowCountdownStore = defineStore('WindowCountdownStore', () => {
+
+    /**
+     * 统一放置全局用到的对象,变量等参数
+     */
+    const obj = ref({
+        
+        // 是否展示窗口
+        viewOpen : false,
+        // 倒计时多少秒
+        num : 5,
+        // 自定义回调的数据,可以是null 也可以是json对象
+        myJson : null,
+        // 自定义回调事件
+        callbackEvent : null,
+        
+    });
+
+    const loadSuccess = ref(false);
+
+    return {
+        obj,
+    }
+
+})

+ 24 - 0
src/components/WindowQingXiCheAndQv/store/WindowTxtStore.js

@@ -0,0 +1,24 @@
+import { defineStore } from 'pinia'
+import { ref, watch } from "vue";
+
+export const WindowTxtStore = defineStore('WindowTxtStore', () => {
+
+    /**
+     * 统一放置全局用到的对象,变量等参数
+     */
+    const obj = ref({
+        
+        // 是否展示窗口文本
+        WindowTxtViewOpen : false,
+        // 展示的内容
+        WindowTxtViewTxt : "",
+        
+    });
+
+    const loadSuccess = ref(false);
+
+    return {
+        obj,
+    }
+
+})

+ 31 - 0
src/components/WindowQingXiCheAndQv/store/WindowVideoRemoveColorStore.js

@@ -0,0 +1,31 @@
+import { defineStore } from 'pinia'
+import { ref, watch } from "vue";
+
+export const WindowVideoRemoveColorStore = defineStore('WindowVideoRemoveColorStore', () => {
+
+    /**
+     * 统一放置全局用到的对象,变量等参数
+     */
+    const obj = ref({
+        
+        // 是否展示窗口
+        viewOpen : false,
+        // 自定义回调的数据,可以是null 也可以是json对象
+        myJson : null,
+        // 自定义回调事件
+        callbackEvent : null,
+        // 播放的视频地址
+        videoUrl : "",
+        // 自定义样式
+        style : "",
+
+        // VideoAndCanvasToImg 视频抠像的对象
+        objVideoAndCanvasToImg : null,
+        
+    });
+
+    return {
+        obj,
+    }
+
+})

+ 28 - 0
src/components/WindowQingXiCheAndQv/store/WindowVideoStore.js

@@ -0,0 +1,28 @@
+import { defineStore } from 'pinia'
+import { ref, watch } from "vue";
+
+export const WindowVideoStore = defineStore('WindowVideoStore', () => {
+
+    /**
+     * 统一放置全局用到的对象,变量等参数
+     */
+    const obj = ref({
+        
+        // 是否展示窗口
+        WindowVideoViewOpen : false,
+        // 展示的视频
+        WindowVideoUrl : "",
+        // 自定义回调
+        callbackEvent : null,
+        // 自定义回调的数据,定义什么数据,就回调什么
+        myJson : null,
+        
+    });
+
+    const loadSuccess = ref(false);
+
+    return {
+        obj,
+    }
+
+})

+ 101 - 0
src/utils/common/ComMusic.js

@@ -0,0 +1,101 @@
+import { ModelHtml5Audio } from "./ModelHtml5Audio.js";
+
+/**
+ * 统一处理要播放的声音
+ */
+export class ComMusic {
+    
+    // 每次 new 出对象则会调用这个构造函数
+    constructor() {
+        
+        // 播放声音的对象
+        this.objModelHtml5Audio = null;
+
+        /**
+         * 定义播放的声音文件地址
+         */
+        this.codeJson = {
+            // "唯一code" : "对应的文件地址",
+        };
+
+    }
+
+    // 实现单例模式
+    static find() {
+        if (!ComMusic.instance) {
+            ComMusic.instance = new ComMusic();
+        }
+        return ComMusic.instance;
+    }
+    
+    objModelHtml5AudioInit = function() {
+
+        if (this.objModelHtml5Audio != null && this.objModelHtml5Audio != undefined) {
+            return this.objModelHtml5Audio;
+        }
+
+        this.objModelHtml5Audio = new ModelHtml5Audio();
+        return this.objModelHtml5Audio;
+
+    }
+
+    /**
+     * 指定播放指定 code 的声音
+     * code         this.codeJson 的 key 值
+     */
+    play = function(code) {
+
+        let thisClass = this;
+
+        thisClass.objModelHtml5AudioInit();
+
+        if (thisClass.objModelHtml5Audio != null && thisClass.objModelHtml5Audio != undefined) {
+            thisClass.objModelHtml5Audio.pause();
+        }
+
+        if (thisClass.codeJson[code] == null || thisClass.codeJson[code] == undefined) {
+            return thisClass;
+        }
+        
+        let musicUrl = thisClass.codeJson[code];
+        
+        // console.log(
+        //     "播放声音", musicUrl
+        // );
+
+        // 设置播放音乐的文件,或者地址
+        thisClass.objModelHtml5Audio.setUrl(musicUrl);
+
+        // 不需要循环播放
+        thisClass.objModelHtml5Audio.loopClose();
+        // 继续播放音乐
+        thisClass.objModelHtml5Audio.start();
+
+        // console.log(
+        //     "播放的音乐",
+        //     musicUrl,
+        //     thisClass.objModelHtml5Audio
+        // );
+
+        return thisClass;
+
+
+    }
+
+
+
+
+
+    
+}
+
+
+
+
+
+
+
+
+
+
+

+ 7 - 2
src/view/student/trainChapter/trainChapter.vue

@@ -64,7 +64,9 @@
         <!-- <div v-show="state.hasRead && state.showCnt && state.currentChapter.type == 30" class="chapter-3d"> -->
         <div v-if="courseChapter3dViewBool == true" class="chapter-3d">
             <div v-show="state.hasRead && state.showCnt && state.currentChapter.type == 30">
-                <CourseChapter3d
+
+                <!-- 老版本的三维逻辑了,用不到了 -->
+                <!-- <CourseChapter3d
                     :config="state?.currentChapter ?? ''"
                     :studentTaskIdList="studentTaskIdList"
                     @tipsBtnsUpOpen="tipsBtnsUpOpenEvent"
@@ -75,7 +77,10 @@
                     @showOperationHelpExitEvent="showOperationHelpExitEvent"
                     @carCameraScreenshot="carCameraScreenshotEvent"
                     @carShutDown="carShutDownEvent"
-                ></CourseChapter3dView>
+                ></CourseChapter3dView> -->
+                
+
+                
             </div>
         </div>
     </div>