From 6bd3778ad9f598c6f50f4fca99bb7fb7bfdf8847 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=8F=E5=A4=A7=E8=83=86?= <1101282782@qq.com> Date: Tue, 12 Aug 2025 10:50:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BA=BF=E6=B5=81=E5=8A=A8?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E5=9C=A8=E4=BA=8C=E7=BB=B4=E4=B8=AD=E6=98=BE?= =?UTF-8?q?=E7=A4=BAbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Obj/Base/PolylineObject/index.js | 44 +++++- src/Tools/index.js | 212 ++++++++++++++++++++------- 2 files changed, 192 insertions(+), 64 deletions(-) diff --git a/src/Obj/Base/PolylineObject/index.js b/src/Obj/Base/PolylineObject/index.js index 2401abb..cf58f8c 100644 --- a/src/Obj/Base/PolylineObject/index.js +++ b/src/Obj/Base/PolylineObject/index.js @@ -11,7 +11,7 @@ import LabelObject from '../LabelObject' import MouseEvent from '../../../Event/index' import MouseTip from '../../../MouseTip' import Controller from '../../../Controller/index' -import { syncData } from '../../../Global/MultiViewportMode' +import { syncData, get3DView } from '../../../Global/MultiViewportMode' import { legp } from '../../Element/datalist' import { setSplitDirection, syncSplitData, setActiveId } from '../../../Global/SplitScreen' import { setActiveViewer, closeRotateAround, closeViewFollow } from '../../../Global/global' @@ -1306,6 +1306,7 @@ class PolylineObject extends Base { } static create(that) { + let ground if (that.heightMode == 2) { ground = true @@ -1422,9 +1423,17 @@ class PolylineObject extends Base { var groundResolution = that.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight) repeatX *= groundResolution / cameraHeight / (param.space * (canvasEle.width / canvasEle.height * 5) + 1); // if (entity.polyline.material.oriRepeat) { - let speed = repeatX / entity.polyline.oriRepeat - entity.polyline.oriSpeed = speed - entity.polyline.oriRepeatX = repeatX + + if (that.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) { + let speed = repeatX / entity.polyline.oriRepeat + entity.polyline.oriSpeed = speed + entity.polyline.oriRepeatX = repeatX + } else { + let sdk3d = get3DView() + let sdk3dEntity = sdk3d.viewer.entities.getById(that.options.id) + entity.polyline.oriSpeed = sdk3dEntity.polyline.oriSpeed + entity.polyline.oriRepeatX = sdk3dEntity.polyline.oriRepeatX + } } @@ -1436,8 +1445,21 @@ class PolylineObject extends Base { getSceenLine(entity, options, canvasEle) { let point1 = new Cesium.Cartesian2(0, this.sdk.viewer.canvas.clientHeight) let point2 = new Cesium.Cartesian2(this.sdk.viewer.canvas.clientWidth / 2, this.sdk.viewer.canvas.clientHeight) - var cartesian1 = this.sdk.viewer.scene.pickPosition(point1) - var cartesian2 = this.sdk.viewer.scene.pickPosition(point2) + // var cartesian1 = this.sdk.viewer.scene.pickPosition(point1) + // var cartesian2 = this.sdk.viewer.scene.pickPosition(point2) + + let ray = this.sdk.viewer.camera.getPickRay(point1); + let cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene); + + let ray2 = this.sdk.viewer.camera.getPickRay(point2); + let cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene); + // if (!cartesian1 || !cartesian2) { + // let ray = this.sdk.viewer.camera.getPickRay(point1); + // cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene); + + // let ray2 = this.sdk.viewer.camera.getPickRay(point2); + // cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene); + // } var distance = Cesium.Cartesian3.distance(cartesian1, cartesian2); @@ -1449,6 +1471,7 @@ class PolylineObject extends Base { 500000 // 半径(距离) ); + // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率) var drawingBufferWidth = this.sdk.viewer.canvas.clientWidth; var drawingBufferHeight = this.sdk.viewer.canvas.clientHeight; @@ -1462,7 +1485,14 @@ class PolylineObject extends Base { repeatX = undefined; } - return repeatX + if (this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) { + return repeatX + } else { + let sdk3d = get3DView() + let sdk3dEntity = sdk3d.viewer.entities.getById(this.options.id) + return sdk3dEntity.polyline.oriRepeatX + } + } /** * 编辑框 diff --git a/src/Tools/index.js b/src/Tools/index.js index 6a605ee..0674a47 100644 --- a/src/Tools/index.js +++ b/src/Tools/index.js @@ -11,6 +11,7 @@ import { open as projConvertOpen, close as projConvertClose } from './projConver import { open as projectionConvertOpen, close as projectionConvertClose } from './projectionConvert' import { setActiveViewer, closeRotateAround, closeViewFollow } from '../Global/global' import FlowPictureMaterialProperty from '../Obj/Materail/FlowPictureMaterialProperty' +import { syncData, get3DView } from '../Global/MultiViewportMode' class Tools { /** @@ -646,25 +647,52 @@ class Tools { // dashSize: newParam.dashSize, space: newParam.space, scale: new Cesium.CallbackProperty(function () { - var oriPositions = entity.polyline.positions.getValue(); - if (!Cesium.defined(oriPositions)) { - return 1.0; + if (that.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) { + let oriPositions = entity.polyline.positions.getValue(); + + if (!Cesium.defined(oriPositions)) { + return 1.0; + } + let distance = 0; + for (let i = 0; i < oriPositions.length - 1; ++i) { + distance += Cesium.Cartesian3.distance(oriPositions[i], oriPositions[i + 1]); + } + //屏幕坐标 + let point1 = new Cesium.Cartesian2(0, that.sdk.viewer.canvas.clientHeight) + let point2 = new Cesium.Cartesian2(that.sdk.viewer.canvas.clientWidth / 2, that.sdk.viewer.canvas.clientHeight) + let cartesian1 = that.sdk.viewer.scene.pickPosition(point1) + let cartesian2 = that.sdk.viewer.scene.pickPosition(point2) + if (cartesian1 && cartesian2) { + let distance2 = Cesium.Cartesian3.distance(cartesian1, cartesian2); + repeatX = distance2 * 2 / distance + } + return repeatX; + } else { + let sdk3d = get3DView() + let sdk3dEntity = sdk3d.viewer.entities.getById(that.options.id) + let oriPositions = sdk3dEntity.polyline.positions.getValue(); + + if (!Cesium.defined(oriPositions)) { + return 1.0; + } + let distance = 0; + for (let i = 0; i < oriPositions.length - 1; ++i) { + distance += Cesium.Cartesian3.distance(oriPositions[i], oriPositions[i + 1]); + } + //屏幕坐标 + let point1 = new Cesium.Cartesian2(0, sdk3d.viewer.canvas.clientHeight) + let point2 = new Cesium.Cartesian2(sdk3d.viewer.canvas.clientWidth / 2, sdk3d.viewer.canvas.clientHeight) + let cartesian1 = sdk3d.viewer.scene.pickPosition(point1) + let cartesian2 = sdk3d.viewer.scene.pickPosition(point2) + if (cartesian1 && cartesian2) { + let distance2 = Cesium.Cartesian3.distance(cartesian1, cartesian2); + repeatX = distance2 * 2 / distance + } + return repeatX; } - var distance = 0; - for (var i = 0; i < oriPositions.length - 1; ++i) { - distance += Cesium.Cartesian3.distance(oriPositions[i], oriPositions[i + 1]); - } - //屏幕坐标 - let point1 = new Cesium.Cartesian2(0, that.sdk.viewer.canvas.clientHeight) - let point2 = new Cesium.Cartesian2(that.sdk.viewer.canvas.clientWidth / 2, that.sdk.viewer.canvas.clientHeight) - var cartesian1 = that.sdk.viewer.scene.pickPosition(point1) - var cartesian2 = that.sdk.viewer.scene.pickPosition(point2) - if (cartesian1 && cartesian2) { - var distance2 = Cesium.Cartesian3.distance(cartesian1, cartesian2); - repeatX = distance2 * 2 / distance - } - return repeatX; + + }) }) @@ -730,51 +758,109 @@ class Tools { image: canvasEle, speed: options.speed, repeat: new Cesium.CallbackProperty(function () { - var positionProperty = entity.polyline.positions; - var positions = positionProperty.getValue(that.sdk.viewer.clock.currentTime); - if (!Cesium.defined(positions)) { - return new Cesium.Cartesian2(1.0, 1.0); - // return 1.0; - } + if (that.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) { + let positionProperty = entity.polyline.positions; + let positions = positionProperty.getValue(that.sdk.viewer.clock.currentTime); - var distance = 0; - for (var i = 0; i < positions.length - 1; ++i) { - distance += Cesium.Cartesian3.distance(positions[i], positions[i + 1]); - } + if (!Cesium.defined(positions)) { + return new Cesium.Cartesian2(1.0, 1.0); + // return 1.0; + } - var repeatX = distance / entity.polyline.width.getValue(); - // 根据地图缩放程度调整repeatX - var cameraHeight = that.sdk.viewer.camera.positionCartographic.height; - var boundingSphere = new Cesium.BoundingSphere( - new Cesium.Cartesian3(-1000000, 0, 0), // 中心点坐标 - 500000 // 半径(距离) - ); + let distance = 0; + for (let i = 0; i < positions.length - 1; ++i) { + // if (that.sdk.viewer.scene.mode===Cesium.SceneMode.SCENE2D){} + distance += Cesium.Cartesian3.distance(positions[i], positions[i + 1]); + } + + let repeatX = distance / entity.polyline.width.getValue(); + // 根据地图缩放程度调整repeatX + let cameraHeight = that.sdk.viewer.camera.positionCartographic.height; + let boundingSphere = new Cesium.BoundingSphere( + new Cesium.Cartesian3(-1000000, 0, 0), // 中心点坐标 + 500000 // 半径(距离) + ); + + // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率) + let drawingBufferWidth = that.sdk.viewer.canvas.clientWidth; + let drawingBufferHeight = that.sdk.viewer.canvas.clientHeight; + + // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小 + let groundResolution = that.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight) + let result + if (groundResolution > 700) { + repeatX *= groundResolution / cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1); + // if (entity.polyline.material.oriRepeat) { + let speed = repeatX / entity.polyline.oriRepeat + entity.polyline.oriSpeed = speed + entity.polyline.oriRepeatX = repeatX + // } else { + // entity.polyline.material.oriRepeat = repeatX + // } + beforeSpeed = speed + repeat = repeatX + result = new Cesium.Cartesian2(repeatX, speed || 1.0) + } else { + result = new Cesium.Cartesian2(repeat || entity.polyline.oriRepeatX, beforeSpeed || entity.polyline.oriSpeed) + } + + return result; - // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率) - var drawingBufferWidth = that.sdk.viewer.canvas.clientWidth; - var drawingBufferHeight = that.sdk.viewer.canvas.clientHeight; - // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小 - var groundResolution = that.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight) - let result - if (groundResolution > 700) { - repeatX *= groundResolution / cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1); - // if (entity.polyline.material.oriRepeat) { - let speed = repeatX / entity.polyline.oriRepeat - entity.polyline.oriSpeed = speed - entity.polyline.oriRepeatX = repeatX - // } else { - // entity.polyline.material.oriRepeat = repeatX - // } - beforeSpeed = speed - repeat = repeatX - result = new Cesium.Cartesian2(repeatX, speed || 1.0) } else { - result = new Cesium.Cartesian2(repeat || entity.polyline.oriRepeatX, beforeSpeed || entity.polyline.oriSpeed) + let sdk3d = get3DView() + let sdk3dEntity = sdk3d.viewer.entities.getById(that.options.id) + let positionProperty = sdk3dEntity.polyline.positions; + let positions = positionProperty.getValue(sdk3d.viewer.clock.currentTime); + + if (!Cesium.defined(positions)) { + return new Cesium.Cartesian2(1.0, 1.0); + // return 1.0; + } + + let distance = 0; + for (let i = 0; i < positions.length - 1; ++i) { + // if (that.sdk.viewer.scene.mode===Cesium.SceneMode.SCENE2D){} + distance += Cesium.Cartesian3.distance(positions[i], positions[i + 1]); + } + + let repeatX = distance / sdk3dEntity.polyline.width.getValue(); + // 根据地图缩放程度调整repeatX + let cameraHeight = sdk3d.viewer.camera.positionCartographic.height; + let boundingSphere = new Cesium.BoundingSphere( + new Cesium.Cartesian3(-1000000, 0, 0), // 中心点坐标 + 500000 // 半径(距离) + ); + + // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率) + let drawingBufferWidth = sdk3d.viewer.canvas.clientWidth; + let drawingBufferHeight = sdk3d.viewer.canvas.clientHeight; + + // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小 + let groundResolution = sdk3d.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight) + let result + if (groundResolution > 700) { + repeatX *= groundResolution / cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1); + // if (entity.polyline.material.oriRepeat) { + let speed = repeatX / sdk3dEntity.polyline.oriRepeat + sdk3dEntity.polyline.oriSpeed = speed + sdk3dEntity.polyline.oriRepeatX = repeatX + // } else { + // entity.polyline.material.oriRepeat = repeatX + // } + beforeSpeed = speed + repeat = repeatX + result = new Cesium.Cartesian2(repeatX, speed || 1.0) + } else { + result = new Cesium.Cartesian2(repeat || sdk3dEntity.polyline.oriRepeatX, beforeSpeed || sdk3dEntity.polyline.oriSpeed) + } + + return result; } - return result; + + // return repeatX; }) } @@ -787,8 +873,13 @@ class Tools { getSceenLine(entity, options, canvasEle) { let point1 = new Cesium.Cartesian2(0, this.sdk.viewer.canvas.clientHeight) let point2 = new Cesium.Cartesian2(this.sdk.viewer.canvas.clientWidth / 2, this.sdk.viewer.canvas.clientHeight) - var cartesian1 = this.sdk.viewer.scene.pickPosition(point1) - var cartesian2 = this.sdk.viewer.scene.pickPosition(point2) + // var cartesian1 = this.sdk.viewer.scene.pickPosition(point1) + // var cartesian2 = this.sdk.viewer.scene.pickPosition(point2) + let ray = this.sdk.viewer.camera.getPickRay(point1); + let cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene); + + let ray2 = this.sdk.viewer.camera.getPickRay(point2); + let cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene); var distance = Cesium.Cartesian3.distance(cartesian1, cartesian2); @@ -813,7 +904,14 @@ class Tools { repeatX = undefined; } - return repeatX + if (this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) { + return repeatX + } else { + let sdk3d = get3DView() + let sdk3dEntity = sdk3d.viewer.entities.getById(this.options.id) + return sdk3dEntity.polyline.oriRepeatX + } + } /*创建直箭头图片*/