📄 wksp_layer_legend.cpp
字号:
{
Pen = dc.GetPen();
Pen.SetColour(Get_Color_asWX(m_pClassify->Get_Class_Color(i)));
dc.SetPen(Pen);
}
if( m_Box_bFill )
{
Brush = dc.GetBrush();
Brush.SetColour(Get_Color_asWX(m_pClassify->Get_Class_Color(i)));
dc.SetBrush(Brush);
}
pLayer->Draw_Symbol(dc, m_xBox + m_dxBox / 2, y + (BOX_HEIGHT - BOX_SPACE) / 2, (BOX_HEIGHT - BOX_SPACE) / 2);
_Draw_Label(dc, y, m_pClassify->Get_Class_Name(i), TEXTALIGN_TOP);
}
}
//-----------------------------------------------------
if( bSize )
{
dc.SetBrush(Brush);
dc.SetPen(Pen);
_Draw_Title(dc, FONT_SUBTITLE, Name_Size);
_Draw_Point_Sizes(dc, pLayer, min_Size, max_Size, min_Value, d_Value);
_Set_Size(0, SIZE_HEIGHT + dc.GetFont().GetPointSize());
}
}
//---------------------------------------------------------
void CWKSP_Layer_Legend::_Draw_Point_Sizes(wxDC &dc, CWKSP_Shapes_Point *pLayer, int min_Size, int max_Size, double min_Value, double d_Value)
{
int iClass, nClasses, dy, y;
double iSize, dySize;
nClasses = (int)((double)SIZE_HEIGHT / (double)BOX_HEIGHT);
dySize = (double)(max_Size - min_Size) / (double)nClasses;
for(iClass=nClasses, iSize=max_Size; iClass>=0; iClass--, iSize-=dySize)
{
dy = (int)(2.0 * m_Zoom_Map * iSize) + BOX_SPACE;
y = m_Position.y + SIZE_HEIGHT - iClass * BOX_HEIGHT;
pLayer->Draw_Symbol(dc, m_xBox + m_dxBox / 2, y + dy / 2, dy / 2);
_Draw_Label (dc, y, wxString::Format(wxT("%f"), min_Value + (iSize - min_Size) / d_Value), TEXTALIGN_TOP);
}
}
//---------------------------------------------------------
void CWKSP_Layer_Legend::_Draw_Line(wxDC &dc, CWKSP_Shapes_Line *pLayer)
{
bool bSize;
int min_Size, max_Size, iSize, y;
double min_Value, dValue;
wxString Name, Name_Size;
wxPen Pen;
//-----------------------------------------------------
m_BoxStyle = BOXSTYLE_LINE;
m_Box_bFill = false;
m_Box_bOutline = false;
//-----------------------------------------------------
bSize = pLayer->Get_Style_Size(min_Size, max_Size, min_Value, dValue, &Name_Size);
pLayer->Get_Style(Pen, &Name);
if( m_pClassify->Get_Mode() != CLASSIFY_UNIQUE || !bSize )
{
dc.SetPen(Pen);
if( Name.Length() > 0 )
{
_Draw_Title(dc, FONT_SUBTITLE, Name);
}
_Draw_Boxes(dc, m_Position.y);
}
//-----------------------------------------------------
if( bSize )
{
_Draw_Title(dc, FONT_SUBTITLE, Name_Size);
for(iSize=min_Size; iSize<=max_Size; iSize++)
{
Pen.SetWidth(iSize);
dc.SetPen(Pen);
y = m_Position.y;
_Draw_Box (dc, y, BOX_HEIGHT, Pen.GetColour());
_Draw_Label (dc, y, wxString::Format(wxT("%f"), min_Value + (iSize - min_Size) / dValue), TEXTALIGN_TOP);
}
}
}
//---------------------------------------------------------
void CWKSP_Layer_Legend::_Draw_Polygon(wxDC &dc, CWKSP_Shapes_Polygon *pLayer)
{
wxString Name;
wxPen Pen;
wxBrush Brush;
//-----------------------------------------------------
m_BoxStyle = BOXSTYLE_RECT;
m_Box_bFill = true;
//-----------------------------------------------------
pLayer->Get_Style(Pen, Brush, m_Box_bOutline, &Name);
dc.SetBrush(Brush);
dc.SetPen(Pen);
if( Name.Length() > 0 )
{
_Draw_Title(dc, FONT_SUBTITLE, Name);
}
//-----------------------------------------------------
_Draw_Boxes(dc, m_Position.y);
}
//---------------------------------------------------------
void CWKSP_Layer_Legend::_Draw_TIN(wxDC &dc, CWKSP_TIN *pLayer)
{
//-----------------------------------------------------
m_BoxStyle = BOXSTYLE_RECT;
m_Box_bFill = true;
m_Box_bOutline = true;
//-----------------------------------------------------
switch( m_pClassify->Get_Mode() )
{
default:
_Draw_Boxes(dc, m_Position.y);
break;
case CLASSIFY_METRIC:
case CLASSIFY_SHADE:
_Draw_Continuum(dc, m_Position.y, 1.0);
break;
}
}
//---------------------------------------------------------
void CWKSP_Layer_Legend::_Draw_Grid(wxDC &dc, CWKSP_Grid *pLayer)
{
//-----------------------------------------------------
m_BoxStyle = BOXSTYLE_RECT;
m_Box_bFill = true;
m_Box_bOutline = true;
//-----------------------------------------------------
switch( m_pClassify->Get_Mode() )
{
default:
_Draw_Boxes(dc, m_Position.y);
break;
case CLASSIFY_METRIC:
case CLASSIFY_SHADE:
if( pLayer->Get_Grid()->Get_Unit() && *(pLayer->Get_Grid()->Get_Unit()) )
{
_Draw_Title(dc, FONT_SUBTITLE, wxString::Format(wxT("[%s]"), pLayer->Get_Grid()->Get_Unit()));
}
_Draw_Continuum(dc, m_Position.y, pLayer->Get_Grid()->Get_ZFactor());
break;
case CLASSIFY_RGB:
_Draw_Box_Image(dc, m_Position.y, pLayer->Get_Grid());
break;
}
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
void CWKSP_Layer_Legend::_Draw_Boxes(wxDC &dc, int y)
{
for(int i=m_pClassify->Get_Class_Count()-1; i>=0; i--, y+=BOX_HEIGHT)
{
_Draw_Box (dc, y, BOX_HEIGHT, Get_Color_asWX(m_pClassify->Get_Class_Color(i)));
_Draw_Label (dc, y, m_pClassify->Get_Class_Name(i), TEXTALIGN_TOP);
}
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
void CWKSP_Layer_Legend::_Draw_Continuum(wxDC &dc, int y, double zFactor)
{
int i;
double zMin, zMax;
//-----------------------------------------------------
zMin = m_pClassify->Get_RelativeToMetric(0.0);
zMax = m_pClassify->Get_RelativeToMetric(1.0);
//-----------------------------------------------------
if( zMin >= zMax )
{
if( m_pLayer->Get_Value_Range() > 0.0 )
{
i = m_pClassify->Get_Class_Count() - 1;
_Draw_Box (dc, y, BOX_HEIGHT, Get_Color_asWX(m_pClassify->Get_Class_Color(i)));
_Draw_Label (dc, y, m_pClassify->Get_Class_Name(i), TEXTALIGN_TOP);
y += BOX_HEIGHT;
}
i = 0;
_Draw_Box (dc, y, BOX_HEIGHT, Get_Color_asWX(m_pClassify->Get_Class_Color(i)));
_Draw_Label (dc, y, m_pClassify->Get_Class_Name(i), TEXTALIGN_TOP);
}
//-----------------------------------------------------
else if( METRIC_HEIGHT > m_pClassify->Get_Class_Count() * BOX_HEIGHT )
{
_Draw_Boxes(dc, y);
}
//-----------------------------------------------------
else
{
int dyFont;
double yToDC, dz;
_Set_Font(dc, FONT_LABEL);
dc.GetTextExtent(wxString::Format(wxT("01234567")), &i, &dyFont);
zMin *= zFactor;
zMax *= zFactor;
yToDC = METRIC_HEIGHT / (zMax - zMin);
dz = pow(10.0, floor(log10(zMax - zMin)) - 1.0);
while( yToDC * dz < dyFont )
dz *= 2.0;
yToDC = METRIC_HEIGHT / (double)m_pClassify->Get_Class_Count();
if( m_bVertical )
{
_Draw_Continuum_V(dc, y, yToDC, zMin, zMax, zFactor, dz, dyFont);
}
else
{
_Draw_Continuum_H(dc, y, yToDC, zMin, zMax, zFactor, dz, dyFont);
}
}
}
//---------------------------------------------------------
void CWKSP_Layer_Legend::_Draw_Continuum_V(wxDC &dc, int y, double yToDC, double zMin, double zMax, double zFactor, double dz, int dyFont)
{
int i, iy, jy;
double z;
//-----------------------------------------------------
for(i=0, z=y+METRIC_HEIGHT; i<m_pClassify->Get_Class_Count(); i++, z-=yToDC)
{
Draw_FillRect(dc, Get_Color_asWX(m_pClassify->Get_Class_Color(i)), m_xBox, (int)(z), m_xTick, (int)(z - yToDC));
}
Draw_Edge(dc, EDGE_STYLE_SIMPLE, m_xBox, y, m_xTick, y + METRIC_HEIGHT);
//-----------------------------------------------------
switch( m_pClassify->Get_Metric_Mode() )
{
case METRIC_MODE_NORMAL: default:
z = dz * floor(zMin / dz);
if( z < zMin ) z += dz;
for(; z<=zMax; z+=dz)
{
iy = METRIC_POS_V(z);
dc.DrawLine(m_xTick, iy, m_xText, iy);
_Draw_Label(dc, iy, METRIC_GET_STRING(z, dz), TEXTALIGN_YCENTER);
}
break;
case METRIC_MODE_LOGUP:
jy = METRIC_POS_V(zMax) + (1 + dyFont);
z = dz * floor(zMax / dz);
if( z > zMax ) z -= dz;
for(; z>=zMin; z-=dz)
{
iy = METRIC_POS_V(z);
dc.DrawLine(m_xTick, iy, m_xText, iy);
if( abs(jy - iy) >= (int)(0.75 * dyFont) )
{
jy = iy;
_Draw_Label(dc, iy, METRIC_GET_STRING(z, dz), TEXTALIGN_YCENTER);
}
while( abs(iy - METRIC_POS_V(z - dz)) > 2 * dyFont )
dz *= 0.1;
}
break;
case METRIC_MODE_LOGDOWN:
jy = METRIC_POS_V(zMin) - (1 + dyFont);
z = dz * floor(zMin / dz);
if( z < zMin ) z += dz;
for(; z<=zMax; z+=dz)
{
iy = METRIC_POS_V(z);
dc.DrawLine(m_xTick, iy, m_xText, iy);
if( abs(jy - iy) >= (int)(0.75 * dyFont) )
{
jy = iy;
_Draw_Label(dc, iy, METRIC_GET_STRING(z, dz), TEXTALIGN_YCENTER);
}
while( abs(iy - METRIC_POS_V(z + dz)) > 2 * dyFont )
dz *= 0.1;
}
break;
}
//-----------------------------------------------------
_Set_Size(0, METRIC_HEIGHT + dc.GetFont().GetPointSize());
}
//---------------------------------------------------------
void CWKSP_Layer_Legend::_Draw_Continuum_H(wxDC &dc, int y, double yToDC, double zMin, double zMax, double zFactor, double dz, int dyFont)
{
int i, iy, jy, yTick, yText, sx, sy;
double z;
wxString s;
yTick = y + m_dxBox;
yText = y + m_dxBox + m_dxTick;
//-----------------------------------------------------
for(i=0, z=m_xBox; i<m_pClassify->Get_Class_Count(); i++, z+=yToDC)
{
Draw_FillRect(dc, Get_Color_asWX(m_pClassify->Get_Class_Color(i)), (int)(z), y, (int)(z + yToDC), yTick);
}
Draw_Edge(dc, EDGE_STYLE_SIMPLE, m_xBox, y, m_xBox + METRIC_HEIGHT, yTick);
//-----------------------------------------------------
switch( m_pClassify->Get_Metric_Mode() )
{
case METRIC_MODE_NORMAL: default:
jy = METRIC_POS_H(zMin) - METRIC_HEIGHT;
z = dz * floor(zMin / dz);
if( z < zMin ) z += dz;
for(; z<=zMax; z+=dz)
{
iy = METRIC_POS_H(z);
dc.DrawLine(iy, yTick, iy, yText);
s = METRIC_GET_STRING(z, dz);
dc.GetTextExtent(s, &sx, &sy);
if( abs(jy - iy) >= (int)(1.25 * sx) )
{
jy = iy;
Draw_Text(dc, TEXTALIGN_TOPCENTER, iy, yText, s);
}
}
break;
case METRIC_MODE_LOGUP:
jy = METRIC_POS_H(zMax) + METRIC_HEIGHT;
z = dz * floor(zMax / dz);
if( z > zMax ) z -= dz;
for(; z>=zMin; z-=dz)
{
iy = METRIC_POS_H(z);
dc.DrawLine(iy, yTick, iy, yText);
s = METRIC_GET_STRING(z, dz);
dc.GetTextExtent(s, &sx, &sy);
if( abs(jy - iy) >= (int)(1.25 * sx) )
{
jy = iy;
Draw_Text(dc, TEXTALIGN_TOPCENTER, iy, yText, s);
}
while( abs(iy - METRIC_POS_H(z - dz)) > 2 * sx )
dz *= 0.1;
}
break;
case METRIC_MODE_LOGDOWN:
jy = METRIC_POS_H(zMin) - METRIC_HEIGHT;
z = dz * floor(zMin / dz);
if( z < zMin ) z += dz;
for(; z<=zMax; z+=dz)
{
iy = METRIC_POS_H(z);
dc.DrawLine(iy, yTick, iy, yText);
s = METRIC_GET_STRING(z, dz);
dc.GetTextExtent(s, &sx, &sy);
if( abs(jy - iy) >= (int)(1.25 * sx) )
{
jy = iy;
Draw_Text(dc, TEXTALIGN_TOPCENTER, iy, yText, s);
}
while( abs(iy - METRIC_POS_H(z + dz)) > 2 * sx )
dz *= 0.1;
}
break;
}
//-----------------------------------------------------
_Set_Size(METRIC_HEIGHT, yText + dyFont);
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -