Appendix B : Data Structures And Constants


This appendix explains how the 3DVIEWNIX 1.1 directory structure is formed, and lists all the constants and data structures defined in 3DVIEWNIX 1.1.
B.1 Directory Tree Structure
Under the main 3DVIEWNIX directory are five subdirectories - FILES, INCLUDE, LIBRARY, DOCUMENT, and PROCESS. In a process using the interface functions, the pathname of the 3DVIEWNIX directory should be given in the environment variable VIEWNIX_ENV. The FILES subdirectory contains all global input/output files (such as specification files, font files, help files, menu files) which are used by 3DVIEWNIX 1.1. The INCLUDE subdirectory contains all the relevant constants and data structures required by the interface functions in 3DVIEWNIX 1.1. This will be described in the next three sections. The LIBRARY subdirectory contains all the 3DVIEWNIX 1.1 library source code and the object code. The DOCUMENT subdirectory contains all the 3DVIEWNIX 1.1 documents in PostScript format. The PROCESS subdirectory contains multiple subdirectories. The executables of all the processes are placed in the BIN subdirectory.

B.2 3DVIEWNIX 1.1 Constants (File : 3DVIEWNIX.PAR)
Common parameters for 3DVIEWNIX software package
	#define FALSE 0 
	#define TRUE !FALSE
	#define BITS_PER_WORD 16
	#define BITS_PER_BYTE 8
	#define BYTES_PER_BLK ((unsigned long)0xffffffff)
	#define rint(x) floor(0.5+(x))
	#define SINGLE_FILE 0
	#define MULTIPLE_FILES 1
	#define MSG_WIDTH 120
	#define NUM_OF_RESERVED_COLORCELLS 12
	#define MAX_SUBWINS 20
	#define MAX_SCALES 15
	#define FILES_PATH "FILES"
	#define PROCESS_PATH "PROCESS/BIN"
	#define MAX_HORIZONTAL_MENUS 6
	#define Default 0
	#define MAX_BUTT_CHARS 10
	#define MAX_BUTT_MSG_LINES 3
	#define MAX_PANEL_CHARS 12
	#define MAX_HELP_CHARS 10
	#define COPYRIGHT_MSG "3DVIEWNIX 1.1, Copyright (c) 1993, Medical Image Processing Group, UPenn"
Saving output filename (default)
	#define MAX_DEFAULT_FILES 20
	#define MAX_DEFAULT_CHAR 20
Data types
	#define MAX_DATA_TYPES          3
	#define IMAGE0                  0
	#define IMAGE1                  1
	#define MOVIE0                  200
	#define SHELL0                  120
	#define SHELL1                  121
	#define CURVE0                  100
	#define SURFACE0                110
	#define SURFACE1                111
File extension types
	#define MAX_FILE_TYPES  13
	#define IM0             1
	#define CIM             2
	#define MV0             4
	#define BIM             8
	#define CBI             16
	#define SH0             32
	#define BS0             64
	#define CV0             128
	#define S03             256
	#define S04             512
	#define SH1             1024
	#define BS1             2048
	#define S13             4096
Cursor types
	#define DEWEY_CURSOR 160
	#define DEFAULT_CURSOR XC_top_left_arrow
Window types
	#define IMAGE_WINDOW 0
	#define BUTTON_WINDOW 1
	#define DIALOG_WINDOW 2
	#define ALL_WINDOWS 3
	#define LEFT_BUTTON 1
	#define MIDDLE_BUTTON 2
	#define RIGHT_BUTTON 3
	#define NO_BUTTON 4
Visual class type
	#define INHERIT 1000
	#define DEFAULT 1001
	#define GRAYSCALE 1002
	#define PSEUDOCOLOR 1003
	#define DIRECTCOLOR 1004
To accomodate SGI peculiarities
	#ifdef NDEBUG
	#define LIB_EXIT SIGKILL
	#else
	#ifdef SIGBUS
	#define LIB_EXIT SIGBUS
	#else
	#define LIB_EXIT SIGKILL
	#endif
	#endif

B.3 3DVIEWNIX 1.1 Graphics & Process Interface Data Structure (File : TYPEDEF.H)
typedef struct {
        unsigned long pixel;		/*pixel value*/
        unsigned short  red,green,blue;	/*RGB values*/
} ViewnixColor;
 
typedef struct {
        char filename[30];	/*input filename*/
        short num_of_elem;	/*the no. of elem. in min/max arrays(sd-2)*/
        short *min;		/*the min no. of n-1 scenes for each n*/
        short *max;		/*the max no. of n-1 scenes for each n*/
        short *incr;
} FileInfo;
 
typedef struct {
        short num_of_ifiles;	/*no. of file selected from INPUT command*/
        FileInfo *ifiles;	/*array fo files selected from INPUT command*/
} GlobalInfo;
 
typedef struct {
        short on;		/*horizontal menu on(1)/off(0)*/
        short item_selected;	/*horizontal menu selected*/
        short cmd_wd;		/*the width of horizontal command*/
} HorizontalMenuInfo;
 
typedef struct {
        short up;		/*vertical menu on(1)/off(0)*/
        short x,y;		/*top-left cood of vertical menu*/
        short width;		/*the width of the vertical menu*/
        short height;		/*the height of the vertical menu*/
} VerticalMenuInfo;

typedef struct {
        char cmd[30];		/*the current command selected*/
        char function[30];	/*the current function selected*/ 
        char process[30];	/*the current process being executed*/
        char filetype[100];	/*the types of files to be read*/
        short father;		/*the father fo the current process*/
        short sibling;		/*the first sibling of the current process*/
        short son;		/*the first child of the current process*/
        short x,y;		/*the top-left cood of the current command*/
        short terminal_leaf_node;/*terminal node(1) or not(0)*/
} TreeInfo;
 
typedef char Char30[30];
 
typedef struct {
        short  group;           /*the group number*/
        Char30 cmd;             /*the name of command*/
        short  type;            /*0 - button type; 1 - switch type.*/
        short  num_of_switches;	/*the number of switches per command*/
        Char30 *switches;	/*the names of the switches*/
        short  switch_item_displayed; /*the switch item to be displayed*/
} PanelCmdInfo;

typedef struct {
        Char30 machine_name;	/*machine on which tape is mounted*/
        Char30 tape_drive_name;	/*name of tape drive*/
        Char30 mt_option;	/*option to be used with mt command*/
        Char30 tape_size;	/*kind of drive (1/4,1/2inch,8mm)*/
} TapePathName;
 
typedef struct {
        short x,y;		/*the top-left coordinate of Click button*/
        short width;		/*the width of the Click button*/
        short height;		/*the height of the Click button*/
} MarginClickInfo;
 
typedef struct {
        short top_x,top_y;	/*the top-left cood of top Click button*/
        short top_width;	/*the width of the top Click button*/
        short top_height;	/*the height of the top Click button*/
        short bottom_x,bottom_y;/*the top-left cood of botton Click button*/
        short bottom_width;	/*the width of the bottom Click button*/
        short bottom_height;	/*the height of the bottom Click button*/
} ScrollbarClickInfo;
 
typedef struct _text {
        Window  win;            /*window in which item resides*/
        GC      *gc;
        int     x,y;            /*location of upper-left corner of item*/
        int     w;              /*width of the total item area in fonts*/
        int     h;              /*height of the total item area in  PIXELS*/
        short   label_width;    /*width of label in pixels*/
        short   label_height;   /*height of label*/
        short   label_ascent;   /*ascent dimension of font*/
        short   label_x;        /*position of the label*/
        short   label_y;
        int     thick;          /*thickness of the frame of the item*/
        int     width;          /*current width of item in pixels*/
        int     fw,fh;          /*size of font*/
        char    label[150];     /*label of the text item*/
        char    value[200];     /*value of the text item*/
        int     pos;            /*pos indicates the index of the first VALUE*/
        int     state;          /*indicates if text item is OFF(0) or ON(1)*/
        int     mode;           /*text item is DISABLED(0) or ENABLED (1)*/
        int     (*func)();      /*notify procedure*/
        struct _text *next;     /*next text item*/
        XFontStruct *font_struct; /*Font used on the window*/
} TEXT;
 
typedef struct _button {
        Window  win;            /*window in which item resides*/
        short   type;           /*type of button(0=button, 1=toggle, etc..)*/
        short   x,y;            /*location of upper-left corner of item*/
        short   w;              /*width of the item area in fonts*/
        short   h;              /*height of the item area in fonts*/
        short   label_width;    /*width of label in pixels*/
        short   label_height;   /*height of label*/
        short   label_ascent;   /*ascent dimension of font*/
        short   label_x;        /*position of the label*/
        short   label_y;
        short   thick;          /*thickness of frame*/
        short   width;          /*width of item in pixels*/
        short   height;         /*height of item in pixels*/
        int     fw,fh;          /*size of font*/
        char    label[150];     /*label of the button item*/
        short   state;          /*indicates if button item is OFF(0) / ON(1)*/
        short   mode;           /*0=RELEASED, 1=PRESSED*/
        int     (*func)();      /*notify procedure*/
        struct _button *next;   /*next button item*/
} BUTTON;

B.4 3DVIEWNIX 1.1 Data Interface Data Structures (File : 3DVIEWNIX.HDR)
typedef struct {
        char recognition_code[80]; /*recognition code*/
        char study_date[15]; 	/*study date (the format is yyyy.mm.dd)*/
        char study_time[15]; 	/*study time (the format is hh:mm:ss)*/
        short data_type; 	/*data set type : Scan data: IMAGE0, IMAGE1.
                         	  Structure data: CURVE0, SURFACE0, SURFACE1,
				  SHELL. Display data: MOVIE0.*/
        char modality[10]; 	/*modality (CT, NM, MR, DS, DR, US, OT)*/
        char institution[80]; 	/*institution ID*/
        char physician[80]; 	/*referring physician*/
        char department[80]; 	/*institutional department*/
        char radiologist[80]; 	/*radiologist*/
        char model[80]; 	/*manufacturer's model*/
        char filename[80]; 	/*name of the file containing this message*/
        char filename1[80]; 	/*name of the file that created this file*/ 
        char *description; 	/*description of data in file*/
        char *comment; 		/*scratch pad to store user-specified info*/
        char patient_name[80]; 	/*patient name*/
        char patient_id[80]; 	/*patient ID*/
        float slice_thickness; 	/*slice thickness*/
        float kvp[2]; 		/*KVP*/
        float repetition_time; 	/*repetition time*/
        float echo_time; 	/*echo time*/
        char *imaged_nucleus; 	/*imaged nucleus*/
        float gantry_tilt; 	/*gantry tilt*/
        char study[10]; 	/*study number*/
        char series[10]; 	/*series number*/
        short gray_descriptor[3]; /*lookup table description - gray 
				(number of entries in the table(net)\starting
 				 pixel value(spv)\num of bits for entries)*/
        short red_descriptor[3]; /*lookup table description - red
				(as for gray)*/
        short green_descriptor[3]; /*lookup table description - green
                                (as for gray)*/
        short blue_descriptor[3]; /*lookup table description - blue
				(as for gray)*/
        unsigned short *gray_lookup_data; /*lookup data - gray 
				(mapped value1\mapped value2\...\ mapped value
			 	 net; pixel values to be mapped are assumed to
 				 be spv, spv+1,...,spv+net-1; each mapped 
				 value is stored in 16 bits)*/
        unsigned short *red_lookup_data; /*lookup data - red
                                (as for gray)*/
        unsigned short *green_lookup_data; /*lookup data - green
                                (as for gray)*/
        unsigned short *blue_lookup_data; /*lookup data - blue
                                (as for gray)*/
 
        /*the following structure items are one bit for each item and
          indicate whether the corresponding item stated above is valid(1)
          or invalid(0).*/
        unsigned recognition_code_valid: 1;
        unsigned study_date_valid: 1;
        unsigned study_time_valid: 1;
        unsigned data_type_valid: 1;
        unsigned modality_valid: 1;
        unsigned institution_valid: 1;
        unsigned physician_valid: 1;
        unsigned department_valid: 1;
        unsigned radiologist_valid: 1;
        unsigned model_valid: 1;
        unsigned filename_valid: 1;
        unsigned filename1_valid: 1;
        unsigned description_valid: 1;
        unsigned comment_valid: 1;
        unsigned patient_name_valid: 1;
        unsigned patient_id_valid: 1;
        unsigned slice_thickness_valid: 1;
        unsigned kvp_valid: 1;
        unsigned repetition_time_valid: 1;
        unsigned echo_time_valid: 1;
        unsigned imaged_nucleus_valid: 1;
        unsigned gantry_tilt_valid: 1;
        unsigned study_valid: 1;
        unsigned series_valid: 1;
        unsigned gray_descriptor_valid: 1;
        unsigned red_descriptor_valid: 1;
        unsigned green_descriptor_valid: 1;
        unsigned blue_descriptor_valid: 1;
        unsigned gray_lookup_data_valid: 1;
        unsigned red_lookup_data_valid: 1;
        unsigned green_lookup_data_valid: 1;
        unsigned blue_lookup_data_valid: 1;
} GeneralInfo;

typedef struct {
        short dimension; 	/*scene dimension (sd)*/
        float *domain; 		/*location and orientation of the scene domain
				  with respect to a fixed imaging device 
				  coordinate system : specified by sd+1 vector
 			    	  X0,...,Xsd. X0: coordinates of the origin of
 				  the scene coordinate system, X1,...,Xsd: 
				  unit vectors along each of its sd principal
				  directions.*/
        Char30 *axis_label; 	/*label associated with each axis*/
        short *measurement_unit;/*unit measurement in the sd direction.
                                  0 - kilometer;1 - meter;2 - cm;3 - mm; 
				  4 - micron;5 - sec;6 - msec;7 - microsec.*/ 
        short num_of_density_values; /*number of density values associated
                                  with each cell*/
        short *density_measurement_unit; /*Unit of measurement of density val:
                                  0 - No unit;1 - Hounsfield Units;
                                  2 - Relaxation Times;3 - Proton Density.*/
        float *smallest_density_value; /*smallest density value (when density
                                  is vector valued, the smallest of each 
				  component in the scene*/
        float *largest_density_value; /*largest density value (when density
                                  is vector valued, the largest of each 
				  component in the scene*/ 
        short num_of_integers; 	/*density storage scheme: number of integers
                                  in the density vector(ni). (the rest nd-ni
                                  are assumed to be floating point number*/
        short *signed_bits; 	/*density storage scheme: each component is
                                  signed or unsigned: sous1\...\sousni, where
                                  each sousi indicates if the ith component
                                  of the density vector is signed(1) or
                                  unsigned(0)*/
        short num_of_bits; 	/*density storage scheme: total number of bits
                                  required for the density vector(nbi)*/ 
        short *bit_fields; 	/*density storage scheme:lbit1\rbit1\...\
				  lbitnd\rbitnd\. Within the bit field of nbi
 				  bits for the density vector, the bits are 
				  numbered 0,1,...,nbi-1 from left to right 
				  and the bit field for each component is 
				  specified by a left-bit (lbit) and a right-
				  bit(rbit). For every component, thus, 
				  lbit <= rbit. The lbit, rbit pair for a 
				  floating point number indicates if the
                               	  number is of single or double percision. The
 				  density vector itself is stored as integer1\
				  interger2\...\integerni\fp1\...\fp(nd-ni)\ 
				  within the nbi bits bit field and the order 
				  of the bit fields is preserved in the file 
				  storing the  message.*/
        short dimension_in_alignment; /*Alignment dimension (ads): null for
                                  IMAGE1 type. For IAMGE0 type, this element 
				  stores the dimenality of the subscene which 
				  is stored in an integer number of unit of 
				  multiple bytes. ads=0 means no alignment.*/
        short bytes_in_alignment; /*Number of bytes in a unit used for
                                  alignment. NULL for IMAGE1 type. nbys=0
                                  means no alignment.*/
        short xysize[2]; 	/*size of each slice: null(i.e. LENGTH=0) for
                             	  IMAGE1 type; for IMAGE0 type this element 
				  stores number of columns\number of rows\ in 
				  the slice*/ 
        short *num_of_subscenes;/*sampling scheme(number of sunscenes): null
                                  (i.e. LENGTH=0) for IMAGE1 type. For
                                  IMAGE0 type, this element stores, for each 
				  n, 2 rbit, it means that 
				  component of TSE associated with this field
                                  is not stored.*/
        short num_of_integers_in_NTSE; /*storage scheme for non-terminal
                                  structure elements : number of integers in 
				  NTSE (nint). (The rest ncnt-nint components 
				  are floating point numbers).*/
        short *signed_bits_in_NTSE; /*storage scheme for non-terminal
                                  structure elements : whether each component 
				  of NTSE is signed or unsigned : sous1\sous2\
				  ...\sousnint\, when each sousi indicates 
				  whether the ith component of NTSE is 
				  signed(1) or unsigned(0).*/
        short num_of_bits_in_NTSE; /*storage scheme for non-terminal
                                  structure elements : total number of bits 
				  required for NTSE(nbint).*/
        short *bit_fields_in_NTSE; /*storage scheme for non-terminal
                                  structure elements : lbit1\rbit1\...\lbitnct
				  \rbitncnt\. Description is similar to that 
				  for gr:0029, el:8090. If lbit > rbit, it
                                  means that component of TSE associated
                                  with this field is not stored.*/
        short *num_of_samples; 	/*sampling schemefor the structure: this
                                  element stores, for each n, 2