1 #ifndef __AXIS_H__
2 #define __AXIS_H__
3 
4 #include "qwt3d_autoptr.h"
5 #include "qwt3d_label.h"
6 #include "qwt3d_scale.h"
7 #include "qwt3d_autoscaler.h"
8 
9 namespace Qwt3D
10 {
11 
12 //! Autoscalable axis with caption.
13 /*!
14   Axes are highly customizable especially in terms
15   of labeling and scaling.
16 */
17 class QWT3D_EXPORT Axis : public Drawable
18 {
19 
20 public:
21 
22 	Axis(); //!< Constructs standard axis
23 	Axis(Qwt3D::Triple beg, Qwt3D::Triple end); //!< Constructs a new axis with specified limits
24 	virtual ~Axis(); // dtor
25 
26 	virtual void draw(); //!< Draws axis
27 
28 	void setPosition(const Qwt3D::Triple& beg, const Qwt3D::Triple& end); //!< Positionate axis
position(Qwt3D::Triple & beg,Qwt3D::Triple & end)29 	void position(Qwt3D::Triple& beg, Qwt3D::Triple& end) const {beg = beg_; end = end_;} //!< Returns axis' position
begin()30 	Qwt3D::Triple begin() const				{ return beg_; }					//!< Returns axis' beginning position
end()31 	Qwt3D::Triple end() const				{ return end_; }					//!< Returns axis' ending position
length()32 	double length() const					{ return (end_-beg_).length(); }	//!< Returns axis' length
33 
decorate()34 	bool decorate() const					{ return decorate_; }				//! whether or not labels/tics will be drawn (overrides individual flags)
setDecorate(bool on)35 	void setDecorate(bool on)				{ decorate_ = on; }					//! toggle whether or not labels/tics will be drawn (overrides individual flags)
36 
37 	void setTicLength(double majorl, double minorl); //!< Sets tics lengths in world coordinates
38 	//! Returns tics lengths
ticLength(double & majorl,double & minorl)39 	void ticLength(double& majorl, double& minorl) const {majorl = lmaj_; minorl = lmin_;}
40 	void setTicOrientation(double tx, double ty, double tz);					//!< Sets tic orientation
41 	void setTicOrientation(const Qwt3D::Triple& val);							//!< Same function as above
ticOrientation()42 	Qwt3D::Triple ticOrientation() const	{ return orientation_; }			//!< Returns tic orientation
setSymmetricTics(bool b)43 	void setSymmetricTics( bool b)			{ symtics_ = b; }					//!< Sets two-sided tics (default is false)
44 
45 	//! Sets font for axis label
46 	void setLabelFont(QString const& family, int pointSize, int weight = QFont::Normal, bool italic = false);
47 	void setLabelFont(QFont const& font);										//!< Sets font for axis label
labelFont()48 	QFont const& labelFont() const			{ return labelfont_; }				//!< Returns current label font
49 
50 	void setLabelString(QString const& name);									//!< Sets label content
labelString()51 	const QString& labelString() const		{ return label_.string(); }			//!< Gets label content
52 
53 	void setLabelPosition(const Qwt3D::Triple& pos, Qwt3D::ANCHOR);
54 	void setLabelColor(Qwt3D::RGBA col);
setLabel(bool d)55 	void setLabel(bool d)					{ drawLabel_ = d; }					//!< Turns label drawing on or off
label()56 	bool label() const						{ return drawLabel_; }				//!< Whether label drawing is on or off
adjustLabel(int val)57 	void adjustLabel(int val)				{ labelgap_ = val; }				//!< Shifts label in device coordinates dependent on anchor;
58 
setScaling(bool d)59 	void setScaling(bool d)					{ drawTics_ = d; }					//!< Turns scale drawing on or off
scaling()60 	bool scaling() const					{ return drawTics_; }				//!< Returns, if scale drawing is on or off
61 	void setScale(Qwt3D::SCALETYPE);
62 	void setScale(Scale* item);
63 
setNumbers(bool d)64 	void setNumbers(bool d)					{ drawNumbers_ = d; }				//!< Turns number drawing on or off
numbers()65 	bool numbers() const					{ return drawNumbers_; }			//!< Returns, if number drawing is on or off
66 	void setNumberColor(Qwt3D::RGBA col);										//!< Sets the color for axes numbers
numberColor()67 	Qwt3D::RGBA numberColor() const			{ return numbercolor_; }			//!< Returns the color for axes numbers
68 	//! Sets font for numbering
69 	void setNumberFont(QString const& family, int pointSize, int weight = QFont::Normal, bool italic = false);
70 	void setNumberFont(QFont const&);		//!< Overloaded member, works like the above function
numberFont()71 	QFont const& numberFont() const			{ return numberfont_; }				//!< Returns current numbering font
setNumberAnchor(Qwt3D::ANCHOR a)72 	void setNumberAnchor(Qwt3D::ANCHOR a)	{ scaleNumberAnchor_ = a; }			//!< Sets anchor position for numbers
adjustNumbers(int val)73 	void adjustNumbers(int val)				{ numbergap_ = val; }				//!< Shifts axis numbers in device coordinates dependent on anchor;
74 
75 	void setAutoScale(bool val = true)		{ autoscale_ = val; }				//!< Turns Autoscaling on or off
autoScale()76 	bool autoScale() const					{ return autoscale_; }				//!< actual Autoscaling mode
77 
78 	void setMajors(int val);				//!< Requests major intervals (maybe changed, if autoscaling is present)
79 	void setMinors(int val);				//!< Requests minor intervals
majors()80 	int majors() const						{ return majorintervals_; }			//!< Returns number of major intervals
minors()81 	int minors() const						{ return minorintervals_; }			//!< Returns number of minor intervals
majorPositions()82 	Qwt3D::TripleField const& majorPositions() const {return majorpos_; }		//!< Returns positions for actual major tics (also if invisible)
minorPositions()83 	Qwt3D::TripleField const& minorPositions() const {return minorpos_; }		//!< Returns positions for actual minor tics (also if invisible)
84 
85 	//! Sets line width for axis components
86 	void setLineWidth(double val, double majfac = 0.9, double minfac = 0.5);
lineWidth()87 	double lineWidth() const				{ return lineWidth_; }				//!< Returns line width for axis body
majLineWidth()88 	double majLineWidth() const				{ return majLineWidth_; }			//!< Returns Line width for major tics
minLineWidth()89 	double minLineWidth() const				{ return minLineWidth_; }			//!< Returns Line width for minor tics
90 
setLimits(double start,double stop)91 	void setLimits(double start, double stop) {start_=start; stop_=stop;}		//!< Sets interval
limits(double & start,double & stop)92 	void limits(double& start, double& stop) const {start = start_; stop = stop_;} //!< Returns axis interval
93 	void recalculateTics();					//!< Enforces recalculation of ticmark positions
94 
numericPrecision()95 	int numericPrecision(){return scale_->numericPrecision();};//!< Returns numeric precision for tick labels
numericFormat()96 	Qwt3D::Scale::NumericFormat numericFormat(){return scale_->numericFormat();};//!< Returns numeric format for tick labels
setNumericFormat(const Qwt3D::Scale::NumericFormat & fmt,int prec)97 	void setNumericFormat(const Qwt3D::Scale::NumericFormat& fmt, int prec){scale_->setNumericFormat(fmt, prec);};
98 
99 private:
100 
101 	void init();
102 	void drawBase();
103 	void drawTics();
104 	void drawTicLabel(Qwt3D::Triple Pos, int mtic);
105 	Qwt3D::Triple drawTic(Qwt3D::Triple nadir, double length);
106 	void drawLabel();
107 	bool prepTicCalculation(Triple& startpoint);
108 
109 	Qwt3D::ANCHOR scaleNumberAnchor_;
110 	Qwt3D::Label label_;
111 	std::vector<Qwt3D::Label> markerLabel_;
112 
113 	Qwt3D::Triple beg_, end_;
114 	Qwt3D::TripleField majorpos_, minorpos_; //! vectors, holding major resp. minor tic positions;
115 
116 	Qwt3D::Triple ncube_beg_, ncube_end_; //!< enclosing parallelepiped for axis numbering
117 
118 	double start_, stop_, autostart_, autostop_;
119 	double lmaj_, lmin_;
120 	Qwt3D::Triple orientation_;
121 
122 	int majorintervals_, minorintervals_;
123 
124 	double lineWidth_, majLineWidth_, minLineWidth_;
125 	bool symtics_;
126 	bool drawNumbers_, drawTics_, drawLabel_;
127 	bool autoscale_;
128 	QFont numberfont_, labelfont_;
129 	Qwt3D::RGBA  numbercolor_;
130 
131 	int numbergap_, labelgap_;
132 
133 	Qwt3D::qwt3d_ptr<Qwt3D::Scale> scale_;
134 
135 	bool decorate_;
136 };
137 
138 } // ns
139 
140 #endif
141