var ceshi = 'http://space3d.4dage.com/back'; //新编辑界面 var EditTools = function (n) { //main2018 里面的主要对象 this.n = n; //当前状态 this.atPanel = null; //场景信息 this.sceneInformation = new SceneInformation(); //热点 this.hotpoint = new Hotpoint(); //导览 this.editGuide = new EditGuide(); //音乐 this.editMiuse = new EditMiuse(); //初始化界面 this.init(); } EditTools.prototype.init = function () { this.hotpoint.init(this.n); var that = this; this.saveAll(); this.active(); //请求数据someData.js $.ajax(g_Prefix + "data/" + window.number + "/someData.json" + "?" + Date.now(), { dataType: "json" }) .done(function (data) { //创建导览 that.editMiuse.init(data); //请求完someData.js 之后再请求data2.js data2(data, that.sceneInformation.init); }) //请求热点数据 data2.js function data2(data, callback) { $.ajax(g_Prefix + "data/" + window.number + "/data2.js" + "?" + Date.now(), { dataType: "json" }) .done(function (data2) { callback(data, data2); // fyz 初始化导览需要两部分数据, 其中data2为data.js中的数据 that.editGuide.init(data, data2); }).fail( callback(data, data2) ) } $("body").on("click", function () { $(".DelConfirm").removeClass("active"); }) } //点击的时候激活状态 EditTools.prototype.active = function () { var that = this; var confirmSnap = $(".confirmSnap.innerBtn"); var snapshotGui = $(".snapshotGui.overlayGui"); $('.toolBottom .toolLeft li').click(function () { var name = $(this).data("name"); $('.toolLeft li[data-name=' + name + ']').addClass("active").siblings().removeClass("active"); $('.toolRight .' + name).removeClass("hide").siblings().addClass("hide"); that.atPanel = name; if (name === "screen") { confirmSnap.removeClass("hide"); snapshotGui.show(); } else { confirmSnap.addClass("hide"); snapshotGui.hide(); } }) //滚动阻止事件 $(".toolRight div.content").on("mousewheel", function (event) { event.stopPropagation() }); // 输入框阻止事件 $('.toolRight').on('keydown', function (ev) { ev.stopPropagation(); }) } //保存按钮 EditTools.prototype.saveAll = function () { var that = this; $('#save').on('click', function () { $(".edit-loading").removeClass("hide"); //导览的数据 var guides = Array.from($('.tourList ul li')).map(function (dom) { return dom.data }) var hots = {} Array.from($('.spotList ul li')).forEach(function (dom) { hots[dom.hotAttribute.belongHot.sid] = { position: { x: dom.hotAttribute.position.x, y: dom.hotAttribute.position.y, z: dom.hotAttribute.position.z }, rotation: { x: dom.hotAttribute.rotation.x, y: dom.hotAttribute.rotation.y, z: dom.hotAttribute.rotation.z }, infoAttribute: dom.infoAttribute } }) var info = { name: $('#pjtName').val(), summary: $('#info-summary').val(), backgroundMusic: $('#query-bgm').attr('href'), hoticon: JSON.parse($(".hotStyle-item li.active").attr("data-val")), camera_start: $('#camera-start')[0].data, loadlogo: $("#loadlogo").is(':checked'), special: $("#g_specialScene").is(':checked'), vision_version: $("#twoData").is(':checked') ? "1.1.562.17209" : false, /************************************** 方奕卓 场景可配置项 ******************************************/ hotImageScale: $("#hotImgScale").is(':checked'), // 热点图片可放大 hideFloorMarker: $("#hideFloorMarker").is(':checked'), // 地面标记 hideMouseMarker: $("#hideMouseMarker").is(':checked'), // 鼠标标记 floorMarkerColor: $('#floorMarkerColor').val(), // 地面/导览标志颜色 mouseMarkerColor: $('#mouseMarkerColor').val(), // 鼠标标志颜色 momentTour: $('#tourSwitch input').is(':checked') ? 'black' : 'walk', // 导览瞬间过渡 showHotListSta: $('#hotListSwitch input').is(':checked'), // 开启热点列表 hotIconScale: $('#hotIconScale input').val(), // 热点缩放 supportsVR: $('#VRSwitch input').is(':checked'), // 开启VR功能 } info.weixinDesc = $('#weixin-summary').val(); $.ajax({ method: 'POST', url: ceshi + '/savesetting', data: { hots: hots, name: number, guides: guides, info: info, tourAudio: that.editGuide.tourAudio }, success: function (data) { if (data.code === 200) { location.reload() } } }) }); } //场景信息编辑 var SceneInformation = function () { } SceneInformation.prototype.init = function (data, data2) { var $options = $('.hotStyle-item li'); var $loadlogo = $("#loadlogo"); var $hotImageScale = $("#hotImgScale"); var $hideFloorMarker = $("#hideFloorMarker"); var $hideMouseMarker = $("#hideMouseMarker"); var $g_specialScene = $("#g_specialScene"); var $twoData = $("#twoData"); /*******************方奕卓 其他项需要用到data来初始化, 故一并放到这里 ******************/ let momentTour = $('#tourSwitch input'); // 导览瞬间过渡开关 let hotListSwitch = $('#hotListSwitch input'); // 热点列表开关 let hotIconScale = $('#hotIconScale input'); // 热点图标缩放 let VRSwitch = $('#VRSwitch input'); // VR功能开启 /***********************************************************************************/ $(".model-title2").text(data.model.name); $('#pjtName').val(data.model.name); $('#info-summary').val(data.model.summary); if (data2) $('#weixin-summary').val(data2.weixinDesc); for (var i = 0; i < $options.length; i++) { if ($options.eq(i).attr('data-val') === JSON.stringify(data.hoticon)) { $options.eq(i).addClass("active").siblings().removeClass("active"); } } $('#camera-start')[0].data = data.model.camera_start; /*************方奕卓 其他项的初始化操作 ************/ initColorElem(data); addListener(); // 给其他元素绑定事件 if (data.momentTour === 'black') { momentTour.prop('checked', true); } if (data.showHotListSta === 'true') { hotListSwitch.prop('checked', true); } if (data.hotIconScale && parseFloat(data.hotIconScale) < 1.5 && parseFloat(data.hotIconScale) > 0.3) { hotIconScale.val(parseFloat(data.hotIconScale)); } if(data.supportsVR === 'true'){ VRSwitch.prop('checked', true); } /************************************************/ //隐藏公司logo if (data.loadlogo) { $loadlogo[0].checked = true showLogo(); } // 热点图片放大 if (data.hotImageScale === 'true') { $hotImageScale[0].checked = true } // 隐藏地面标记 if (data.hideFloorMarker === 'true') { $hideFloorMarker[0].checked = true } // 隐藏鼠标标记 if (data.hideMouseMarker === 'true') { $hideMouseMarker[0].checked = true } //特殊大场景 if (data.special === "true" || data.model.special) { $g_specialScene[0].checked = true } //启动二代的数据 if (data.vision_version === "1.1.562.17209" || data.model.vision_version) { $twoData[0].checked = true } } function initColorElem(data, elem) { let $floorMarkerColor = $('#floorMarkerColor'); let $mouseMarkerColor = $('#mouseMarkerColor'); let $floorMarkerColorTex = $('#floorMarkerColorTex'); let $mouseMarkerColorTex = $('#mouseMarkerColorTex'); var colorRe = /^#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$/; data.floorMarkerColor ? $floorMarkerColor.val(data.floorMarkerColor) : $floorMarkerColor.val('#4bcdfc'); data.mouseMarkerColor ? $mouseMarkerColor.val(data.mouseMarkerColor) : $mouseMarkerColor.val('#4bcdfc'); $floorMarkerColor.on('change', function (e) { $('#floorMarkerColorTex').attr('placeholder', e.target.value) }) $floorMarkerColorTex.on('blur keydown', function (e) { (e.type === 'blur' || e.type === 'keydown' && e.keyCode === 13) && setColor(e, $floorMarkerColor, this); }) $mouseMarkerColor.on('change', function (e) { $('#mouseMarkerColorTex').attr('placeholder', e.target.value) }) $mouseMarkerColorTex.on('blur keydown', function (e) { (e.type === 'blur' || e.type === 'keydown' && e.keyCode === 13) && setColor(e, $mouseMarkerColor, this); }) function setColor(e, colorElem, inputElem) { var isColor = colorRe.test(e.target.value); isColor && colorElem.val(e.target.value); // isColor ? colorElem.val(e.target.value): (inputElem.placeholder = colorElem.val()); } } function addListener(){ // let customizeHot = $('#customizeHot'); // 自定义热点 // customizeHot.on('click', function(){ // }) } //设置初始界面 function getSeft(seft) { $('#camera-start').on('click', function () { var snap = JSON.parse("{" + seft.getSnapAngleInfo() + "}") this.data.camera.quaternion = snap.metadata.camera_quaternion; this.data.pano.uuid = snap.metadata.scan_id; var ev = document.createEvent("MouseEvent");//点击截取视图 g_snapShotWidth = 240; g_snapShotHeight = 118; window.screenSta = 'startScreen'; ev.initMouseEvent("snapshotBegin", true, true, document.defaultView, 0, 0, 0, 0, 0, false, false, false, false, 0, null); ev.__callback = function (imgData, info) { initialPicture(imgData, info) }.bind(this); window.dispatchEvent(ev); }); //上传图片 function initialPicture(imgData) { uploadImg(imgData, function (rs) { if (rs.code === 200) { $(".shotImg.innerBtn").css("background-image", "url('//" + rs.content + "')") } }) } } //热点编辑 var Hotpoint = function () { this.spotList = $(".spotList"); this.hotpointDetail = $("#hotpointDetail"); // fyz 导览编辑页面同样采取热点编辑的样式, 这里确保只查找到热点编辑 } Hotpoint.prototype.init = function (n) { this.active(); this.addmedia(); this.addMusic(); this.addModel(); this.addwebPack(); this.saveHot(); var that = this; let hotIconScale = $('#hotIconScale'); //点击添加热点按钮 $('#addHotSpots').on("click", function () {//点击添加热点 g_HotStatus = g_HotStatus === "add" ? null : "add"; $("#player").css("cursor", "cell"); }); //点解热点列表删除按钮 this.spotList.on("click", function (e) { var target = $(e.target); if (target.hasClass("del")) { e.stopPropagation(); target.siblings(".DelConfirm").addClass("active"); that.spotList.find("i").text(that.spotList.find("ul li").length); } else { if (target.hasClass("DelConfirm")) { e.stopPropagation(); that.remHot(target, n); } else { //点击热点列表弹出编辑热点窗口 if (target.hasClass("title") || target.hasClass("icon")) { that.editHot(target) } } } }); //点击热点编辑窗口右上角的关闭按钮 this.hotpointDetail.find("a.close, button.cancel").on("click", function () { that.hotpointDetail.addClass("atRight"); }); //遍历热点 初始话加载热点数据 for (var i = 0; i < g_HotMeshes.length; i++) { this.spotList.children("ul").append(this.addHotList(g_HotMeshes[i], i)); } this.spotList.find("i").text(g_HotMeshes.length); // 初始话的时候把热点信息添加到对应的热点中 $.ajax(g_Prefix + "data/" + window.number + "/hot/js/data.js" + "?" + Date.now(), { dataType: "json" }) .then(function (infos) { Object.keys(infos).forEach(function (key) { that.spotList.find("ul li[data-spid=" + key + "]")[0] && (that.spotList.find("ul li[data-spid=" + key + "]")[0].infoAttribute = infos[key]) }) }) } //显示编辑热点的窗口和初始化热点窗口的数据 Hotpoint.prototype.editHot = function (target) { this.hotpointDetail.removeClass("atRight"); $("#hotpointDetail .audio.mediaUpload").find("input").val(''); // 点击编辑导览清空上一次文件 var playIcon = '139.159.225.37:85/images/play.png'; var $layout = $("#hotpointDetail")[0]; $layout.targetDOM = target.closest("li")[0]; var info = $layout.targetDOM.infoAttribute || {} info.title = info.title || ''; info.content = info.content || ''; info.iframe = info.iframe || []; info.model = info.model || []; info.images = info.images || []; info.video = info.video || []; var iframesHTML = info.iframe.map(function (iframe) { return this.inputList("请填写网页链接", iframe) }.bind(this)) var modulesHTML = info.model.map(function (module) { return this.inputList("请填写网页链接", module) }.bind(this)) var imagesHTML = info.images.map(function (image) { return '
' }) var videosHTML = info.video.map(function (ly) { var imgDom = (!ly.img || ly.img === "undefined") ? '' : 'success'; var imgUrl = (!ly.img || ly.img === "undefined") ? playIcon : ly.img; return '
上传封面
' }) this.hotpointDetail.find(".name > input").val(info.title); this.hotpointDetail.find(".editText").val(info.content); this.hotpointDetail.find(".photo .list").html(imagesHTML); this.hotpointDetail.find(".video .list").html(videosHTML); this.hotpointDetail.find(".model .list").html(modulesHTML); this.hotpointDetail.find(".webPage .list").html(iframesHTML); let bgName = info.bgName || '热点背景音乐'; if (info.backgroundMusic) { this.hotpointDetail.find(".audio .playBox").removeClass("hide"); this.hotpointDetail.find("#upload-hotBgm").attr('data-hotBgm', info.backgroundMusic) this.hotpointDetail.find(".audio .playBox a").attr("href", "//" + info.backgroundMusic); this.hotpointDetail.find('#hotBgName')[0].innerHTML = bgName; this.hotpointDetail.find(".audio .submit").text("替换"); } else { this.hotpointDetail.find(".audio .playBox").addClass("hide"); this.hotpointDetail.find("#upload-hotBgm").removeAttr('data-hotBgm') // 没有背景音乐,则移除该属性, 避免其他热点的干扰 } } //添加图片和视频 Hotpoint.prototype.addmedia = function () { // 视频预览控制 var $videoLayout = $('.fun-view-video') $videoLayout.find('span').on('click', function () { $videoLayout.hide(); $videoLayout.find('video').attr('src', '')[0].pause() }); // 图片加载回调 function imageSuccess(file) { if (!/image\/\w+/.test(file.type)) { alert("文件必须为图片!"); return false; } if (!restrictedSize(file, 2)) { return false; } var img = new Image() img.src = URL.createObjectURL(file); return img } // 视频加载回调 function videoSuccess(file, $elayout) { if (!/video\/\w+/.test(file.type)) { alert("视频必须为map4格式!"); return false; } $elayout.append('上传封面') return '' } // 视频封面回调 function thumSuccess(file, $elayout, $seft) { if (!/image\/\w+/.test(file.type)) { alert("文件必须为图片!"); return false; } if (!restrictedSize(file, 2)) { return false; } $seft.closest('div').find('img').attr('src', URL.createObjectURL(file)); } // 图片与视频加载 function fileHandle() { var $seft = $(this) var $layout = $seft.closest("li"); var type = $seft.parent().attr('data-type'); var file = this.files[0]; var $din = $(document.createElement('div')); var fnc = type === 'photo' ? imageSuccess : type === 'video' ? videoSuccess : thumSuccess var $dom = fnc(file, $din, $seft) if (type === 'photo' || type === 'video') { if (!$dom) return $seft.val(''); var $addLayout = $(document.createElement('a')); var $addInput = $('') var $close = $(document.createElement('span')); $addInput[0].files = this.files; $addLayout.append($addInput) $addLayout.append($close); $addLayout.append($dom); $addLayout.addClass("result"); $din.prepend($addLayout); $layout.find('.edit-fun-images').append($din); } }; // 图片与视频加载 $('.upload, .edit-fun-images').on('change', function (ev) { if (ev.target.tagName.toUpperCase() === 'INPUT') { fileHandle.call(ev.target) } }) $('.edit-fun-images').on('click', function (ev) { var $tag = $(ev.target) var tagName = ev.target.tagName.toUpperCase() if (tagName === 'SPAN') { var $resf = $(ev.target) $resf.parent().parent().remove() } else if (tagName === 'IMG' && $tag.hasClass('play-video')) { $videoLayout .css('display', 'flex') .find('video') .attr('src', $tag.attr('videoURL'))[0] .play() } }) } //选择热点的样式 Hotpoint.prototype.active = function () { $(".hotStyle-item li").on('click', function () { $(this).addClass('active').siblings().removeClass('active'); }) } //当前处于的状态,比如是否是添加热点的状态 Hotpoint.prototype.state = function (that, Hot) { if (g_HotStatus === "add") { this.addHot(that, Hot, function () { this.addHotList(g_HotMeshes, g_HotMeshes.length - 1); this.spotList.find("i").text(this.spotList.find("ul li").length); }); } } //删除热点 Hotpoint.prototype.remHot = function (that, thisScene) { var hotId = that.closest("li").attr("data-spid"); for (var i = 0; i < g_HotMeshes.length; i++) { if (g_HotMeshes[i].belongHot.sid === hotId) { //在场景中删除这个热点模型 thisScene.scene.remove(g_HotMeshes[i]); g_HotMeshes[i].visible = false; //如果热点数据中有这个热点数据就删除 //g_HotMeshes.splice(i, 1); } } that.closest("li").remove(); this.spotList.find(".hotNum").text(this.spotList.find("ul li").length); console.log("删除成功:" + hotId); } //添加热点模型 Hotpoint.prototype.addHot = function (that, Hot, fn) { if (!window.hotPointPos) return; // 没有正确的热点位置, return // console.log(that.reticule.position); var position = that.reticule.position.toArray(); // window.hotPointPos.z -= 0.05 // var position = window.hotPointPos.toArray(); var rotation = that.reticule.rotation.toArray().slice(0, 3); // var rotation = new THREE.Quaternion(); // rotation.setFromAxisAngle( new THREE.Vector3( 0, 1, 0 ), Math.PI / 2 ); // var rotation = [-3.1415914628953048, ] var sid = g_HotMeshes.length > 0 ? "sprite_" + (parseInt(g_HotMeshes[g_HotMeshes.length - 1].name.substring(7)) + 1) : "sprite_" + g_HotMeshes.length; var hot = new Hot(sid, { position: position, rotation: rotation, size: 1.05 }, that.model); that.model.hots[sid] = hot; g_HotStatus = false; that.mouseCouldBeClickToMove = false; $("#player").css("cursor", ""); //添加完热点之后的回调函数 if (g_HotMeshes && g_newHot.length === g_newHot.length++) { var thisScene = that; fn && fn.call(this, thisScene); } } //创建热点列表的dom Hotpoint.prototype.creatDom = function (data, index) { var _index = +index + 1; return "
  • " + "
    " + "
    热点" + _index + "
    " + "
    确定删除
    " + "
    " + "
  • "; } //添加热点列表 Hotpoint.prototype.addHotList = function (data, index) { if (!data) return; this.spotList.children("ul").append(this.creatDom(data, index)); //保存热点信息到热点dom元素中 var spotList = $(".spotList ul").children("#ggg_s" + index); spotList[0].hotAttribute = g_HotMeshes[index]; spotList.attr('data-spid', g_HotMeshes[index].belongHot.sid); } //添加热点音乐 Hotpoint.prototype.addMusic = function () { var mediaUpload = $("#hotpointDetail .audio.mediaUpload"); mediaUpload.find("input").on("change", function () { var file = this.files[0]; mediaUpload.find(".innerBtn").text("替换"); mediaUpload.find(".playBox").removeClass("hide"); mediaUpload.find(".title").text(file.name); mediaUpload.find('#query-bgm').attr('href', URL.createObjectURL(file)); }); //删除音乐 mediaUpload.on("click", ".delete", function () { mediaUpload.find('#query-bgm').attr('href', ""); mediaUpload.find(".playBox").addClass("hide"); mediaUpload.find(".innerBtn").text("上传"); mediaUpload.find("input").val("").removeAttr("data-hotbgm"); }) } //添加热点模型列表dom Hotpoint.prototype.inputList = function (text, val) { var _val = ''; if (arguments[1]) { _val = 'value=' + val; } return '' } //添加热点模型 Hotpoint.prototype.addModel = function () { var text = this.inputList("请填写模型链接"); this.hotpointDetail.find(".model .add").on('click', function () { $(this).closest(".model").find(".list").append(text) }); this.hotpointDetail.find(".model .delete").on('click', function () { $(this).closest(".model").find(".list > div:last").remove(); }); } //添加网页链接 Hotpoint.prototype.addwebPack = function () { var text = this.inputList("请填写网页链接", ""); this.hotpointDetail.find(".webPage .add").on('click', function () { $(this).closest(".webPage").find(".list").append(text) }); this.hotpointDetail.find(".webPage .delete").on('click', function () { $(this).closest(".webPage").find(".list > div:last").remove(); }); } // 保存热点信息 Hotpoint.prototype.saveHot = function () { var $layout = $(".edit-loading"); var hotpointDetail = this.hotpointDetail; hotpointDetail.find(".tail .submit").on('click', function () { //显示loading $layout.removeClass('hide'); var args = {}; //热点标题 var $title = hotpointDetail.find(".info input"); //热点内容 var $content = hotpointDetail.find(".info textarea"); //热点图片 var $images = hotpointDetail.find(".photo .edit-fun-images a.result"); //热点视频 var $videos = hotpointDetail.find(".video .edit-fun-images a.result"); //热点视频的图片 var $thums = hotpointDetail.find(".video .edit-fun-images .upload-thum"); //热点模型 var $modules = hotpointDetail.find(".model input"); //热点内嵌网页 var $iframes = hotpointDetail.find(".webPage input"); //热点音乐 var $miusc = hotpointDetail.find("#upload-hotBgm"); let $bgName = hotpointDetail.find('.title'); new Promise(function (resolve, reject) { //获取热点图片所有的路径 upload($images, 'images', resolve) }).then(function (imgUrls) { args.images = imgUrls //获取热点视频所有的路径 return new Promise(function (resolve, reject) { upload($videos, 'images', resolve) }) }).then(function (videoUrls) { args.video = videoUrls //获取热点视频图片所有的路径 return new Promise(function (resolve, reject) { upload($thums, 'images', resolve) }) }).then(function (thums) { args.video = args.video.map(function (video, index) { return { url: video, img: thums[index] } }) }).then(function () { //获取热点音乐所有的路径 //console.log($miusc) if ($miusc[0].files.length > 0) { return new Promise(function (resolve) { upload($miusc, 'miusc', function (res) { resolve(res[0]) }) }) } else { return $miusc.attr('data-hotBgm') } }).then(function (src) { args.backgroundMusic = src args.bgName = $bgName[0].innerHTML; }).then(function () { //获取热点标题、内容、内嵌网页、模型网页。 args.title = $title.val() args.content = $content.val() var iframes = [] for (var i = 0; i < $iframes.length; i++) { var iframe = $iframes.eq(i).val() iframe && iframes.push(iframe) } args.iframe = iframes var modules = [] for (var i = 0; i < $modules.length; i++) { var module = $modules.eq(i).val() module && modules.push(module) } args.model = modules return args }).then(function (args) { //把获取的所有信息都保存在对应热点的dom元素里面 hotpointDetail[0].targetDOM.infoAttribute = args; $layout.addClass('hide'); hotpointDetail.addClass("atRight"); }) }) } //背景音乐 var EditMiuse = function () { this.mediaUpload = $(".music .audio.mediaUpload"); this.success = function (text, url) { this.mediaUpload.find(".innerBtn").text("替换"); this.mediaUpload.find(".playBox").removeClass("hide"); this.mediaUpload.find(".title").text(text); this.mediaUpload.find('#query-bgm').attr('href', "//" + url) }; this.delete = function () { this.mediaUpload.find('#query-bgm').attr('href', ""); this.mediaUpload.find(".playBox").addClass("hide"); this.mediaUpload.find(".innerBtn").text("上传"); this.mediaUpload.find("input").val(""); }; var that = this; $('#upload-bgm').on('change', function () { var file = this.files[0]; uploadMiuse(file, function (rs, file) { if (rs.code === 200) { that.success(file.name, rs.content) } }) }); //删除音乐 this.mediaUpload.on("click", ".delete", function () { that.delete(); }) } EditMiuse.prototype.init = function (data) { if (!data.backgroundMusic) return; this.success("backgound", data.backgroundMusic); } //导览编辑 var EditGuide = function () { this.$list = $('#guide-list') this.tourDetail = $('#tourEdit'); // 导览编辑 this.targetTourPoint = null; // fyz 记录当前编辑的导览点 // fyz 导览音乐队列 this.tourAudio = {}; } /** * @author fyz 2019.07.31 * @description 新增参数data2, 表示data2.js中的数据 */ EditGuide.prototype.init = function (data, data2) { this.creatDom(data, data2); this.addTourMusic(); // 添加导览音乐 this.tourAudio = data2.tourAudio || {}; var that = this; //点击添加导览 $('.addTour .innerBtn').on("click", function () {//点击截取视图 addTour(this); }.bind(this)); // 重新录制导览 $('#renewTourBtn').on("click", function () {//点击截取视图 addTour(this, true); }.bind(this)); // 确认并保存导览信息 $('#tourSubmit').on("click", function () {//点击截取视图 this.saveGuide(); }.bind(this)); function addTour(that, renew) { var ev = document.createEvent("MouseEvent");//"MouseEvent" ev.initMouseEvent("snapshotBegin", true, true, document.defaultView, 0, 0, 0, 0, 0, false, false, false, false, 0, null); g_snapShotWidth = 200; g_snapShotHeight = 140; window.screenSta = 'tour'; // 记录当前哪个功能截屏, 因为导览截屏需要做额外的校对调整, 初始画面截屏不需要 ev.__callback = function (imgData, info) { that.uploadGuide(imgData, info, renew, that.targetTourPoint) }.bind(that); window.dispatchEvent(ev); } // fyz 点击导览名字, 对导览进行详细编辑 $('.tourList ul').on('click', function (ev) { var $seft = $(ev.target) if ($seft.attr('data-oper') === 'tour-text') { // $seft.siblings('input').removeClass('hide').closest('li').siblings().find('input').addClass('hide'); // $seft.siblings('input').focus(); that.editGuideData($seft); } if ($seft.attr('data-oper') === 'tour-delete') { var choice = confirm("你确定删除吗?"); if (choice) { $seft.closest('li').remove(); } else { return false } } }).on("change", function (ev) { this.inputDone(ev) }.bind(this)) $('.tourList ul input').on('blur', function (ev) { this.inputDone(ev) }.bind(this)).on('keydown', function (ev) { ev.stopPropagation() }) //点击导览编辑窗口右上角的关闭按钮 this.tourDetail.find("a.close, button.cancel").on("click", function () { that.targetTourPoint[0].musicSta = true; // 取消操作, 重置状态 that.tourDetail.addClass("atRight"); }); /*fyz 导览列表拖拽以改变导览点的顺序 */ let tourListNode = document.querySelector('#tourListWrap'); let draging = null; tourListNode.ondragstart = function (event) { event.dataTransfer.setData("te", event.target.innerText); //不能使用text,firefox会打开新tab draging = event.target; } tourListNode.ondragover = function (event) { event.preventDefault(); let target = event.target.parentNode.parentNode; let dragingIndex = draging.querySelector('#index'); let targetIndex = target.querySelector('#index'); // 判断dragover是否发生在LI元素上 if (target.nodeName === 'LI' && target !== draging) { var targetRect = target.getBoundingClientRect(); var dragingRect = draging.getBoundingClientRect(); if (target && target.animated) { return; } let ulElem = target.parentNode; // 寻找到 ul节点 if (getIndex(draging) < getIndex(target)) { dragingIndex.innerText = [targetIndex.innerText, targetIndex.innerText = dragingIndex.innerText][0]; // 交换两个节点的序号 ulElem.insertBefore(draging, target.nextSibling); } else { dragingIndex.innerText = [targetIndex.innerText, targetIndex.innerText = dragingIndex.innerText][0]; ulElem.insertBefore(draging, target); } _animate(dragingRect, draging); _animate(targetRect, target); } } } /** * @author fyz 编辑导览数据 * @param {any} target 所点击的导览点 */ EditGuide.prototype.editGuideData = function (target) { this.targetTourPoint = target; // 记录当前编辑的导览点 var that = this; $('#tourEdit').removeClass('atRight'); // 显示导览编辑的工具栏 document.querySelector('#tourName input').value = target.context.textContent; // 显示已有的导览名字 $("#tourEdit .audio.mediaUpload").find("input").val(''); // 点击编辑导览清空上一次文件 target[0].musicSta = true; // 判断当前点是否有导览音频 var audio = this.tourAudio[target.closest('li')[0].data.sid]; var musicUrl = audio ? audio.music : null; if (musicUrl) { var musicName = audio.name || '导览音频.mp3' // 获取音频的文件名 this.tourDetail.find(".audio .playBox").removeClass("hide"); this.tourDetail.find("#upload-hotBgm").attr('data-hotBgm', musicUrl) this.tourDetail.find(".audio .playBox a").attr("href", "//" + musicUrl); this.tourDetail.find(".audio .submit").text("替换"); this.tourDetail.find("#tourMusicName").text(musicName); } else { this.tourDetail.find(".audio .playBox").addClass("hide"); this.tourDetail.find(".audio .submit").text("上传"); } } /** * @author fyz 保存导览数据 */ EditGuide.prototype.saveGuide = function () { var $layout = $(".edit-loading"); $layout.removeClass('hide'); var that = this; var tourDetail = this.tourDetail; var tourName = tourDetail.find('#tourNameInput').val() || this.targetTourPoint.context.innerText; var curTourPoint = this.targetTourPoint.context.closest('li'); this.targetTourPoint.text(tourName); // 输入框未输入数据则保留原来的值 curTourPoint.data.name = tourName; // 导览音乐 var tourAudio = this.tourDetail.find('#uploadTourBgm'); var tourName = this.tourDetail.find("#tourMusicName").text(); // 记录音频名称 var sid = curTourPoint.data.sid; // 判断当前编辑的导览点位是否已上传音乐 if (tourAudio[0].files.length > 0 && this.targetTourPoint[0].musicSta) { // 已添加导览音乐 new Promise(function (resolve, reject) { uploadMiuse(tourAudio[0].files[0], function (res) { resolve(res.content); }) }).then(function (src) { var audio = new Audio(); audio.src = '//' + src; audio.onloadedmetadata = function () { // 对返回的src进行处理, 去掉前面域名, 尽量避免修改main.js var srcArr = src.split('/'); srcArr[0] = ''; src = srcArr.join('/'); that.tourAudio[sid] = { "name": tourName, "music": '/' + src, "time": Math.round(audio.duration * 1000 + 1000) } $layout.addClass('hide'); $('#tourEdit').addClass('atRight'); // 显示导览编辑的工具栏 } }) } else if (!this.targetTourPoint[0].musicSta) { // 删除导览音乐, 将数据重置 this.tourAudio[sid] = { "music": "", "time": 0 } $layout.addClass('hide'); $('#tourEdit').addClass('atRight'); // 显示导览编辑的工具栏 } else { // 未添加导览音乐 $layout.addClass('hide'); $('#tourEdit').addClass('atRight'); // 显示导览编辑的工具栏 } } //添加导览音乐 EditGuide.prototype.addTourMusic = function () { var mediaUpload = $("#tourEdit .audio.mediaUpload"); var that = this; mediaUpload.find("input").on("change", function () { var file = this.files[0]; mediaUpload.find(".innerBtn").text("替换"); mediaUpload.find(".playBox").removeClass("hide"); mediaUpload.find(".title").text(file.name); mediaUpload.find('#query-bgm').attr('href', URL.createObjectURL(file)); that.targetTourPoint[0].musicSta = true; }); mediaUpload.find("input").on("click", function () { mediaUpload }); //删除音乐 mediaUpload.on("click", ".delete", function () { mediaUpload.find('#query-bgm').attr('href', ""); mediaUpload.find(".playBox").addClass("hide"); mediaUpload.find(".innerBtn").text("上传"); mediaUpload.find("input").val("").removeAttr("data-hotbgm"); that.targetTourPoint[0].musicSta = false; }) } /** * @author fyz 2019.07.31 * @description 新增参数data2 * @param {object} data someData.js中的模型数据 * @param {object} data2 data2.js中的导览和热点数据 */ EditGuide.prototype.creatDom = function (data, data2) { var $lis = []; var that = this; var tourAudio = data2.tourAudio || {}; data.model.images.forEach(function (i, index) { if (i.thumbnail_signed_src) { var $li = $(that.dom(index, i.name, i.thumbnail_signed_src)); $li[0].data = i // 挂载当前导览点对应的音频链接 if (i.sid in tourAudio && tourAudio[i.sid].music && tourAudio[i.sid].music !== '') { $li[0].musicUrl = tourAudio[i.sid].music; } $lis.push($li) } }) $(".tourList > ul").append($lis) } EditGuide.prototype.dom = function (index, title, img) { return '
  • ' + '
    ' + '' + index + '' + '
    ' + '
    ' + '
    ' + '' + title + '' + '' + '
    ' + '
    ' + '
    ' + '
    ' + '
    ' + '
  • '; } /** * @author fyz * @param target 当前导览点的父级li元素 */ EditGuide.prototype.inputDone = function (ev, target) { var $seft = $(ev.target) if ($seft.attr('data-oper') === 'tour-input') { // $seft.addClass('hide') // fyz 现有的实现方式不隐藏输入框 var name = target.siblings('span').context.innerText; $seft.text($seft.val() || name); // fyz 如果未输入数据, 则保留原来的导览名字 //更改导览横向列表的名字: target.siblings('span').context.innerText = $seft.val() || name; target.closest('li')[0].data.name = $seft.val() || name; } } /** * @author fyz 2019.07.31 * @description uploadGuide方法新增参数renew状态码, 表示是否重新录制当前导览, 新增targetTourPoint, 记录当前的导览点元素 */ EditGuide.prototype.uploadGuide = function (urlData, guide, renew, target) { var that = this; uploadImg(urlData, function (rs) { if (rs.code === 200) { var editGuide = new EditGuide(); var sid = rs.content.substring(rs.content.lastIndexOf('/') + 1, rs.content.lastIndexOf('.')); var thumbnail_signed_src = rs.content; var args = JSON.parse("{" + guide + "}"); args.sid = sid; args.name = sid; args.thumbnail_signed_src = thumbnail_signed_src; args.metadata = JSON.stringify({ camera_mode: 0, camera_position: { x: args.metadata.camera_position[0], y: args.metadata.camera_position[1], z: args.metadata.camera_position[2] }, camera_quaternion: { x: args.metadata.camera_quaternion[0], y: args.metadata.camera_quaternion[1], z: args.metadata.camera_quaternion[2], w: args.metadata.camera_quaternion[3] }, ortho_zoom: -1, scan_id: args.metadata.scan_id, final_angle: 110, is_ortho: false, zoom: args.metadata.zoom // fyz zoom是内部计算的zoomLevel, 乘以系数1.06才是实际缩放倍数 }) if (renew && target) { // 重新录制导览 var oldId = target.closest('li')[0].data.sid; that.tourAudio[args.sid] = that.tourAudio[oldId]; // 新生成的id指向以前的导览音频 delete that.tourAudio[oldId]; // 删除导览音频中的旧导览id target.closest('li')[0].data = args; // 更新数据 target.closest('li').find('#tourBg')[0].style.backgroundImage = 'url(//' + args.thumbnail_signed_src + ')'; target.text(args.name); // 更新导览列表中的导览名称 $('#tourEdit').find('#tourNameInput').val(args.name); // 修改输入框内容 } else { var index = $(".tourList ul li").length + 1; var $li = $(editGuide.dom(index, args.name, args.thumbnail_signed_src)); $li[0].data = args; $(".tourList ul").append($li); } } }) } /* -- 以下是一些公用的方法 -- */ //限制大小 var restrictedSize = function (file, _size) { //限制大小不大于8m var fileSize = 0; var isIE = /msie/i.test(navigator.userAgent) && !window.opera; if (isIE && !file) { var fileSystem = new ActiveXObject("Scripting.FileSystemObject"); var _file = fileSystem.GetFile(filepath); fileSize = _file.Size; } else { fileSize = file.size; } var size = fileSize / 1024; var RSize = _size * 1024; if (size > RSize) { alert("文件不能大于" + _size + "M"); return false; } if (size <= 0) { alert("文件大小不能为0M!"); return false; } return true } //上传音乐 var uploadMiuse = function (file, callback) { if (!/audio\/\w+/.test(file.type)) { alert("文件必须为音乐!"); return false; } //限制大小不大于8m if (!restrictedSize(file, 8)) { return false } uploadFile(file, 'audio', callback); } //上传图片 function uploadImg(urlData, callback) { var bytes = window.atob(urlData.split(',')[1]); //去掉url的头,并转换为byte //处理异常,将ascii码小于0的转换为大于0 var ab = new ArrayBuffer(bytes.length); var ia = new Uint8Array(ab); for (var i = 0; i < bytes.length; i++) { ia[i] = bytes.charCodeAt(i); } var blob = new Blob([ab], { type: 'image/jpeg' }); uploadFile(blob, 'hot/images', callback); } //上传文件 function uploadFile(file, type, callback) { $(".edit-loading").removeClass("hide"); var formData = new FormData() formData.append('name', number) formData.append('dir', type) formData.append('random', true) formData.append('file', file) $.ajax({ url: ceshi + '/uploadFile', data: formData, dataType: 'json', type: 'POST', cache: false,//上传文件无需缓存 processData: false,//用于对data参数进行序列化处理 这里必须false contentType: false, //必须 success: function (rs) { callback(rs, file); $(".edit-loading").addClass("hide"); } }) } function _animate(prevRect, target) { var ms = 300; if (ms) { var currentRect = target.getBoundingClientRect(); if (prevRect.nodeType === 1) { prevRect = prevRect.getBoundingClientRect(); } _css(target, 'transition', 'none'); _css(target, 'transform', 'translate3d(' + (prevRect.left - currentRect.left) + 'px,' + (prevRect.top - currentRect.top) + 'px,0)' ); target.offsetWidth; // 触发重绘 //放在timeout里面也可以 // setTimeout(function() { // _css(target, 'transition', 'all ' + ms + 'ms'); // _css(target, 'transform', 'translate3d(0,0,0)'); // }, 0); _css(target, 'transition', 'all ' + ms + 'ms'); _css(target, 'transform', 'translate3d(0,0,0)'); clearTimeout(target.animated); target.animated = setTimeout(function () { _css(target, 'transition', ''); _css(target, 'transform', ''); target.animated = false; }, ms); } } //给元素添加style function _css(el, prop, val) { var style = el && el.style; if (style) { if (val === void 0) { if (document.defaultView && document.defaultView.getComputedStyle) { val = document.defaultView.getComputedStyle(el, ''); } else if (el.currentStyle) { val = el.currentStyle; } return prop === void 0 ? val : val[prop]; } else { if (!(prop in style)) { prop = '-webkit-' + prop; } style[prop] = val + (typeof val === 'string' ? '' : 'px'); } } } function upload($files, type, cb) { var length = $files.length var rcount = 0 var result = [] Array.from($files).forEach(function (dFile) { //a 标签的success 是用来判断是否是已经上传过的文件 //attr-thum 属性是视频的图片 //videoURL 是判断是否有视频 var $file = $(dFile) var $image = $file.find('img') if ($file.hasClass('success')) { if ($file.attr('attr-thum')) { result.push($file.attr('attr-thum')) } else if ($image.attr('videoURL')) { result.push($image.attr('videoURL')) } else { result.push($image.attr('src')) } return success(++rcount); } else { switch ($file[0].localName) { case "input": dFile = $file[0] break; case "span": dFile = $file.find('input')[0]; break; case "a": dFile = $file.find('input')[0]; break; default: dFile = $file.closest("li").find('.upload input')[0]; break; } // dFile = $file[0].localName === "input" ? $file[0] : $file[0].localName === "span" ? $file.find('input')[0] : $file.closest("li").find('.upload input')[0]; } var file = (dFile.files && dFile.files[0]) || ''; if (!file) return success(++rcount); uploadFile(file, 'hot/' + type, function (rs) { if (rs.code === 200) { result.push(rs.content) }; success(++rcount); }) }) //判断当前队列元素是否处理成功 function success() { if (rcount === length) { cb(result) } } success() } function getIndex(el) { let index = 0; if (!el || !el.parentNode) { return -1; } while (el && (el = el.previousElementSibling)) { index++; } return index; }