Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    [Helper] Symbols Parser for Dialog implementation

    Scheduled Pinned Locked Moved PYTHON Development
    1 Posts 0 Posters 162 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H Offline
      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
      

      _<_h2_>_Source _<_h2_>_/h2>

      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[0]  
                if groups[2]: last_value = int(groups[2])  
        
                storage[ename] = last_value  
                last_value    += 1  
        
            if filename:  
                file.close()  
        
            return True
      

      -Niklas

      1 Reply Last reply Reply Quote 0
      • First post
        Last post