📄 wksp_grid.cpp
字号:
m_Parameters.Add_Node(
NULL , "NODE_VALUES" , LNG("[CAP] Display: Cell Values"),
LNG("")
);
m_Parameters.Add_Value(
m_Parameters("NODE_VALUES") , "VALUES_SHOW" , LNG("[CAP] Show"),
LNG(""),
PARAMETER_TYPE_Bool, true
);
m_Parameters.Add_Font(
m_Parameters("NODE_VALUES") , "VALUES_FONT" , LNG("[CAP] Font"),
LNG("")
)->asFont()->SetFamily(wxDECORATIVE);
m_Parameters.Add_Value(
m_Parameters("NODE_VALUES") , "VALUES_SIZE" , LNG("[CAP] Size"),
LNG(""),
PARAMETER_TYPE_Double, 15, 0, true , 100.0, true
);
m_Parameters.Add_Value(
m_Parameters("NODE_VALUES") , "VALUES_DECIMALS" , LNG("[CAP] Decimals"),
LNG(""),
PARAMETER_TYPE_Int, 2
);
//-----------------------------------------------------
CSG_Parameters Parameters;
Parameters.Add_Range(NULL, "METRIC_ZRANGE" , LNG(""), LNG(""), m_pGrid->Get_ZMin(true), m_pGrid->Get_ZMax(true));
PROCESS_Set_Okay(true);
DataObject_Changed(&Parameters);
}
//---------------------------------------------------------
void CWKSP_Grid::On_DataObject_Changed(void)
{
//-----------------------------------------------------
m_Parameters("GENERAL_Z_UNIT") ->Set_Value((void *)m_pGrid->Get_Unit());
m_Parameters("GENERAL_Z_FACTOR") ->Set_Value(m_pGrid->Get_ZFactor());
m_Parameters("GENERAL_Z_NODATA")->asRange()->Set_Range(
m_pGrid->Get_NoData_Value(),
m_pGrid->Get_NoData_hiValue()
);
//-----------------------------------------------------
m_Parameters("MEMORY_MODE") ->Set_Value(
m_pGrid->is_Compressed() ? 1 : (m_pGrid->is_Cached() ? 2 : 0)
);
m_Parameters("MEMORY_BUFFER_SIZE") ->Set_Value(
(double)m_pGrid->Get_Buffer_Size() / N_MEGABYTE_BYTES
);
}
//---------------------------------------------------------
void CWKSP_Grid::On_Parameters_Changed(void)
{
//-----------------------------------------------------
m_pGrid->Set_Unit (m_Parameters("GENERAL_Z_UNIT") ->asString());
m_pGrid->Set_ZFactor (m_Parameters("GENERAL_Z_FACTOR") ->asDouble());
m_pGrid->Set_NoData_Value_Range(
m_Parameters("GENERAL_Z_NODATA")->asRange()->Get_LoVal(),
m_Parameters("GENERAL_Z_NODATA")->asRange()->Get_HiVal()
);
//-----------------------------------------------------
switch( m_Parameters("MEMORY_MODE")->asInt() )
{
case 0:
if( m_pGrid->is_Compressed() )
{
m_pGrid->Set_Compression(false);
}
else if( m_pGrid->is_Cached() )
{
m_pGrid->Set_Cache(false);
}
break;
case 1:
if( !m_pGrid->is_Compressed() )
{
m_pGrid->Set_Compression(true);
}
break;
case 2:
if( !m_pGrid->is_Cached() )
{
m_pGrid->Set_Cache(true);
}
break;
}
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
wxString CWKSP_Grid::Get_Value(CSG_Point ptWorld, double Epsilon)
{
double Value;
wxString s;
if( m_pGrid->Get_Value(ptWorld, Value, GRID_INTERPOLATION_NearestNeighbour, true) )
{
switch( m_pClassify->Get_Mode() )
{
case CLASSIFY_LUT:
s = m_pClassify->Get_Class_Name_byValue(Value);
break;
case CLASSIFY_METRIC: default:
case CLASSIFY_SHADE:
switch( m_pGrid->Get_Type() )
{
case GRID_TYPE_Byte: default:
case GRID_TYPE_Char:
case GRID_TYPE_Word:
case GRID_TYPE_Short:
case GRID_TYPE_DWord:
case GRID_TYPE_Int:
s.Printf(wxT("%d%s"), (int)Value, m_pGrid->Get_Unit());
break;
case GRID_TYPE_Float:
case GRID_TYPE_Double:
s.Printf(wxT("%f%s"), Value, m_pGrid->Get_Unit());
break;
}
break;
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;
}
}
return( s );
}
//---------------------------------------------------------
double CWKSP_Grid::Get_Value_Range(void)
{
return( m_pGrid->Get_ZRange() );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CWKSP_Grid::On_Edit_On_Key_Down(int KeyCode)
{
switch( KeyCode )
{
default:
return( false );
case WXK_DELETE:
return( _Edit_Del_Selection() );
}
}
//---------------------------------------------------------
#define SELECTION_MAX 20
//---------------------------------------------------------
bool CWKSP_Grid::On_Edit_On_Mouse_Up(CSG_Point Point, double ClientToWorld, int Key)
{
int x, y;
CSG_Table_Record *pRecord;
CSG_Rect rWorld(m_Edit_Mouse_Down, Point);
m_Sel_xOff = m_pGrid->Get_System().Get_xWorld_to_Grid(rWorld.Get_XMin());
if( m_Sel_xOff < 0 )
m_Sel_xOff = 0;
m_Sel_xN = m_pGrid->Get_System().Get_xWorld_to_Grid(rWorld.Get_XMax());
if( m_Sel_xN >= m_pGrid->Get_NX() )
m_Sel_xN = m_pGrid->Get_NX() - 1;
m_Sel_xN = 1 + m_Sel_xN - m_Sel_xOff;
m_Sel_yOff = m_pGrid->Get_System().Get_yWorld_to_Grid(rWorld.Get_YMin());
if( m_Sel_yOff < 0 )
m_Sel_yOff = 0;
m_Sel_yN = m_pGrid->Get_System().Get_yWorld_to_Grid(rWorld.Get_YMax());
if( m_Sel_yN >= m_pGrid->Get_NY() )
m_Sel_yN = m_pGrid->Get_NY() - 1;
m_Sel_yN = 1 + m_Sel_yN - m_Sel_yOff;
m_Edit_Attributes.Destroy();
if( m_Sel_xN < 1 || m_Sel_yN < 1 )
{
m_Sel_xN = -1;
}
else
{
if( m_Sel_xN > SELECTION_MAX )
{
m_Sel_xOff += (m_Sel_xN - SELECTION_MAX) / 2;
m_Sel_xN = SELECTION_MAX;
}
if( m_Sel_yN > SELECTION_MAX )
{
m_Sel_yOff += (m_Sel_yN - SELECTION_MAX) / 2;
m_Sel_yN = SELECTION_MAX;
}
for(x=0; x<m_Sel_xN; x++)
{
m_Edit_Attributes.Add_Field(wxString::Format(wxT("%d"), x + 1), TABLE_FIELDTYPE_Double);
}
for(y=0; y<m_Sel_yN; y++)
{
pRecord = m_Edit_Attributes.Add_Record();
for(x=0; x<m_Sel_xN; x++)
{
pRecord->Set_Value(x, m_pGrid->asDouble(m_Sel_xOff + x, m_Sel_yOff + m_Sel_yN - 1 - y, false));
}
}
}
g_pACTIVE->Get_Attributes()->Set_Attributes();
Update_Views(true);
return( true );
}
//---------------------------------------------------------
bool CWKSP_Grid::On_Edit_Set_Attributes(void)
{
int x, y;
CSG_Table_Record *pRecord;
if( m_Sel_xN >= 0 )
{
for(y=0; y<m_Sel_yN; y++)
{
pRecord = m_Edit_Attributes.Get_Record(y);
for(x=0; x<m_Sel_xN; x++)
{
m_pGrid->Set_Value(m_Sel_xOff + x, m_Sel_yOff + m_Sel_yN - 1 - y, pRecord->asDouble(x));
}
}
Update_Views(true);
return( true );
}
return( false );
}
//---------------------------------------------------------
TSG_Rect CWKSP_Grid::On_Edit_Get_Extent(void)
{
if( m_Sel_xN >= 0 )
{
return( CSG_Rect(
-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))
);
}
return( m_pGrid->Get_Extent().m_rect );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CWKSP_Grid::_Edit_Del_Selection(void)
{
int x, y;
if( m_Sel_xN >= 0 && DLG_Message_Confirm(LNG("[DLG] Set selected values to no data."), LNG("[CAP] Delete")) )
{
for(y=m_Sel_yOff; y<m_Sel_yOff + m_Sel_yN; y++)
{
for(x=m_Sel_xOff; x<m_Sel_xOff + m_Sel_xN; x++)
{
m_pGrid->Set_NoData(x, y);
}
}
Update_Views(false);
return( true );
}
return( false );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CWKSP_Grid::Fit_Color_Range(CSG_Rect rWorld)
{
int x, y, xMin, yMin, xMax, yMax;
double z, zMin, zMax;
if( rWorld.Intersect(Get_Extent()) )
{
xMin = m_pGrid->Get_System().Get_xWorld_to_Grid(rWorld.Get_XMin());
yMin = m_pGrid->Get_System().Get_yWorld_to_Grid(rWorld.Get_YMin());
xMax = m_pGrid->Get_System().Get_xWorld_to_Grid(rWorld.Get_XMax());
yMax = m_pGrid->Get_System().Get_yWorld_to_Grid(rWorld.Get_YMax());
zMin = 1.0;
zMax = 0.0;
for(y=yMin; y<=yMax; y++)
{
for(x=xMin; x<=xMax; x++)
{
if( m_pGrid->is_InGrid(x, y) )
{
z = m_pGrid->asDouble(x, y);
if( zMin > zMax )
{
zMin = zMax = z;
}
else if( z < zMin )
{
zMin = z;
}
else if( z > zMax )
{
zMax = z;
}
}
}
}
return( Set_Color_Range(zMin, zMax) );
}
return( false );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -