[Helper] Symbols Parser for Dialog implementation
Helper last edited by
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 15/03/2012 at 14:16, xxxxxxxx wrote:
It is annoying to hardcode all symbols from the res/c4d_symbols.h file directly into the Python plugin file. This is a little helper I wrote to make things easier. You just give it a file or filename and it extracts all symbols it can find. This way you don't need to write pesky definitions (that might even change!) at the top of your source.
You are allowed to copy, use and modify the code but please don't expose it as your own written peace of code.
Here's an example of how to use the class:
import os import c4d dirname = os.path.dirname(__file__) respath = os.path.join(dirname, 'res', 'c4d_symbols.h') # Create a SymbolsContainer and parse the c4d_symbols.h directly res = SymbolsContainer(filename = respath) class Dialog(c4d.gui.GeDialog) : def CreateLayout(self) : # NOTE: ID_DIALOG is a symbol from c4d_symbols.h return self.LoadDialogResource(res.ID_DIALOG) def Command(self, id, msg) : # NOTE: Again, SOME_DIALOG_GADGET is a symbol from c4d_symbols.h if id == res.SOME_DIALOG_GADGET: doStuff() return True
import re class SymbolsContainer(object) : """ This class implements parsing a ``c4d_symbols.h`` file and inserting the data into a dictionary to access these value. Direct access is implemented via ``__getattr__``. The parsing is implemented using a single regular expression and is therefore not checking wether the parsed file is actually a valid C header file. """ # The regular expression used to match the enumeration in a # ``c4d_symbols.h`` file. enum_match = re.compile('\s*(\w* )\s*(,\s*|=\s*(\d* )\s*,)\n') def __init__(self, **ontoParse) : self.values = dict() if ontoParse: self.parse(**ontoParse) def __getattr__(self, name) : return self.values[name] def parse(self, file = None, filename = None, storage = None) : """ Use this method to parse a file given by its ``filename`` or a file-like object. The values are inserted into the calling container, unless ``storage`` is given which will then be used to store the parsed data. """ if file and filename: raise ValueError("Either `file` or `filename` must be set, both given.") elif file: pass elif filename: file = open(filename) else: raise ValueError("Either `file` or `filename` must be set, none given.") last_value = 0 storage = storage if hasattr(storage, "__setitem__") else self.values for line in file: match = self.enum_match.match(line) if not match: continue groups = match.groups() ename = groups if groups: last_value = int(groups) storage[ename] = last_value last_value += 1 if filename: file.close() return True