bmh_cesium/public/widgets/analysis/widget.js
2025-03-10 07:23:50 +08:00

545 lines
16 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//模块:
xjsdk.widget.bindClass(xjsdk.widget.BaseWidget.extend({
options: {
//弹窗
view: {
type: "window",
url: "view.html",
windowOptions: {
width: 320,
height: 400
}
},
},
//初始化[仅执行1次]
create: function () {
},
viewWindow: null,
//每个窗口创建完成后调用
winCreateOK: function (opt, result) {
this.viewWindow = result;
},
//激活插件
activate: function () {
},
//释放插件
disable: function () {
this.viewWindow = null;
this.destroyAll();
},
openTerrainDepthTest: function () {
this._last_depthTestAgainstTerrain = this.viewer.scene.globe.depthTestAgainstTerrain;
this.viewer.scene.globe.depthTestAgainstTerrain = true;
},
resetTerrainDepthTest: function () {
if (Cesium.defined(this._last_depthTestAgainstTerrain)) {
this.viewer.scene.globe.depthTestAgainstTerrain = this._last_depthTestAgainstTerrain;
delete this._last_depthTestAgainstTerrain
}
},
destroyAll: function () {
this.destroyRZFX()//日照分析
this.destroyPDPX()//坡度坡向
this.destroyKSY()//可视域分析
this.destroyFLFX()//方量分析
this.destroyDXKW() //地形开挖
this.destroyDBTM()//地表透明
this.destroyMXPQ()//模型剖切
this.destroyMXYP()//模型压平
this.destroyMXCJ()//模型裁剪
},
enableControl: function (value) {
if (this.viewer.xjsdk.popup)
this.viewer.xjsdk.popup.enable = value;
if (this.viewer.xjsdk.tooltip)
this.viewer.xjsdk.tooltip.enable = value;
if (this.viewer.xjsdk.contextmenu)
this.viewer.xjsdk.contextmenu.enable = value;
},
//=========日照分析========
createRZFX: function () {
this.viewer.clock.onTick.addEventListener(this.showNowTimeRZFX, this);
},
destroyRZFX: function () {
this.viewer.clock.clockRange = Cesium.ClockRange.UNBOUNDED;
this.viewer.clock.multiplier = 1;
this.viewer.clock.onTick.removeEventListener(this.showNowTimeRZFX, this);
this.viewer.shadows = false;
},
showNowTimeRZFX: function () {
if (!this.viewWindow || !this.viewer.clock.shouldAnimate) return;
var currentTime = this.viewer.clock.currentTime;
var date = Cesium.JulianDate.toDate(currentTime);
this.viewWindow.setRZFXNowTime(date);
},
clearRZFX: function () {//停止
this.viewer.shadows = false;
this.viewer.clock.shouldAnimate = false;
},
startPlayRZFX: function (startDate, endDate) {
if (this.stopTime) {
this.viewer.clock.currentTime = this.stopTime;
}
this.viewer.clock.startTime = Cesium.JulianDate.fromDate(startDate);
this.viewer.clock.currentTime = Cesium.JulianDate.fromDate(startDate);
this.viewer.clock.stopTime = Cesium.JulianDate.fromDate(endDate);
this.viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP;
this.viewer.clock.multiplier = 1600;
this.viewer.clock.shouldAnimate = true;
this.viewer.shadows = true;
},
pauseRZFX: function () {
if (this.viewer.clock.shouldAnimate) {
this.stopTime = this.viewer.clock.currentTime;
this.viewer.clock.shouldAnimate = false;
} else {
this.viewer.clock.currentTime = this.stopTime || this.viewer.clock.currentTime;
this.viewer.clock.shouldAnimate = true;
}
return this.viewer.clock.shouldAnimate
},
//=========可视域分析========
createKSY: function () {
//不开启抗锯齿,可视域会闪烁
this.viewer.scene.postProcessStages.fxaa.enabled = true;
//不加无法投射到地形上
this.openTerrainDepthTest();
},
destroyKSY: function () {
this.clearKSY();
this.resetTerrainDepthTest();
},
clearKSY: function () {
for (var i = 0, len = this.arrKsyList.length; i < len; i++) {
this.arrKsyList[i].destroy();
}
this.arrKsyList = [];
delete this.lastViewField;
},
arrKsyList: [],
getLastKSY: function () {
return this.lastViewField || {};
},
addKSY: function (options) {
var that = this;
var thisViewField = new xjsdk.analysi.ViewShed3D(this.viewer, {
horizontalAngle: options.horizontalAngle,
verticalAngle: options.verticalAngle,
distance: options.distance,
offsetHeight: 1.5, //增加人的升高
calback: function (distance) {
if (that.viewWindow)
that.viewWindow.updateKsyDistance(distance);
}
});
this.lastViewField = thisViewField;
this.arrKsyList.push(thisViewField);
},
updateKsyDebugFrustum: function (debugFrustum) {
for (var i = 0, len = this.arrKsyList.length; i < len; i++) {
this.arrKsyList[i].debugFrustum = debugFrustum;
}
},
//=========方量分析========
createFLFX: function () {
if (this.measureObj) return;
var that = this;
this.measureObj = new xjsdk.analysi.MeasureVolume(viewer, {
heightLabel: true,
offsetLabel: false,
onStart: function () {
haoutil.loading.show({ type: "loader-bar" });
},
onStop: function () {
haoutil.loading.hide();
that.viewWindow.showFLFXHeightRg(that.measureObj);
}
});
},
destroyFLFX: function () {
if (!this.measureObj) return;
this.measureObj.destroy();
delete this.measureObj;
},
clearFLFX: function () {
if (!this.measureObj) return;
this.measureObj.clear();
},
//=========地形开挖========
createDXKW: function () {
this.openTerrainDepthTest();
},
startDrawDXKW: function () {
var that = this;
this.enableControl(false);
viewer.xjsdk.draw.startDraw({
type: "polygon",
style: {
color: "#29cf34",
opacity: 0.5,
clampToGround: true
},
success: function (entity) { //绘制成功后回调
that.enableControl(true);
var positions = viewer.xjsdk.draw.getPositions(entity);
viewer.xjsdk.draw.deleteAll();
that.showDXKWClippingPlanes(positions, true);
}
});
},
startDrawDXKWExtent: function () {
var that = this;
this.enableControl(false);
viewer.xjsdk.draw.startDraw({
type: 'rectangle',
style: {
color: '#007be6',
opacity: 0.8,
outline: false,
},
success: function (entity) { //绘制成功后回调
that.enableControl(true);
var positions = xjsdk.draw.attr.rectangle.getOutlinePositions(entity, true);
viewer.xjsdk.draw.deleteAll();
that.showDXKWClippingPlanes(positions, false);
}
});
},
destroyDXKW: function () {
this.clearDXKW();
this.resetTerrainDepthTest();
},
clearDXKW: function () {
if (this.TerrainClip) {
this.TerrainClip.destroy();
delete this.TerrainClip;
}
if (this.TerrainClipPlan) {
this.TerrainClipPlan.destroy();
delete this.TerrainClipPlan;
}
//同时有模型时,清除模型裁剪
this.clearMXCJ();
},
showDXKWClippingPlanes: function (positions, has2) {
this.clearDXKW();
//同时有模型时,进行模型裁剪
this.addMxcjPoly(positions)
var height = this.viewWindow.getDXKWNowHeight();
//cesium原生的clip组成的【因为转cesium原生接口的plan组成存在问题不稳定时而不生效】
this.TerrainClipPlan = new xjsdk.analysi.TerrainClipPlan(viewer, {
positions: positions,
height: height,
wall: true,
splitNum: 50, //wall边界插值数
wallImg: this.path + 'img/textures/excavationregion_top.jpg',
bottomImg: this.path + 'img/textures/excavationregion_side.jpg'
});
// xjsdkgis扩展的地形开挖【存在问题鼠标无法穿透地表地下管网的popup无法展示】
if (has2) {
this.TerrainClip = new xjsdk.analysi.TerrainClip(viewer, {
positions: positions,
height: height,
wall: false
});
}
},
updateDXKWHeight: function (nowValue) {
if (this.TerrainClipPlan)
this.TerrainClipPlan.height = nowValue;
},
//=========地表透明========
createDBTM: function () {
this.openTerrainDepthTest();
this.underObj = new xjsdk.analysi.Underground(viewer, {
alpha: 0.5,
enable: false,
});
},
destroyDBTM: function () {
if (!this.underObj) return;
this.resetTerrainDepthTest();
this.underObj.destroy();
delete this.underObj;
},
clearDBTM: function () {
},
//=========坡度坡向========
createPDPX: function () {
if (this.slope) return;
this.slope = new xjsdk.analysi.Slope({
viewer: this.viewer,
point: {
pixelSize: 9,
color: Cesium.Color.RED.withAlpha(0.5),
//disableDepthTestDistance: Number.POSITIVE_INFINITY,
},
arrow: {
scale: 0.3, //箭头长度的比例范围0.1-0.9
width: 15, //箭头宽度
color: Cesium.Color.YELLOW
}
})
},
destroyPDPX: function () {
if (!this.slope) return;
this.clearPDPX();
this.slope.destroy();
delete this.slope;
},
clearPDPX: function () {
if (!this.slope) return;
this.viewer.xjsdk.draw.deleteAll();
this.slope.clear();
},
drawPDPXLine: function (splitNum) {
var that = this;
this.viewer.xjsdk.draw.deleteAll();
this.viewer.xjsdk.draw.startDraw({
"type": "polygon",
"style": {
"color": "#29cf34",
"opacity": 0.3,
"outline": true,
"outlineColor": "#ffffff",
"clampToGround": true
},
success: function (entity) { //绘制成功后回调
var positions = that.viewer.xjsdk.draw.getPositions(entity);
that.viewer.xjsdk.draw.deleteAll()
that.slope.add(positions, {
splitNum: splitNum //splitNum插值分割的个数
});
}
});
},
//=========模型剖切========
selectedPQMX: function () {
var that = this;
this.enableControl(false);
this.viewer.xjsdk.draw.startDraw({
type: "point",
style: {
color: "#007be6",
},
success: function (entity) { //绘制成功后回调
var positions = that.viewer.xjsdk.draw.getPositions(entity);
that.viewer.xjsdk.draw.deleteAll();
that.enableControl(true);
var tileset = xjsdk.tileset.pick3DTileset(that.viewer, positions);//拾取绘制返回的模型
if (!tileset) {
haoutil.msg("请单击选择模型");
return;
}
that.clipTileset = new xjsdk.tiles.TilesClipPlan(tileset);
var radius = tileset.boundingSphere.radius / 2;
that.viewWindow.setClipDistanceRange(radius, tileset.name);
}
});
},
drawLinePQMX: function () {
var that = this;
if (this.clipTileset) {
this.clipTileset.clear();
}
viewer.xjsdk.draw.startDraw({
type: 'polyline',
config: { maxPointNum: 2 },
style: {
color: '#007be6',
opacity: 0.8,
outline: false,
},
success: function (entity) { //绘制成功后回调
var points = viewer.xjsdk.draw.getPositions(entity);
viewer.xjsdk.draw.deleteAll();
if (that.clipTileset) {
that.clipTileset.clear();
}
else {
var tileset = xjsdk.tileset.pick3DTileset(viewer, points);//拾取绘制返回的模型
if (!tileset) {
haoutil.msg("请单击选择模型");
return;
}
that.clipTileset = new xjsdk.tiles.TilesClipPlan(tileset);
}
that.clipTileset.clipByPoints(points);
}
});
},
destroyMXPQ: function () {
if (!this.clipTileset) return;
this.clipTileset.destroy();
delete this.clipTileset;
},
clearMXPQ: function () {
if (!this.clipTileset) return;
this.clipTileset.clear();
},
//=========模型压平========
createMXYP: function () {
},
destroyMXYP: function () {
this.clearMXYP();
},
clearMXYP: function () {
if (!this.flatObj) return;
this.flatObj.destroy();
delete this.flatObj;
},
drawMxypPoly: function (flatHeight) {
this.clearMXYP();
var that = this;
viewer.xjsdk.draw.startDraw({
type: "polygon",
style: {
color: "#007be6",
opacity: 0.5,
clampToGround: false
},
success: function (entity) { //绘制成功后回调
var positions = viewer.xjsdk.draw.getPositions(entity);
viewer.xjsdk.draw.deleteAll();
var tileset = xjsdk.tileset.pick3DTileset(viewer, positions);//拾取绘制返回的模型
if (!tileset) {
haoutil.msg("请单击选择模型");
return;
}
that.flatObj = new xjsdk.tiles.TilesFlat({
viewer: that.viewer,
tileset: tileset,
positions: positions,
flatHeight: flatHeight
});
}
});
},
//=========模型裁剪========
createMXCJ: function () {
},
destroyMXCJ: function () {
this.clearMXCJ();
},
clearMXCJ: function () {
if (!this.tilesetClip) return;
this.tilesetClip.destroy();
delete this.tilesetClip;
},
drawMxcjPoly: function (clipOutSide) {
this.clearMXCJ();
var that = this;
viewer.xjsdk.draw.startDraw({
type: 'rectangle',
style: {
color: '#007be6',
opacity: 0.8,
outline: false,
// clampToGround: true
},
success: function (entity) { //绘制成功后回调
var positions = xjsdk.draw.attr.rectangle.getOutlinePositions(entity, true);
viewer.xjsdk.draw.deleteAll();
var isAdd = that.addMxcjPoly(positions, clipOutSide)
if (!isAdd) {
haoutil.msg("请单击选择模型");
}
}
});
},
addMxcjPoly: function (positions, clipOutSide) {
this.clearMXCJ();
var tileset = xjsdk.tileset.pick3DTileset(this.viewer, positions);//拾取绘制返回的模型
if (!tileset) {
return false;
}
this.tilesetClip = new xjsdk.tiles.TilesClipPlan({
// viewer: this.viewer,
tileset: tileset,
positions: positions,
clipOutSide: clipOutSide
});
return true;
},
}));