SAGA API  v9.5
api_core.cpp
Go to the documentation of this file.
1 
3 // //
4 // SAGA //
5 // //
6 // System for Automated Geoscientific Analyses //
7 // //
8 // Application Programming Interface //
9 // //
10 // Library: SAGA_API //
11 // //
12 //-------------------------------------------------------//
13 // //
14 // api_core.cpp //
15 // //
16 // Copyright (C) 2005 by Olaf Conrad //
17 // //
18 //-------------------------------------------------------//
19 // //
20 // This file is part of 'SAGA - System for Automated //
21 // Geoscientific Analyses'. //
22 // //
23 // This library is free software; you can redistribute //
24 // it and/or modify it under the terms of the GNU Lesser //
25 // General Public License as published by the Free //
26 // Software Foundation, either version 2.1 of the //
27 // License, or (at your option) any later version. //
28 // //
29 // This library is distributed in the hope that it will //
30 // be useful, but WITHOUT ANY WARRANTY; without even the //
31 // implied warranty of MERCHANTABILITY or FITNESS FOR A //
32 // PARTICULAR PURPOSE. See the GNU Lesser General Public //
33 // License for more details. //
34 // //
35 // You should have received a copy of the GNU Lesser //
36 // General Public License along with this program; if //
37 // not, see <http://www.gnu.org/licenses/>. //
38 // //
39 //-------------------------------------------------------//
40 // //
41 // contact: Olaf Conrad //
42 // Institute of Geography //
43 // University of Hamburg //
44 // Germany //
45 // //
46 // e-mail: oconrad@saga-gis.org //
47 // //
49 
50 //---------------------------------------------------------
51 #include <wx/utils.h>
52 #include <wx/app.h>
53 #include <wx/dir.h>
54 
55 #include "api_core.h"
56 #include "tool_library.h"
57 
58 
60 // //
61 // //
62 // //
64 
65 //---------------------------------------------------------
66 #ifdef _OPENMP
67 
68 #include <omp.h>
69 
70 //---------------------------------------------------------
71 int g_SG_OMP_Max_Num_Threads = omp_get_num_procs();
72 
73 //---------------------------------------------------------
74 void SG_OMP_Set_Max_Num_Threads (int iCores)
75 {
76  if( iCores < 1 )
77  {
78  iCores = 1;
79  }
80  else if( iCores > omp_get_num_procs() )
81  {
82  iCores = omp_get_num_procs();
83  }
84 
85  omp_set_num_threads(g_SG_OMP_Max_Num_Threads = iCores);
86 }
87 
88 //---------------------------------------------------------
90 {
91  return( g_SG_OMP_Max_Num_Threads );
92 }
93 
94 //---------------------------------------------------------
95 int SG_OMP_Get_Max_Num_Procs (void)
96 {
97  return( omp_get_num_procs() );
98 }
99 
100 //---------------------------------------------------------
101 int SG_OMP_Get_Thread_Num (void)
102 {
103  return( omp_get_thread_num() );
104 }
105 
106 //---------------------------------------------------------
107 #else
108 void SG_OMP_Set_Max_Num_Threads (int iCores) {}
109 int SG_OMP_Get_Max_Num_Threads (void) { return( 1 ); }
110 int SG_OMP_Get_Max_Num_Procs (void) { return( 1 ); }
111 int SG_OMP_Get_Thread_Num (void) { return( 0 ); }
112 #endif
113 
114 
116 // //
117 // //
118 // //
120 
121 //---------------------------------------------------------
123 {
124  switch( Type )
125  {
126  case SG_DATATYPE_Bit : return( _TL("bit" ) );
127  case SG_DATATYPE_Byte : return( bShort ? _TL("uint8" ) : _TL("unsigned 1 byte integer" ) );
128  case SG_DATATYPE_Char : return( bShort ? _TL("int8" ) : _TL("signed 1 byte integer" ) );
129  case SG_DATATYPE_Word : return( bShort ? _TL("uint16") : _TL("unsigned 2 byte integer" ) );
130  case SG_DATATYPE_Short : return( bShort ? _TL("int16" ) : _TL("signed 2 byte integer" ) );
131  case SG_DATATYPE_DWord : return( bShort ? _TL("uint32") : _TL("unsigned 4 byte integer" ) );
132  case SG_DATATYPE_Int : return( bShort ? _TL("int32" ) : _TL("signed 4 byte integer" ) );
133  case SG_DATATYPE_ULong : return( bShort ? _TL("uint64") : _TL("unsigned 8 byte integer" ) );
134  case SG_DATATYPE_Long : return( bShort ? _TL("int64" ) : _TL("signed 8 byte integer" ) );
135  case SG_DATATYPE_Float : return( bShort ? _TL("float" ) : _TL("4 byte floating point number") );
136  case SG_DATATYPE_Double: return( bShort ? _TL("double") : _TL("8 byte floating point number") );
137  case SG_DATATYPE_String: return( _TL("string") );
138  case SG_DATATYPE_Date : return( _TL("date" ) );
139  case SG_DATATYPE_Color : return( _TL("color" ) );
140  case SG_DATATYPE_Binary: return( _TL("binary") );
141  default : return( bShort ? _TL("none" ) : _TL("undefined" ) );
142  }
143 };
144 
145 //---------------------------------------------------------
147 {
148  return( gSG_Data_Type_Identifier[Type] );
149 }
150 
151 //---------------------------------------------------------
153 {
154  if( !Identifier.Cmp(gSG_Data_Type_Identifier[SG_DATATYPE_Bit ]) ) return( SG_DATATYPE_Bit );
155  if( !Identifier.Cmp(gSG_Data_Type_Identifier[SG_DATATYPE_Byte ]) ) return( SG_DATATYPE_Byte );
156  if( !Identifier.Cmp(gSG_Data_Type_Identifier[SG_DATATYPE_Char ]) ) return( SG_DATATYPE_Char );
157  if( !Identifier.Cmp(gSG_Data_Type_Identifier[SG_DATATYPE_Word ]) ) return( SG_DATATYPE_Word );
158  if( !Identifier.Cmp(gSG_Data_Type_Identifier[SG_DATATYPE_Short ]) ) return( SG_DATATYPE_Short );
159  if( !Identifier.Cmp(gSG_Data_Type_Identifier[SG_DATATYPE_DWord ]) ) return( SG_DATATYPE_DWord );
160  if( !Identifier.Cmp(gSG_Data_Type_Identifier[SG_DATATYPE_Int ]) ) return( SG_DATATYPE_Int );
161  if( !Identifier.Cmp(gSG_Data_Type_Identifier[SG_DATATYPE_ULong ]) ) return( SG_DATATYPE_ULong );
162  if( !Identifier.Cmp(gSG_Data_Type_Identifier[SG_DATATYPE_Long ]) ) return( SG_DATATYPE_Long );
163  if( !Identifier.Cmp(gSG_Data_Type_Identifier[SG_DATATYPE_Float ]) ) return( SG_DATATYPE_Float );
166  if( !Identifier.Cmp(gSG_Data_Type_Identifier[SG_DATATYPE_Date ]) ) return( SG_DATATYPE_Date );
167  if( !Identifier.Cmp(gSG_Data_Type_Identifier[SG_DATATYPE_Color ]) ) return( SG_DATATYPE_Color );
168 
169  return( SG_DATATYPE_Undefined );
170 }
171 
172 //---------------------------------------------------------
174 {
175  switch( Type )
176  {
177  case SG_DATATYPE_Bit : return( SG_DATATYPES_Bit );
178  case SG_DATATYPE_Byte : return( SG_DATATYPES_Byte );
179  case SG_DATATYPE_Char : return( SG_DATATYPES_Char );
180  case SG_DATATYPE_Word : return( SG_DATATYPES_Word );
181  case SG_DATATYPE_Short : return( SG_DATATYPES_Short );
182  case SG_DATATYPE_DWord : return( SG_DATATYPES_DWord );
183  case SG_DATATYPE_Int : return( SG_DATATYPES_Int );
184  case SG_DATATYPE_ULong : return( SG_DATATYPES_ULong );
185  case SG_DATATYPE_Long : return( SG_DATATYPES_Long );
186  case SG_DATATYPE_Float : return( SG_DATATYPES_Float );
187  case SG_DATATYPE_Double: return( SG_DATATYPES_Double );
188  case SG_DATATYPE_String: return( SG_DATATYPES_String );
189  case SG_DATATYPE_Date : return( SG_DATATYPES_Date );
190  case SG_DATATYPE_Color : return( SG_DATATYPES_Color );
191  case SG_DATATYPE_Binary: return( SG_DATATYPES_Binary );
192  default : return( SG_DATATYPES_Undefined );
193  }
194 };
195 
196 //---------------------------------------------------------
198 {
199  switch( Type )
200  {
201  case SG_DATATYPE_Bit :
202  case SG_DATATYPE_Byte :
203  case SG_DATATYPE_Char :
204  case SG_DATATYPE_Word :
205  case SG_DATATYPE_Short :
206  case SG_DATATYPE_DWord :
207  case SG_DATATYPE_Int :
208  case SG_DATATYPE_ULong :
209  case SG_DATATYPE_Long :
210  case SG_DATATYPE_Float :
211  case SG_DATATYPE_Double:
212  return( true );
213 
214  case SG_DATATYPE_String:
215  case SG_DATATYPE_Date :
216  case SG_DATATYPE_Color :
217  case SG_DATATYPE_Binary: default:
218  return( false );
219  }
220 }
221 
222 //---------------------------------------------------------
223 bool SG_Data_Type_Range_Check(TSG_Data_Type Type, double &Value)
224 {
225  double min, max;
226 
227  switch( Type )
228  {
229  default:
230  case SG_DATATYPE_Double: Value = (double)Value; return( true );
231  case SG_DATATYPE_Float : Value = (float )Value; return( true );
232 
233  case SG_DATATYPE_Bit : min = 0.; max = 1.; break;
234  case SG_DATATYPE_Byte : min = 0.; max = 255.; break;
235  case SG_DATATYPE_Char : min = -128.; max = 127.; break;
236  case SG_DATATYPE_Word : min = 0.; max = 65535.; break;
237  case SG_DATATYPE_Short : min = -32768.; max = 32767.; break;
238  case SG_DATATYPE_DWord : min = 0.; max = 4294967295.; break;
239  case SG_DATATYPE_Int : min = -2147483648.; max = 2147483647.; break;
240  }
241 
242  if( Value < min )
243  {
244  Value = min;
245  }
246  else if( Value > max )
247  {
248  Value = max;
249  }
250 
251  return( true );
252 }
253 
254 
256 // //
257 // Environment //
258 // //
260 
261 //---------------------------------------------------------
272 class CSG_App_Initialize
273 {
274 public:
275  CSG_App_Initialize(void)
276  {
277  m_Initialized = 0;
278  }
279 
280  virtual ~CSG_App_Initialize(void)
281  {}
282 
283  bool Initialize (void)
284  {
285  if( wxInitialize() )
286  {
287  m_Initialized++;
288 
289  return( true );
290  }
291 
292  return( false );
293  }
294 
295  bool Uninitialize (void)
296  {
297  if( m_Initialized > 0 )
298  {
299  wxUninitialize();
300 
301  m_Initialized--;
302 
303  return( true );
304  }
305 
306  return( false );
307  }
308 
309  bool Uninitialize (bool bAll)
310  {
311  if( bAll )
312  {
313  while( m_Initialized > 0 )
314  {
315  Uninitialize();
316  }
317  }
318  else
319  {
320  Uninitialize();
321  }
322 
323  return( true );
324  }
325 
326 
327 private:
328 
329  int m_Initialized;
330 
331 };
332 
333 //---------------------------------------------------------
334 CSG_App_Initialize g_App_Initialize;
335 
336 
338 // //
340 
341 //---------------------------------------------------------
342 bool SG_Add_Dll_Paths(const wxString &Directory, wxString &Paths)
343 {
344  wxDir Dir(Directory);
345 
346  if( Dir.IsOpened() )
347  {
348  wxString Path;
349 
350  if( Dir.GetFirst(&Path, "*.dll", wxDIR_HIDDEN|wxDIR_FILES) )
351  {
352  if( !Path.IsEmpty() )
353  {
354  Paths += ";";
355  }
356 
357  Paths += Directory;
358  }
359 
360  if( Dir.GetFirst(&Path, "gdal_netCDF.dll", wxDIR_HIDDEN|wxDIR_FILES) )
361  {
362  wxSetEnv("GDAL_DRIVER_PATH", Directory);
363  }
364 
365  if( Dir.GetFirst(&Path, "pdalcpp.dll", wxDIR_HIDDEN | wxDIR_FILES) )
366  {
367  wxSetEnv("PDAL_DRIVER_PATH", Directory);
368  }
369 
370  if( Dir.GetFirst(&Path, wxEmptyString, wxDIR_HIDDEN|wxDIR_DIRS) )
371  {
372  do
373  {
374  wxString SubDir(Directory + "\\" + Path);
375 
376  if( !Path.CmpNoCase("gdal-plugins") ) { wxSetEnv("GDAL_DRIVER_PATH", SubDir); }
377  else if( !Path.CmpNoCase("gdal-data" ) ) { wxSetEnv("GDAL_DATA" , SubDir); }
378  else if( !Path.CmpNoCase("proj-data" ) ) { wxSetEnv("PROJ_LIB" , SubDir); }
379  else
380  {
381  SG_Add_Dll_Paths(SubDir, Paths);
382  }
383  }
384  while( Dir.GetNext(&Path) );
385  }
386  }
387 
388  return( !Paths.IsEmpty() );
389 }
390 
391 //---------------------------------------------------------
392 bool SG_Initialize_Environment(bool bLibraries, bool bProjections, const SG_Char *Directory, bool bInitializeWX)
393 {
394  #ifdef _DEBUG
395  SG_UI_Console_Print_StdOut("\n!!! Loading SAGA API => DEBUG !!!");
396  #endif
397 
398  if( bInitializeWX )
399  {
400  g_App_Initialize.Initialize();
401  }
402 
403  //-----------------------------------------------------
404  static bool bInitialized = false;
405 
406  if( bInitialized == false )
407  {
408  bInitialized = true;
409 
411 
412  #ifdef _SAGA_MSW
413  {
414  wxString App_Path, Dll_Paths, System_Paths;
415 
416  if( Directory && SG_Dir_Exists(Directory) )
417  {
418  App_Path = Directory;
419  }
420  else
421  {
422  App_Path = SG_UI_Get_Application_Path(true).c_str();
423  }
424 
425  wxGetEnv("PATH", &System_Paths);
426 
427  if( SG_Add_Dll_Paths(App_Path + "\\dll", Dll_Paths) )
428  {
429  Dll_Paths += ';' + App_Path + ';' + System_Paths;
430 
431  wxSetEnv("PATH", Dll_Paths);
432  }
433 
434  if( bLibraries )
435  {
436  SG_Get_Tool_Library_Manager().Add_Directory(SG_File_Make_Path(&App_Path, "tools"), false);
437  }
438 
439  if( bProjections )
440  {
441  SG_Get_Projections().Load(SG_File_Make_Path(&App_Path, "saga_prj", "srs"));
442  }
443  }
444  #elif defined(__WXMAC__)
445  {
446  CSG_String App_Path(SG_UI_Get_Application_Path(true));
447 
448  if( bLibraries )
449  {
450  if( SG_Get_Tool_Library_Manager().Add_Directory(App_Path + "/../Tools", false) < 1 )
451  {
452  #ifdef TOOLS_PATH
454  #endif
455 
456  #ifdef SHARE_PATH
457  SG_Get_Tool_Library_Manager().Add_Directory(CSG_String(SHARE_PATH) + "/toolchains"); // look for tool chains
458  #endif
459  }
460  }
461 
462  if( bProjections )
463  {
464  if( SG_Get_Projections().Load(App_Path + "/saga_prj.srs") == false )
465  {
466  #ifdef SHARE_PATH
467  SG_Get_Projections().Load(CSG_String(SHARE_PATH) + "/saga_prj.srs");
468  #endif
469  }
470  }
471 
472  if( SG_Dir_Exists(App_Path + "/proj-data") ) { wxSetEnv("PROJ_LIB" , wxString::Format("%s/proj-data", App_Path.c_str())); }
473  if( SG_Dir_Exists(App_Path + "/gdal-data") ) { wxSetEnv("GDAL_DATA", wxString::Format("%s/gdal-data", App_Path.c_str())); }
474  }
475  #else // #ifdef _SAGA_LINUX
476  {
477  if( bLibraries )
478  {
479  #ifdef TOOLS_PATH
481  #endif
482  #ifdef SHARE_PATH
483  SG_Get_Tool_Library_Manager().Add_Directory(SG_File_Make_Path(SHARE_PATH, "toolchains")); // look for tool chains
484  #endif
485  }
486 
487  if( bProjections )
488  {
489  #ifdef SHARE_PATH
490  SG_Get_Projections().Load(SG_File_Make_Path(SHARE_PATH, "saga_prj", "srs"));
491  #endif
492  }
493  }
494  #endif
495 
497  }
498 
499  //-----------------------------------------------------
500  if( bLibraries )
501  {
502  wxString Path;
503 
504  if( wxGetEnv("SAGA_TLB", &Path) )
505  {
507 
508  #ifdef _SAGA_MSW
509  CSG_Strings Paths = SG_String_Tokenize(&Path, ";" ); // colon (':') would split drive from paths!
510  #else // #ifdef _SAGA_LINUX
511  CSG_Strings Paths = SG_String_Tokenize(&Path, ";:"); // colon (':') is more native to non-windows os than semi-colon (';'), we support both...
512  #endif
513 
514  for(int i=0; i<Paths.Get_Count(); i++)
515  {
517  }
518 
520  }
521  }
522 
523  //-----------------------------------------------------
524  return( true );
525 }
526 
527 //---------------------------------------------------------
529 {
530  g_App_Initialize.Uninitialize(true);
531 
532  return( true );
533 }
534 
535 
537 // //
538 // //
539 // //
541 
542 //---------------------------------------------------------
SG_DATATYPE_Color
@ SG_DATATYPE_Color
Definition: api_core.h:1007
SG_DATATYPE_Int
@ SG_DATATYPE_Int
Definition: api_core.h:1000
g_App_Initialize
CSG_App_Initialize g_App_Initialize
Definition: api_core.cpp:334
SG_DATATYPE_Undefined
@ SG_DATATYPE_Undefined
Definition: api_core.h:1009
SG_DATATYPES_ULong
#define SG_DATATYPES_ULong
Definition: api_core.h:1022
SG_DATATYPE_String
@ SG_DATATYPE_String
Definition: api_core.h:1005
SG_DATATYPES_Double
#define SG_DATATYPES_Double
Definition: api_core.h:1025
_TL
#define _TL(s)
Definition: api_core.h:1489
SG_DATATYPE_DWord
@ SG_DATATYPE_DWord
Definition: api_core.h:999
SG_DATATYPE_Binary
@ SG_DATATYPE_Binary
Definition: api_core.h:1008
SG_Data_Type_Range_Check
bool SG_Data_Type_Range_Check(TSG_Data_Type Type, double &Value)
Definition: api_core.cpp:223
SG_Data_Type_Get_Flag
int SG_Data_Type_Get_Flag(TSG_Data_Type Type)
Definition: api_core.cpp:173
SG_DATATYPES_Undefined
#define SG_DATATYPES_Undefined
Definition: api_core.h:1014
SG_Uninitialize_Environment
bool SG_Uninitialize_Environment(void)
Definition: api_core.cpp:528
SG_DATATYPES_Float
#define SG_DATATYPES_Float
Definition: api_core.h:1024
SG_Dir_Exists
SAGA_API_DLL_EXPORT bool SG_Dir_Exists(const CSG_String &Directory)
Definition: api_file.cpp:743
SG_DATATYPES_DWord
#define SG_DATATYPES_DWord
Definition: api_core.h:1020
SG_Add_Dll_Paths
bool SG_Add_Dll_Paths(const wxString &Directory, wxString &Paths)
Definition: api_core.cpp:342
SG_UI_Console_Print_StdOut
void SG_UI_Console_Print_StdOut(const char *Text, SG_Char End, bool bFlush)
Definition: api_callback.cpp:78
SG_DATATYPE_Byte
@ SG_DATATYPE_Byte
Definition: api_core.h:995
SG_DATATYPES_Long
#define SG_DATATYPES_Long
Definition: api_core.h:1023
api_core.h
SG_DATATYPES_String
#define SG_DATATYPES_String
Definition: api_core.h:1026
SG_UI_Get_Application_Path
CSG_String SG_UI_Get_Application_Path(bool bPathOnly)
Definition: api_callback.cpp:799
SG_DATATYPES_Word
#define SG_DATATYPES_Word
Definition: api_core.h:1018
CSG_String::Cmp
int Cmp(const CSG_String &String) const
Definition: api_string.cpp:515
SG_Data_Type_Get_Identifier
CSG_String SG_Data_Type_Get_Identifier(TSG_Data_Type Type)
Definition: api_core.cpp:146
SG_OMP_Get_Max_Num_Threads
int SG_OMP_Get_Max_Num_Threads(void)
Definition: api_core.cpp:109
SG_DATATYPE_Long
@ SG_DATATYPE_Long
Definition: api_core.h:1002
SG_DATATYPES_Char
#define SG_DATATYPES_Char
Definition: api_core.h:1017
SG_Initialize_Environment
bool SG_Initialize_Environment(bool bLibraries, bool bProjections, const SG_Char *Directory, bool bInitializeWX)
Definition: api_core.cpp:392
SG_DATATYPES_Byte
#define SG_DATATYPES_Byte
Definition: api_core.h:1016
SG_DATATYPES_Bit
#define SG_DATATYPES_Bit
Definition: api_core.h:1015
SG_DATATYPES_Date
#define SG_DATATYPES_Date
Definition: api_core.h:1027
CSG_Projections::Load
bool Load(const CSG_String &File, bool bAppend=false)
Definition: projections.cpp:809
SG_Get_Tool_Library_Manager
CSG_Tool_Library_Manager & SG_Get_Tool_Library_Manager(void)
Definition: tool_library.cpp:286
SG_Data_Type_is_Numeric
bool SG_Data_Type_is_Numeric(TSG_Data_Type Type)
Definition: api_core.cpp:197
SG_DATATYPES_Short
#define SG_DATATYPES_Short
Definition: api_core.h:1019
SG_OMP_Get_Max_Num_Procs
int SG_OMP_Get_Max_Num_Procs(void)
Definition: api_core.cpp:110
SG_DATATYPE_Float
@ SG_DATATYPE_Float
Definition: api_core.h:1003
SG_String_Tokenize
SAGA_API_DLL_EXPORT CSG_Strings SG_String_Tokenize(const CSG_String &String, const CSG_String &Delimiters=SG_DEFAULT_DELIMITERS, TSG_String_Tokenizer_Mode Mode=SG_TOKEN_DEFAULT)
Definition: api_string.cpp:1559
SG_Data_Type_Get_Name
CSG_String SG_Data_Type_Get_Name(TSG_Data_Type Type, bool bShort)
Definition: api_core.cpp:122
SG_Get_Projections
SAGA_API_DLL_EXPORT CSG_Projections & SG_Get_Projections(void)
Definition: projections.cpp:69
CSG_Strings
Definition: api_core.h:699
SG_DATATYPE_Date
@ SG_DATATYPE_Date
Definition: api_core.h:1006
SG_DATATYPE_Word
@ SG_DATATYPE_Word
Definition: api_core.h:997
SG_DATATYPES_Binary
#define SG_DATATYPES_Binary
Definition: api_core.h:1029
gSG_Data_Type_Identifier
const char gSG_Data_Type_Identifier[][32]
Definition: api_core.h:1039
SG_Char
#define SG_Char
Definition: api_core.h:536
SG_DATATYPES_Color
#define SG_DATATYPES_Color
Definition: api_core.h:1028
CSG_String
Definition: api_core.h:563
SG_OMP_Set_Max_Num_Threads
void SG_OMP_Set_Max_Num_Threads(int iCores)
Definition: api_core.cpp:108
SG_DATATYPE_Short
@ SG_DATATYPE_Short
Definition: api_core.h:998
CSG_Tool_Library_Manager::Add_Directory
int Add_Directory(const CSG_String &Directory, bool bOnlySubDirectories=false)
Definition: tool_library.cpp:394
SG_OMP_Get_Thread_Num
int SG_OMP_Get_Thread_Num(void)
Definition: api_core.cpp:111
SG_DATATYPES_Int
#define SG_DATATYPES_Int
Definition: api_core.h:1021
SG_DATATYPE_Bit
@ SG_DATATYPE_Bit
Definition: api_core.h:994
SG_File_Make_Path
SAGA_API_DLL_EXPORT CSG_String SG_File_Make_Path(const CSG_String &Directory, const CSG_String &Name)
Definition: api_file.cpp:919
SG_UI_ProgressAndMsg_Lock
void SG_UI_ProgressAndMsg_Lock(bool bOn)
Definition: api_callback.cpp:590
CSG_String::c_str
const SG_Char * c_str(void) const
Definition: api_string.cpp:236
tool_library.h
CSG_Strings::Get_Count
int Get_Count(void) const
Definition: api_core.h:712
SG_Data_Type_Get_Type
TSG_Data_Type SG_Data_Type_Get_Type(const CSG_String &Identifier)
Definition: api_core.cpp:152
TSG_Data_Type
TSG_Data_Type
Definition: api_core.h:993
SG_DATATYPE_Char
@ SG_DATATYPE_Char
Definition: api_core.h:996
SG_DATATYPE_ULong
@ SG_DATATYPE_ULong
Definition: api_core.h:1001
SG_DATATYPE_Double
@ SG_DATATYPE_Double
Definition: api_core.h:1004