|
@@ -583,6 +583,9 @@ export class Viewer extends ViewerBase{
|
|
//-----------
|
|
//-----------
|
|
|
|
|
|
|
|
|
|
|
|
+ this.modules.volumeComputer && this.modules.volumeComputer.init()
|
|
|
|
+
|
|
|
|
+
|
|
}catch(e){
|
|
}catch(e){
|
|
this.onCrash(e);
|
|
this.onCrash(e);
|
|
}
|
|
}
|
|
@@ -2813,8 +2816,8 @@ export class Viewer extends ViewerBase{
|
|
let clipBoxes_in = clipBoxes.filter(e=>e.box.clipTask == ClipTask.SHOW_INSIDE && !e.box.highlight)
|
|
let clipBoxes_in = clipBoxes.filter(e=>e.box.clipTask == ClipTask.SHOW_INSIDE && !e.box.highlight)
|
|
let clipBoxes_out = clipBoxes.filter(e=>e.box.clipTask == ClipTask.SHOW_OUTSIDE && !e.box.highlight)
|
|
let clipBoxes_out = clipBoxes.filter(e=>e.box.clipTask == ClipTask.SHOW_OUTSIDE && !e.box.highlight)
|
|
let highlightBoxes = clipBoxes.filter(e=>e.box.highlight )
|
|
let highlightBoxes = clipBoxes.filter(e=>e.box.highlight )
|
|
- let prismPolygons = this.modules.volumeComputer && this.modules.volumeComputer.entered ? viewer.scene.measurements.filter(e=>(e.measureType == 'MulDistance Ring') && !e.isNew) : []
|
|
|
|
-
|
|
|
|
|
|
+ //let prismPolygons = this.modules.volumeComputer && this.modules.volumeComputer.entered ? viewer.scene.measurements.filter(e=>(e.measureType == 'MulDistance Ring') && !e.isNew) : []
|
|
|
|
+ let prismPolygons = this.modules.volumeComputer ? this.modules.volumeComputer.prisms.filter(e=>!e.isNew && e.visible) : []
|
|
|
|
|
|
// set clip volumes in material
|
|
// set clip volumes in material
|
|
for(let pointcloud of visiblePointClouds){
|
|
for(let pointcloud of visiblePointClouds){
|
|
@@ -3394,9 +3397,9 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
renderOverlay1(params){
|
|
renderOverlay1(params){
|
|
let camera = params.camera ? params.camera : this.scene.getActiveCamera();
|
|
let camera = params.camera ? params.camera : this.scene.getActiveCamera();
|
|
-
|
|
|
|
|
|
+ let renderer = params.renderer || this.renderer
|
|
this.reticule.updateAtViewports(params.viewport)
|
|
this.reticule.updateAtViewports(params.viewport)
|
|
- this.renderer.setRenderTarget(params.target||null)
|
|
|
|
|
|
+ renderer.setRenderTarget(params.target||null)
|
|
|
|
|
|
//为什么要在点云之后渲染,否则透明失效 、 会被点云覆盖
|
|
//为什么要在点云之后渲染,否则透明失效 、 会被点云覆盖
|
|
let cameraLayers
|
|
let cameraLayers
|
|
@@ -3428,7 +3431,7 @@ export class Viewer extends ViewerBase{
|
|
}
|
|
}
|
|
|
|
|
|
viewer.dispatchEvent({type: "render.begin2" , name:'scene', viewport:params.viewport })
|
|
viewer.dispatchEvent({type: "render.begin2" , name:'scene', viewport:params.viewport })
|
|
- this.renderer.render(this.scene.scene, camera);
|
|
|
|
|
|
+ renderer.render(this.scene.scene, camera);
|
|
|
|
|
|
if('renderBeforeCloud' in params){
|
|
if('renderBeforeCloud' in params){
|
|
this.scene.scene.traverse((object)=>{
|
|
this.scene.scene.traverse((object)=>{
|
|
@@ -3447,26 +3450,26 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
|
|
|
|
renderOverlay2(params){
|
|
renderOverlay2(params){
|
|
-
|
|
|
|
|
|
+ let renderer = params.renderer || this.renderer
|
|
let camera = params.camera ? params.camera : this.scene.getActiveCamera();
|
|
let camera = params.camera ? params.camera : this.scene.getActiveCamera();
|
|
//清除深度 !!!!
|
|
//清除深度 !!!!
|
|
- this.renderer.clearDepth();
|
|
|
|
|
|
+ renderer.clearDepth();
|
|
|
|
|
|
if(!params.magnifier){
|
|
if(!params.magnifier){
|
|
//测量线
|
|
//测量线
|
|
- this.dispatchEvent({type: "render.pass.perspective_overlay", camera, screenshot:params.screenshot,viewport:params.viewport});
|
|
|
|
|
|
+ this.dispatchEvent({type: "render.pass.perspective_overlay", camera, screenshot:params.screenshot,viewport:params.viewport, renderer});
|
|
|
|
|
|
if(!params.screenshot && params.viewport.name != "mapViewport" ){
|
|
if(!params.screenshot && params.viewport.name != "mapViewport" ){
|
|
Potree.Utils.setCameraLayers(camera, ['magnifier']) //magnifier 遮住测量线
|
|
Potree.Utils.setCameraLayers(camera, ['magnifier']) //magnifier 遮住测量线
|
|
- this.renderer.render(this.scene.scene, camera);
|
|
|
|
|
|
+ renderer.render(this.scene.scene, camera);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if(params.viewport.name != "mapViewport" ) {
|
|
if(params.viewport.name != "mapViewport" ) {
|
|
Potree.Utils.setCameraLayers(camera, ['volume','transformationTool'])
|
|
Potree.Utils.setCameraLayers(camera, ['volume','transformationTool'])
|
|
//viewer.dispatchEvent({type: "render.begin2" , name:'clip&trans',viewport:params.viewport })
|
|
//viewer.dispatchEvent({type: "render.begin2" , name:'clip&trans',viewport:params.viewport })
|
|
- this.renderer.render(this.clippingTool.sceneVolume, camera); //official 可以删
|
|
|
|
- this.renderer.render(this.transformationTool.scene, camera);
|
|
|
|
|
|
+ renderer.render(this.clippingTool.sceneVolume, camera); //official 可以删
|
|
|
|
+ renderer.render(this.transformationTool.scene, camera);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -3510,7 +3513,7 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
let s = SiteModel.editing && SiteModel.selected && (SiteModel.selected.buildType == 'room' || SiteModel.selected.buildType == 'floor') //空间模型的房间选中材质是需要depth的,这时候需要绘制两次点云
|
|
let s = SiteModel.editing && SiteModel.selected && (SiteModel.selected.buildType == 'room' || SiteModel.selected.buildType == 'floor') //空间模型的房间选中材质是需要depth的,这时候需要绘制两次点云
|
|
|
|
|
|
- Potree.settings.pointEnableRT = !this.screenshoting && (this.scene.measurements.length > 0 || s )
|
|
|
|
|
|
+ Potree.settings.pointEnableRT = !this.screenshoting && (this.scene.measurements.filter(e=>e.visible).length > 0 || s )
|
|
|
|
|
|
|
|
|
|
if(vrActive){
|
|
if(vrActive){
|
|
@@ -3547,7 +3550,7 @@ export class Viewer extends ViewerBase{
|
|
let finishDeferred = info.finishDeferred || $.Deferred();
|
|
let finishDeferred = info.finishDeferred || $.Deferred();
|
|
|
|
|
|
let viewerMaster = info.map ? this.mapViewer : this; //截图主体
|
|
let viewerMaster = info.map ? this.mapViewer : this; //截图主体
|
|
- let useMap = info.type == 'measure' || info.map || info.type == 'prism2d-all'
|
|
|
|
|
|
+ let useMap = info.map || info.type == 'measure' || info.type.includes('prism2d')
|
|
|
|
|
|
|
|
|
|
if(Potree.settings.displayMode == 'showPanos' && viewer.scene.view.isFlying('pos')){//如果在飞,飞完再截图
|
|
if(Potree.settings.displayMode == 'showPanos' && viewer.scene.view.isFlying('pos')){//如果在飞,飞完再截图
|
|
@@ -3566,10 +3569,10 @@ export class Viewer extends ViewerBase{
|
|
console.log('startScreenshot: '+sid)
|
|
console.log('startScreenshot: '+sid)
|
|
|
|
|
|
let updateCamera = ()=>{
|
|
let updateCamera = ()=>{
|
|
- this.viewports.forEach(e=>{
|
|
|
|
|
|
+ viewports.forEach(e=>{
|
|
e.view.applyToCamera(e.camera) //因为fly时只更新了view所以要强制更新下camera
|
|
e.view.applyToCamera(e.camera) //因为fly时只更新了view所以要强制更新下camera
|
|
|
|
|
|
- this.dispatchEvent({ //update map and sprite
|
|
|
|
|
|
+ this.dispatchEvent({ //update map and sprite, mapChanged
|
|
type: "camera_changed",
|
|
type: "camera_changed",
|
|
camera: e.camera,
|
|
camera: e.camera,
|
|
viewport : e,
|
|
viewport : e,
|
|
@@ -3592,15 +3595,21 @@ export class Viewer extends ViewerBase{
|
|
}else{
|
|
}else{
|
|
|
|
|
|
//直接渲染 会改变canvas大小
|
|
//直接渲染 会改变canvas大小
|
|
- let canvas = this.renderArea.getElementsByTagName('canvas')[0]
|
|
|
|
|
|
+ let canvas = viewerMaster.renderArea.getElementsByTagName('canvas')[0]
|
|
//canvas.width = width, canvas.height = height //不需要改canvas大小, 只需要 this.renderer.setSize(width, height ); 前面updateScreenSize已经执行
|
|
//canvas.width = width, canvas.height = height //不需要改canvas大小, 只需要 this.renderer.setSize(width, height ); 前面updateScreenSize已经执行
|
|
- this.render({ screenshot : true, width , height, resize :true }); //需要resize
|
|
|
|
- var dataUrl = canvas.toDataURL('image/jpeg',compressRatio)
|
|
|
|
|
|
+ viewerMaster.render({ screenshot : true, width , height, resize :true }); //需要resize
|
|
|
|
+
|
|
|
|
+ /* if(info.type.includes('prism2d')){//o.map要为true
|
|
|
|
+ viewer.dispatchEvent({type:'resize', viewport:viewer.mapViewer.viewports[0]}) //借用viewer通知lineMaterial resize
|
|
|
|
+ viewerMaster.renderOverlay()
|
|
|
|
+ } */
|
|
|
|
+
|
|
|
|
+ var dataUrl = canvas.toDataURL('image/png',compressRatio)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
if(!Potree.settings.isOfficial){
|
|
if(!Potree.settings.isOfficial){
|
|
- Common.downloadFile(dataUrl, 'screenshot.jpg')
|
|
|
|
|
|
+ Common.downloadFile(dataUrl, 'screenshot.png')
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -3612,11 +3621,10 @@ export class Viewer extends ViewerBase{
|
|
viewport.left = old.left; viewport.bottom = old.bottom;
|
|
viewport.left = old.left; viewport.bottom = old.bottom;
|
|
viewport.width = old.width; viewport.height = old.height
|
|
viewport.width = old.width; viewport.height = old.height
|
|
viewport.view.copy(old.view)
|
|
viewport.view.copy(old.view)
|
|
- viewport.view.applyToCamera(viewport.camera);
|
|
|
|
-
|
|
|
|
|
|
+ //viewport.view.applyToCamera(viewport.camera);
|
|
})
|
|
})
|
|
|
|
|
|
- viewer.updateScreenSize({forceUpdateSize:true})//更新像素
|
|
|
|
|
|
+ viewerMaster.updateScreenSize({forceUpdateSize:true})//更新像素
|
|
|
|
|
|
/* oldStates.viewports.forEach(old=>{//恢复相机
|
|
/* oldStates.viewports.forEach(old=>{//恢复相机
|
|
var viewport = [mapViewport, mainViewport].find(v=>v.name == old.name);
|
|
var viewport = [mapViewport, mainViewport].find(v=>v.name == old.name);
|
|
@@ -3631,7 +3639,7 @@ export class Viewer extends ViewerBase{
|
|
finishDeferred.resolve({dataUrl, pose})
|
|
finishDeferred.resolve({dataUrl, pose})
|
|
|
|
|
|
|
|
|
|
- setTimeout(()=>{
|
|
|
|
|
|
+ info.map || setTimeout(()=>{
|
|
if(!this.screenshoting){
|
|
if(!this.screenshoting){
|
|
//Potree.settings.pointNoLimit = false
|
|
//Potree.settings.pointNoLimit = false
|
|
Potree.settings.pointDensity = 'high'
|
|
Potree.settings.pointDensity = 'high'
|
|
@@ -3651,29 +3659,39 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- if(info.type == 'measure'){
|
|
|
|
|
|
+ if(info.type == 'measure' || info.type.includes('prism2d')){
|
|
this.modules.SiteModel.pauseUpdateEntity = false
|
|
this.modules.SiteModel.pauseUpdateEntity = false
|
|
this.focusDatasets = null
|
|
this.focusDatasets = null
|
|
this.scene.measurements.forEach(e=>Potree.Utils.updateVisible(e, 'screenshot',true))
|
|
this.scene.measurements.forEach(e=>Potree.Utils.updateVisible(e, 'screenshot',true))
|
|
- info.measurement.setSelected(false, 'screenshot')
|
|
|
|
|
|
+ info.type == 'measure' && info.measurement.setSelected(false, 'screenshot')
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if(info.type.includes('prism2d')){
|
|
|
|
+ //viewer.mapViewer.transparentBG = false;
|
|
|
|
+ this.backgroundOpacity = oldStates.bgOpacity;
|
|
|
|
+ (info.prisms || [info.prism]).forEach(prism=>{
|
|
|
|
+ prism.changeStyleForScreenshot(false)
|
|
|
|
+ })
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
this.images360.panos.forEach(pano=>{
|
|
this.images360.panos.forEach(pano=>{
|
|
Potree.Utils.updateVisible(pano, 'screenshot', true)
|
|
Potree.Utils.updateVisible(pano, 'screenshot', true)
|
|
})
|
|
})
|
|
Potree.Utils.updateVisible(this.reticule, 'screenshot', true)
|
|
Potree.Utils.updateVisible(this.reticule, 'screenshot', true)
|
|
|
|
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
|
|
if(useMap){
|
|
if(useMap){
|
|
Potree.Utils.updateVisible(this.mapViewer.cursor, 'screenshot', true)
|
|
Potree.Utils.updateVisible(this.mapViewer.cursor, 'screenshot', true)
|
|
|
|
|
|
|
|
|
|
- if(oldStates.attachedToViewer != this.mapViewer.attachedToViewer){
|
|
|
|
- if(info.type == 'measure'){
|
|
|
|
- this.mapViewer.attachToMainViewer(false )
|
|
|
|
- }
|
|
|
|
|
|
+ if(oldStates.attachedToViewer != this.mapViewer.attachedToViewer){
|
|
|
|
+ this.mapViewer.attachToMainViewer(!!oldStates.attachedToViewer )
|
|
}
|
|
}
|
|
- if(this.mapViewer.splitDir != oldStates.oldSplitDir){
|
|
|
|
|
|
+ if(oldStates.attachedToViewer && this.mapViewer.splitDir != oldStates.oldSplitDir){
|
|
this.mapViewer.changeSplitScreenDir(oldStates.oldSplitDir)
|
|
this.mapViewer.changeSplitScreenDir(oldStates.oldSplitDir)
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3683,7 +3701,7 @@ export class Viewer extends ViewerBase{
|
|
mapViewport.camera.updateProjectionMatrix()
|
|
mapViewport.camera.updateProjectionMatrix()
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
|
|
+ Potree.Utils.updateVisible(viewer.mapViewer.mapLayer.sceneGroup, 'screenshot-prism', true)
|
|
|
|
|
|
|
|
|
|
let recover = ()=>{
|
|
let recover = ()=>{
|
|
@@ -3759,9 +3777,7 @@ export class Viewer extends ViewerBase{
|
|
//console.log(levels)
|
|
//console.log(levels)
|
|
let actMaxLevel = Math.max.apply(null, levels) //实际加载到的最高的node level
|
|
let actMaxLevel = Math.max.apply(null, levels) //实际加载到的最高的node level
|
|
//console.warn('decreaseLevel, 新maxLevel', actMaxLevel - 1, '原maxlevel', viewer.scene.pointclouds[0].maxLevel, 'numVisiblePoints', Potree.numVisiblePoints)
|
|
//console.warn('decreaseLevel, 新maxLevel', actMaxLevel - 1, '原maxlevel', viewer.scene.pointclouds[0].maxLevel, 'numVisiblePoints', Potree.numVisiblePoints)
|
|
- /* viewer.scene.pointclouds[0].maxLevel = actMaxLevel - 1
|
|
|
|
- viewer.scene.pointclouds[0].material.oldSize_ = viewer.scene.pointclouds[0].material.size
|
|
|
|
- viewer.scene.pointclouds[0].material.size *= 1.5 */
|
|
|
|
|
|
+
|
|
}
|
|
}
|
|
if(Potree.settings.displayMode == 'showPointCloud'){
|
|
if(Potree.settings.displayMode == 'showPointCloud'){
|
|
viewer.updateScreenSize({forceUpdateSize:true, width, height, forTarget:info.useRenderTarget})//需要先setSize才能加载范围内的点云
|
|
viewer.updateScreenSize({forceUpdateSize:true, width, height, forTarget:info.useRenderTarget})//需要先setSize才能加载范围内的点云
|
|
@@ -3868,20 +3884,40 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
})
|
|
})
|
|
}else if(info.type.includes('prism2d')){
|
|
}else if(info.type.includes('prism2d')){
|
|
- let points = [], prisms = info.type == 'prism2d-all' ? this.modules.volumeComputer.prisms : [info.prism]
|
|
|
|
|
|
+
|
|
|
|
+ let points = [], prisms = info.type == 'prism2d-all' ? info.prisms: [info.prism]
|
|
|
|
|
|
- viewer.mapViewer.updateScreenSize({forceUpdateSize:true, width, height, forTarget:info.useRenderTarget}) //更新viewports相机透视 使focusOnObject在此窗口大小下
|
|
|
|
-
|
|
|
|
- prisms.forEach(e=>points.push(...e.points))
|
|
|
|
|
|
+ this.mapViewer.attachToMainViewer(true, 'screenshot', 1 , {/* dir:'leftRight' */} )
|
|
|
|
+
|
|
|
|
+ viewer.updateScreenSize({forceUpdateSize:true, width, height, forTarget:info.useRenderTarget}) //更新viewports相机透视 使focusOnObject在此窗口大小下
|
|
|
|
|
|
- let {promise} = this.focusOnObject({points}, 'prisms2d', 0, {
|
|
|
|
- minMapWidth: 0.2 , onlyMap:true, focusBoundCenter:true
|
|
|
|
|
|
+ prisms.forEach(prism=>{
|
|
|
|
+ points.push(...prism.points)
|
|
|
|
+ prism.changeStyleForScreenshot(true, {hideLabel: info.type != 'prism2d-all', showName: info.type == 'prism2d-all' })
|
|
|
|
+
|
|
})
|
|
})
|
|
|
|
+
|
|
|
|
+ let {promise} = this.focusOnObject({points}, 'prisms2d', 0, {
|
|
|
|
+ minMapWidth: 0.5 , onlyMap:true, focusBoundCenter:true, boundExpandRatio:1.4
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ oldStates.bgOpacity = this.backgroundOpacity
|
|
|
|
+ this.backgroundOpacity = 0
|
|
|
|
+
|
|
promise.done(()=>{
|
|
promise.done(()=>{
|
|
|
|
+ updateCamera()
|
|
|
|
+
|
|
if(info.type == 'prism2d-all'){//全部 带平面图
|
|
if(info.type == 'prism2d-all'){//全部 带平面图
|
|
focusDatasets(prisms) //更新平面图 可能有漏洞,当不在任何一个数据集内的话?
|
|
focusDatasets(prisms) //更新平面图 可能有漏洞,当不在任何一个数据集内的话?
|
|
this.mapViewer.waitLoadDone(screenshot.bind(this))//等待地图所有加载完
|
|
this.mapViewer.waitLoadDone(screenshot.bind(this))//等待地图所有加载完
|
|
}else{//单个
|
|
}else{//单个
|
|
|
|
+
|
|
|
|
+ this.scene.measurements.forEach(e=>Potree.Utils.updateVisible(e,'screenshot', e == info.prism) )
|
|
|
|
+ //info.prism.setSelected(true, 'screenshot')
|
|
|
|
+ //viewer.mapViewer.transparentBG = true
|
|
|
|
+
|
|
|
|
+ Potree.Utils.updateVisible(viewer.mapViewer.mapLayer.sceneGroup, 'screenshot-prism', false)
|
|
|
|
+
|
|
screenshot()
|
|
screenshot()
|
|
}
|
|
}
|
|
})
|
|
})
|
|
@@ -3915,11 +3951,9 @@ export class Viewer extends ViewerBase{
|
|
let camera = o.endCamera || viewer.scene.getActiveCamera()
|
|
let camera = o.endCamera || viewer.scene.getActiveCamera()
|
|
let cameraPos = camera.position.clone()
|
|
let cameraPos = camera.position.clone()
|
|
let boundSize
|
|
let boundSize
|
|
- /* if(camera.type == 'OrthographicCamera'){
|
|
|
|
- return console.error('focusOnObject暂不支持OrthographicCamera。因情况复杂,请视情况使用splitScreenTool.viewportFitBound')
|
|
|
|
- } */
|
|
|
|
|
|
|
|
- let moveMap = ()=>{
|
|
|
|
|
|
+
|
|
|
|
+ let moveMap = (done)=>{
|
|
if(this.mapViewer){
|
|
if(this.mapViewer){
|
|
//console.log('mapFocusOn: '+target.toArray())
|
|
//console.log('mapFocusOn: '+target.toArray())
|
|
const minMapWidth = o.minMapWidth || 2 //截图的时候要显示的地图范围较大,为了显示出地区名字
|
|
const minMapWidth = o.minMapWidth || 2 //截图的时候要显示的地图范围较大,为了显示出地区名字
|
|
@@ -3940,15 +3974,18 @@ export class Viewer extends ViewerBase{
|
|
}
|
|
}
|
|
let boundSizeOri = boundOri.getSize(new THREE.Vector3)
|
|
let boundSizeOri = boundOri.getSize(new THREE.Vector3)
|
|
|
|
|
|
- let boundSizeMap = boundSizeOri.clone().multiplyScalar(2)
|
|
|
|
|
|
+ let boundSizeMap = boundSizeOri.clone().multiplyScalar(o.boundExpandRatio || 1.5)
|
|
boundSizeMap.x = Math.max(minBound.x, boundSizeMap.x )
|
|
boundSizeMap.x = Math.max(minBound.x, boundSizeMap.x )
|
|
boundSizeMap.y = Math.max(minBound.y, boundSizeMap.y )
|
|
boundSizeMap.y = Math.max(minBound.y, boundSizeMap.y )
|
|
- this.mapViewer.moveTo(target.clone(), boundSizeMap, duration)
|
|
|
|
|
|
+ this.mapViewer.moveTo(target.clone(), boundSizeMap, duration, o.margin, null, done)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if(o.onlyMap){
|
|
if(o.onlyMap){
|
|
- return moveMap()
|
|
|
|
|
|
+ moveMap(()=>{
|
|
|
|
+ deferred.resolve()
|
|
|
|
+ })
|
|
|
|
+ return {promise:deferred.promise()}
|
|
}
|
|
}
|
|
|
|
|
|
let getPosWithFullBound = (points, boundingBox, target, cameraPos )=>{//使boundingBox差不多占满屏幕时的相机到target的距离
|
|
let getPosWithFullBound = (points, boundingBox, target, cameraPos )=>{//使boundingBox差不多占满屏幕时的相机到target的距离
|
|
@@ -4454,6 +4491,24 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+ findClosestDatasetOnMap(position){//寻找当前平面图上离某点最近的数据集
|
|
|
|
+ let pointclouds = viewer.scene.pointclouds.filter(e=>e.visible);
|
|
|
|
+
|
|
|
|
+ const addScore = viewer.bound.boundSize.length()
|
|
|
|
+ let r = Potree.Common.sortByScore(pointclouds, [], [(e)=>{//pos2d和bound2d距离排序
|
|
|
|
+ let pos3d = position.clone().setZ(e.panosBound ? e.panosBound.center.z : (e.bound.min.z+e.bound.max.z)/2)
|
|
|
|
+ return - (e.panosBound ? e.panosBound.bounding : e.bound).distanceToPoint(pos3d)
|
|
|
|
+ },(e)=>{//最有可能的是地图上显示的平面图
|
|
|
|
+ return e in viewer.fpVisiDatasets ? addScore : 0
|
|
|
|
+ }]);
|
|
|
|
+ return r[0] && r[0].item
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
|
|
addTimeMark(name, type){
|
|
addTimeMark(name, type){
|
|
let record = Potree.timeCollect[name]
|
|
let record = Potree.timeCollect[name]
|