@@ -16,7 +16,6 @@ function DicomWebMods() {
1616 if ( ! Array . isArray ( series_overview ) ) {
1717 throw new Error ( "Unexpected series metadata format" ) ;
1818 }
19-
2019 // Extract instance IDs
2120 const instance_ids = series_overview
2221 . map ( item => item ?. [ "00080018" ] ?. [ "Value" ] ?. [ 0 ] )
@@ -54,15 +53,38 @@ function DicomWebMods() {
5453 if ( instance_data . length === 0 ) {
5554 throw new Error ( "No valid instance metadata retrieved" ) ;
5655 }
57-
56+ console . log ( instance_data )
5857 // Transform result into OpenSeadragon-compatible format
5958 const instance_results = instance_data . map ( x => {
6059 try {
61- let tile_order = 1 ; // default
60+ let tile_order = "r++" ; // default
6261 if ( x [ "00480102" ] ?. Value &&
6362 Array . isArray ( x [ "00480102" ] . Value ) &&
64- x [ "00480102" ] . Value . length > 4 ) {
65- tile_order = x [ "00480102" ] . Value [ 4 ] ;
63+ x [ "00480102" ] . Value . length == 6 ) {
64+ let [ X1 , Y1 , Z1 , X2 , Y2 , Z2 ] = x [ "00480102" ] . Value ;
65+ isRowMajor = Math . abs ( X1 ) < Math . abs ( X2 ) ;
66+ isColReverse = X1 < 0 || X2 < 0 ;
67+ isRowReverse = Y1 < 0 || Y2 < 0 ;
68+ tile_order_proposed = `${ isRowMajor ? 'r' : 'c' } ${ isRowReverse ? '-' : '+' } ${ isColReverse ? '-' : '+' } ` ;
69+
70+ //isColReverse = false;
71+ isRowReverse = ! isRowReverse ;
72+ //isRowMajor = false;
73+ //isRowMajor = !isRowMajor;
74+ //isColReverse = !isColReverse;
75+ //isRowReverse = !isRowReverse;
76+ let doReverse = true ;
77+ doReverse = false ;
78+ if ( doReverse && ! isRowMajor ) {
79+ let tmp = isRowReverse ;
80+ isRowReverse = isColReverse ;
81+ isColReverse = tmp ;
82+ }
83+
84+ tile_order = `${ isRowMajor ? 'r' : 'c' } ${ isRowReverse ? '-' : '+' } ${ isColReverse ? '-' : '+' } ` ;
85+ //tile_order = "r++"
86+ console . info ( x [ "00480102" ] ?. Value , tile_order , tile_order_proposed )
87+
6688 }
6789 return {
6890 height : x [ "00480007" ] ?. [ "Value" ] ?. [ 0 ] ?? null ,
@@ -77,20 +99,26 @@ function DicomWebMods() {
7799 return null ;
78100 }
79101 } ) . filter ( x => {
80- if ( x == null ) {
102+ if ( x == null || x . height == null || x . width == null ) {
81103 return false ;
82104 }
83105 let types = x [ 'type' ]
84106 for ( let i = 0 ; i < types . length ; i ++ ) {
85107 let v = types [ i ] . toUpperCase ( ) ;
86108 if ( v . indexOf ( "LABEL" ) !== - 1 ||
87109 v . indexOf ( "THUMBNAIL" ) !== - 1 ||
110+ v . indexOf ( "MACRO" ) !== - 1 ||
88111 v . indexOf ( "OVERVIEW" ) !== - 1 ) {
89112 return false ;
90113 }
91114 }
92115 return true ;
93116 } ) ;
117+ console . log ( instance_results )
118+ if ( instance_results . length == 0 ) {
119+ alert ( "didn't find anything!! Labels only maybe?" )
120+ history . back ( )
121+ }
94122
95123 // Sort instance_results by width in ascending order
96124 instance_results . sort ( ( a , b ) => a . width - b . width ) ;
@@ -111,10 +139,28 @@ function DicomWebMods() {
111139 maxLevel : x [ 'order' ] ,
112140 getTileUrl : function ( level , x_pos , y_pos ) {
113141 if ( level == x [ 'order' ] ) {
114- var frameIndex = y_pos * Math . ceil ( x [ 'width' ] / x [ 'tile_size' ] ) + x_pos ;
115- if ( x [ 'tile_order' ] == - 1 ) {
116- frameIndex = x_pos * Math . ceil ( x [ 'height' ] / x [ 'tile_size' ] ) + y_pos ;
142+ const numRows = Math . ceil ( x [ 'height' ] / x [ 'tile_size' ] ) ;
143+ const numCols = Math . ceil ( x [ 'width' ] / x [ 'tile_size' ] ) ;
144+ let a = x_pos ;
145+ let b = y_pos ;
146+
147+ if ( x [ 'tile_order' ] [ 1 ] == "-" ) {
148+ a = numRows - 1 - a ;
117149 }
150+
151+ if ( x [ 'tile_order' ] [ 2 ] == "-" ) {
152+ b = numCols - 1 - b ;
153+ }
154+
155+ if ( x [ 'tile_order' ] [ 0 ] == "c" ) {
156+ let tmp = b ;
157+ b = a ;
158+ a = tmp ;
159+ }
160+
161+ let frameIndex = b * numCols + a ;
162+
163+
118164 return `${ x [ "url" ] } /frames/${ frameIndex + 1 } /rendered` ;
119165 } else {
120166 return null ;
0 commit comments