From 5b788a74d4c393056e338300ff2202c66c0cff73 Mon Sep 17 00:00:00 2001
From: zh <972939975@qq.com>
Date: Fri, 22 Aug 2025 17:52:32 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/Global/MultiViewportMode/index.js | 8 +++-
src/Global/mouseRightMenu/index.js | 16 +++----
src/Measure/MeasureDistance/index.js | 6 +--
src/Obj/Base/BaseSource/BaseLayer/index.js | 15 +++++-
src/Obj/Base/BillboardObject/index.js | 44 +++++++++---------
src/Obj/Base/PolylineObject/index.js | 27 ++++++++++-
src/Obj/Base/TrajectoryMotion/index.js | 2 +-
src/Obj/Base/WallStereoscopic/index.js | 4 ++
src/Obj/Base/index.js | 4 +-
src/Obj/Element/richText.js | 24 +++++-----
src/Obj/Materail/WallMaterialProperty.js | 14 ++++--
.../fonts/PangMenZhengDaoBiaoTiTi-1.ttf | Bin 1915800 -> 1028572 bytes
12 files changed, 107 insertions(+), 57 deletions(-)
diff --git a/src/Global/MultiViewportMode/index.js b/src/Global/MultiViewportMode/index.js
index 53ec9c0..9e61089 100644
--- a/src/Global/MultiViewportMode/index.js
+++ b/src/Global/MultiViewportMode/index.js
@@ -49,7 +49,11 @@ async function init(sdk) {
sdk2D.viewer.imageryLayers.removeAll()
for (let i = 0; i < imageryLayers.length; i++) {
let entity = sdk2D.viewer.imageryLayers.addImageryProvider(imageryLayers[i].imageryProvider, imageryLayers[i]._layerIndex)
+ if(imageryLayers[i]._id) {
+ entity._id = imageryLayers[i]._id
+ }
entity.show = imageryLayers[i].show
+ entity.alpha = imageryLayers[i].alpha
if (imageryLayers[i]._objectState) {
if (imageryLayers[i]._showView == 3) {
entity.show = false
@@ -136,7 +140,7 @@ async function syncData2(sdk, id, entityId) {
options.height = 0
}
- if (!that.type || (that.type !== 'tileset' && that.type !== 'bim' && that.type !== 'glb' && that.type !== 'layer')) {
+ if (!that.type || (that.type !== 'tileset' && that.type !== 'bim' && that.type !== 'glb' && that.type !== 'layer' && that.type !== 'wallStereoscopic')) {
if (that.showView == 3) {
options.show = false
}
@@ -227,7 +231,7 @@ async function syncData2(sdk, id, entityId) {
obj.options.heightReference = 1
}
let options = syncObject.tools.deepCopyObj(obj.options)
- if (!obj.type || (obj.type !== 'tileset' && obj.type !== 'bim' && obj.type !== 'glb' && obj.type !== 'layer')) {
+ if (!obj.type || (obj.type !== 'tileset' && obj.type !== 'bim' && obj.type !== 'glb' && obj.type !== 'layer' && obj.type !== 'wallStereoscopic')) {
if (obj.showView == 3) {
options.show = false
}
diff --git a/src/Global/mouseRightMenu/index.js b/src/Global/mouseRightMenu/index.js
index 0fd350e..24e360a 100644
--- a/src/Global/mouseRightMenu/index.js
+++ b/src/Global/mouseRightMenu/index.js
@@ -100,14 +100,14 @@ function MouseRightMenu(sdk, status, callBack) {
that = sdk.entityMap.get(entityId)
}
- if (that && that.picking) {
- addedMenu = `
-
-
- `
- }
+ // if (that && that.picking) {
+ // addedMenu = `
+ //
+ //
+ // `
+ // }
let position = tools.cartesian3Towgs84(cartesian, sdk.viewer)
menuElm = document.createElement('div')
menuElm.id = 'custom-menu'
diff --git a/src/Measure/MeasureDistance/index.js b/src/Measure/MeasureDistance/index.js
index 7bb3749..52755af 100644
--- a/src/Measure/MeasureDistance/index.js
+++ b/src/Measure/MeasureDistance/index.js
@@ -91,7 +91,7 @@ class MeasureDistance extends Measure {
//暂时固定取20个点
- if (d > 20) {//大于20m时,固定取20个点
+ if (d > 2) {//大于20m时,固定取20个点
meters = d / 20
await start(meters)
} else if (d < 1) {
@@ -106,8 +106,8 @@ class MeasureDistance extends Measure {
async sampleHeight(p1, index) {
- let p2 = await this.sampleHeightMostDetailed([p1])
- p1.alt = p2[0].height
+ let height = await this.getClampToHeight(p1, [...this.sdk.viewer.entities.values])
+ p1.alt = height
return {position: p1, index}
}
diff --git a/src/Obj/Base/BaseSource/BaseLayer/index.js b/src/Obj/Base/BaseSource/BaseLayer/index.js
index f4a0a79..083fd74 100644
--- a/src/Obj/Base/BaseSource/BaseLayer/index.js
+++ b/src/Obj/Base/BaseSource/BaseLayer/index.js
@@ -9,7 +9,7 @@
import Dialog from '../../../Element/Dialog';
import CoordTransform from "../../../../transform/CoordTransform";
import BaseSource from "../index";
-import { syncData } from '../../../../Global/MultiViewportMode'
+import { syncData, get2DView } from '../../../../Global/MultiViewportMode'
import { setSplitDirection, syncSplitData } from '../../../../Global/SplitScreen'
import { setActiveViewer, closeRotateAround, closeViewFollow } from '../../../../Global/global'
@@ -244,8 +244,19 @@ class BaseLayer extends BaseSource {
this.originalOptions = this.deepCopyObj(this.options)
this._DialogObject.close()
this.Dialog.confirmCallBack && this.Dialog.confirmCallBack(this.originalOptions)
- syncData(this.sdk, this.options.id)
+ // syncData(this.sdk, this.options.id)
syncSplitData(this.sdk, this.options.id)
+ let sdk2D = get2DView()
+ if (sdk2D && sdk2D != this.sdk) {
+ for(let i=0;i {
this.reset()
diff --git a/src/Obj/Base/BillboardObject/index.js b/src/Obj/Base/BillboardObject/index.js
index efcbfe7..c6275ee 100644
--- a/src/Obj/Base/BillboardObject/index.js
+++ b/src/Obj/Base/BillboardObject/index.js
@@ -433,31 +433,31 @@ class BillboardObject extends Base {
value: '链接',
key: 'link'
},
- {
- name: 'IP摄像头',
- value: 'IP摄像头',
- key: 'camera'
- },
// {
- // name: 'ISC摄像头',
- // value: 'ISC摄像头',
- // key: 'isc'
+ // name: 'IP摄像头',
+ // value: 'IP摄像头',
+ // key: 'camera'
+ // },
+ // // {
+ // // name: 'ISC摄像头',
+ // // value: 'ISC摄像头',
+ // // key: 'isc'
+ // // },
+ // // {
+ // // name: '传感器',
+ // // value: '传感器',
+ // // key: 'sensor'
+ // // },
+ // {
+ // name: '全景图',
+ // value: '全景图',
+ // key: 'vr'
// },
// {
- // name: '传感器',
- // value: '传感器',
- // key: 'sensor'
- // },
- {
- name: '全景图',
- value: '全景图',
- key: 'vr'
- },
- {
- name: '物资',
- value: '物资',
- key: 'goods'
- }
+ // name: '物资',
+ // value: '物资',
+ // key: 'goods'
+ // }
]
}
diff --git a/src/Obj/Base/PolylineObject/index.js b/src/Obj/Base/PolylineObject/index.js
index e184417..561c8c3 100644
--- a/src/Obj/Base/PolylineObject/index.js
+++ b/src/Obj/Base/PolylineObject/index.js
@@ -825,7 +825,6 @@ class PolylineObject extends Base {
set labelLineColor(v) {
this.options.label.lineColor = v
this.label.lineColor = v
- let _this = this
if (this._elms.labelLineColor) {
this._elms.labelLineColor.forEach((item, i) => {
let lineColorPicker = new YJColorPicker({
@@ -840,6 +839,29 @@ class PolylineObject extends Base {
}, //点击确认按钮事件回调
clear: () => {
this.labelLineColor = 'rgba(0,255,255,0.5)'
+ } //点击清空按钮事件回调
+ })
+ this._elms.labelLineColor[i] = lineColorPicker
+ })
+ }
+ }
+
+ get labelBackgroundColorStart() {
+ return this.options.label.backgroundColor[0]
+ }
+ set labelBackgroundColorStart(v) {
+ this.options.label.backgroundColor[0] = v
+ this.label.backgroundColor = [v, this.label.backgroundColor[1]]
+ if (this._elms.labelBackgroundColorStart) {
+ this._elms.labelBackgroundColorStart.forEach((item, i) => {
+ let labelBackgroundColorStartPicker = new YJColorPicker({
+ el: item.el,
+ size: 'mini', //颜色box类型
+ alpha: true, //是否开启透明度
+ defaultColor: this.labelBackgroundColorStart,
+ disabled: false, //是否禁止打开颜色选择器
+ openPickerAni: 'opacity', //打开颜色选择器动画
+ sure: color => {
this.labelBackgroundColorStart = color
}, //点击确认按钮事件回调
clear: () => {
@@ -848,10 +870,11 @@ class PolylineObject extends Base {
})
this._elms.labelBackgroundColorStart[
i
- ] = _this.labelBackgroundColorStartPicker
+ ] = labelBackgroundColorStartPicker
})
}
}
+
get labelBackgroundColorEnd() {
return this.options.label.backgroundColor[1]
}
diff --git a/src/Obj/Base/TrajectoryMotion/index.js b/src/Obj/Base/TrajectoryMotion/index.js
index e02a63a..167135a 100644
--- a/src/Obj/Base/TrajectoryMotion/index.js
+++ b/src/Obj/Base/TrajectoryMotion/index.js
@@ -2087,7 +2087,7 @@ class TrajectoryMotion extends Base {
rubricElm.style.color = '#ff5733';
rubricElm.style.display = 'none'
- rubricElm.innerHTML = `场景正北方向为轨迹前进正方向`
+ rubricElm.innerHTML = `场景正东方向为轨迹前进正方向`
let iconRubric = contentElm.getElementsByClassName('icon-rubric')[0]
iconRubric.addEventListener('mouseenter', (e) => {
rubricElm.style.display = 'block'
diff --git a/src/Obj/Base/WallStereoscopic/index.js b/src/Obj/Base/WallStereoscopic/index.js
index 938f2c1..49a0edf 100644
--- a/src/Obj/Base/WallStereoscopic/index.js
+++ b/src/Obj/Base/WallStereoscopic/index.js
@@ -88,6 +88,10 @@ class WallStereoscopic extends Base {
}
}
+ get type() {
+ return 'wallStereoscopic'
+ }
+
static createLabel(that) {
// 标签
that.label = new LabelObject(that.sdk, {
diff --git a/src/Obj/Base/index.js b/src/Obj/Base/index.js
index 3f16db4..fedb92a 100644
--- a/src/Obj/Base/index.js
+++ b/src/Obj/Base/index.js
@@ -290,7 +290,7 @@ class Base extends Tools {
let destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt)
let position = { lng: 0, lat: 0 }
- if (this.options.position) {
+ if (this.options.position && Object.prototype.toString.call(this.options.position) === '[object Object]') {
position = { ...this.options.position }
}
else if (this.options.positions) {
@@ -436,7 +436,7 @@ class Base extends Tools {
let position = { lng: 0, lat: 0 }
let relativePosition = { ...cameraPosition84 }
- if (this.options.position) {
+ if (this.options.position && Object.prototype.toString.call(this.options.position) === '[object Object]') {
position = { ...this.options.position }
}
else if (this.options.positions) {
diff --git a/src/Obj/Element/richText.js b/src/Obj/Element/richText.js
index 072a599..c63614c 100644
--- a/src/Obj/Element/richText.js
+++ b/src/Obj/Element/richText.js
@@ -56,8 +56,8 @@ class richText {
MENU_CONF: {
uploadImage: {
fieldName: 'file',
- maxFileSize: 50 * 1024 * 1024,
- base64LimitSize: 50 * 1024 * 1024, // 50M 以下插入 base64
+ // maxFileSize: 50 * 1024 * 1024,
+ // base64LimitSize: 50 * 1024 * 1024, // 50M 以下插入 base64
server: this.uploadImageServer,
// // 上传之前触发
// onBeforeUpload(file) { // TS 语法
@@ -95,18 +95,18 @@ class richText {
// console.log(`${file.name} 上传出错`, err, res)
// },
- // // 自定义上传
- // async customUpload(file, insertFn) { // TS 语法
- // // async customUpload(file, insertFn) { // JS 语法
- // // file 即选中的文件
- // // 自己实现上传,并得到图片 url alt href
- // // 最后插入图片
- // console.log(file, insertFn)
- // insertFn(url, file.name)
- // }
+ // 自定义上传
+ async customUpload(file, insertFn) { // TS 语法
+ // async customUpload(file, insertFn) { // JS 语法
+ // file 即选中的文件
+ // 自己实现上传,并得到图片 url alt href
+ // 最后插入图片
+ let url = await _this.upload(file)
+ insertFn((_this.host = _this.host || getHost()) + '/' + url)
+ }
},
uploadVideo: {
- maxFileSize: 500 * 1024 * 1024,
+ // maxFileSize: 500 * 1024 * 1024,
server: this.uploadVideoServer,
allowedFileTypes: ['video/mp4', 'video/mp3', 'video/ogg', 'video/webm', 'video/avi'],
// 自定义上传
diff --git a/src/Obj/Materail/WallMaterialProperty.js b/src/Obj/Materail/WallMaterialProperty.js
index b71c889..bda11b0 100644
--- a/src/Obj/Materail/WallMaterialProperty.js
+++ b/src/Obj/Materail/WallMaterialProperty.js
@@ -70,7 +70,7 @@ function StreamWall1() {
fragColor.rgb = color.rgb / 1.0;\n\
fragColor = czm_gammaCorrect(fragColor);\n\
material.alpha = colorImage.a * color.a;\n\
- material.diffuse = (colorImage.rgb+color.rgb)/2.0;\n\
+ material.diffuse = color.rgb/20.0;\n\
material.emission = fragColor.rgb;\n\
return material;\n\
}";
@@ -208,6 +208,14 @@ function StreamWall2() {
Property.equals(this.repeat, other._repeat) &&
Property.equals(this.repeats, other._repeats)
};
+ // let code2 = 'material.diffuse = color.rgb*1.0;'
+ // if (uniforms.is2D) {
+ // code2 = `
+ // material.diffuse = color.rgb*0.0;
+ // material.emission = color.rgb * 1.0;
+ // `
+ // }
+ // console.log(code2, uniforms.is2D)
// 将定义的材质对象添加到cesium的材质队列中
Material._materialCache.addMaterial(MaterialType, {
fabric: {
@@ -230,8 +238,8 @@ function StreamWall2() {
else {
material.alpha = 1.0;
}
- material.diffuse = colorImage.rgb*color.rgb*0.0;
- material.emission = colorImage.rgb*color.rgb * 1.4;
+ material.diffuse = color.rgb*0.0;
+ material.emission = color.rgb * 1.0;
return material;
}`,
components: {
diff --git a/static/custom/fonts/PangMenZhengDaoBiaoTiTi-1.ttf b/static/custom/fonts/PangMenZhengDaoBiaoTiTi-1.ttf
index 61d491d8c20b2da92309223fc23066ae338b7a7c..cd65b624d9d83939890b33cbcc57a239e864092f 100644
GIT binary patch
literal 1028572
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