define([ 'dojo/_base/declare', 'dojo/_base/lang', 'dojo/_base/array', 'dojo/_base/html', 'dojo/topic', 'jimu/BaseWidget', ], function (declare, lang, array, html, topic, BaseWidget ) { return declare([BaseWidget], { baseClass: 'jimu-widget-polygonClipping', name: 'polygonClipping', flag: false, startup: function () { var that = this; topic.subscribe("beginpolygonClipping", lang.hitch(this, this.beginpolygonClipping)); topic.subscribe("closespolygonClipping", lang.hitch(this, this.closespolygonClipping)); // topic.publish('getbeginSlope', that.beginSlope); $(`.${that.baseClass}`).find('.closeOUR').click(() => { $(`.${that.baseClass}`).hide(); that.closespolygonClipping(); }) // that.beginpolygonClipping(); }, beginpolygonClipping: function () { console.log(`${this.name}--kaishi`); var that = this; // 初始化viewer部件 var viewer = this.map; // viewer.imageryLayers.addImageryProvider(new Cesium.BingMapsImageryProvider({ // url: 'https://dev.virtualearth.net', // mapStyle: Cesium.BingMapsStyle.AERIAL, // key: window.MYURL_CONFIG.BING_MAP_KEY // })); var scene = viewer.scene; var positions = [], regions = [], geometry = null, clipMode = Cesium.ModifyRegionMode.CLIP_OUTSIDE; console.log(Cesium.SpatialQuery3D); var spatialQuery = new Cesium.SpatialQuery3D(scene); // try { //场景添加S3M图层服务 var promise = scene.open('http://www.supermapol.com/realspace/services/3D-BIMbuilding/rest/realspace'); Cesium.when(promise, function (layers) { // 精准定位 scene.camera.setView({ destination: new Cesium.Cartesian3(-2180753.065987198, 4379023.266141494, 4092583.575045952), orientation: { heading: 4.0392222751147955, pitch: 0.010279641987852584, roll: 1.240962888005015e-11 } }); if (!scene.pickPositionSupported) { alert('不支持深度纹理,无法拾取位置!'); } for (var layer of layers) { layer.selectEnabled = false; // 设置被裁剪对象的颜色 layer.clipLineColor = new Cesium.Color(1, 1, 1, 0); } var tooltip = createTooltip(document.body); var handlerPolygon = new Cesium.DrawHandler(viewer, Cesium.DrawMode.Polygon, 0); handlerPolygon.activeEvt.addEventListener(function (isActive) { if (isActive == true) { viewer.enableCursorStyle = false; viewer._element.style.cursor = ''; $('body').removeClass('drawCur').addClass('drawCur'); } else { viewer.enableCursorStyle = true; $('body').removeClass('drawCur'); } }); handlerPolygon.movingEvt.addEventListener(function (windowPosition) { if (handlerPolygon.isDrawing) { tooltip.showAt(windowPosition, '
点击确定多边形顶点
右键单击结束绘制
'); } else { tooltip.showAt(windowPosition, '点击绘制第一个点
'); } }); handlerPolygon.drawEvt.addEventListener(function (result) { tooltip.setVisible(false); handlerPolygon.polygon.show = false; handlerPolygon.polyline.show = false; if (clipMode === Cesium.ModifyRegionMode.CLIP_OUTSIDE) { positions = []; for (var pt of result.object.positions) { var cartographic = Cesium.Cartographic.fromCartesian(pt); var longitude = Cesium.Math.toDegrees(cartographic.longitude); var latitude = Cesium.Math.toDegrees(cartographic.latitude); var height = cartographic.height; positions.push(longitude, latitude, height); } regions = []; regions.push(positions); geometry = regions; for (var layer of layers) { layer.setModifyRegions(regions, clipMode); } } else { for (var layer of layers) { var array = [].concat(result.object.positions); var point3ds = new Cesium.Point3Ds(); regions = []; for (var i = 0, len = array.length; i < len; i++) { var cartographic = Cesium.Cartographic.fromCartesian(array[i]); var longitude = Cesium.Math.toDegrees(cartographic.longitude); var latitude = Cesium.Math.toDegrees(cartographic.latitude); var h = cartographic.height; var pnt = new Cesium.Point3D(longitude, latitude, h); point3ds.add(pnt); } regions.push(point3ds); geometry = null; geometry = new Cesium.GeoRegion3D(regions); geometry.extrudedHeight = -100; geometry.isLatLon = false; spatialQuery.build(); layer.setCustomClipGeometry({ geometry: geometry, clippingType: Cesium.ClippingType.KeepOutside, spatialQuery: spatialQuery }); } } }); $('#polygon').click(function () { handlerPolygon.activate(); }); $('#clear').click(function () { handlerPolygon.clear(); // 清除裁剪结果 if (clipMode === Cesium.ModifyRegionMode.CLIP_OUTSIDE) { for (var layer of layers) { layer.clearModifyRegions(); } } else { for (var layer of layers) { layer.clearCustomClipGeometry(); } geometry = null; } positions = []; regions = []; }); $('#clip-modepolygonClipping').on('propertychange input', function () { clipMode = $(this).val() === 'clip-inside' ? Cesium.ModifyRegionMode.CLIP_INSIDE : Cesium.ModifyRegionMode.CLIP_OUTSIDE; if (clipMode === Cesium.ModifyRegionMode.CLIP_OUTSIDE) { for (var layer of layers) { layer.clearModifyRegions(); } } else { for (var layer of layers) { layer.clearCustomClipGeometry(); } } geometry = null; positions = []; regions = []; }); $('#clip-modepolygonClipping').on('propertychange input', function () { clipMode = $(this).val() === 'clip-inside' ? Cesium.ModifyRegionMode.CLIP_INSIDE : Cesium.ModifyRegionMode.CLIP_OUTSIDE; if (clipMode === Cesium.ModifyRegionMode.CLIP_INSIDE) { for (var layer of layers) { if (geometry !== null) { layer.setCustomClipGeometry({ geometry: geometry, clippingType: Cesium.ClippingType.KeepInside, spatialQuery: spatialQuery }); geometry = null; } else { alert("请点击绘制裁剪面"); } } } else { if (geometry !== null) { for (var layer of layers) { layer.setModifyRegions(regions, clipMode); } geometry = null; } else { alert("请点击绘制裁剪面"); } } }); $('#toolbarpolygonClipping').show(); $('#loadingbar').remove(); }, function (e) { if (widget._showRenderLoopErrors) { var title = '加载SCP失败,请检查网络连接状态或者url地址是否正确?'; widget.showErrorPanel(title, undefined, e); } }); // } // catch (e) { // if (widget._showRenderLoopErrors) { // var title = '渲染时发生错误,已停止渲染。'; // widget.showErrorPanel(title, undefined, e); // } // } }, closespolygonClipping: function (froms) { console.log(`${this.name}--guanbi`); }, onOpen: function () { }, onClose: function () { //面板关闭的时候触发 (when this panel is closed trigger) console.log('jies') }, onMinimize: function () { this.resize(); }, onMaximize: function () { this.resize(); }, resize: function () { }, destroy: function () { //销毁的时候触发 //todo //do something before this func this.inherited(arguments); } }); });