545 lines
16 KiB
JavaScript
545 lines
16 KiB
JavaScript
|
||
//模块:
|
||
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;
|
||
},
|
||
|
||
|
||
|
||
|
||
|
||
})); |