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

#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();
}