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, '<p>点击确定多边形顶点</p><p>右键单击结束绘制</p>');
|
} else {
|
tooltip.showAt(windowPosition, '<p>点击绘制第一个点</p>');
|
}
|
});
|
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);
|
}
|
|
});
|
});
|