summaryrefslogtreecommitdiffstats
path: root/applications/rview/rviewOSection.hh
diff options
context:
space:
mode:
Diffstat (limited to 'applications/rview/rviewOSection.hh')
-rw-r--r--applications/rview/rviewOSection.hh230
1 files changed, 230 insertions, 0 deletions
diff --git a/applications/rview/rviewOSection.hh b/applications/rview/rviewOSection.hh
new file mode 100644
index 0000000..962c3de
--- /dev/null
+++ b/applications/rview/rviewOSection.hh
@@ -0,0 +1,230 @@
+/*
+* 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
+ */
+
+#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