summaryrefslogtreecommitdiffstats
path: root/applications/rview/rviewOSection.hh
blob: 54145a4b5f18c540feeab38d3f6e27b8e9aed787 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
/*
* This file is part of rasdaman community.
*
* Rasdaman community is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Rasdaman community is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with rasdaman community.  If not, see <http://www.gnu.org/licenses/>.
*
* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann /
rasdaman GmbH.
*
* For more information please see <http://www.rasdaman.org>
* or contact Peter Baumann via <baumann@rasdaman.com>.
/

/**
 *  PURPOSE:
 *
 *  A viewer for orthosections in 3D images (bias on medical images)
 *
 *	COMMENTS:
 *			None
 */

/**
*	@file rviewOSection.hh
*
*	@ingroup Applications
*/

#ifndef _RVIEW_OSECTION_H_
#define _RVIEW_OSECTION_H_

#include "rviewDModes.hh"


/*
 *  Abstract base class for orthosection views of 3D image volumes
 *  Client classes implement the data sources (everything in memory
 *  vs. loading slices on demand)
 */
 
class rviewOSectionImage : public rviewRenderImage
{
  public:
  
  rviewOSectionImage(mdd_frame *mf, unsigned int flags=0);
  virtual ~rviewOSectionImage(void);

  virtual void label(void);
  virtual int process(wxObject &obj, wxEvent &evt);
  virtual void OnSize(int w, int h);
  virtual int openViewer(void);

  virtual const char *getFrameName(void) const;
  virtual rviewFrameType getFrameType(void) const;
  virtual int getViewerType(void) const;
  virtual void childMouseEvent(wxWindow *child, wxMouseEvent &mev);

  // new virtual methods
  virtual bool sectionValid(unsigned int num) = 0;
  virtual const r_Minterval &getSectionDomain(unsigned int num) = 0;
  virtual const r_Minterval &getSectionParent(unsigned int num) = 0;
  virtual char *getSectionArray(unsigned int num) = 0;
  virtual long getSectionProjection(unsigned int num) = 0;
  virtual r_Ref<r_GMarray> &getCsmapArray(void) = 0;
    
  // internal structures
  struct section_map_s;
  struct section_part_s;
  typedef struct section_map_s section_map_t;
  typedef struct section_part_s section_part_t;

  // constants
  // additional height of control panel
  static const int osection_ctrly;
  // width of righthand column (next to sliders)
  static const int osection_rcwidth;
  // height of slider bar
  static const int osection_sheight;
  // Checkbox dimensions
  static const int osection_chkwidth;
  static const int osection_chkheight;
  // Text widget dimensions
  static const int osection_twidth;
  static const int osection_theight;
  // Button dimensions
  static const int osection_bwidth;
  static const int osection_bheight;


  protected:

  virtual char *initMode(void);
  virtual char *setupEnvironment(int w, int h);
  virtual bool doUpdate(int updateFlags);
  virtual void fillBuffer(void);

  // view management
  virtual int saveView(FILE *fp);
  virtual int readView(const char *key, const char *value);
  virtual void loadViewFinished(void);

  // create the currently relevant spatial domain for a slice
  int makeMinterval(unsigned int num, r_Minterval &dom);
  // partition sections into quadrants for rendering
  int performPartition(void);
  // update a slice
  void updateSlice(unsigned int num, long value, bool useDummy=TRUE);
  // refresh all slices that need to (or all, if force=TRUE)
  void refreshSlices(bool force=FALSE);

  // load the correct slices from the database if necessary
  virtual int ensureSections(void) = 0;
  // create a dummy slice (empty)
  virtual int createDummySection(unsigned int num, const r_Minterval *dom=NULL) = 0;
  // flush out all slices
  virtual void flushSlices(void) = 0;
  
  void setOId(const r_OId &oid);

  //rviewSlider **sliders;
  rviewSpecialSlider **sliders;
  rviewText **sltexts;
  rviewCheckBox *boundingBox;
  rviewText *thickText;

  // intersection point of the (3) sections
  r_Point intersection;
  // thickness of a section (1)
  int thickness;
  // mapping sections to dimensions
  struct section_map_s *secmap;
  // mapping partitions (section quadrants) to sections and 3D space
  struct section_part_s *partition;
  unsigned int numPartitions;
  bool doBoundingBox;
  // currently selected section
  unsigned int currentSection;
  // static members
  static const unsigned int numSections;
  static const char *sliderLabels[];

  // view parameters
  static const char *view_Thickness;
  static const char *view_MidPoint;
  static const char *view_UseBBox;
};




/*
 *  Orthosection class where slices are loaded on demand from the database.
 */
 
class rviewOSectionPartImage : public rviewOSectionImage
{
  public:
  rviewOSectionPartImage(mdd_frame *mf, const char *cname, const r_OId &oid, unsigned int flags=0);
  ~rviewOSectionPartImage(void);

  virtual void label(void);
  virtual int process(wxObject &obj, wxEvent &evt);
  virtual void OnSize(int w, int h);
  virtual void childMouseEvent(wxWindow *child, wxMouseEvent &mev);

  virtual bool sectionValid(unsigned int num);
  virtual const r_Minterval &getSectionDomain(unsigned int num);
  virtual const r_Minterval &getSectionParent(unsigned int num);
  virtual char *getSectionArray(unsigned int num);
  virtual long getSectionProjection(unsigned int num);
  virtual r_Ref<r_GMarray> &getCsmapArray(void);
    
  // create a new instance.
  static rviewOSectionPartImage *createViewer(const char *collname, const double *loid=NULL);

  struct section_desc_s;
  typedef struct section_desc_s section_desc_t;


  protected:
  virtual int ensureSections(void);
  virtual int createDummySection(unsigned int num, const r_Minterval *dom=NULL);
  virtual void flushSlices(void);

  rviewCheckBox *fireDragRelease;
  rviewButton *fireButton;

  // the sections (slices through the cube; all technically 3D)
  struct section_desc_s *sections;
  r_OId objOId;
  DynamicString collName;
  // dummy MDD used for colourspace configuration
  r_Ref<r_GMarray> csDummy;
};





/*
 *  Orthosection class where the entire object is in client memory
 */
 
class rviewOSectionFullImage : public rviewOSectionImage
{
  public:
  rviewOSectionFullImage(mdd_frame *mf, unsigned int flags = 0);
  ~rviewOSectionFullImage(void);
  
  virtual bool sectionValid(unsigned int num);
  virtual const r_Minterval &getSectionDomain(unsigned int num);
  virtual const r_Minterval &getSectionParent(unsigned int num);
  virtual char *getSectionArray(unsigned int num);
  virtual long getSectionProjection(unsigned int num);
  virtual r_Ref<r_GMarray> &getCsmapArray(void);
  
  
  protected:
  virtual int ensureSections(void);
  virtual int createDummySection(unsigned int num, const r_Minterval *dom=NULL);
  virtual void flushSlices(void);
  
  r_Minterval *sections;
};

#endif