Hi!
I think it would be really nice to have the possibility to add some user
definable track filtering mechanism without the need to hack around in
CDlgTrackFilter and compile the whole thing from source, but some
interpreted scripting language instead.
Compared to e.g. Python, Lua is embarrassingly easy to embed, so I made
a quick hack that adds a "Lua" page to the track page, where you can
simply paste your Lua filter script and execute it. Obviously the
attached hack isn't ready for prime time yet and leaves much to be
desired on the UI, but it's enough to play a bit around and check what's
possible.
The track data is exposed to the Lua interpreter through the single
global array "track". Note that array elements are, by convention,
counted from 1 instead of 0 in Lua. Currently only a subset of the track
point data is exposed: lat(itude), lon(gitude), ele(vation), flags and
timestamp.
Attached is also a simple implementation of the Douglas-Peucker
algorithm in Lua. Filtering a track with 3000 points takes only a few
seconds on my dated G4 Powerbook, and it seems most of the time is
actually spent in track.rebuild() *after* the Lua work. So performance
is IMHO no showstopper.
Opinions?
Regard,
Michael
--
Q: Does it run under windows?
A: Who cares?
-- from the babygimp homepage-- vim: sw=4 et
--
-- http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm
epsilon = 2.5*1e-6
-- http://www.movable-type.co.uk/scripts/gis-faq-5.1.html
function haversine(lat1, lon1, lat2, lon2)
local dlon = math.abs(lon2 - lon1)
local dlat = math.abs(lat2 - lat1)
local a = math.sin(math.rad(dlat/2))^2 + math.cos(math.rad(lat1)) *
math.cos(math.rad(lat2)) * math.sin(math.rad(dlon/2))^2
return 2 * math.asin(math.min(1, math.sqrt(a)))
end
function douglas_peucker(lb, ub)
if lb < ub then
local p1, p2 = track[lb], track[ub]
local c = haversine(p1.lat, p1.lon, p2.lat, p2.lon)
local max_h = 0
local h, max_i
for i = lb+1, ub-1 do
local p = track[i]
local a = haversine(p1.lat, p1.lon, p.lat, p.lon)
local b = haversine(p.lat, p.lon, p2.lat, p2.lon)
--local gamma =
math.acos((math.cos(c)-math.cos(a)*math.cos(b))/(math.sin(a)*math.sin(b)))
local alpha =
math.acos((math.cos(a)-math.cos(c)*math.cos(b))/(math.sin(c)*math.sin(b)))
local beta =
math.acos((math.cos(b)-math.cos(c)*math.cos(a))/(math.sin(c)*math.sin(a)))
if math.deg(alpha) > 90 or math.deg(beta) > 90 then
h = math.min(a, b)
else
if a > b then
h = math.asin(math.sin(a)*math.sin(beta))
else
h = math.asin(math.sin(b)*math.sin(alpha))
end
end
if h > max_h then
max_h = h
max_i = i
end
end
if max_h > epsilon then
douglas_peucker(lb, max_i)
douglas_peucker(max_i, ub)
else
for i = lb+1, ub-1 do
track[i].flags = 4 -- CTrack::eDeleted
end
end
end
end
douglas_peucker(1, table.getn(track))
From f1a047de6e69006889fcd771a332438a921a8cd0 Mon Sep 17 00:00:00 2001
From: Michael Klein <[email protected]>
Date: Tue, 20 Sep 2011 20:48:35 +0200
Subject: [PATCH] quick lua track filter hack
---
cmake/Modules/FindLua50.cmake | 96 ++++++++
cmake/Modules/FindLua51.cmake | 75 ++++++
cmake/Modules/FindPackageHandleStandardArgs.cmake | 260 +++++++++++++++++++++
src/CDlgTrackFilter.cpp | 80 ++++++-
src/CDlgTrackFilter.h | 1 +
src/CMakeLists.txt | 16 ++-
src/IDlgTrackFilter.ui | 29 +++-
7 files changed, 552 insertions(+), 5 deletions(-)
create mode 100644 cmake/Modules/FindLua50.cmake
create mode 100644 cmake/Modules/FindLua51.cmake
create mode 100644 cmake/Modules/FindPackageHandleStandardArgs.cmake
diff --git a/cmake/Modules/FindLua50.cmake b/cmake/Modules/FindLua50.cmake
new file mode 100644
index 0000000..ee8b84e
--- /dev/null
+++ b/cmake/Modules/FindLua50.cmake
@@ -0,0 +1,96 @@
+# Locate Lua library
+# This module defines
+# LUA50_FOUND, if false, do not try to link to Lua
+# LUA_LIBRARIES, both lua and lualib
+# LUA_INCLUDE_DIR, where to find lua.h and lualib.h (and probably lauxlib.h)
+#
+# Note that the expected include convention is
+# #include "lua.h"
+# and not
+# #include <lua/lua.h>
+# This is because, the lua location is not standardized and may exist
+# in locations other than lua/
+
+#=============================================================================
+# Copyright 2007-2009 Kitware, Inc.
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+# License text for the above reference.)
+
+FIND_PATH(LUA_INCLUDE_DIR lua.h
+ HINTS
+ $ENV{LUA_DIR}
+ PATH_SUFFIXES include/lua50 include/lua5.0 include/lua5 include/lua include
+ PATHS
+ ~/Library/Frameworks
+ /Library/Frameworks
+ /usr/local
+ /usr
+ /sw # Fink
+ /opt/local # DarwinPorts
+ /opt/csw # Blastwave
+ /opt
+)
+
+FIND_LIBRARY(LUA_LIBRARY_lua
+ NAMES lua50 lua5.0 lua-5.0 lua5 lua
+ HINTS
+ $ENV{LUA_DIR}
+ PATH_SUFFIXES lib64 lib
+ PATHS
+ ~/Library/Frameworks
+ /Library/Frameworks
+ /usr/local
+ /usr
+ /sw
+ /opt/local
+ /opt/csw
+ /opt
+)
+
+# In an OS X framework, lualib is usually included as part of the framework
+# (like GLU in OpenGL.framework)
+IF(${LUA_LIBRARY_lua} MATCHES "framework")
+ SET( LUA_LIBRARIES "${LUA_LIBRARY_lua}" CACHE STRING "Lua framework")
+ELSE(${LUA_LIBRARY_lua} MATCHES "framework")
+ FIND_LIBRARY(LUA_LIBRARY_lualib
+ NAMES lualib50 lualib5.0 lualib5 lualib
+ HINTS
+ $ENV{LUALIB_DIR}
+ $ENV{LUA_DIR}
+ PATH_SUFFIXES lib64 lib
+ PATHS
+ /usr/local
+ /usr
+ /sw
+ /opt/local
+ /opt/csw
+ /opt
+ )
+ IF(LUA_LIBRARY_lualib AND LUA_LIBRARY_lua)
+ # include the math library for Unix
+ IF(UNIX AND NOT APPLE)
+ FIND_LIBRARY(MATH_LIBRARY_FOR_LUA m)
+ SET( LUA_LIBRARIES
"${LUA_LIBRARY_lualib};${LUA_LIBRARY_lua};${MATH_LIBRARY_FOR_LUA}" CACHE STRING
"This is the concatentation of lua and lualib libraries")
+ # For Windows and Mac, don't need to explicitly include the math library
+ ELSE(UNIX AND NOT APPLE)
+ SET( LUA_LIBRARIES "${LUA_LIBRARY_lualib};${LUA_LIBRARY_lua}" CACHE
STRING "This is the concatentation of lua and lualib libraries")
+ ENDIF(UNIX AND NOT APPLE)
+ ENDIF(LUA_LIBRARY_lualib AND LUA_LIBRARY_lua)
+ENDIF(${LUA_LIBRARY_lua} MATCHES "framework")
+
+
+INCLUDE(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
+# handle the QUIETLY and REQUIRED arguments and set LUA_FOUND to TRUE if
+# all listed variables are TRUE
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(Lua50 DEFAULT_MSG LUA_LIBRARIES
LUA_INCLUDE_DIR)
+
+MARK_AS_ADVANCED(LUA_INCLUDE_DIR LUA_LIBRARIES)
+
diff --git a/cmake/Modules/FindLua51.cmake b/cmake/Modules/FindLua51.cmake
new file mode 100644
index 0000000..123fd5d
--- /dev/null
+++ b/cmake/Modules/FindLua51.cmake
@@ -0,0 +1,75 @@
+# Locate Lua library
+# This module defines
+# LUA51_FOUND, if false, do not try to link to Lua
+# LUA_LIBRARIES
+# LUA_INCLUDE_DIR, where to find lua.h
+#
+# Note that the expected include convention is
+# #include "lua.h"
+# and not
+# #include <lua/lua.h>
+# This is because, the lua location is not standardized and may exist
+# in locations other than lua/
+
+#=============================================================================
+# Copyright 2007-2009 Kitware, Inc.
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+# License text for the above reference.)
+
+FIND_PATH(LUA_INCLUDE_DIR lua.h
+ HINTS
+ $ENV{LUA_DIR}
+ PATH_SUFFIXES include/lua51 include/lua5.1 include/lua include
+ PATHS
+ ~/Library/Frameworks
+ /Library/Frameworks
+ /usr/local
+ /usr
+ /sw # Fink
+ /opt/local # DarwinPorts
+ /opt/csw # Blastwave
+ /opt
+)
+
+FIND_LIBRARY(LUA_LIBRARY
+ NAMES lua51 lua5.1 lua-5.1 lua
+ HINTS
+ $ENV{LUA_DIR}
+ PATH_SUFFIXES lib64 lib
+ PATHS
+ ~/Library/Frameworks
+ /Library/Frameworks
+ /usr/local
+ /usr
+ /sw
+ /opt/local
+ /opt/csw
+ /opt
+)
+
+IF(LUA_LIBRARY)
+ # include the math library for Unix
+ IF(UNIX AND NOT APPLE)
+ FIND_LIBRARY(LUA_MATH_LIBRARY m)
+ SET( LUA_LIBRARIES "${LUA_LIBRARY};${LUA_MATH_LIBRARY}" CACHE STRING "Lua
Libraries")
+ # For Windows and Mac, don't need to explicitly include the math library
+ ELSE(UNIX AND NOT APPLE)
+ SET( LUA_LIBRARIES "${LUA_LIBRARY}" CACHE STRING "Lua Libraries")
+ ENDIF(UNIX AND NOT APPLE)
+ENDIF(LUA_LIBRARY)
+
+INCLUDE(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
+# handle the QUIETLY and REQUIRED arguments and set LUA_FOUND to TRUE if
+# all listed variables are TRUE
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(Lua51 DEFAULT_MSG LUA_LIBRARIES
LUA_INCLUDE_DIR)
+
+MARK_AS_ADVANCED(LUA_INCLUDE_DIR LUA_LIBRARIES LUA_LIBRARY LUA_MATH_LIBRARY)
+
diff --git a/cmake/Modules/FindPackageHandleStandardArgs.cmake
b/cmake/Modules/FindPackageHandleStandardArgs.cmake
new file mode 100644
index 0000000..1acb021
--- /dev/null
+++ b/cmake/Modules/FindPackageHandleStandardArgs.cmake
@@ -0,0 +1,260 @@
+# FIND_PACKAGE_HANDLE_STANDARD_ARGS(<name> ... )
+#
+# This function is intended to be used in FindXXX.cmake modules files.
+# It handles the REQUIRED, QUIET and version-related arguments to
FIND_PACKAGE().
+# It also sets the <UPPERCASED_NAME>_FOUND variable.
+# The package is considered found if all variables <var1>... listed contain
+# valid results, e.g. valid filepaths.
+#
+# There are two modes of this function. The first argument in both modes is
+# the name of the Find-module where it is called (in original casing).
+#
+# The first simple mode looks like this:
+# FIND_PACKAGE_HANDLE_STANDARD_ARGS(<name> (DEFAULT_MSG|"Custom failure
message") <var1>...<varN> )
+# If the variables <var1> to <varN> are all valid, then <UPPERCASED_NAME>_FOUND
+# will be set to TRUE.
+# If DEFAULT_MSG is given as second argument, then the function will generate
+# itself useful success and error messages. You can also supply a custom error
message
+# for the failure case. This is not recommended.
+#
+# The second mode is more powerful and also supports version checking:
+# FIND_PACKAGE_HANDLE_STANDARD_ARGS(NAME [REQUIRED_VARS <var1>...<varN>]
+# [VERSION_VAR <versionvar>
+# [CONFIG_MODE]
+# [FAIL_MESSAGE "Custom failure
message"] )
+#
+# As above, if <var1> through <varN> are all valid, <UPPERCASED_NAME>_FOUND
+# will be set to TRUE.
+# After REQUIRED_VARS the variables which are required for this package are
listed.
+# Following VERSION_VAR the name of the variable can be specified which holds
+# the version of the package which has been found. If this is done, this
version
+# will be checked against the (potentially) specified required version used
+# in the find_package() call. The EXACT keyword is also handled. The default
+# messages include information about the required version and the version
+# which has been actually found, both if the version is ok or not.
+# Use the option CONFIG_MODE if your FindXXX.cmake module is a wrapper for
+# a find_package(... NO_MODULE) call, in this case all the information
+# provided by the config-mode of find_package() will be evaluated
+# automatically.
+# Via FAIL_MESSAGE a custom failure message can be specified, if this is not
+# used, the default message will be displayed.
+#
+# Example for mode 1:
+#
+# FIND_PACKAGE_HANDLE_STANDARD_ARGS(LibXml2 DEFAULT_MSG LIBXML2_LIBRARY
LIBXML2_INCLUDE_DIR)
+#
+# LibXml2 is considered to be found, if both LIBXML2_LIBRARY and
+# LIBXML2_INCLUDE_DIR are valid. Then also LIBXML2_FOUND is set to TRUE.
+# If it is not found and REQUIRED was used, it fails with FATAL_ERROR,
+# independent whether QUIET was used or not.
+# If it is found, success will be reported, including the content of <var1>.
+# On repeated Cmake runs, the same message won't be printed again.
+#
+# Example for mode 2:
+#
+# FIND_PACKAGE_HANDLE_STANDARD_ARGS(BISON REQUIRED_VARS BISON_EXECUTABLE
+# VERSION_VAR BISON_VERSION)
+# In this case, BISON is considered to be found if the variable(s) listed
+# after REQUIRED_VAR are all valid, i.e. BISON_EXECUTABLE in this case.
+# Also the version of BISON will be checked by using the version contained
+# in BISON_VERSION.
+# Since no FAIL_MESSAGE is given, the default messages will be printed.
+#
+# Another example for mode 2:
+#
+# FIND_PACKAGE(Automoc4 QUIET NO_MODULE HINTS /opt/automoc4)
+# FIND_PACKAGE_HANDLE_STANDARD_ARGS(Automoc4 CONFIG_MODE)
+# In this case, FindAutmoc4.cmake wraps a call to FIND_PACKAGE(Automoc4
NO_MODULE)
+# and adds an additional search directory for automoc4.
+# The following FIND_PACKAGE_HANDLE_STANDARD_ARGS() call produces a proper
+# success/error message.
+
+#=============================================================================
+# Copyright 2007-2009 Kitware, Inc.
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+# License text for the above reference.)
+
+INCLUDE(FindPackageMessage)
+INCLUDE(CMakeParseArguments)
+
+# internal helper macro
+MACRO(_FPHSA_FAILURE_MESSAGE _msg)
+ IF (${_NAME}_FIND_REQUIRED)
+ MESSAGE(FATAL_ERROR "${_msg}")
+ ELSE (${_NAME}_FIND_REQUIRED)
+ IF (NOT ${_NAME}_FIND_QUIETLY)
+ MESSAGE(STATUS "${_msg}")
+ ENDIF (NOT ${_NAME}_FIND_QUIETLY)
+ ENDIF (${_NAME}_FIND_REQUIRED)
+ENDMACRO(_FPHSA_FAILURE_MESSAGE _msg)
+
+
+# internal helper macro to generate the failure message when used in
CONFIG_MODE:
+MACRO(_FPHSA_HANDLE_FAILURE_CONFIG_MODE)
+ # <name>_CONFIG is set, but FOUND is false, this means that some other of
the REQUIRED_VARS was not found:
+ IF(${_NAME}_CONFIG)
+ _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: missing: ${MISSING_VARS}
(found ${${_NAME}_CONFIG} ${VERSION_MSG})")
+ ELSE(${_NAME}_CONFIG)
+ # If _CONSIDERED_CONFIGS is set, the config-file has been found, but no
suitable version.
+ # List them all in the error message:
+ IF(${_NAME}_CONSIDERED_CONFIGS)
+ SET(configsText "")
+ LIST(LENGTH ${_NAME}_CONSIDERED_CONFIGS configsCount)
+ MATH(EXPR configsCount "${configsCount} - 1")
+ FOREACH(currentConfigIndex RANGE ${configsCount})
+ LIST(GET ${_NAME}_CONSIDERED_CONFIGS ${currentConfigIndex} filename)
+ LIST(GET ${_NAME}_CONSIDERED_VERSIONS ${currentConfigIndex} version)
+ SET(configsText "${configsText} ${filename} (version ${version})\n")
+ ENDFOREACH(currentConfigIndex)
+ _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} ${VERSION_MSG}, checked
the following files:\n${configsText}")
+
+ ELSE(${_NAME}_CONSIDERED_CONFIGS)
+ # Simple case: No Config-file was found at all:
+ _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: found neither
${_NAME}Config.cmake nor ${_NAME_LOWER}-config.cmake ${VERSION_MSG}")
+ ENDIF(${_NAME}_CONSIDERED_CONFIGS)
+ ENDIF(${_NAME}_CONFIG)
+ENDMACRO(_FPHSA_HANDLE_FAILURE_CONFIG_MODE)
+
+
+FUNCTION(FIND_PACKAGE_HANDLE_STANDARD_ARGS _NAME _FIRST_ARG)
+
+# set up the arguments for CMAKE_PARSE_ARGUMENTS and check whether we are in
+# new extended or in the "old" mode:
+ SET(options CONFIG_MODE)
+ SET(oneValueArgs FAIL_MESSAGE VERSION_VAR)
+ SET(multiValueArgs REQUIRED_VARS)
+ SET(_KEYWORDS_FOR_EXTENDED_MODE ${options} ${oneValueArgs}
${multiValueArgs} )
+ LIST(FIND _KEYWORDS_FOR_EXTENDED_MODE "${_FIRST_ARG}" INDEX)
+
+ IF(${INDEX} EQUAL -1)
+ SET(FPHSA_FAIL_MESSAGE ${_FIRST_ARG})
+ SET(FPHSA_REQUIRED_VARS ${ARGN})
+ SET(FPHSA_VERSION_VAR)
+ ELSE(${INDEX} EQUAL -1)
+
+ CMAKE_PARSE_ARGUMENTS(FPHSA "${options}" "${oneValueArgs}"
"${multiValueArgs}" ${_FIRST_ARG} ${ARGN})
+
+ IF(FPHSA_UNPARSED_ARGUMENTS)
+ MESSAGE(FATAL_ERROR "Unknown keywords given to
FIND_PACKAGE_HANDLE_STANDARD_ARGS(): \"${FPHSA_UNPARSED_ARGUMENTS}\"")
+ ENDIF(FPHSA_UNPARSED_ARGUMENTS)
+
+ IF(NOT FPHSA_FAIL_MESSAGE)
+ SET(FPHSA_FAIL_MESSAGE "DEFAULT_MSG")
+ ENDIF(NOT FPHSA_FAIL_MESSAGE)
+ ENDIF(${INDEX} EQUAL -1)
+
+# now that we collected all arguments, process them
+
+ IF("${FPHSA_FAIL_MESSAGE}" STREQUAL "DEFAULT_MSG")
+ SET(FPHSA_FAIL_MESSAGE "Could NOT find ${_NAME}")
+ ENDIF("${FPHSA_FAIL_MESSAGE}" STREQUAL "DEFAULT_MSG")
+
+ # In config-mode, we rely on the variable <package>_CONFIG, which is set by
find_package()
+ # when it successfully found the config-file, including version checking:
+ IF(FPHSA_CONFIG_MODE)
+ LIST(INSERT FPHSA_REQUIRED_VARS 0 ${_NAME}_CONFIG)
+ LIST(REMOVE_DUPLICATES FPHSA_REQUIRED_VARS)
+ SET(FPHSA_VERSION_VAR ${_NAME}_VERSION)
+ ENDIF(FPHSA_CONFIG_MODE)
+
+ IF(NOT FPHSA_REQUIRED_VARS)
+ MESSAGE(FATAL_ERROR "No REQUIRED_VARS specified for
FIND_PACKAGE_HANDLE_STANDARD_ARGS()")
+ ENDIF(NOT FPHSA_REQUIRED_VARS)
+
+ LIST(GET FPHSA_REQUIRED_VARS 0 _FIRST_REQUIRED_VAR)
+
+ STRING(TOUPPER ${_NAME} _NAME_UPPER)
+ STRING(TOLOWER ${_NAME} _NAME_LOWER)
+
+ # collect all variables which were not found, so they can be printed, so the
+ # user knows better what went wrong (#6375)
+ SET(MISSING_VARS "")
+ SET(DETAILS "")
+ SET(${_NAME_UPPER}_FOUND TRUE)
+ # check if all passed variables are valid
+ FOREACH(_CURRENT_VAR ${FPHSA_REQUIRED_VARS})
+ IF(NOT ${_CURRENT_VAR})
+ SET(${_NAME_UPPER}_FOUND FALSE)
+ SET(MISSING_VARS "${MISSING_VARS} ${_CURRENT_VAR}")
+ ELSE(NOT ${_CURRENT_VAR})
+ SET(DETAILS "${DETAILS}[${${_CURRENT_VAR}}]")
+ ENDIF(NOT ${_CURRENT_VAR})
+ ENDFOREACH(_CURRENT_VAR)
+
+
+ # version handling:
+ SET(VERSION_MSG "")
+ SET(VERSION_OK TRUE)
+ SET(VERSION ${${FPHSA_VERSION_VAR}} )
+ IF (${_NAME}_FIND_VERSION)
+
+ IF(VERSION)
+
+ IF(${_NAME}_FIND_VERSION_EXACT) # exact version required
+ IF (NOT "${${_NAME}_FIND_VERSION}" VERSION_EQUAL "${VERSION}")
+ SET(VERSION_MSG "Found unsuitable version \"${VERSION}\", but
required is exact version \"${${_NAME}_FIND_VERSION}\"")
+ SET(VERSION_OK FALSE)
+ ELSE (NOT "${${_NAME}_FIND_VERSION}" VERSION_EQUAL "${VERSION}")
+ SET(VERSION_MSG "(found suitable exact version \"${VERSION}\")")
+ ENDIF (NOT "${${_NAME}_FIND_VERSION}" VERSION_EQUAL "${VERSION}")
+
+ ELSE(${_NAME}_FIND_VERSION_EXACT) # minimum version specified:
+ IF ("${${_NAME}_FIND_VERSION}" VERSION_GREATER "${VERSION}")
+ SET(VERSION_MSG "Found unsuitable version \"${VERSION}\", but
required is at least \"${${_NAME}_FIND_VERSION}\"")
+ SET(VERSION_OK FALSE)
+ ELSE ("${${_NAME}_FIND_VERSION}" VERSION_GREATER "${VERSION}")
+ SET(VERSION_MSG "(found suitable version \"${VERSION}\", required is
\"${${_NAME}_FIND_VERSION}\")")
+ ENDIF ("${${_NAME}_FIND_VERSION}" VERSION_GREATER "${VERSION}")
+ ENDIF(${_NAME}_FIND_VERSION_EXACT)
+
+ ELSE(VERSION)
+
+ # if the package was not found, but a version was given, add that to the
output:
+ IF(${_NAME}_FIND_VERSION_EXACT)
+ SET(VERSION_MSG "(Required is exact version
\"${${_NAME}_FIND_VERSION}\")")
+ ELSE(${_NAME}_FIND_VERSION_EXACT)
+ SET(VERSION_MSG "(Required is at least version
\"${${_NAME}_FIND_VERSION}\")")
+ ENDIF(${_NAME}_FIND_VERSION_EXACT)
+
+ ENDIF(VERSION)
+ ELSE (${_NAME}_FIND_VERSION)
+ IF(VERSION)
+ SET(VERSION_MSG "(found version \"${VERSION}\")")
+ ENDIF(VERSION)
+ ENDIF (${_NAME}_FIND_VERSION)
+
+ IF(VERSION_OK)
+ SET(DETAILS "${DETAILS}[v${VERSION}(${${_NAME}_FIND_VERSION})]")
+ ELSE(VERSION_OK)
+ SET(${_NAME_UPPER}_FOUND FALSE)
+ ENDIF(VERSION_OK)
+
+
+ # print the result:
+ IF (${_NAME_UPPER}_FOUND)
+ FIND_PACKAGE_MESSAGE(${_NAME} "Found ${_NAME}: ${${_FIRST_REQUIRED_VAR}}
${VERSION_MSG}" "${DETAILS}")
+ ELSE (${_NAME_UPPER}_FOUND)
+
+ IF(FPHSA_CONFIG_MODE)
+ _FPHSA_HANDLE_FAILURE_CONFIG_MODE()
+ ELSE(FPHSA_CONFIG_MODE)
+ IF(NOT VERSION_OK)
+ _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: ${VERSION_MSG} (found
${${_FIRST_REQUIRED_VAR}})")
+ ELSE(NOT VERSION_OK)
+ _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} (missing:
${MISSING_VARS}) ${VERSION_MSG}")
+ ENDIF(NOT VERSION_OK)
+ ENDIF(FPHSA_CONFIG_MODE)
+
+ ENDIF (${_NAME_UPPER}_FOUND)
+
+ SET(${_NAME_UPPER}_FOUND ${${_NAME_UPPER}_FOUND} PARENT_SCOPE)
+
+ENDFUNCTION(FIND_PACKAGE_HANDLE_STANDARD_ARGS _FIRST_ARG)
diff --git a/src/CDlgTrackFilter.cpp b/src/CDlgTrackFilter.cpp
index 5b49724..f2dfbd7 100644
--- a/src/CDlgTrackFilter.cpp
+++ b/src/CDlgTrackFilter.cpp
@@ -25,6 +25,10 @@
#include <QtGui>
+#ifdef HAS_LUA
+# include <lua.hpp>
+#endif
+
// Change this when changing comboMeterFeet
enum meter_feet_index
{
@@ -38,6 +42,10 @@ CDlgTrackFilter::CDlgTrackFilter(CTrack &track, QWidget *
parent)
{
setupUi(this);
+#ifndef HAS_LUA
+ tabTrackFilter->removeTab(tabTrackFilter->indexOf(tabLua));
+#endif
+
QSettings cfg;
checkReduceDataset->setChecked(false);
@@ -113,7 +121,11 @@ CDlgTrackFilter::~CDlgTrackFilter()
void CDlgTrackFilter::accept()
{
- if(checkSplitTrack->isChecked())
+ if(checkLua->isChecked())
+ {
+ applyLuaFilter(&track);
+ }
+ else if(checkSplitTrack->isChecked())
{
splitTrack(&track);
}
@@ -134,7 +146,6 @@ void CDlgTrackFilter::accept()
void CDlgTrackFilter::splitTrack(CTrack * trk)
{
-
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
QList<CTrack::pt_t>& trkpts = trk->getTrackPoints();
@@ -200,9 +211,72 @@ void CDlgTrackFilter::splitTrack(CTrack * trk)
delete track1;
}
-
QApplication::restoreOverrideCursor();
+}
+
+#ifdef HAS_LUA
+template<typename T> void pushHelper(lua_State * L, const T & t) {
lua_pushnumber(L, t); }
+template<> void pushHelper(lua_State * L, const lua_Integer & i) {
lua_pushinteger(L, i); }
+template<> void pushHelper(lua_State * L, const CFlags & f) {
lua_pushinteger(L, static_cast<lua_Integer>(f.flag())); }
+#define PUSH_TRACK_PT_ELEMENT(L, pt, e) { lua_pushliteral(L, #e);
pushHelper(L, (pt).e); lua_rawset(L, -3); }
+template<typename T> void popHelper(lua_State * L, T & t) { t =
lua_tonumber(L, -1); }
+template<> void popHelper(lua_State * L, lua_Integer & i) { i =
lua_tointeger(L, -1); }
+template<> void popHelper(lua_State * L, CFlags & f) {
f.setFlags(static_cast<quint32>(lua_tointeger(L, -1))); }
+#define POP_TRACK_PT_ELEMENT(L, pt, e) { lua_pushliteral(L, #e); lua_rawget(L,
-2); popHelper(L, (pt).e); lua_pop(L, 1); }
+#endif
+
+void CDlgTrackFilter::applyLuaFilter(CTrack * trk)
+{
+#ifdef HAS_LUA
+ QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
+ QList<CTrack::pt_t>::iterator trkpt;
+ unsigned int i = 0;
+
+ lua_State * L = lua_open();
+ luaL_openlibs(L);
+
+ lua_newtable(L);
+ for(trkpt = trk->getTrackPoints().begin(); trkpt !=
trk->getTrackPoints().end(); ++trkpt)
+ {
+ lua_pushinteger(L, ++i);
+ lua_newtable(L);
+ PUSH_TRACK_PT_ELEMENT(L, *trkpt, lon);
+ PUSH_TRACK_PT_ELEMENT(L, *trkpt, lat);
+ PUSH_TRACK_PT_ELEMENT(L, *trkpt, ele);
+ PUSH_TRACK_PT_ELEMENT(L, *trkpt, flags);
+ PUSH_TRACK_PT_ELEMENT(L, *trkpt, timestamp);
+ lua_rawset(L, -3);
+ }
+ lua_setglobal(L, "track");
+ if (!luaL_dostring(L, editLua->toPlainText().toLocal8Bit().constData()))
+ {
+ lua_getglobal(L, "track");
+ i = 0;
+ for(trkpt = trk->getTrackPoints().begin(); trkpt !=
trk->getTrackPoints().end(); ++trkpt)
+ {
+ lua_pushinteger(L, ++i);
+ lua_rawget(L, -2);
+ POP_TRACK_PT_ELEMENT(L, *trkpt, lon);
+ POP_TRACK_PT_ELEMENT(L, *trkpt, lat);
+ POP_TRACK_PT_ELEMENT(L, *trkpt, ele);
+ POP_TRACK_PT_ELEMENT(L, *trkpt, flags);
+ POP_TRACK_PT_ELEMENT(L, *trkpt, timestamp);
+ lua_pop(L, 1);
+ }
+
+ track.rebuild(false);
+ CTrackDB::self().emitSigModified();
+ }
+ else
+ {
+ qWarning() << lua_tostring(L, -1);
+ }
+
+ lua_close(L);
+
+ QApplication::restoreOverrideCursor();
+#endif
}
void CDlgTrackFilter::modifyTimestamp(CTrack * trk)
diff --git a/src/CDlgTrackFilter.h b/src/CDlgTrackFilter.h
index 0183c75..cd0255b 100644
--- a/src/CDlgTrackFilter.h
+++ b/src/CDlgTrackFilter.h
@@ -62,6 +62,7 @@ class CDlgTrackFilter : public QDialog, private
Ui::IDlgTrackFilter
void modifyTimestamp(CTrack * trk);
void reduceDataset(CTrack * trk);
void splitTrack(CTrack * trk);
+ void applyLuaFilter(CTrack * trk);
CTrack &track;
};
#endif //CDLGTRACKFILTER_H
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 09b79dd..3fb3bad 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -4,6 +4,7 @@ option(WITH_OPENGL "BUILD OPENGL" ON)
option(WITH_EXIF "BUILD EXIF" ON)
option(WITH_DMTX "BUILD DMTX" ON)
option(WITH_GPSD "BUILD_GPSD" ON)
+option(WITH_LUA "BUILD_LUA" ON)
find_package(Qt4 REQUIRED)
if(WITH_OPENGL)
@@ -21,6 +22,10 @@ endif(WITH_DMTX)
if(WITH_GPSD)
find_package(GPSD)
endif(WITH_GPSD)
+if(WITH_LUA)
+ find_package(LUA51)
+ find_package(LUA50)
+endif(WITH_LUA)
if (NOT WIN32)
find_program(GDALWARP gdalwarp DOC "full path of the gdalwarp application")
@@ -484,11 +489,18 @@ ENDIF(EXIF_FOUND)
IF(DMTX_FOUND)
add_definitions(-DHAS_DMTX)
-else(EXIF_FOUND)
+else(DMTX_FOUND)
set(DMTX_INCLUDE_DIRS "")
set(DMTX_LIBRARIES "")
ENDIF(DMTX_FOUND)
+IF(LUA59_FOUND OR LUA51_FOUND)
+ add_definitions(-DHAS_LUA)
+else(LUA59_FOUND OR LUA51_FOUND)
+ set(LUA_INCLUDE_DIRS "")
+ set(LUA_LIBRARIES "")
+ENDIF(LUA59_FOUND OR LUA51_FOUND)
+
IF(GEO_DB)
add_definitions(-DHAS_GEODB -DDB_VERSION=8)
SET(qlandkarte_HDRS ${qlandkarte_HDRS} CGeoDB.h CDlgSelGeoDBFolder.h
CDlgEditFolder.h)
@@ -582,6 +594,7 @@ include_directories(
${EXIF_INCLUDE_DIRS}
${DMTX_INCLUDE_DIRS}
${GPSD_INCLUDE_DIRS}
+ ${LUA_INCLUDE_DIRS}
)
set(qlandkarte_ALLINP
@@ -645,6 +658,7 @@ target_link_libraries(
${EXIF_LIBRARIES}
${DMTX_LIBRARIES}
${GPSD_LIBRARIES}
+ ${LUA_LIBRARIES}
SerialPort
QMKToolBox
qzip
diff --git a/src/IDlgTrackFilter.ui b/src/IDlgTrackFilter.ui
index 8b600b2..2ba1b0b 100644
--- a/src/IDlgTrackFilter.ui
+++ b/src/IDlgTrackFilter.ui
@@ -402,7 +402,7 @@
</item>
</layout>
</widget>
- <widget class="QWidget" name="tab">
+ <widget class="QWidget" name="tabSplit">
<attribute name="title">
<string>Split Track</string>
</attribute>
@@ -500,6 +500,33 @@
</item>
</layout>
</widget>
+ <widget class="QWidget" name="tabLua">
+ <attribute name="title">
+ <string>Lua</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_5">
+ <item>
+ <widget class="QPlainTextEdit" name="editLua">
+ <property name="font">
+ <font>
+ <family>Courier</family>
+ <pointsize>14</pointsize>
+ </font>
+ </property>
+ <property name="plainText">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="checkLua">
+ <property name="text">
+ <string>Apply Lua filter on "OK"</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
</widget>
</item>
<item>
--
1.7.6.1
------------------------------------------------------------------------------
All of the data generated in your IT infrastructure is seriously valuable.
Why? It contains a definitive record of application performance, security
threats, fraudulent activity, and more. Splunk takes this data and makes
sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-d2dcopy2
_______________________________________________
Qlandkartegt-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/qlandkartegt-users