/*
* 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 .
*
* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann /
rasdaman GmbH.
*
* For more information please see
* or contact Peter Baumann via .
/
/**
* 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 &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 &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 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 &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