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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