123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561 |
- /**
- * [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 = $('<ul class="menu-content"></ul>');
- for (var i = 0; i < threeLength; i++) {
- var threeDlist = $('<li class="item" cid="' + i + '"><input type="checkbox" class="zt-cbx" layer=""><span class="meun-checkBox menu-select-no"></span><span class="no-bg">' + thrData[i].name + '</span></li>');
- 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
- }
- });
|