|
|
@@ -100,12 +100,13 @@ async function groupsFor(viewer, plan, heights, alive) {
|
|
|
return { groups:[...groups.values()], missing }
|
|
|
}
|
|
|
|
|
|
-export function createCesiumPipeModels(viewer, { source, onChange=()=>{}, base=import.meta.env?.BASE_URL||'/' }={}) {
|
|
|
+export function createCesiumPipeModels(viewer, { source, onChange=()=>{}, base=import.meta.env?.BASE_URL||'/', viewMode='ground' }={}) {
|
|
|
const heights=new Map()
|
|
|
const guideStates=new WeakMap()
|
|
|
let active=true,generation=0,fingerprint='',missing=new Set(),allIds=[],task=null,planning=false
|
|
|
let lastGroups=[], signatures=new Map(), terrainFailed=false, lastTerrainAttempt=0
|
|
|
- let diameterSummary={reported:0,interpolated:0,missing:0}
|
|
|
+ let diameterSummary={reported:0,interpolated:0,missing:0}, visualDefaultCount=0
|
|
|
+ let pipelineView=viewMode==='pipeline'
|
|
|
const publish=(state)=>{
|
|
|
if(!active) return
|
|
|
const covered=new Set(state.covered.filter((id)=>!missing.has(id)))
|
|
|
@@ -113,16 +114,17 @@ export function createCesiumPipeModels(viewer, { source, onChange=()=>{}, base=i
|
|
|
const modeled=covered.has(entity.id)
|
|
|
if(entity.polyline) {
|
|
|
if(entity.show!==true) entity.show=true
|
|
|
- if(guideStates.get(entity.polyline)!==modeled) {
|
|
|
- entity.polyline.distanceDisplayCondition=modeled?FAR_GUIDE:ALL_DISTANCES
|
|
|
- guideStates.set(entity.polyline,modeled)
|
|
|
+ const distantOnly=pipelineView&&modeled
|
|
|
+ if(guideStates.get(entity.polyline)!==distantOnly) {
|
|
|
+ entity.polyline.distanceDisplayCondition=distantOnly?FAR_GUIDE:ALL_DISTANCES
|
|
|
+ guideStates.set(entity.polyline,distantOnly)
|
|
|
}
|
|
|
} else {
|
|
|
- const show=!modeled
|
|
|
+ const show=!pipelineView||!modeled
|
|
|
if(entity.show!==show) entity.show=show
|
|
|
}
|
|
|
}
|
|
|
- onChange({...state,covered:[...covered],fallback:allIds.length-covered.size,planning,terrainFailed,diameterSummary,note:PIPE_MODEL_NOTE})
|
|
|
+ onChange({...state,covered:[...covered],fallback:allIds.length-covered.size,planning,terrainFailed,diameterSummary,visualDefaultCount,viewMode:pipelineView?'pipeline':'ground',note:PIPE_MODEL_NOTE})
|
|
|
viewer.scene.requestRender()
|
|
|
}
|
|
|
const batches=createPipeModelBatches({
|
|
|
@@ -159,6 +161,7 @@ export function createCesiumPipeModels(viewer, { source, onChange=()=>{}, base=i
|
|
|
if (!active || viewer.isDestroyed()) return Promise.resolve()
|
|
|
const plan=planPipeModels(network)
|
|
|
diameterSummary=plan.diameterSummary
|
|
|
+ visualDefaultCount=plan.visualDefaultCount
|
|
|
const next=JSON.stringify(plan)
|
|
|
if(next===fingerprint && !(terrainFailed && Date.now()-lastTerrainAttempt>=30000)) {
|
|
|
if (planning) return task
|
|
|
@@ -199,5 +202,9 @@ export function createCesiumPipeModels(viewer, { source, onChange=()=>{}, base=i
|
|
|
batches.clear()
|
|
|
heights.clear()
|
|
|
}
|
|
|
- return {sync,destroy,state:batches.state}
|
|
|
+ function setViewMode(mode) {
|
|
|
+ pipelineView=mode==='pipeline'
|
|
|
+ publish(batches.state())
|
|
|
+ }
|
|
|
+ return {sync,setViewMode,destroy,state:batches.state}
|
|
|
}
|