/** * [ONEMAP.M.projectController] * @return {[object]} */ define(function (tplLayout) { /** * 初始化并订阅事件 * @return {[type]} [description] */ /** * 模块数据 用于数据存储和外部调用 * @type {Object} * 数据存放 */ var modValue = { QXSY: {}, model: {}, seleted_guid: null, stereoscopic_handle: null, } /** * 状态值 * @type {Boolean} * @default false * @private */ var status = { initialized: false, isShowChild: false, connect: false, webSocketState: false }; function init() { if (!status.initialized) { subscribe(); bindEvent(); prototypeBind(); status.initialized = true; // $("#threeData").parent().find(".menu-content").show(); } ONEMAP.C.publisher.publish({ modName: 'threeData' }, 'menuListClick'); } function prototypeBind() { //1.0GLTG插件 var fixGltf = function (gltf) { if (!gltf.extensionsUsed) { return; } var v = gltf.extensionsUsed.indexOf('KHR_technique_webgl'); var t = gltf.extensionsRequired.indexOf('KHR_technique_webgl'); // 中招了。。 if (v !== -1) { gltf.extensionsRequired.splice(t, 1, 'KHR_techniques_webgl'); gltf.extensionsUsed.splice(v, 1, 'KHR_techniques_webgl'); gltf.extensions = gltf.extensions || {}; gltf.extensions['KHR_techniques_webgl'] = {}; gltf.extensions['KHR_techniques_webgl'].programs = gltf.programs; gltf.extensions['KHR_techniques_webgl'].shaders = gltf.shaders; gltf.extensions['KHR_techniques_webgl'].techniques = gltf.techniques; var techniques = gltf.extensions['KHR_techniques_webgl'].techniques; gltf.materials.forEach(function (mat, index) { gltf.materials[index].extensions['KHR_technique_webgl'].values = gltf.materials[index].values; gltf.materials[index].extensions['KHR_techniques_webgl'] = gltf.materials[index].extensions['KHR_technique_webgl']; var vtxfMaterialExtension = gltf.materials[index].extensions['KHR_techniques_webgl']; for (var value in vtxfMaterialExtension.values) { var us = techniques[vtxfMaterialExtension.technique].uniforms; for (var key in us) { if (us[key] === value) { vtxfMaterialExtension.values[key] = vtxfMaterialExtension.values[value]; delete vtxfMaterialExtension.values[value]; break; } } }; }); techniques.forEach(function (t) { for (var attribute in t.attributes) { var name = t.attributes[attribute]; t.attributes[attribute] = t.parameters[name]; }; for (var uniform in t.uniforms) { var name = t.uniforms[uniform]; t.uniforms[uniform] = t.parameters[name]; }; }); } } Object.defineProperties(Cesium.Model.prototype, { _cachedGltf: { set: function (value) { this._vtxf_cachedGltf = value; if (this._vtxf_cachedGltf && this._vtxf_cachedGltf._gltf) { fixGltf(this._vtxf_cachedGltf._gltf); } }, get: function () { return this._vtxf_cachedGltf; } } }); } function bindEvent() { var thrData = ONEMAP.D.globalSettingData.map3DModelSetting; var threeLength = ONEMAP.D.globalSettingData.map3DModelSetting.length; // alert(thrData); var ul = $(''); for (var i = 0; i < threeLength; i++) { var threeDlist = $('
  • ' + thrData[i].name + '
  • '); ul.append(threeDlist); } var data = ul.html(); $(".sanWei .menu-content").html(data); $(".sanWei li").unbind('click').bind('click', function () { var menuCheckBox = $(this).find('.meun-checkBox'); var ztCbx = $(this).find('.zt-cbx'); if (menuCheckBox.hasClass("menu-select-no")) { menuCheckBox.removeClass('menu-select-no').addClass("menu-select"); if (!map23DData.display.map3D) { $("#mapModelChange .bg")[0].click() } var idx = $(this).attr('cid'); var modelData = ONEMAP.D.globalSettingData.map3DModelSetting[idx]; var guid = null var options = {}; if (modelData.type == "qxData") { guid = add3DQX(modelData); options = { action: "add", DOM: { guid: guid, type: "QXSY", name: $(this).find('.no-bg').text(), }, mod: "QXSY" } } else { guid = add3DModel(modelData) options = { action: "add", DOM: { guid: guid, type: "MOXING", name: $(this).find('.no-bg').text(), }, mod: "MOXING" } } if (!guid) { return } ztCbx.attr("layer", guid); ztCbx.attr("class", "zt-cbx " + guid); // // 添加到我的图层 // var options = { // action: "add", // DOM: { // guid: guid, // type: "QXSY", // name: $(this).find('.no-bg').text(), // }, // mod: "QXSY" // } ONEMAP.M.myLayers.myLayerControl(options); // 添加信息到“我的图层” ONEMAP.C.publisher.subscribe(layerAction, guid); } else { menuCheckBox.removeClass('menu-select').addClass("menu-select-no"); var guid = ztCbx.attr("layer"); var type = guid.split("-")[0] if (type == "QXSY") { removeQXSY(guid); } else { removeMX(guid) } ONEMAP.M.myLayers.myLayerControl({ action: "remove", DOMid: guid }); // 移除数据层 } }) } function layerAction(options) { if (options.guid.split("-")[0] == "QXSY") { if (options.action == "remove") { removeQXSY(options.guid) } else if (options.action == "opacity") { opacityQXSY(options) } } else if (options.guid.split("-")[0] == "MOXING") { if (options.action == "remove") { removeMX(options.guid) } else if (options.action == "opacity") { opacityMX(options) } else if (options.action == "set") { // 高亮显示模型,选中后可拖动 removeModelHighlight(); if (modValue.seleted_guid != null && options.guid == modValue.seleted_guid) { removeControlStereoscopic(); modValue.seleted_guid = null; return; } modValue.seleted_guid = options.guid; addControlStereoscopic(); } } } function removeQXSY(guid) { map3DViewer.map.scene.primitives.remove(modValue.QXSY[guid]); delete modValue.QXSY[guid]; } function opacityQXSY(options) { if (options.options.opacity) modValue.QXSY[options.guid].show = true if (!options.options.opacity) modValue.QXSY[options.guid].show = false } function removeMX(guid) { map3DViewer.map.entities.remove(modValue.model[guid]); delete modValue.model[guid]; if (modValue.seleted_guid == guid) { removeControlStereoscopic() modValue.seleted_guid = null } } function opacityMX(options) { if (options.options.opacity) { modValue.model[options.guid].show = true } else { modValue.model[options.guid].show = false } } // 添加控制 模型 事件 function addControlStereoscopic() { removeControlStereoscopic() addModelHighlight(); modValue.stereoscopic_handle = new Cesium.ScreenSpaceEventHandler(map3DViewer.map.scene.canvas); // console.log(viewer.scene.canvas); modValue.stereoscopic_handle.setInputAction(mouseLeftDown, Cesium.ScreenSpaceEventType.LEFT_DOWN); } function mouseLeftDown(e) { //当鼠标点击时获取移动的位置 var pick = map3DViewer.map.scene.pick(e.position); // console.log(pick); if (pick != undefined) { var id = pick.id._id; if (modValue.seleted_guid != id) { return; } else { //禁止地图移动,绑定鼠标移动时间,移动时模型随之移动 setMapControl(false) modValue.stereoscopic_handle.setInputAction(mouseLeftUp, Cesium.ScreenSpaceEventType.LEFT_UP); modValue.stereoscopic_handle.setInputAction(mouseMove, Cesium.ScreenSpaceEventType.MOUSE_MOVE) } } } function mouseLeftUp(e) { // //当鼠标点击时获取移动的位置 // var pick = map3DViewer.map.scene.pick(e.position); // if (pick != undefined) { // var id = pick.id._id; // if (modValue.seleted_guid != id) { // return; // } else { // //恢复地图移动 取消鼠标移动事件 // setMapControl(true) // modValue.stereoscopic_handle.removeInputAction(mouseMove, Cesium.ScreenSpaceEventType.MOUSE_MOVE) // } // } //恢复地图移动 取消鼠标移动事件 setMapControl(true) modValue.stereoscopic_handle.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP) modValue.stereoscopic_handle.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE) } function mouseMove(e) { var ray = map3DViewer.map.camera.getPickRay(e.endPosition); var cartesian = map3DViewer.map.scene.globe.pick(ray, map3DViewer.map.scene); // console.log(cartesian); modValue.model[modValue.seleted_guid].position.setValue(cartesian); } // 移除控制 模型 事件 function removeControlStereoscopic() { if (modValue.stereoscopic_handle != null) { modValue.stereoscopic_handle.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN); modValue.stereoscopic_handle.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP); modValue.stereoscopic_handle.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE); modValue.stereoscopic_handle = null; } } // 添加 模型 高亮 function addModelHighlight() { modValue.model[modValue.seleted_guid].model.silhouetteColor = Cesium.Color.BLUE; modValue.model[modValue.seleted_guid].model.silhouetteSize = 3.0; } // 移除 模型 高亮 function removeModelHighlight() { if (modValue.seleted_guid != null) { modValue.model[modValue.seleted_guid].model.silhouetteSize = 0.0; } } function setMapControl(judge) { var obj = {}; if (!judge) { modValue.screenSpaceCameraController = { rotateEventTypes: map3DViewer.map.scene.screenSpaceCameraController.rotateEventTypes, tiltEventTypes: map3DViewer.map.scene.screenSpaceCameraController.tiltEventTypes, translateEventTypes: map3DViewer.map.scene.screenSpaceCameraController.translateEventTypes, zoomEventTypes: map3DViewer.map.scene.screenSpaceCameraController.zoomEventTypes // enableRotate: map3DViewer.map.scene.screenSpaceCameraController.enableRotate, // enableTranslate: map3DViewer.map.scene.screenSpaceCameraController.enableTranslate, // enableZoom: map3DViewer.map.scene.screenSpaceCameraController.enableZoom, // enableTilt: map3DViewer.map.scene.screenSpaceCameraController.enableTilt, } obj = { rotateEventTypes: undefined, tiltEventTypes: undefined, translateEventTypes: undefined, zoomEventTypes: undefined } } else { if (!modValue.screenSpaceCameraController) { return } obj = { rotateEventTypes: modValue.screenSpaceCameraController.rotateEventTypes, tiltEventTypes: modValue.screenSpaceCameraController.tiltEventTypes, translateEventTypes: modValue.screenSpaceCameraController.translateEventTypes, zoomEventTypes: modValue.screenSpaceCameraController.zoomEventTypes, } modValue.screenSpaceCameraController = null; } // 如果为真,则允许用户旋转相机。如果为假,相机将锁定到当前标题。此标志仅适用于2D和3D。 // map3DViewer.map.scene.screenSpaceCameraController.enableRotate = obj.enableRotate; // // 如果为true,则允许用户平移地图。如果为假,相机将保持锁定在当前位置。此标志仅适用于2D和Columbus视图模式。 // map3DViewer.map.scene.screenSpaceCameraController.enableTranslate = obj.enableTranslate; // // 如果为真,允许用户放大和缩小。如果为假,相机将锁定到距离椭圆体的当前距离 // map3DViewer.map.scene.screenSpaceCameraController.enableZoom = obj.enableZoom; // // 如果为真,则允许用户倾斜相机。如果为假,相机将锁定到当前标题。这个标志只适用于3D和哥伦布视图。 // map3DViewer.map.scene.screenSpaceCameraController.enableTilt = obj.enableTilt; map3DViewer.map.scene.screenSpaceCameraController.rotateEventTypes = obj.rotateEventTypes; map3DViewer.map.scene.screenSpaceCameraController.tiltEventTypes = obj.tiltEventTypes; map3DViewer.map.scene.screenSpaceCameraController.translateEventTypes = obj.translateEventTypes; map3DViewer.map.scene.screenSpaceCameraController.zoomEventTypes = obj.zoomEventTypes; } /** * 设置界面 */ function setLayout() { } /** * 界面重置 * @return {[type]} [description] */ function layoutResize(options) { if (options.modName != "threeData") { remove(); } else { if (status.isShowChild) { remove(); } else { $("#menu .sanWei").addClass('active'); status.isShowChild = true; if (map23DData.show3DAlert) { ONEMAP.C.publisher.publish('3D', 'layout::mapStyle'); } } } } /** * 模块移除 * @return {[type]} [description] */ function remove() { //取消订阅 unSubscribe(); $("#menu .sanWei").removeClass('active'); status.isShowChild = false; } /** * 加载/移除倾斜摄影 * @return {[type]} [description] */ function add3DQX(options) { var guid = map23DControl.buildGuid('QXSY-3DData'); var tilesetUrl = options.url var tileset = new Cesium.Cesium3DTileset({ url: tilesetUrl, show: true, }); modValue.tileset = tileset map3DViewer.map.scene.primitives.add(tileset, 1); tileset.readyPromise.then(function (tileset) { // mapControl.viewer.camera.viewBoundingSphere(tileset.boundingSphere, new Cesium.HeadingPitchRange(0, -0.5, 0)); // changeHeight(0) }); map3DViewer.map.zoomTo(tileset); modValue.QXSY[guid] = tileset return guid; }; /** * [add3DModel description] * 加载/移除三维模型 * @param {[type]} options [description] * @return {[type]} [description] */ function add3DModel(options) { var guid = map23DControl.buildGuid('MOXING-3DData'); options.m_height = JSON.parse(options.m_height); options.m_hdeading = JSON.parse(options.m_hdeading); options.m_pitch = JSON.parse(options.m_pitch); options.m_roll = JSON.parse(options.m_roll); options.m_scale = JSON.parse(options.m_scale); var position = Cesium.Cartesian3.fromDegrees(options.center.lng, options.center.lat, options.m_height); var tileset = map3DViewer.map.entities.add({ id: guid, position: position, orientation: Cesium.Transforms.headingPitchRollQuaternion( position, new Cesium.HeadingPitchRoll( Cesium.Math.toRadians(options.m_hdeading), Cesium.Math.toRadians(options.m_pitch), Cesium.Math.toRadians(options.m_roll) ) ), model: { uri: onemapUrlConfig.qxsy + options.url, // uri: options.url, minimumPixelSize: 128, scale: options.m_scale, heightReference: Cesium.HeightReference.RELATIVE_TO_GROUND } }); map3DViewer.map.zoomTo(tileset); modValue.model[guid] = tileset; return guid; } function add3DModelNoFly(options) { if (options.name) { modValue['model' + options.indexNum] = locaSpaceMap.Globe.Layers.Add1(options.url); } else { locaSpaceMap.Globe.Layers.RemoveLayerByID(modValue['model' + options.indexNum]['ID']); } locaSpaceMap.Refresh(); }; function qxAction(options) { var thrData = ONEMAP.D.globalSettingData.map3DModelSetting; var opData = { lng: "", lat: "", zoom: "" }; for (var i = 0; i < thrData.length; i++) { var threeDlist = thrData[i].type; if (threeDlist == "qxData") { // alert("qx"); // alert(opData.lng); // alert(thrData[i].center.lat) if (options == "add") { // alert(thrData[i].name); add3DModelNoFly(thrData[i]); thrData[i].indexNum = i; if (opData.lng == "") { opData.lng = thrData[i].center.lng; opData.lat = thrData[i].center.lat; opData.zoom = thrData[i].zoom; // if(options == "add"){ point3D = locaSpaceMap.CreateGeoPoint3D(); point3D.X = opData.lng; point3D.Y = opData.lat; point3D.Z = opData.zoom; feature = locaSpaceMap.CreateFeature(); feature.Geometry = point3D; locaSpaceMap.Globe.FlyToFeature1(feature, 0, 45, 1); //飞行定位到目标点 //locaSpace.FlyToPlace(opData.lng,opData.lat,opData.zoom,0,45); // } } } else if (options == "remove") { var modelData = { indexNum: i } add3DModelNoFly(modelData); } } else { // alert(threeDlist); } } // if(options == "add"){ // locaSpace.FlyToPlace(opData.lng,opData.lat,opData.zoom,0,45); // } } /** * 注册订阅 * @type {Function} * 推送:ONEMAP.C.publisher.publish(options,'moduleName::type'); * 订阅:ONEMAP.C.publisher.subscribe(layoutResize,'sideBarLayoutChange'); */ function subscribe() { ONEMAP.C.publisher.subscribe(layoutResize, 'menuListClick'); ONEMAP.C.publisher.subscribe(qxAction, '3DModelControl'); // ONEMAP.C.publisher.subscribe(remove, 'cleanMap'); } /** * 取消订阅 * @type {Function} * 取消订阅:ONEMAP.C.publisher.unSubscribe(layoutResize,'sideBarLayoutChange'); */ function unSubscribe() { } return ONEMAP.M.threeData = { init: init } });