📄 module_library.cpp
字号:
///////////////////////////////////////////////////////////
// //
// SAGA //
// //
// System for Automated Geoscientific Analyses //
// //
// Command Line Interface //
// //
// Program: SAGA_CMD //
// //
//-------------------------------------------------------//
// //
// module_library.cpp //
// //
// Copyright (C) 2005 by Olaf Conrad //
// //
//-------------------------------------------------------//
// //
// This file is part of 'SAGA - System for Automated //
// Geoscientific Analyses'. SAGA is free software; you //
// can redistribute it and/or modify it under the terms //
// of the GNU General Public License as published by the //
// Free Software Foundation; version 2 of the License. //
// //
// SAGA is distributed in the hope that it will be //
// useful, but WITHOUT ANY WARRANTY; without even the //
// implied warranty of MERCHANTABILITY or FITNESS FOR A //
// PARTICULAR PURPOSE. See the GNU General Public //
// License for more details. //
// //
// You should have received a copy of the GNU General //
// Public License along with this program; if not, //
// write to the Free Software Foundation, Inc., //
// 59 Temple Place - Suite 330, Boston, MA 02111-1307, //
// USA. //
// //
//-------------------------------------------------------//
// //
// contact: Olaf Conrad //
// Institute of Geography //
// University of Goettingen //
// Goldschmidtstr. 5 //
// 37077 Goettingen //
// Germany //
// //
// e-mail: oconrad@saga-gis.org //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
#include <wx/cmdline.h>
#include <saga_api/saga_api.h>
#include "callback.h"
#include "module_library.h"
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
#define GET_ID1(p) (p->Get_Owner()->Get_Identifier() && *(p->Get_Owner()->Get_Identifier()) \
? wxString::Format(wxT("%s_%s"), p->Get_Owner()->Get_Identifier(), p->Get_Identifier()) \
: wxString::Format(p->Get_Identifier()))
#define GET_ID2(p, s) wxString::Format(wxT("%s_%s"), GET_ID1(p).c_str(), s)
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
CModule_Library::CModule_Library(void)
{
m_nModules = 0;
m_Modules = NULL;
m_pSelected = NULL;
m_pCMD = NULL;
}
//---------------------------------------------------------
CModule_Library::~CModule_Library(void)
{
Destroy();
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CModule_Library::Create(const SG_Char *FileName, const SG_Char *FilePath)
{
TSG_PFNC_MLB_Initialize MLB_Initialize;
TSG_PFNC_MLB_Get_Interface MLB_Get_Interface;
CSG_Module_Library_Interface *pInterface;
CSG_Module *pModule;
//-----------------------------------------------------
Destroy();
m_FileName = SG_File_Make_Path(FilePath, FileName, NULL).c_str();
m_Library.Load(m_FileName);
//-----------------------------------------------------
if( !m_Library.IsLoaded() )
{
Print_Error(LNG("[ERR] Library could not be loaded"), FileName);
}
else
{
MLB_Initialize = (TSG_PFNC_MLB_Initialize) m_Library.GetSymbol(SYMBOL_MLB_Initialize);
MLB_Get_Interface = (TSG_PFNC_MLB_Get_Interface) m_Library.GetSymbol(SYMBOL_MLB_Get_Interface);
if( !MLB_Get_Interface || !(pInterface = MLB_Get_Interface())
|| !MLB_Initialize || !MLB_Initialize(m_FileName) )
{
Print_Error(LNG("[ERR] Invalid library"), FileName);
}
else
{
while( (pModule = pInterface->Get_Module(m_nModules)) != NULL )
{
m_Modules = (CSG_Module **)SG_Realloc(m_Modules, (m_nModules + 1) * sizeof(CSG_Module *));
m_Modules[m_nModules++] = pModule;
}
if( m_nModules > 0 )
{
return( true );
}
Print_Error(LNG("[ERR] Library does not contain any modules"), FileName);
}
}
return( false );
}
//---------------------------------------------------------
void CModule_Library::Destroy(void)
{
if( m_nModules > 0 )
{
SG_Free(m_Modules);
m_nModules = 0;
m_Modules = NULL;
m_pSelected = NULL;
}
if( m_pCMD )
{
delete(m_pCMD);
m_pCMD = NULL;
}
if( m_Library.IsLoaded() )
{
m_Library.Unload();
}
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
CSG_Module * CModule_Library::Select(const SG_Char *ModuleName)
{
int i;
wxString Description;
//-----------------------------------------------------
if( m_pCMD )
{
delete(m_pCMD);
m_pCMD = NULL;
}
for(i=0, m_pSelected=NULL; i<m_nModules && !m_pSelected; i++)
{
if( !SG_STR_CMP(ModuleName, Get_Module(i)->Get_Name()) )
{
m_pSelected = Get_Module(i);
}
}
if( !m_pSelected )
{
long l;
wxString s(ModuleName);
if( s.ToLong(&l) )
{
m_pSelected = Get_Module((int)l);
}
}
//-----------------------------------------------------
if( m_pSelected )
{
m_pCMD = new wxCmdLineParser;
_Set_CMD(m_pSelected->Get_Parameters(), false);
for(i=0; i<m_pSelected->Get_Parameters_Count(); i++)
{
_Set_CMD(m_pSelected->Get_Parameters(i), true);
}
}
return( m_pSelected );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CModule_Library::Execute(int argc, char *argv[])
{
bool bResult = false;
if( m_pSelected && m_pCMD )
{
m_pCMD->SetCmdLine(argc, argv);
if( _Get_CMD(m_pSelected->Get_Parameters()) )
{
bResult = m_pSelected->Execute();
_Destroy_DataObjects(bResult);
}
}
if( !bResult )
{
Print_Error(LNG("executing module"), m_pSelected->Get_Name());
}
return( bResult );
}
//---------------------------------------------------------
bool CModule_Library::Get_Parameters(CSG_Parameters *pParameters)
{
return( _Get_CMD(pParameters) );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
void CModule_Library::_Set_CMD(CSG_Parameters *pParameters, bool bExtra)
{
CSG_Parameter *pParameter;
wxString Description;
//-----------------------------------------------------
if( m_pCMD && pParameters )
{
m_pCMD->SetSwitchChars(SG_T("-"));
for(int i=0; i<pParameters->Get_Count(); i++)
{
pParameter = pParameters->Get_Parameter(i);
Description = pParameter->Get_Description(
PARAMETER_DESCRIPTION_NAME|PARAMETER_DESCRIPTION_TYPE|PARAMETER_DESCRIPTION_PROPERTIES, SG_T("\n\t")
).c_str();
if( pParameter->is_Input() || pParameter->is_Output() )
{
m_pCMD->AddOption(
GET_ID1(pParameter), wxEmptyString, Description,
wxCMD_LINE_VAL_STRING,
wxCMD_LINE_NEEDS_SEPARATOR | (pParameter->is_Optional() || bExtra ? wxCMD_LINE_PARAM_OPTIONAL : wxCMD_LINE_OPTION_MANDATORY)
);
}
else if( pParameter->is_Option() && !pParameter->is_Information() )
{
switch( pParameter->Get_Type() )
{
default:
break;
case PARAMETER_TYPE_Bool:
m_pCMD->AddSwitch(GET_ID1(pParameter), wxEmptyString, Description, wxCMD_LINE_PARAM_OPTIONAL);
break;
case PARAMETER_TYPE_Int:
case PARAMETER_TYPE_Choice:
case PARAMETER_TYPE_Table_Field:
m_pCMD->AddOption(GET_ID1(pParameter), wxEmptyString, Description, wxCMD_LINE_VAL_NUMBER, wxCMD_LINE_PARAM_OPTIONAL);
break;
case PARAMETER_TYPE_Double:
case PARAMETER_TYPE_Degree:
m_pCMD->AddOption(GET_ID1(pParameter), wxEmptyString, Description, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
break;
case PARAMETER_TYPE_Range:
m_pCMD->AddOption(GET_ID2(pParameter, "MIN"), wxEmptyString, Description, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
m_pCMD->AddOption(GET_ID2(pParameter, "MAX"), wxEmptyString, Description, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
break;
case PARAMETER_TYPE_String:
case PARAMETER_TYPE_Text:
case PARAMETER_TYPE_FilePath:
m_pCMD->AddOption(GET_ID1(pParameter), wxEmptyString, Description, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
break;
case PARAMETER_TYPE_FixedTable:
m_pCMD->AddOption(GET_ID1(pParameter), wxEmptyString, Description, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
break;
case PARAMETER_TYPE_Grid_System:
if( pParameter->Get_Children_Count() == 0 )
{
m_pCMD->AddOption(GET_ID2(pParameter, "NX"), wxEmptyString, Description, wxCMD_LINE_VAL_NUMBER, wxCMD_LINE_PARAM_OPTIONAL);
m_pCMD->AddOption(GET_ID2(pParameter, "NY"), wxEmptyString, Description, wxCMD_LINE_VAL_NUMBER, wxCMD_LINE_PARAM_OPTIONAL);
m_pCMD->AddOption(GET_ID2(pParameter, "X"), wxEmptyString, Description, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
m_pCMD->AddOption(GET_ID2(pParameter, "Y"), wxEmptyString, Description, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
m_pCMD->AddOption(GET_ID2(pParameter, "D"), wxEmptyString, Description, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
}
break;
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -