Fei_Xian_Lin_Ye_Fang_Huo/public/widgets/analysis/widget.js

634 lines
17 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

(function (window, mars3d) {
//创建widget类需要继承BaseWidget
class MyWidget extends mars3d.widget.BaseWidget {
//弹窗配置
get view() {
return {
type: "window",
url: "view.html",
windowOptions: {
width: 320,
height: 400,
},
};
}
//初始化[仅执行1次]
create() {
this.arrKsyList = [];
}
//每个窗口创建完成后调用
winCreateOK(opt, result) {
this.viewWindow = result;
}
//激活插件
activate() {}
//释放插件
disable() {
this.viewWindow = null;
this.destroyAll();
}
openTerrainDepthTest() {
this._last_depthTestAgainstTerrain = this.map.scene.globe.depthTestAgainstTerrain;
this.map.scene.globe.depthTestAgainstTerrain = true;
}
resetTerrainDepthTest() {
if (Cesium.defined(this._last_depthTestAgainstTerrain)) {
this.map.scene.globe.depthTestAgainstTerrain = this._last_depthTestAgainstTerrain;
delete this._last_depthTestAgainstTerrain;
}
}
destroyAll() {
this.destroyRZFX(); //日照分析
this.destroyPDPX(); //坡度坡向
this.destroyKSY(); //可视域分析
this.destroyFLFX(); //方量分析
this.destroyDXKW(); //地形开挖
this.destroyDBTM(); //地表透明
this.destroyMXPQ(); //模型剖切
this.destroyMXYP(); //模型压平
this.destroyMXCJ(); //模型裁剪
}
enableControl(value) {
if (this.map.popup) {
this.map.popup.enabled = value;
}
if (this.map.tooltip) {
this.map.tooltip.enabled = value;
}
if (this.map.contextmenu) {
this.map.contextmenu.enabled = value;
}
}
//=========日照分析========
createRZFX() {
this.destroyRZFX();
//日照分析类
this.shadows = new mars3d.thing.Shadows({
multiplier: 1600,
time: this.viewWindow.getCurrTime(),
});
this.map.addThing(this.shadows);
this.shadows.on(mars3d.EventType.change, (event) => {
this.viewWindow.setRZFXNowTime(this.shadows.time);
});
}
destroyRZFX() {
if (this.shadows) {
this.map.removeThing(this.shadows, true);
delete this.shadows;
}
}
//=========可视域分析========
createKSY() {
//不开启抗锯齿,可视域会闪烁
this.map.scene.postProcessStages.fxaa.enabled = true;
//不加无法投射到地形上
this.openTerrainDepthTest();
}
destroyKSY() {
this.clearKSY();
this.resetTerrainDepthTest();
}
clearKSY() {
for (var i = 0, len = this.arrKsyList.length; i < len; i++) {
this.map.removeThing(this.arrKsyList[i], true);
}
this.arrKsyList = [];
delete this.lastViewField;
}
getLastKSY() {
return this.lastViewField || {};
}
addKSY(options) {
var thisViewField = new mars3d.thing.ViewShed3D({
...options,
offsetHeight: 1.5, //增加人的升高
});
this.map.addThing(thisViewField);
thisViewField.on(mars3d.EventType.end, (event) => {
if (this.viewWindow) {
this.viewWindow.updateKsyDistance(event.distance);
}
});
this.lastViewField = thisViewField;
this.arrKsyList.push(thisViewField);
}
updateKsyDebugFrustum(show) {
for (var i = 0, len = this.arrKsyList.length; i < len; i++) {
this.arrKsyList[i].showFrustum = show;
}
}
//=========方量分析========
createFLFX() {
if (this.measure) {
return;
}
this.measure = new mars3d.thing.Measure({
heightLabel: true,
// offsetLabel: true,
});
this.map.addThing(this.measure);
this.measure.on(mars3d.EventType.start, (e) => {
haoutil.loading.show({ type: "loader-bar" });
});
this.measure.on(mars3d.EventType.end, (e) => {
haoutil.loading.hide();
this.viewWindow.showFLFXHeightRg();
});
}
destroyFLFX() {
if (this.measure) {
this.map.removeThing(this.measure, true);
delete this.measure;
}
this.measureVolume = null;
}
clearFLFX() {
if (!this.measure) {
return;
}
this.measure.clear();
this.measureVolume = null;
}
startFLFX() {
this.measureVolume = this.measure.volume({
splitNum: 6, //面内插值次数,控制精度[注意精度越大,分析时间越长]
// minHeight: 50 //可以设置一个固定的最低高度
});
}
//=========地形开挖========
createDXKW() {
this.openTerrainDepthTest();
}
startDrawDXKW() {
this.enableControl(false);
this.map.graphicLayer.startDraw({
type: "polygon",
style: {
color: "#29cf34",
opacity: 0.5,
},
success: (graphic) => {
//绘制成功后回调
this.enableControl(true);
//绘制成功后回调
var positions = graphic.positionsShow;
this.map.graphicLayer.clear();
this.showDXKWTerrainClip(positions);
},
});
}
startDrawDXKWExtent() {
this.enableControl(false);
this.map.graphicLayer.startDraw({
type: "rectangle",
style: {
color: "#007be6",
opacity: 0.8,
},
success: (graphic) => {
//绘制成功后回调
this.enableControl(true);
var positions = graphic.getOutlinePositions(false);
this.map.graphicLayer.clear();
this.showDXKWTerrainClip(positions);
},
});
}
destroyDXKW() {
if (this.terrainClip) {
this.map.removeThing(this.terrainClip, true);
delete this.terrainClip;
}
this.resetTerrainDepthTest();
}
clearDXKW() {
if (this.terrainClip) {
this.terrainClip.clear(); //清除挖地区域
}
//同时有模型时,清除模型裁剪
this.clearMXCJ();
}
showDXKWTerrainClip(positions) {
var height = this.viewWindow.getDXKWNowHeight();
if (!this.terrainClip) {
this.terrainClip = new mars3d.thing.TerrainClip({
diffHeight: height, //井的深度
image: this.path + "img/textures/excavationregion_top.jpg",
imageBottom: this.path + "img/textures/excavationregion_side.jpg",
splitNum: 50, //井边界插值数
});
this.map.addThing(this.terrainClip);
}
this.terrainClip.addArea(positions, { diffHeight: height });
//同时有模型时,进行模型裁剪
this.addMxcjPoly(positions);
}
updateDXKWHeight(nowValue) {
if (this.terrainClip) {
this.terrainClip.diffHeight = nowValue;
}
}
//=========地表透明========
createDBTM() {
this.underground = new mars3d.thing.Underground({
alpha: 0.5,
});
this.map.addThing(this.underground);
}
destroyDBTM() {
if (this.underground) {
this.map.removeThing(this.underground, true);
delete this.underground;
}
}
clearDBTM() {}
//=========坡度坡向========
createPDPX() {
if (this.slope) {
return;
}
//渲染效果
this.contourLine = new mars3d.thing.ContourLine({
contourShow: false, //是否显示等高线
shadingType: "none", //地表渲染效果类型:无nono, 高程 elevation, 坡度slope, 坡向aspect
});
this.map.addThing(this.contourLine);
this.slope = new mars3d.thing.Slope({
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,
},
});
this.map.addThing(this.slope);
}
destroyPDPX() {
this.clearPDPX();
if (this.slope) {
this.map.removeThing(this.slope, true);
delete this.slope;
}
if (this.contourLine) {
this.map.removeThing(this.contourLine, true);
delete this.contourLine;
}
}
clearPDPX() {
if (this.slope) {
this.slope.clear();
}
if (this.contourLine) {
this.contourLine.clear();
}
this.map.graphicLayer.clear();
}
drawPDPXPoly(splitNum) {
this.map.graphicLayer.clear();
this.map.graphicLayer.startDraw({
type: "polygon",
style: {
color: "#29cf34",
opacity: 0.3,
outline: true,
outlineColor: "#ffffff",
clampToGround: true,
},
success: (graphic) => {
//绘制成功后回调
var positions = graphic.positionsShow;
this.map.graphicLayer.clear();
this.contourLine.positions = positions;
this.slope.add(positions, {
splitNum: splitNum, //splitNum插值分割的个数
radius: 1, //缓冲半径(影响坡度坡向的精度)
count: 4, //缓冲的数量(影响坡度坡向的精度)会求周边(count*4)个点
});
},
});
}
drawPDPXExtent(splitNum) {
this.map.graphicLayer.clear();
this.map.graphicLayer.startDraw({
type: "rectangle",
style: {
color: "#007be6",
opacity: 0.8,
outline: false,
},
success: (graphic) => {
//绘制成功后回调
var positions = graphic.getOutlinePositions(false);
this.map.graphicLayer.clear();
this.contourLine.positions = positions;
this.slope.add(positions, {
splitNum: splitNum, //splitNum插值分割的个数
radius: 1, //缓冲半径(影响坡度坡向的精度)
count: 4, //缓冲的数量(影响坡度坡向的精度)会求周边(count*4)个点
});
},
});
}
//=========模型剖切========
selectedPQMX() {
this.enableControl(false);
this.map.graphicLayer.startDraw({
type: "point",
style: {
color: "#007be6",
},
success: (graphic) => {
//绘制成功后回调
var position = graphic.positionShow;
this.map.graphicLayer.clear();
this.enableControl(true);
var tileset = this.map.pick3DTileset([position]); //拾取绘制返回的模型
if (!tileset) {
haoutil.msg("请单击选择模型");
return;
}
var radius = tileset.boundingSphere.radius / 2;
this.viewWindow.setClipDistanceRange(radius, tileset.name || "未命名");
this.tilesetPlanClip = new mars3d.thing.TilesetPlanClip({
tileset: tileset,
});
this.map.addThing(this.tilesetPlanClip);
},
});
}
drawLinePQMX() {
if (this.tilesetPlanClip) {
this.tilesetPlanClip.clear();
}
this.map.graphicLayer.startDraw({
type: "polyline",
maxPointNum: 2,
style: {
color: "#007be6",
opacity: 0.8,
outline: false,
},
success: (graphic) => {
//绘制成功后回调
var positions = graphic.positionsShow;
this.map.graphicLayer.clear();
if (this.tilesetPlanClip) {
this.tilesetPlanClip.clear();
} else {
var tileset = this.map.pick3DTileset(positions); //拾取绘制返回的模型
if (!tileset) {
haoutil.msg("请单击选择模型");
return;
}
this.tilesetPlanClip = new mars3d.thing.TilesetPlanClip({
tileset: tileset,
});
this.map.addThing(this.tilesetPlanClip);
}
this.tilesetPlanClip.positions = positions;
},
});
}
destroyMXPQ() {
if (this.tilesetPlanClip) {
this.map.removeThing(this.tilesetPlanClip, true);
delete this.tilesetPlanClip;
}
}
clearMXPQ() {
if (!this.tilesetPlanClip) {
return;
}
this.tilesetPlanClip.clear();
}
//=========模型压平========
createMXYP() {}
destroyMXYP() {
this.clearMXYP();
this._mxypTileset = null;
}
clearMXYP() {
if (this.tilesetFlat) {
this.map.removeThing(this.tilesetFlat, true);
delete this.tilesetFlat;
}
}
selectedYPMX() {
this.enableControl(false);
this.map.graphicLayer.startDraw({
type: "point",
style: {
color: "#007be6",
},
success: (graphic) => {
//绘制成功后回调
var position = graphic.positionShow;
this.map.graphicLayer.clear();
this.enableControl(true);
var tileset = this.map.pick3DTileset([position]); //拾取绘制返回的模型
if (!tileset) {
haoutil.msg("请单击选择模型");
return;
}
this._mxypTileset = tileset;
this.viewWindow.setMxpyName(tileset.name || "未命名");
},
});
}
drawMxypPoly(flatHeight) {
this.enableControl(false);
this.map.graphicLayer.startDraw({
type: "polygon",
style: {
color: "#007be6",
opacity: 0.5,
},
success: (graphic) => {
//绘制成功后回调
this.enableControl(true);
var positions = graphic.positionsShow;
this.map.graphicLayer.clear();
this.showMxypTilesetFlat(positions, flatHeight);
},
});
}
drawMxypPolyExtent(flatHeight) {
this.enableControl(false);
this.map.graphicLayer.startDraw({
type: "rectangle",
style: {
color: "#007be6",
opacity: 0.8,
},
success: (graphic) => {
//绘制成功后回调
this.enableControl(true);
var positions = graphic.getOutlinePositions(false);
this.map.graphicLayer.clear();
this.showMxypTilesetFlat(positions, flatHeight);
},
});
}
showMxypTilesetFlat(positions, height) {
var tileset = this._mxypTileset || this.map.pick3DTileset(positions); //拾取绘制返回的模型
if (!this.tilesetFlat || this.tilesetFlat.tileset != tileset) {
if (!tileset) {
haoutil.msg("请单击选择模型");
return;
}
this.clearMXYP();
this.tilesetFlat = new mars3d.thing.TilesetFlat({
tileset: tileset,
positions: positions,
height: height,
});
this.map.addThing(this.tilesetFlat);
} else {
this.tilesetFlat.height = height;
}
this.tilesetFlat.addArea(positions);
}
//=========模型裁剪========
createMXCJ() {}
destroyMXCJ() {
this.clearMXCJ();
if (this.tilesetClip) {
this.map.removeThing(this.tilesetClip, true);
delete this.tilesetClip;
}
}
clearMXCJ() {
if (this.tilesClipPlan) {
this.map.removeThing(this.tilesClipPlan, true);
delete this.tilesClipPlan;
}
if (this.tilesetClip) {
this.tilesetClip.clear();
}
}
drawMxcjPoly(clipOutSide) {
this.clearMXCJ();
this.map.graphicLayer.startDraw({
type: "rectangle",
style: {
color: "#007be6",
opacity: 0.8,
},
success: (graphic) => {
//绘制成功后回调
var positions = graphic.getOutlinePositions(false);
this.map.graphicLayer.clear();
var isAdd = this.addMxcjPoly(positions, clipOutSide);
if (!isAdd) {
haoutil.msg("请单击选择模型");
}
},
});
}
addMxcjPoly(positions, clipOutSide) {
var tileset = this.map.pick3DTileset(positions); //拾取绘制返回的模型
if (!tileset) {
return false;
}
//模型开挖处理类(Plan围合的)
this.tilesClipPlan = new mars3d.thing.TilesetPlanClip({
tileset: tileset,
positions: positions,
clipOutSide: clipOutSide,
});
this.map.addThing(this.tilesClipPlan);
//倾斜模型开挖处理类(只适用于部分倾斜模型)
if (!this.tilesetClip || this.tilesetClip.tileset != tileset) {
if (this.tilesetClip) {
this.map.removeThing(this.tilesetClip, true);
delete this.tilesetClip;
}
this.tilesetClip = new mars3d.thing.TilesetClip({
tileset: tileset,
positions: positions,
clipOutSide: clipOutSide,
});
this.map.addThing(this.tilesetClip);
} else {
this.tilesetClip.addArea(positions);
}
return true;
}
}
//注册到widget管理器中。
mars3d.widget.bindClass(MyWidget);
//每个widet之间都是直接引入到index.html中会存在彼此命名冲突所以闭包处理下。
})(window, mars3d);