diff options
author | Sebastian Koslowski <koslowski@kit.edu> | 2015-06-09 14:07:50 +0200 |
---|---|---|
committer | Sebastian Koslowski <koslowski@kit.edu> | 2015-07-17 16:45:17 +0200 |
commit | b82987acb6b1e4c368384753c43ad4d2a373659f (patch) | |
tree | 05d95491cfe95e3cdc0f2cbc54dabc918ab96892 | |
parent | d5ce8528b5df758012a4c16eb2816af2bb853054 (diff) |
grc: add struct variable block
-rw-r--r-- | grc/blocks/.gitignore | 1 | ||||
-rw-r--r-- | grc/blocks/CMakeLists.txt | 22 | ||||
-rw-r--r-- | grc/blocks/variable_struct.xml.py | 98 |
3 files changed, 120 insertions, 1 deletions
diff --git a/grc/blocks/.gitignore b/grc/blocks/.gitignore new file mode 100644 index 0000000000..2ac4a79e69 --- /dev/null +++ b/grc/blocks/.gitignore @@ -0,0 +1 @@ +variable_struct.xml diff --git a/grc/blocks/CMakeLists.txt b/grc/blocks/CMakeLists.txt index 98b6512a09..0c2a1f7901 100644 --- a/grc/blocks/CMakeLists.txt +++ b/grc/blocks/CMakeLists.txt @@ -18,6 +18,26 @@ # Boston, MA 02110-1301, USA. ######################################################################## +include(GrPython) + file(GLOB xml_files "*.xml") -install(FILES ${xml_files} DESTINATION ${GRC_BLOCKS_DIR} COMPONENT "grc") +macro(GEN_BLOCK_XML _generator _xml_block) + set(generator ${CMAKE_CURRENT_SOURCE_DIR}/${_generator}) + set(xml_block ${CMAKE_CURRENT_BINARY_DIR}/${_xml_block}) + list(APPEND generated_xml_files ${xml_block}) + add_custom_command( + DEPENDS ${generator} OUTPUT ${xml_block} + COMMAND ${PYTHON_EXECUTABLE} ${generator} ${xml_block} + ) +endmacro(GEN_BLOCK_XML) + +GEN_BLOCK_XML(variable_struct.xml.py variable_struct.xml) + +add_custom_target(grc_generated_xml ALL DEPENDS ${generated_xml_files}) + +install( + FILES ${xml_files} ${generated_xml_files} + DESTINATION ${GRC_BLOCKS_DIR} + COMPONENT "grc" +) diff --git a/grc/blocks/variable_struct.xml.py b/grc/blocks/variable_struct.xml.py new file mode 100644 index 0000000000..e43200828b --- /dev/null +++ b/grc/blocks/variable_struct.xml.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python + +MAX_NUM_FIELDS = 20 + +HEADER = """\ +<block> + <name>Struct Variable</name> + <key>variable_struct</key> + <category>Variables</category> + <import>def struct(data): return type('Struct', (object,), data)()</import> + <var_make>self.$id = $id = struct({{#slurp +#for $i in range({0}): +#set $field = $getVar('field' + str(i)) +#if len(str($field)) > 2 +$field: $getVar('value' + str(i)), #slurp +#end if +#end for +}})</var_make> + <var_value>struct({{#slurp +#for $i in range({0}): +#set $field = $getVar('field' + str(i)) +#if len(str($field)) > 2 +$field: $getVar('value' + str(i)), #slurp +#end if +#end for +}})</var_value> + <make></make> +""" + +FIELD0 = """\ + <param> + <name>Field 0</name> + <key>field0</key> + <value>field0</value> + <type>string</type> + <hide>part</hide> + <tab>Fields</tab> + </param> +""" + +FIELDS = """\ + <param> + <name>Field {0}</name> + <key>field{0}</key> + <value></value> + <type>string</type> + <hide>part</hide> + <tab>Fields</tab> + </param> +""" + +VALUES = """\ + <param> + <name>$field{0}()</name> + <key>value{0}</key> + <value>0</value> + <type>raw</type> + <hide>#if $field{0}() then 'none' else 'all'#</hide> + </param> +""" + +CHECKS = """\ + <check>($str($field{0}) or "a")[0].isalpha()</check> + <check>($str($field{0}) or "a").isalnum()</check> +""" + +FOOTER = """\ + <doc>This is a simple struct/record like variable. + +Attribute/field names can be specified in the tab 'Fields'. +For each non-empty field a parameter with type raw is shown. +Value access via the dot operator, e.g. "variable_struct_0.field0" + </doc> +</block> +""" + + +def make_xml(num_fields): + return ''.join(( + HEADER.format(num_fields), + FIELD0, ''.join(FIELDS.format(i) for i in range(1, num_fields)), + ''.join(VALUES.format(i) for i in range(num_fields)), + ''.join(CHECKS.format(i) for i in range(num_fields)), + FOOTER + )) + + +if __name__ == '__main__': + import sys + try: + filename = sys.argv[1] + except IndexError: + filename = __file__[:-3] + + data = make_xml(MAX_NUM_FIELDS) + + with open(filename, 'w') as fp: + fp.write(data.encode()) |