You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
224 lines
4.9 KiB
224 lines
4.9 KiB
#if defined(_MSC_VER) /* MSVC Compiler */
|
|
#pragma warning ( disable : 4305 )
|
|
#endif
|
|
|
|
#include "qwt3d_colorlegend.h"
|
|
|
|
using namespace Qwt3D;
|
|
|
|
/**
|
|
Contructs a legend object with an axis at the left
|
|
side. The legend resides in the top-right area
|
|
and has no caption. Scale numbering is shown.
|
|
*/
|
|
ColorLegend::ColorLegend()
|
|
{
|
|
axis_.setNumbers(true);
|
|
axis_.setScaling(true);
|
|
axis_.setNumberColor(RGBA(0,0,0,1));
|
|
axis_.setNumberAnchor(CenterRight);
|
|
axis_.setNumberFont(QFont("Courier",8));
|
|
|
|
caption_.setFont("Courier", 10, QFont::Bold);
|
|
caption_.setColor(RGBA(0,0,0,1));
|
|
axisposition_ = ColorLegend::Left;
|
|
orientation_ = ColorLegend::BottomTop;
|
|
showaxis_ = true;
|
|
setRelPosition(Tuple(0.94, 1-0.36),Tuple(0.97, 1-0.04));
|
|
}
|
|
|
|
void ColorLegend::setTitleString(QString const& s)
|
|
{
|
|
caption_.setString(s);
|
|
}
|
|
|
|
void ColorLegend::setTitleFont(QString const& family, int pointSize, int weight, bool italic)
|
|
{
|
|
caption_.setFont(family, pointSize, weight, italic);
|
|
}
|
|
|
|
void ColorLegend::setLimits(double start, double stop)
|
|
{
|
|
axis_.setLimits(start, stop);
|
|
}
|
|
|
|
void ColorLegend::setMajors(int majors)
|
|
{
|
|
axis_.setMajors(majors);
|
|
}
|
|
|
|
void ColorLegend::setMinors(int minors)
|
|
{
|
|
axis_.setMinors(minors);
|
|
}
|
|
|
|
void ColorLegend::setAutoScale(bool val)
|
|
{
|
|
axis_.setAutoScale(val);
|
|
}
|
|
|
|
void ColorLegend::setScale(SCALETYPE val)
|
|
{
|
|
axis_.setScale(val);
|
|
}
|
|
|
|
void ColorLegend::setScale(Scale* val)
|
|
{
|
|
axis_.setScale(val);
|
|
}
|
|
|
|
|
|
void ColorLegend::setOrientation(ORIENTATION orientation, SCALEPOSITION pos)
|
|
{
|
|
orientation_ = orientation;
|
|
axisposition_ = pos;
|
|
|
|
if (orientation_==BottomTop)
|
|
{
|
|
if (axisposition_ == Bottom || axisposition_ == Top)
|
|
axisposition_ = Left;
|
|
}
|
|
else
|
|
{
|
|
if (axisposition_ == Left || axisposition_ == Right)
|
|
axisposition_ = Bottom;
|
|
}
|
|
}
|
|
|
|
void ColorLegend::setRelPosition(Tuple relMin, Tuple relMax)
|
|
{
|
|
relMin_ = relMin;
|
|
relMax_ = relMax;
|
|
}
|
|
|
|
void ColorLegend::setGeometryInternal()
|
|
{
|
|
double ot = .99;
|
|
|
|
getMatrices(modelMatrix, projMatrix, viewport);
|
|
pe_.minVertex = relativePosition(Triple(relMin_.x, relMin_.y, ot));
|
|
pe_.maxVertex = relativePosition(Triple(relMax_.x, relMax_.y, ot));
|
|
|
|
double diff = 0;
|
|
Triple b;
|
|
Triple e;
|
|
|
|
switch (axisposition_)
|
|
{
|
|
case ColorLegend::Left:
|
|
b = pe_.minVertex;
|
|
e = pe_.maxVertex; e.x = b.x;
|
|
axis_.setTicOrientation(-1,0,0);
|
|
axis_.setNumberAnchor(CenterRight);
|
|
diff = pe_.maxVertex.x - pe_.minVertex.x;
|
|
break;
|
|
case ColorLegend::Right:
|
|
e = pe_.maxVertex;
|
|
b = pe_.minVertex; b.x = e.x;
|
|
axis_.setTicOrientation(+1,0,0);
|
|
axis_.setNumberAnchor(CenterLeft);
|
|
diff = pe_.maxVertex.x - pe_.minVertex.x;
|
|
break;
|
|
case ColorLegend::Top:
|
|
e = pe_.maxVertex;
|
|
b = pe_.minVertex; b.z = e.z;
|
|
axis_.setTicOrientation(0,0,+1);
|
|
axis_.setNumberAnchor(BottomCenter);
|
|
diff = pe_.maxVertex.z - pe_.minVertex.z;
|
|
break;
|
|
case ColorLegend::Bottom:
|
|
b = pe_.minVertex;
|
|
e = pe_.maxVertex; e.z = b.z;
|
|
axis_.setTicOrientation(0,0,-1);
|
|
axis_.setNumberAnchor(TopCenter);
|
|
diff = pe_.maxVertex.z - pe_.minVertex.z;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
axis_.setPosition(b,e);
|
|
diff /= 10;
|
|
|
|
axis_.setTicLength(diff, 0.6*diff);
|
|
|
|
Triple c;
|
|
c.x = pe_.minVertex.x + ((pe_.maxVertex-pe_.minVertex) / 2).x;
|
|
c.z = pe_.maxVertex.z;
|
|
c.z += (pe_.maxVertex.z-pe_.minVertex.z)/20;
|
|
c.y = pe_.maxVertex.y;
|
|
|
|
caption_.setPosition(c, BottomCenter);
|
|
}
|
|
|
|
void ColorLegend::draw()
|
|
{
|
|
if (colors.empty())
|
|
return;
|
|
|
|
setGeometryInternal();
|
|
|
|
saveGLState();
|
|
|
|
Triple one = pe_.minVertex;
|
|
Triple two = pe_.maxVertex;
|
|
|
|
double h = (orientation_ == ColorLegend::BottomTop)
|
|
? (two-one).z / colors.size()
|
|
: (two-one).x / colors.size();
|
|
|
|
//glEnable(GL_DEPTH_TEST);
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
|
GLStateBewarer(GL_POLYGON_OFFSET_FILL,true);
|
|
// glPolygonOffset(0.0, 0.0);
|
|
|
|
glColor4d(0, 0, 0, 1);
|
|
glBegin(GL_LINE_LOOP);
|
|
glVertex3d(one.x, one.y, one.z);
|
|
glVertex3d(one.x, one.y, two.z);
|
|
glVertex3d(two.x, one.y, two.z);
|
|
glVertex3d(two.x, one.y, one.z);
|
|
glEnd();
|
|
|
|
|
|
unsigned size = colors.size();
|
|
RGBA rgb;
|
|
|
|
if (orientation_ == ColorLegend::BottomTop)
|
|
{
|
|
for (unsigned i=1; i<=size; ++i)
|
|
{
|
|
rgb = colors[i-1];
|
|
glColor4d(rgb.r,rgb.g,rgb.b,rgb.a);
|
|
glBegin( GL_POLYGON );
|
|
glVertex3d( one.x, one.y, one.z+(i-1)*h );
|
|
glVertex3d( one.x, one.y, one.z+i*h );
|
|
glVertex3d( two.x, one.y, one.z+i*h );
|
|
glVertex3d( two.x, one.y, one.z+(i-1)*h );
|
|
glEnd();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (unsigned i=1; i<=size; ++i)
|
|
{
|
|
rgb = colors[i-1];
|
|
glColor4d(rgb.r,rgb.g,rgb.b,rgb.a);
|
|
glBegin( GL_POLYGON );
|
|
glVertex3d( one.x+(i-1)*h, one.y, one.z );
|
|
glVertex3d( one.x+i*h, one.y, one.z );
|
|
glVertex3d( one.x+i*h, one.y, two.z );
|
|
glVertex3d( one.x+(i-1)*h, one.y, two.z );
|
|
glEnd();
|
|
}
|
|
}
|
|
|
|
restoreGLState();
|
|
|
|
if (showaxis_)
|
|
axis_.draw();
|
|
|
|
caption_.draw();
|
|
}
|