|
@@ -540,10 +540,48 @@ var Clip = {
|
|
|
},
|
|
|
|
|
|
|
|
|
- screenshot: async ()=>{ //测绘图下载。顶视图|侧视图
|
|
|
+
|
|
|
+
|
|
|
+ getRulerBound(){//坐标尺边界
|
|
|
+ let camera = viewer.mainViewport.camera
|
|
|
+ if(!camera.isOrthographicCamera)return
|
|
|
+ let w = camera.right / camera.zoom //half
|
|
|
+ let h = camera.top / camera.zoom
|
|
|
+
|
|
|
+
|
|
|
+ let points = []
|
|
|
+ var boundAtCamera = new THREE.Box3()
|
|
|
+ Clip.box.children[0].geometry.vertices.forEach(e=>{ //模仿getPosWithFullBound
|
|
|
+ let p = e.clone().applyMatrix4(Clip.box.matrixWorld)
|
|
|
+ points.push(p)
|
|
|
+ let p1 = p.clone().applyMatrix4(camera.matrixWorldInverse);
|
|
|
+ boundAtCamera.expandByPoint(p1)
|
|
|
+ })
|
|
|
+ //需要找出clipbox的bound的左上角,它在标尺中是原点
|
|
|
+ let ClipBoxLeftTop = new THREE.Vector2(boundAtCamera.min.x, boundAtCamera.max.y) //相对于相机的位置
|
|
|
+ let camPos = new THREE.Vector2(-ClipBoxLeftTop.x, ClipBoxLeftTop.y)//由于ClipBoxLeftTop要变换到原点,所以相机位置就成了ClipBoxLeftTop的相反数, 但因是从上到下所以y再乘-1
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ let bound_ = {
|
|
|
+ left: camPos.x - w,
|
|
|
+ right: camPos.x + w,
|
|
|
+ bottom: camPos.y + h, //注意从上到下增大
|
|
|
+ top: camPos.y - h,
|
|
|
+ }
|
|
|
+ //console.log(bound)
|
|
|
+
|
|
|
+ return bound_
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ screenshot: async (rulerBound, rulerMargin )=>{ //测绘图下载。顶视图|侧视图
|
|
|
return new Promise((resolve,reject)=>{
|
|
|
if(Clip.screenshoting )return reject()
|
|
|
|
|
|
+
|
|
|
+
|
|
|
let visiPointclouds = viewer.scene.pointclouds.filter(e=> Potree.Utils.getObjVisiByReason(e, 'datasetSelection'))
|
|
|
let camera = viewer.mainViewport.camera
|
|
|
//if(Clip.activeViewName == 'mainView')return reject()
|
|
@@ -628,11 +666,17 @@ var Clip = {
|
|
|
|
|
|
console.log({wc,hc,w,h})
|
|
|
|
|
|
+ let meterPerPixel = boundSize.x / w
|
|
|
+ let text = `1 : ${(meterPerPixel).toFixed(4)}(像素 : 米)`
|
|
|
|
|
|
- let text = `1 : ${(boundSize.x / w).toFixed(4)}(像素 : 米)`
|
|
|
-
|
|
|
+ let beforeScreenshot = ()=>{
|
|
|
+ if(rulerBound){
|
|
|
+ let ruler = Clip.getRulerBound()
|
|
|
+ Object.assign(rulerBound,ruler)
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- let {getImagePromise, finishPromise} = viewer.startScreenshot({ type: 'default', bgOpacity:0, focusObjectInfo, maxTimeForPointLoad : 3e5, pointDensity:'screenshot2', splitRenderInfo }, w, h, 1 )
|
|
|
+ let {getImagePromise, finishPromise} = viewer.startScreenshot({ type: 'default', bgOpacity:0, focusObjectInfo, maxTimeForPointLoad : 3e5, pointDensity:'screenshot2', splitRenderInfo, beforeScreenshot }, w, h, 1 )
|
|
|
finishPromise.done(({dataUrl}) => {
|
|
|
|
|
|
viewer.inputHandler.toggleSelection(Clip.box);
|
|
@@ -643,28 +687,53 @@ var Clip = {
|
|
|
img.onload = async ()=>{//加上标尺比例水印
|
|
|
|
|
|
//固定文字大小和边距像素 //如果有一边过小,可能超出画面外,暂时不管这种可能
|
|
|
- const Margin = 30
|
|
|
- let topRatioToImg = THREE.Math.clamp( Margin / h , 0.006,0.10) //clamp:当图片过大时,label间距像素放大一点,反之缩小一点
|
|
|
- let leftRatioToImg = THREE.Math.clamp( Margin / w , 0.006,0.05)
|
|
|
-
|
|
|
- let labelInfo = {
|
|
|
- topRatioToImg, leftRatioToImg,
|
|
|
- textColor: { r: 255, g: 255, b: 255, a: 1 },
|
|
|
- textBorderColor : { r: 30, g: 30, b: 30, a: 1 },
|
|
|
- textBorderThick : 1,
|
|
|
- fontsize: math.linearClamp(w, [100, 700, 4096, 8192], [12, 20, 30, 40])
|
|
|
+ const fontsize = math.linearClamp(w, [100, 700, 8000], [12, 20, 30])
|
|
|
+
|
|
|
+ const marginSelf = {//img外的margin(标尺内)
|
|
|
+ left : rulerBound ? 76 : 40,
|
|
|
+ right : rulerBound ? 30 : 40,
|
|
|
+ bottom : rulerBound ? 20 + fontsize*2 : 40 + fontsize*2,
|
|
|
+ top : rulerBound ? 60 : 40,
|
|
|
}
|
|
|
+ //const Margin = rulerMargin + marginSelf
|
|
|
|
|
|
- let m = leftRatioToImg * w
|
|
|
- labelInfo.bgMargin = {left:m , top : topRatioToImg * h * 2 + labelInfo.fontsize, right: m, bottom:m }
|
|
|
|
|
|
+ //文字的边距
|
|
|
+ let bottomRatioToImg = - Math.min(fontsize*2.5, rulerBound ? marginSelf.bottom : marginSelf.bottom*0.9 ) / h//- (marginSelf.bottom - fontsize)/ h //在img之下. text底部到img底部的距离
|
|
|
+ //let leftRatioToImg = Margin / w
|
|
|
|
|
|
+
|
|
|
+ let labelInfo = {
|
|
|
+ bottomRatioToImg, horizonCenter:true,//leftRatioToImg,
|
|
|
+ textColor: rulerBound ? {r: 0, g: 0, b: 0, a: 1} : { r: 255, g: 255, b: 255, a: 1 },
|
|
|
+ textBorderColor : { r: 30, g: 30, b: 30, a: 1 },
|
|
|
+ textBorderThick : rulerBound ? 0 : 1 ,
|
|
|
+ fontsize,
|
|
|
+ fontWeight: rulerBound ? 'normal':'Bold',
|
|
|
+ outputCanvas : !!rulerBound,
|
|
|
+ bgColor: rulerBound ? {r:255,g:255,b:255,a:255}:null
|
|
|
+ }
|
|
|
+
|
|
|
+ labelInfo.bgMargin = {//img外需要多少margin
|
|
|
+ left: marginSelf.left + rulerMargin, //rulerMargin是在标尺外的margin
|
|
|
+ bottom : marginSelf.bottom + rulerMargin,
|
|
|
+ right: marginSelf.right + rulerMargin,
|
|
|
+ top: marginSelf.top + rulerMargin
|
|
|
+ }
|
|
|
+
|
|
|
+ if(rulerBound){//因为margin 扩大bound
|
|
|
+ rulerBound.left -= marginSelf.left * meterPerPixel
|
|
|
+ rulerBound.right += marginSelf.right * meterPerPixel
|
|
|
+ rulerBound.top -= marginSelf.top * meterPerPixel
|
|
|
+ rulerBound.bottom += marginSelf.bottom * meterPerPixel
|
|
|
+ }
|
|
|
|
|
|
//console.log('topRatioToImg',topRatioToImg,'leftRatioToImg',leftRatioToImg,'fontsize', labelInfo.fontsize)
|
|
|
|
|
|
|
|
|
|
|
|
- let finalDataUrl = await Potree.Utils.imgAddText(img, text , labelInfo )
|
|
|
+ let result = await Potree.Utils.imgAddText(img, text , labelInfo )
|
|
|
+
|
|
|
|
|
|
//Common.downloadFile(finalDataUrl, 'screenshot11.png')
|
|
|
|
|
@@ -672,7 +741,7 @@ var Clip = {
|
|
|
Clip.screenshoting = false
|
|
|
viewer.viewports = [viewer.mainViewport]
|
|
|
|
|
|
- resolve(finalDataUrl)
|
|
|
+ resolve(result)
|
|
|
}
|
|
|
|
|
|
|