[89] | 1 | #ifndef __plot3d_2003_06_09_12_14__
|
---|
| 2 | #define __plot3d_2003_06_09_12_14__
|
---|
| 3 |
|
---|
| 4 | #include "qwt3d_coordsys.h"
|
---|
| 5 | #include "qwt3d_enrichment_std.h"
|
---|
| 6 |
|
---|
| 7 | namespace Qwt3D
|
---|
| 8 | {
|
---|
| 9 |
|
---|
| 10 | //! Base class for all plotting widgets
|
---|
| 11 | /*!
|
---|
| 12 | Plot3D handles all the common features for plotting widgets - coordinate system, transformations, mouse/keyboard
|
---|
| 13 | handling, labeling etc.. It contains some pure virtual functions and is, in so far, an abstract base class.
|
---|
| 14 | The class provides interfaces for data handling and implements basic data controlled color allocation.
|
---|
| 15 | */
|
---|
| 16 | class QWT3D_EXPORT Plot3D : public QGLWidget
|
---|
| 17 | {
|
---|
| 18 | Q_OBJECT
|
---|
| 19 |
|
---|
| 20 | public:
|
---|
| 21 |
|
---|
| 22 | #if QT_VERSION < 0x040000
|
---|
| 23 | Plot3D( QWidget* parent = 0, const char* name = 0 );
|
---|
| 24 | #else
|
---|
| 25 | Plot3D ( QWidget * parent = 0, const QGLWidget * shareWidget = 0 );
|
---|
| 26 | #endif
|
---|
| 27 | virtual ~Plot3D();
|
---|
| 28 |
|
---|
| 29 | QPixmap renderPixmap (int w=0, int h=0, bool useContext=false);
|
---|
| 30 | void updateData(); //!< Recalculate data
|
---|
| 31 | void createCoordinateSystem(Qwt3D::Triple beg, Qwt3D::Triple end);
|
---|
| 32 | Qwt3D::CoordinateSystem* coordinates() { return &coordinates_p; } //!< Returns pointer to CoordinateSystem object
|
---|
| 33 | Qwt3D::ColorLegend* legend() { return &legend_;} //!< Returns pointer to ColorLegend object
|
---|
| 34 |
|
---|
| 35 | double xRotation() const { return xRot_;} //!< Returns rotation around X axis [-360..360] (some angles are equivalent)
|
---|
| 36 | double yRotation() const { return yRot_;} //!< Returns rotation around Y axis [-360..360] (some angles are equivalent)
|
---|
| 37 | double zRotation() const { return zRot_;} //!< Returns rotation around Z axis [-360..360] (some angles are equivalent)
|
---|
| 38 |
|
---|
| 39 | double xShift() const { return xShift_;} //!< Returns shift along X axis (object coordinates)
|
---|
| 40 | double yShift() const { return yShift_;} //!< Returns shift along Y axis (object coordinates)
|
---|
| 41 | double zShift() const { return zShift_;} //!< Returns shift along Z axis (object coordinates)
|
---|
| 42 |
|
---|
| 43 | double xViewportShift() const { return xVPShift_;} //!< Returns relative shift [-1..1] along X axis (view coordinates)
|
---|
| 44 | double yViewportShift() const { return yVPShift_;} //!< Returns relative shift [-1..1] along Y axis (view coordinates)
|
---|
| 45 |
|
---|
| 46 | double xScale() const { return xScale_;} //!< Returns scaling for X values [0..inf]
|
---|
| 47 | double yScale() const { return yScale_;} //!< Returns scaling for Y values [0..inf]
|
---|
| 48 | double zScale() const { return zScale_;} //!< Returns scaling for Z values [0..inf]
|
---|
| 49 |
|
---|
| 50 | double zoom() const { return zoom_;} //!< Returns zoom (0..inf)
|
---|
| 51 |
|
---|
| 52 | bool ortho() const { return ortho_; } //!< Returns orthogonal (true) or perspective (false) projection
|
---|
| 53 | void setPlotStyle( Qwt3D::PLOTSTYLE val);
|
---|
| 54 | Qwt3D::Enrichment* setPlotStyle( Qwt3D::Enrichment const& val);
|
---|
| 55 | Qwt3D::PLOTSTYLE plotStyle() const { return plotstyle_; }//!< Returns plotting style
|
---|
| 56 | //! Returns current Enrichment object used for plotting styles (if set, zero else)
|
---|
| 57 | Qwt3D::Enrichment* userStyle() const { return userplotstyle_p; }
|
---|
| 58 | void setShading( Qwt3D::SHADINGSTYLE val );
|
---|
| 59 | Qwt3D::SHADINGSTYLE shading() const { return shading_; }//!< Returns shading style
|
---|
| 60 | void setIsolines(int isolines);
|
---|
| 61 | int isolines() const { return isolines_;} //!< Returns number of isolines
|
---|
| 62 |
|
---|
| 63 | void setSmoothMesh(bool val) {smoothdatamesh_p = val;} //!< Enables/disables smooth data mesh lines. Default is false
|
---|
| 64 | bool smoothDataMesh() const {return smoothdatamesh_p;} //!< True if mesh antialiasing is on
|
---|
| 65 | void setBackgroundColor(Qwt3D::RGBA rgba); //!< Sets widgets background color
|
---|
| 66 | Qwt3D::RGBA backgroundRGBAColor() const {return bgcolor_;} //!< Returns the widgets background color
|
---|
| 67 | void setMeshColor(Qwt3D::RGBA rgba); //!< Sets color for data mesh
|
---|
| 68 | Qwt3D::RGBA meshColor() const {return meshcolor_;} //!< Returns color for data mesh
|
---|
| 69 | void setMeshLineWidth(double lw); //!< Sets line width for data mesh
|
---|
| 70 | double meshLineWidth() const {return meshLineWidth_;} //!< Returns line width for data mesh
|
---|
| 71 | void setDataColor(Color* col); //!< Sets new data color object
|
---|
| 72 | const Color* dataColor() const {return datacolor_p;} //!< Returns data color object
|
---|
| 73 |
|
---|
| 74 | virtual Qwt3D::Enrichment* addEnrichment(Qwt3D::Enrichment const&); //!< Add an Enrichment
|
---|
| 75 | virtual bool degrade(Qwt3D::Enrichment*); //!< Remove an Enrichment
|
---|
| 76 |
|
---|
| 77 | Qwt3D::ParallelEpiped hull() const { return hull_;} //!< Returns rectangular hull
|
---|
| 78 |
|
---|
| 79 | void showColorLegend(bool);
|
---|
| 80 |
|
---|
| 81 | void setCoordinateStyle(Qwt3D::COORDSTYLE st); //!< Sets style of coordinate system.
|
---|
| 82 | void setPolygonOffset(double d);
|
---|
| 83 | double polygonOffset() const {return polygonOffset_;} //!< Returns relative value for polygon offset [0..1]
|
---|
| 84 |
|
---|
| 85 | void setTitlePosition(double rely, double relx = 0.5, Qwt3D::ANCHOR = Qwt3D::TopCenter);
|
---|
| 86 | void setTitleFont(const QString& family, int pointSize, int weight = QFont::Normal, bool italic = false);
|
---|
| 87 | void setTitleColor(Qwt3D::RGBA col) {title_.setColor(col);} //!< Set caption color
|
---|
| 88 | void setTitle(const QString& title) {title_.setString(title);} //!< Set caption text (one row only)
|
---|
| 89 |
|
---|
| 90 |
|
---|
| 91 | void assignMouse(MouseState xrot, MouseState yrot, MouseState zrot,
|
---|
| 92 | MouseState xscale, MouseState yscale, MouseState zscale,
|
---|
| 93 | MouseState zoom, MouseState xshift, MouseState yshift);
|
---|
| 94 |
|
---|
| 95 | bool mouseEnabled() const; //!< Returns true, if the widget accept mouse input from the user
|
---|
| 96 | void assignKeyboard(
|
---|
| 97 | KeyboardState xrot_n, KeyboardState xrot_p
|
---|
| 98 | ,KeyboardState yrot_n, KeyboardState yrot_p
|
---|
| 99 | ,KeyboardState zrot_n, KeyboardState zrot_p
|
---|
| 100 | ,KeyboardState xscale_n, KeyboardState xscale_p
|
---|
| 101 | ,KeyboardState yscale_n, KeyboardState yscale_p
|
---|
| 102 | ,KeyboardState zscale_n, KeyboardState zscale_p
|
---|
| 103 | ,KeyboardState zoom_n, KeyboardState zoom_p
|
---|
| 104 | ,KeyboardState xshift_n, KeyboardState xshift_p
|
---|
| 105 | ,KeyboardState yshift_n, KeyboardState yshift_p
|
---|
| 106 | );
|
---|
| 107 |
|
---|
| 108 | bool keyboardEnabled() const; //!< Returns true, if the widget accept keyboard input from the user
|
---|
| 109 | //! Sets speed for keyboard driven transformations
|
---|
| 110 | void setKeySpeed(double rot, double scale, double shift);
|
---|
| 111 | //! Gets speed for keyboard driven transformations
|
---|
| 112 | void keySpeed(double& rot, double& scale, double& shift) const;
|
---|
| 113 |
|
---|
| 114 | bool lightingEnabled() const; //!< Returns true, if Lighting is enabled, false else
|
---|
| 115 | //! Turn light on
|
---|
| 116 | void illuminate(unsigned light = 0);
|
---|
| 117 | //! Turn light off
|
---|
| 118 | void blowout(unsigned light = 0);
|
---|
| 119 |
|
---|
| 120 | void setMaterialComponent(GLenum property, double r, double g, double b, double a = 1.0);
|
---|
| 121 | void setMaterialComponent(GLenum property, double intensity);
|
---|
| 122 | void setShininess(double exponent);
|
---|
| 123 | void setLightComponent(GLenum property, double r, double g, double b, double a = 1.0, unsigned light=0);
|
---|
| 124 | void setLightComponent(GLenum property, double intensity, unsigned light=0);
|
---|
| 125 |
|
---|
| 126 | //! Returns Light 'idx' rotation around X axis [-360..360] (some angles are equivalent)
|
---|
| 127 | double xLightRotation(unsigned idx = 0) const { return (idx<8) ? lights_[idx].rot.x : 0;}
|
---|
| 128 | //! Returns Light 'idx' rotation around Y axis [-360..360] (some angles are equivalent)
|
---|
| 129 | double yLightRotation(unsigned idx = 0) const { return (idx<8) ? lights_[idx].rot.y : 0;}
|
---|
| 130 | //! Returns Light 'idx' rotation around Z axis [-360..360] (some angles are equivalent)
|
---|
| 131 | double zLightRotation(unsigned idx = 0) const { return (idx<8) ? lights_[idx].rot.z : 0;}
|
---|
| 132 |
|
---|
| 133 | //! Returns shift of Light 'idx 'along X axis (object coordinates)
|
---|
| 134 | double xLightShift(unsigned idx = 0) const {return (idx<8) ? lights_[idx].shift.x : 0;}
|
---|
| 135 | //! Returns shift of Light 'idx 'along Y axis (object coordinates)
|
---|
| 136 | double yLightShift(unsigned idx = 0) const {return (idx<8) ? lights_[idx].shift.y : 0;}
|
---|
| 137 | //! Returns shift of Light 'idx 'along Z axis (object coordinates)
|
---|
| 138 | double zLightShift(unsigned idx = 0) const {return (idx<8) ? lights_[idx].shift.z : 0;}
|
---|
| 139 | //! Returns true if valid data available, false else
|
---|
| 140 | bool hasData() const { return (actualData_p) ? !actualData_p->empty() : false;}
|
---|
| 141 |
|
---|
| 142 |
|
---|
| 143 | signals:
|
---|
| 144 |
|
---|
| 145 | //! Emitted, if the rotation is changed
|
---|
| 146 | void rotationChanged( double xAngle, double yAngle, double zAngle );
|
---|
| 147 | //! Emitted, if the shift is changed
|
---|
| 148 | void shiftChanged( double xShift, double yShift, double zShift );
|
---|
| 149 | //! Emitted, if the viewport shift is changed
|
---|
| 150 | void vieportShiftChanged( double xShift, double yShift );
|
---|
| 151 | //! Emitted, if the scaling is changed
|
---|
| 152 | void scaleChanged( double xScale, double yScale, double zScale );
|
---|
| 153 | //! Emitted, if the zoom is changed
|
---|
| 154 | void zoomChanged(double);
|
---|
| 155 | //! Emitted, if the projection mode is changed
|
---|
| 156 | void projectionChanged(bool);
|
---|
| 157 |
|
---|
| 158 | public slots:
|
---|
| 159 |
|
---|
| 160 | void setRotation( double xVal, double yVal, double zVal );
|
---|
| 161 | void setShift( double xVal, double yVal, double zVal );
|
---|
| 162 | void setViewportShift( double xVal, double yVal );
|
---|
| 163 | void setScale( double xVal, double yVal, double zVal );
|
---|
| 164 | void setZoom( double );
|
---|
| 165 |
|
---|
| 166 | void setOrtho(bool);
|
---|
| 167 |
|
---|
| 168 | void enableMouse(bool val=true); //!< Enable mouse input
|
---|
| 169 | void disableMouse(bool val =true); //!< Disable mouse input
|
---|
| 170 | void enableKeyboard(bool val=true); //!< Enable keyboard input
|
---|
| 171 | void disableKeyboard(bool val =true); //!< Disable keyboard input
|
---|
| 172 |
|
---|
| 173 | void enableLighting(bool val = true); //!< Turn Lighting on or off
|
---|
| 174 | void disableLighting(bool val = true); //!< Turn Lighting on or off
|
---|
| 175 |
|
---|
| 176 | void setLightRotation( double xVal, double yVal, double zVal, unsigned int idx = 0 );
|
---|
| 177 | void setLightShift( double xVal, double yVal, double zVal, unsigned int idx = 0 );
|
---|
| 178 |
|
---|
| 179 | virtual bool savePixmap(QString const& fileName, QString const& format); //!< Saves content to pixmap format
|
---|
| 180 | //! Saves content to vector format
|
---|
| 181 | virtual bool saveVector(QString const& fileName, QString const& format, VectorWriter::TEXTMODE text, VectorWriter::SORTMODE sortmode);
|
---|
| 182 | virtual bool save(QString const& fileName, QString const& format); //!< Saves content
|
---|
| 183 |
|
---|
| 184 | protected:
|
---|
| 185 | typedef std::list<Qwt3D::Enrichment*> EnrichmentList;
|
---|
| 186 | typedef EnrichmentList::iterator ELIT;
|
---|
| 187 |
|
---|
| 188 | void initializeGL();
|
---|
| 189 | void paintGL();
|
---|
| 190 | void resizeGL( int w, int h );
|
---|
| 191 |
|
---|
| 192 | void mousePressEvent( QMouseEvent *e );
|
---|
| 193 | void mouseReleaseEvent( QMouseEvent *e );
|
---|
| 194 | void mouseMoveEvent( QMouseEvent *e );
|
---|
| 195 | void wheelEvent( QWheelEvent *e );
|
---|
| 196 |
|
---|
| 197 | void keyPressEvent( QKeyEvent *e );
|
---|
| 198 |
|
---|
| 199 | Qwt3D::CoordinateSystem coordinates_p;
|
---|
| 200 | Qwt3D::Color* datacolor_p;
|
---|
| 201 | Qwt3D::Enrichment* userplotstyle_p;
|
---|
| 202 | EnrichmentList elist_p;
|
---|
| 203 |
|
---|
| 204 | virtual void calculateHull() = 0;
|
---|
| 205 | virtual void createData() = 0;
|
---|
| 206 | virtual void createEnrichment(Qwt3D::Enrichment&){}
|
---|
| 207 | virtual void createEnrichments();
|
---|
| 208 |
|
---|
| 209 | void createCoordinateSystem();
|
---|
| 210 | void setHull(Qwt3D::ParallelEpiped p) {hull_ = p;}
|
---|
| 211 |
|
---|
| 212 | bool initializedGL() const {return initializedGL_;}
|
---|
| 213 |
|
---|
| 214 | enum OBJECTS
|
---|
| 215 | {
|
---|
| 216 | DataObject,
|
---|
| 217 | LegendObject,
|
---|
| 218 | NormalObject,
|
---|
| 219 | DisplayListSize // only to have a vector length ...
|
---|
| 220 | };
|
---|
| 221 | std::vector<GLuint> displaylists_p;
|
---|
| 222 | Qwt3D::Data* actualData_p;
|
---|
| 223 |
|
---|
| 224 |
|
---|
| 225 | private:
|
---|
| 226 | struct Light
|
---|
| 227 | {
|
---|
| 228 | Light() : unlit(true){}
|
---|
| 229 | bool unlit;
|
---|
| 230 | Qwt3D::Triple rot;
|
---|
| 231 | Qwt3D::Triple shift;
|
---|
| 232 | };
|
---|
| 233 | std::vector<Light> lights_;
|
---|
| 234 |
|
---|
| 235 | GLdouble xRot_, yRot_, zRot_, xShift_, yShift_, zShift_, zoom_
|
---|
| 236 | , xScale_, yScale_, zScale_, xVPShift_, yVPShift_;
|
---|
| 237 |
|
---|
| 238 | Qwt3D::RGBA meshcolor_;
|
---|
| 239 | double meshLineWidth_;
|
---|
| 240 | Qwt3D::RGBA bgcolor_;
|
---|
| 241 | Qwt3D::PLOTSTYLE plotstyle_;
|
---|
| 242 | Qwt3D::SHADINGSTYLE shading_;
|
---|
| 243 | Qwt3D::FLOORSTYLE floorstyle_;
|
---|
| 244 | bool ortho_;
|
---|
| 245 | double polygonOffset_;
|
---|
| 246 | int isolines_;
|
---|
| 247 | bool displaylegend_;
|
---|
| 248 | bool smoothdatamesh_p;
|
---|
| 249 |
|
---|
| 250 | Qwt3D::ParallelEpiped hull_;
|
---|
| 251 |
|
---|
| 252 | Qwt3D::ColorLegend legend_;
|
---|
| 253 |
|
---|
| 254 | Label title_;
|
---|
| 255 | Qwt3D::Tuple titlerel_;
|
---|
| 256 | Qwt3D::ANCHOR titleanchor_;
|
---|
| 257 |
|
---|
| 258 |
|
---|
| 259 | // mouse
|
---|
| 260 |
|
---|
| 261 | QPoint lastMouseMovePosition_;
|
---|
| 262 | bool mpressed_;
|
---|
| 263 |
|
---|
| 264 | MouseState xrot_mstate_,
|
---|
| 265 | yrot_mstate_,
|
---|
| 266 | zrot_mstate_,
|
---|
| 267 | xscale_mstate_,
|
---|
| 268 | yscale_mstate_,
|
---|
| 269 | zscale_mstate_,
|
---|
| 270 | zoom_mstate_,
|
---|
| 271 | xshift_mstate_,
|
---|
| 272 | yshift_mstate_;
|
---|
| 273 |
|
---|
| 274 | bool mouse_input_enabled_;
|
---|
| 275 |
|
---|
| 276 | void setRotationMouse(MouseState bstate, double accel, QPoint diff);
|
---|
| 277 | void setScaleMouse(MouseState bstate, double accel, QPoint diff);
|
---|
| 278 | void setShiftMouse(MouseState bstate, double accel, QPoint diff);
|
---|
| 279 |
|
---|
| 280 | // keyboard
|
---|
| 281 |
|
---|
| 282 | bool kpressed_;
|
---|
| 283 |
|
---|
| 284 | KeyboardState xrot_kstate_[2],
|
---|
| 285 | yrot_kstate_[2],
|
---|
| 286 | zrot_kstate_[2],
|
---|
| 287 | xscale_kstate_[2],
|
---|
| 288 | yscale_kstate_[2],
|
---|
| 289 | zscale_kstate_[2],
|
---|
| 290 | zoom_kstate_[2],
|
---|
| 291 | xshift_kstate_[2],
|
---|
| 292 | yshift_kstate_[2];
|
---|
| 293 |
|
---|
| 294 | bool kbd_input_enabled_;
|
---|
| 295 | double kbd_rot_speed_, kbd_scale_speed_, kbd_shift_speed_;
|
---|
| 296 |
|
---|
| 297 | void setRotationKeyboard(KeyboardState kseq, double speed);
|
---|
| 298 | void setScaleKeyboard(KeyboardState kseq, double speed);
|
---|
| 299 | void setShiftKeyboard(KeyboardState kseq, double speed);
|
---|
| 300 |
|
---|
| 301 |
|
---|
| 302 |
|
---|
| 303 | bool lighting_enabled_;
|
---|
| 304 | void applyLight(unsigned idx);
|
---|
| 305 | void applyLights();
|
---|
| 306 |
|
---|
| 307 | bool initializedGL_;
|
---|
| 308 | bool renderpixmaprequest_;
|
---|
| 309 | };
|
---|
| 310 |
|
---|
| 311 |
|
---|
| 312 | } // ns
|
---|
| 313 |
|
---|
| 314 |
|
---|
| 315 | #endif
|
---|