634 lines
17 KiB
JavaScript
634 lines
17 KiB
JavaScript
(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);
|