Newer
Older
import { Component, AfterViewInit, OnDestroy } from "@angular/core";
import * as export_nehuba from 'export_nehuba'
import 'export_nehuba/dist/min/chunk_worker.bundle.js'
Xiao Gui
committed
import { Observable,Subject, Subscription } from 'rxjs'
import { combineLatest } from 'rxjs/operators'
@Component({
templateUrl : './nehubaViewer.template.html',
styleUrls : [
'./nehubaViewer.style.css'
]
})
export class NehubaViewerUnit implements AfterViewInit,OnDestroy{
config : any
nehubaViewer : any
Xiao Gui
committed
_s1$ : any
_s2$ : any
_s3$ : any
_s4$ : any
_s5$ : any
_s6$ : any
_s7$ : any
_s$ : any[] = [
this._s1$,
this._s2$,
this._s3$,
this._s4$,
this._s5$,
this._s6$,
this._s7$
]
parcellationId : string
regionsLabelIndexMap : Map<number,any>
Xiao Gui
committed
navPosReal : [number,number,number] = [0,0,0]
navPosVoxel : [number,number,number] = [0,0,0]
mousePosReal : [number,number,number] = [0,0,0]
mousePosVoxel : [number,number,number] = [0,0,0]
viewerState : ViewerState
private defaultColormap : Map<number,{red:number,green:number,blue:number}>
public mouseOverSegment : number | null
ngAfterViewInit(){
this.nehubaViewer = export_nehuba.createNehubaViewer(this.config,console.warn)
if(this.regionsLabelIndexMap){
this.loadNewParcellation()
}
Xiao Gui
committed
window['nehubaViewer'] = this.nehubaViewer
Xiao Gui
committed
this._s$.forEach(_s$=>{
if(_s$) _s$.unsubscribe()
})
}
public hideAllSeg(){
Xiao Gui
committed
Array.from(this.regionsLabelIndexMap.keys()).forEach(idx=>
this.nehubaViewer.hideSegment(idx,{
name : this.parcellationId
}))
this.nehubaViewer.showSegment(0,{
name : this.parcellationId
})
}
public showAllSeg(){
Xiao Gui
committed
this.hideAllSeg()
this.nehubaViewer.hideSegment(0,{
name : this.parcellationId
})
}
public showSegs(array:number[]){
Xiao Gui
committed
this.hideAllSeg()
this.nehubaViewer.hideSegment(0,{
name : this.parcellationId
})
array.forEach(idx=>
this.nehubaViewer.showSegment(idx,{
name : this.parcellationId
}))
}
Xiao Gui
committed
public setNavigationState(newViewerState:Partial<ViewerState>){
const {
orientation,
perspectiveOrientation,
perspectiveZoom,
position,
positionReal,
zoom
} = newViewerState
if( perspectiveZoom )
this.nehubaViewer.ngviewer.perspectiveNavigationState.zoomFactor.restoreState(perspectiveZoom)
if( zoom )
this.nehubaViewer.ngviewer.navigationState.zoomFactor.restoreState(zoom)
if( perspectiveOrientation )
this.nehubaViewer.ngviewer.perspectiveNavigationState.pose.orientation.restoreState( perspectiveOrientation )
if( orientation )
this.nehubaViewer.ngviewer.navigationState.pose.orientation.restoreState( orientation )
if( position )
this.nehubaViewer.setPosition( position , positionReal ? true : false )
}
private updateColorMap(arrayIdx:number[]){
const set = new Set(arrayIdx)
const newColorMap = new Map(
Array.from(this.defaultColormap.entries())
.map(v=> set.has(v[0]) || set.size === 0 ?
v :
[v[0],{red:255,green:255,blue:255}]) as any
)
this.nehubaViewer.batchAddAndUpdateSegmentColors(newColorMap,{
name:this.parcellationId
})
}
private loadNewParcellation(){
this.nehubaViewer.setMeshesToLoad(
[
...Array.from(this.regionsLabelIndexMap.keys()),
...[65535]
Xiao Gui
committed
],
{
name : this.parcellationId
}
)
this.defaultColormap = new Map(
Array.from(
[
...this.regionsLabelIndexMap.entries(),
...[[65535,{}]]
]
).map(val=>([val[0],this.getRgb(val[1].rgb)])) as any)
this.nehubaViewer.batchAddAndUpdateSegmentColors(
this.defaultColormap,
{ name : this.parcellationId })
Xiao Gui
committed
this._s$.forEach(_s$=>{
if(_s$) _s$.unsubscribe()
})
this._s1$ = this.nehubaViewer.getShownSegmentsObservable({
name : this.parcellationId
}).subscribe(arrayIdx=>this.updateColorMap(arrayIdx))
Xiao Gui
committed
this._s2$ = this.nehubaViewer.mouseOver.segment
.subscribe(obj=>this.mouseOverSegment = obj.segment)
Xiao Gui
committed
this._s3$ = this.nehubaViewer.navigationState.all
.debounceTime(300)
.subscribe(({ orientation, perspectiveOrientation, perspectiveZoom, position, zoom })=>{
this.viewerState = {
orientation,
perspectiveOrientation,
perspectiveZoom,
zoom,
position,
positionReal : false
}
})
this._s4$ = this.nehubaViewer.navigationState.position.inRealSpace
.filter(v=>typeof v !== 'undefined' && v !== null)
.subscribe(v=>this.navPosReal=v)
this._s5$ = this.nehubaViewer.navigationState.position.inVoxels
.filter(v=>typeof v !== 'undefined' && v !== null)
.subscribe(v=>this.navPosVoxel=v)
this._s6$ = this.nehubaViewer.mousePosition.inRealSpace
.filter(v=>typeof v !== 'undefined' && v !== null)
.subscribe(v=>(this.mousePosReal=v))
this._s7$ = this.nehubaViewer.mousePosition.inVoxels
.filter(v=>typeof v !== 'undefined' && v !== null)
.subscribe(v=>(this.mousePosVoxel=v))
private getRgb(rgb?:number[]):{red:number,green:number,blue:number}{
if(typeof rgb === 'undefined' || rgb === null)
return {
red : 255,
green: 255,
blue : 255
}
return {
red : rgb[0],
green: rgb[1],
blue : rgb[2]
}
Xiao Gui
committed
}
export interface ViewerState{
orientation : [number,number,number,number]
perspectiveOrientation : [number,number,number,number]
perspectiveZoom : number
position : [number,number,number]
positionReal : boolean
zoom : number
}