📄 wksp_grid.cpp
字号:
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CWKSP_Grid::asImage(CSG_Grid *pImage)
{
int x, y;
wxBitmap BMP;
if( pImage && Get_Image_Grid(BMP) )
{
wxImage IMG(BMP.ConvertToImage());
pImage->Create(m_pGrid, GRID_TYPE_Int);
for(y=0; y<pImage->Get_NY() && PROGRESSBAR_Set_Position(y, pImage->Get_NY()); y++)
{
for(x=0; x<pImage->Get_NX(); x++)
{
pImage->Set_Value(x, y, SG_GET_RGB(IMG.GetRed(x, y), IMG.GetGreen(x, y), IMG.GetBlue(x, y)));
}
}
return( true );
}
return( false );
}
//---------------------------------------------------------
void CWKSP_Grid::_Save_Image(void)
{
int type;
wxString file;
wxBitmap BMP;
CSG_File Stream;
CSG_Parameters Parms;
//-----------------------------------------------------
Parms.Set_Name(LNG("[CAP] Save Grid as Image..."));
Parms.Add_Value(
NULL , "WORLD" , LNG("Save Georeference"),
wxT(""),
PARAMETER_TYPE_Bool, 1
);
Parms.Add_Value(
NULL , "LG" , LNG("Legend: Save"),
wxT(""),
PARAMETER_TYPE_Bool, 1
);
Parms.Add_Value(
NULL , "LZ" , LNG("Legend: Zoom"),
wxT(""),
PARAMETER_TYPE_Double, 1.0, 0, true
);
//-----------------------------------------------------
if( DLG_Image_Save(file, type) && DLG_Parameters(&Parms) )
{
if( Get_Image_Grid(BMP) )
{
BMP.SaveFile(file, (wxBitmapType)type);
}
if( Parms("LG")->asBool() && Get_Image_Legend(BMP, Parms("LZ")->asDouble()) )
{
wxFileName fn(file);
fn.SetName(wxString::Format(wxT("%s_legend"), fn.GetName().c_str()));
BMP.SaveFile(fn.GetFullPath(), (wxBitmapType)type);
}
if( Parms("WORLD")->asBool() )
{
wxFileName fn(file);
fn.SetExt(wxT("world"));
if( Stream.Open(fn.GetFullPath().c_str(), SG_FILE_W, false) )
{
Stream.Printf(wxT("%.10f\n%.10f\n%.10f\n%.10f\n%.10f\n%.10f\n"),
m_pGrid->Get_Cellsize(),
0.0, 0.0,
-m_pGrid->Get_Cellsize(),
m_pGrid->Get_XMin(),
m_pGrid->Get_YMax()
);
}
}
}
}
//---------------------------------------------------------
bool CWKSP_Grid::Get_Image_Grid(wxBitmap &BMP, bool bFitSize)
{
if( bFitSize || (BMP.GetWidth() > 0 && BMP.GetHeight() > 0) )
{
Set_Buisy_Cursor(true);
if( bFitSize )
{
BMP.Create(m_pGrid->Get_NX(), m_pGrid->Get_NY());
}
wxMemoryDC dc;
wxRect r(0, 0, BMP.GetWidth(), BMP.GetHeight());
CWKSP_Map_DC dc_Map(Get_Extent(), r, 1.0, SG_GET_RGB(255, 255, 255));
On_Draw(dc_Map, false);
dc.SelectObject(BMP);
dc.SetBackground(*wxWHITE_BRUSH);
dc.Clear();
dc_Map.Draw(dc);
dc.SelectObject(wxNullBitmap);
Set_Buisy_Cursor(false);
return( true );
}
return( false );
}
//---------------------------------------------------------
bool CWKSP_Grid::Get_Image_Legend(wxBitmap &BMP, double Zoom)
{
if( Zoom > 0.0 )
{
wxMemoryDC dc;
wxSize s(Get_Legend()->Get_Size(1.0, Zoom));
BMP.Create(s.GetWidth(), s.GetHeight());
dc.SelectObject(BMP);
dc.SetBackground(*wxWHITE_BRUSH);
dc.Clear();
Get_Legend()->Draw(dc, 1.0, Zoom, wxPoint(0, 0));
dc.SelectObject(wxNullBitmap);
return( true );
}
return( false );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
void CWKSP_Grid::On_Draw(CWKSP_Map_DC &dc_Map, bool bEdit)
{
int Interpolation;
double Transparency;
if( Get_Extent().Intersects(dc_Map.m_rWorld) != INTERSECTION_None )
{
switch( m_pClassify->Get_Mode() )
{
default: Transparency = m_Parameters("DISPLAY_TRANSPARENCY")->asDouble() / 100.0; break;
case CLASSIFY_SHADE: Transparency = 2.0; break;
case CLASSIFY_RGB: Transparency = m_Parameters("DISPLAY_TRANSPARENCY")->asDouble() / 100.0; if( Transparency <= 0.0 ) Transparency = 3.0; break;
}
if( dc_Map.IMG_Draw_Begin(Transparency) )
{
Interpolation = m_pClassify->Get_Mode() == CLASSIFY_LUT
? GRID_INTERPOLATION_NearestNeighbour
: m_Parameters("DISPLAY_INTERPOLATION")->asInt();
if( dc_Map.m_DC2World >= m_pGrid->Get_Cellsize()
|| Interpolation != GRID_INTERPOLATION_NearestNeighbour )
{
_Draw_Grid_Points (dc_Map, Interpolation);
}
else
{
_Draw_Grid_Cells (dc_Map);
}
dc_Map.IMG_Draw_End();
_Draw_Values(dc_Map);
if( bEdit )
{
_Draw_Edit(dc_Map);
}
}
}
}
//---------------------------------------------------------
void CWKSP_Grid::_Draw_Grid_Points(CWKSP_Map_DC &dc_Map, int Interpolation)
{
bool bByteWise = m_pClassify->Get_Mode() == CLASSIFY_RGB;
int xDC, yDC, axDC, ayDC, bxDC, byDC, Color;
double x, y, z;
CSG_Rect rGrid(m_pGrid->Get_Extent());
rGrid.Inflate(m_pGrid->Get_Cellsize() / 2.0, false);
rGrid.Intersect(dc_Map.m_rWorld);
axDC = (int)dc_Map.xWorld2DC(rGrid.Get_XMin()); if( axDC < 0 ) axDC = 0;
bxDC = (int)dc_Map.xWorld2DC(rGrid.Get_XMax()); if( bxDC > dc_Map.m_rDC.GetWidth() ) bxDC = dc_Map.m_rDC.GetWidth();
ayDC = (int)dc_Map.yWorld2DC(rGrid.Get_YMin()); if( ayDC > dc_Map.m_rDC.GetHeight() ) ayDC = dc_Map.m_rDC.GetHeight();
byDC = (int)dc_Map.yWorld2DC(rGrid.Get_YMax()); if( byDC < 0 ) byDC = 0;
for(y=rGrid.Get_YMin(), yDC=ayDC-1; yDC>=byDC; y+=dc_Map.m_DC2World, yDC--)
{
for(x=rGrid.Get_XMin(), xDC=axDC; xDC<bxDC; x+=dc_Map.m_DC2World, xDC++)
{
if( m_pGrid->Get_Value(x, y, z, Interpolation, false, bByteWise) && m_pClassify->Get_Class_Color_byValue(z, Color) )
{
dc_Map.IMG_Set_Pixel(xDC, yDC, Color);
}
}
}
}
//---------------------------------------------------------
void CWKSP_Grid::_Draw_Grid_Cells(CWKSP_Map_DC &dc_Map)
{
int x, y, xa, ya, xb, yb, xaDC, yaDC, xbDC, ybDC, Color;
double xDC, yDC, axDC, ayDC, dDC;
//-----------------------------------------------------
dDC = m_pGrid->Get_Cellsize() * dc_Map.m_World2DC;
xa = m_pGrid->Get_System().Get_xWorld_to_Grid(dc_Map.m_rWorld.Get_XMin());
ya = m_pGrid->Get_System().Get_yWorld_to_Grid(dc_Map.m_rWorld.Get_YMin());
xb = m_pGrid->Get_System().Get_xWorld_to_Grid(dc_Map.m_rWorld.Get_XMax());
yb = m_pGrid->Get_System().Get_yWorld_to_Grid(dc_Map.m_rWorld.Get_YMax());
if( xa < 0 ) xa = 0; if( xb >= m_pGrid->Get_NX() ) xb = m_pGrid->Get_NX() - 1;
if( ya < 0 ) ya = 0; if( yb >= m_pGrid->Get_NY() ) yb = m_pGrid->Get_NY() - 1;
axDC = dc_Map.xWorld2DC(m_pGrid->Get_System().Get_xGrid_to_World(xa)) + dDC / 2.0;
ayDC = dc_Map.yWorld2DC(m_pGrid->Get_System().Get_yGrid_to_World(ya)) - dDC / 2.0;
//-----------------------------------------------------
for(y=ya, yDC=ayDC, yaDC=(int)(ayDC), ybDC=(int)(ayDC+dDC); y<=yb; y++, ybDC=yaDC, yaDC=(int)(yDC-=dDC))
{
for(x=xa, xDC=axDC, xaDC=(int)(axDC-dDC), xbDC=(int)(axDC); x<=xb; x++, xaDC=xbDC, xbDC=(int)(xDC+=dDC))
{
if( m_pGrid->is_InGrid(x, y) && m_pClassify->Get_Class_Color_byValue(m_pGrid->asDouble(x, y), Color) )
{
dc_Map.IMG_Set_Rect(xaDC, yaDC, xbDC, ybDC, Color);
}
}
}
}
//---------------------------------------------------------
void CWKSP_Grid::_Draw_Values(CWKSP_Map_DC &dc_Map)
{
int x, y, xa, ya, xb, yb, Decimals;
double xDC, yDC, axDC, ayDC, dDC, zFactor, Value;
wxString s;
wxFont Font;
//-----------------------------------------------------
if( m_Parameters("VALUES_SHOW")->asBool() && (dDC = m_pGrid->Get_Cellsize() * dc_Map.m_World2DC) > 40 )
{
zFactor = m_pGrid->Get_ZFactor();
Decimals = m_Parameters("VALUES_DECIMALS") ->asInt();
xDC = m_Parameters("VALUES_SIZE") ->asDouble() / 100.0;
x = m_Parameters("VALUES_FONT") ->asColor();
Font = *m_Parameters("VALUES_FONT") ->asFont();
Font.SetPointSize((int)(xDC * dDC));
dc_Map.dc.SetFont(Font);
dc_Map.dc.SetTextForeground(Get_Color_asWX(x));
x = m_Parameters("VALUES_FONT") ->asInt();
dc_Map.dc.SetTextForeground(wxColour(SG_GET_R(x), SG_GET_G(x), SG_GET_B(x)));
//-------------------------------------------------
xa = m_pGrid->Get_System().Get_xWorld_to_Grid(dc_Map.m_rWorld.Get_XMin());
ya = m_pGrid->Get_System().Get_yWorld_to_Grid(dc_Map.m_rWorld.Get_YMin());
xb = m_pGrid->Get_System().Get_xWorld_to_Grid(dc_Map.m_rWorld.Get_XMax());
yb = m_pGrid->Get_System().Get_yWorld_to_Grid(dc_Map.m_rWorld.Get_YMax());
if( xa < 0 ) xa = 0; if( xb >= m_pGrid->Get_NX() ) xb = m_pGrid->Get_NX() - 1;
if( ya < 0 ) ya = 0; if( yb >= m_pGrid->Get_NY() ) yb = m_pGrid->Get_NY() - 1;
axDC = dc_Map.xWorld2DC(m_pGrid->Get_System().Get_xGrid_to_World(xa));
ayDC = dc_Map.yWorld2DC(m_pGrid->Get_System().Get_yGrid_to_World(ya));
//-------------------------------------------------
for(y=ya, yDC=ayDC; y<=yb; y++, yDC-=dDC)
{
for(x=xa, xDC=axDC; x<=xb; x++, xDC+=dDC)
{
if( m_pGrid->is_InGrid(x, y) )
{
Value = m_pGrid->asDouble(x, y);
switch( m_pClassify->Get_Mode() )
{
case CLASSIFY_RGB:
s.Printf(wxT("R%03d G%03d B%03d"), SG_GET_R((int)Value), SG_GET_G((int)Value), SG_GET_B((int)Value));
break;
default:
s.Printf(wxT("%.*f"), Decimals, zFactor * Value);
break;
}
Draw_Text(dc_Map.dc, TEXTALIGN_CENTER, (int)xDC, (int)yDC, s);
}
}
}
}
}
//---------------------------------------------------------
void CWKSP_Grid::_Draw_Edit(CWKSP_Map_DC &dc_Map)
{
if( m_Sel_xN >= 0 )
{
CSG_Rect r(
-m_pGrid->Get_Cellsize() / 2.0 + m_pGrid->Get_System().Get_xGrid_to_World(m_Sel_xOff),
-m_pGrid->Get_Cellsize() / 2.0 + m_pGrid->Get_System().Get_yGrid_to_World(m_Sel_yOff),
-m_pGrid->Get_Cellsize() / 2.0 + m_pGrid->Get_System().Get_xGrid_to_World(m_Sel_xOff + m_Sel_xN),
-m_pGrid->Get_Cellsize() / 2.0 + m_pGrid->Get_System().Get_yGrid_to_World(m_Sel_yOff + m_Sel_yN)
);
TSG_Point_Int a(dc_Map.World2DC(r.Get_TopLeft())),
b(dc_Map.World2DC(r.Get_BottomRight()));
a.x -= 1;
b.x -= 1;
a.y -= 1;
b.y -= 1;
dc_Map.dc.SetPen(wxPen(wxColour(255, 0, 0), 2, wxSOLID));
dc_Map.dc.DrawLine(a.x, a.y, a.x, b.y);
dc_Map.dc.DrawLine(a.x, b.y, b.x, b.y);
dc_Map.dc.DrawLine(b.x, b.y, b.x, a.y);
dc_Map.dc.DrawLine(a.x, a.y, b.x, a.y);
}
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -