Creating python plugin results in error



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 26/01/2011 at 14:49, xxxxxxxx wrote:

    The error i'm getting is: "Could not initialize global resource for the plugin"

    I'm new to C4D using Python and am a little frustrated just trying to register a helloworld plugin.
    using version R12.032 on Win7 box

    code:
    import os
    import sys
    import c4d
    from c4d import plugins, documents, utils

    PLUGIN_ID = 1000010

    class myFirstPlugin(c4d.plugins.ObjectData) :

    def Init(self, op) :
            c4d.gui.MessageDialog("Hello World")

    if __name__ == "__main__":
        bmp = c4d.bitmaps.BaseBitmap()
        dir, file = os.path.split(__file__)
        fn = os.path.join(dir, "res", "test.tif")
        bmp.InitWith(fn)

    try:
            result = c4d.plugins.RegisterObjectPlugin(
                id = PLUGIN_ID, 
                str = "myFirstPlugin", 
                g = myFirstPlugin,      
                description = "foo", 
                info = c4d.OBJECT_GENERATOR | c4d.OBJECT_INPUT, 
                icon = bmp
            )
            c4d.gui.MessageDialog("result is: " + result)
        except:
            exctype, value = sys.exc_info()[:2]
            c4d.gui.MessageDialog(value)



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 26/01/2011 at 16:25, xxxxxxxx wrote:

    Got it.  I was missing a required file in my res folder:
    c4d_symbols.h



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 26/01/2011 at 16:40, xxxxxxxx wrote:

    Yeah, that one always has to be there, as well as C4D_string.str.
    Some with C++ plugins.



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 27/01/2011 at 06:44, xxxxxxxx wrote:

    Just a small addition: If you want to register a plugin not from the main *.pype, you have to redirect __res__ to the other modules scope.



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 29/03/2011 at 06:11, xxxxxxxx wrote:

    Originally posted by xxxxxxxx

    Just a small addition: If you want to register a plugin not from the main *.pype, you have to redirect __res__ to the other modules scope.

    what does this mean?
    what would be the scope for a .py, or .pyp



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 30/03/2011 at 06:12, xxxxxxxx wrote:

    This is only important if you register plugins outside the *.pyp file.



  • On 05/01/2013 at 10:00, xxxxxxxx wrote:

    Originally posted by xxxxxxxx

    Just a small addition: If you want to register a plugin not from the main *.pype, you have to redirect __res__ to the other modules scope.

    could someone explain that for me, i know what a scope is and i know what the res folder is, but
    this doesn't make any sense for me. i have got the following plugin structure.

    pluginfolder
    ---res
    ---mainplugin.pyp
    ---subfolder
    ------myNodes.pyp

    and i want to register plugins from myNodes.pyp.

    import os, sys, time
      
    __root__ = os.path.dirname(os.path.dirname(__file__))
    if os.path.join(__root__, 'modules') not in sys.path: sys.path.insert(0, os.path.join(__root__, 'modules'))
      
    import c4d, eCon, cHelp
    from c4d import bitmaps, plugins, documents
      
    # --------------------------------------------------------------------------------------------------------
    # Base node class (dummy)
    # --------------------------------------------------------------------------------------------------------
    class OFhBaseNode(plugins.ObjectData) :
    ...
      
    # --------------------------------------------------------------------------------------------------------
    # Entry point
    # --------------------------------------------------------------------------------------------------------
    if __name__ == "__main__":
      
    ...
      
        plugins.RegisterObjectPlugin(id          = eCon.ID_ENR_BASENODE,
                                     str         = "fhBaseNode",
                                     g           = OFhBaseNode,
                                     description = "ofhbasenode", 
                                     icon        = None,
                                     info        = c4d.OBJECT_GENERATOR)
    

    for the last line (info = c4d.OBJECT_GENERATOR), the console returns the following.

    RuntimeError: Could not initialize global resource for the plugin.

    I am not sure what i am meant to do. When i do not use subfolders my code works as expected, 
    but when i use subfolders to structure the plugins in the menu i run into this problem.
    edit : this also just hapens to the NodeData plugins , i have got a folder with a file with a bunch 
    of CommandData plugins which are being loaded without any errors.



  • On 05/01/2013 at 20:07, xxxxxxxx wrote:

    Hi Ferdinand,

    the __res__ variable is available globally in a *.pyp file and is an instance of the
    c4d.plugins.GeResource class. An instance of this class "represents the contents
    of the plugins res folder folder" (if one can say it like this..)

    It is necessary to load the NodeData's description. This is the reason why the
    CommandData plugins don't cause any problems. If you do not pass the res
    argument to a function registering a NodeData plugin, the object pointed to
    by the __res__ variable is taken instead. If you register a NodeData plugin not
    from a *.pyp file, you need to explicitly pass the __res__ from the *.pyp to the
    plugin registration function.

    Best,
    Niklas

    PS: This information was just written down from scratch, I don't give a warranty
    for possible minor issues. ;-)



  • On 06/01/2013 at 04:15, xxxxxxxx wrote:

    hi nikklas,

    by now i definitely owe you a beer 😂. worked like i charm, maxon should pay you :)
    just to help people who might search for this in the future, here is the 'fix' for my
    problem (you would have to adjust it to your actual folder structure, this is just one
    up).

    import os, sys, time
      
    __root__ = os.path.dirname(os.path.dirname(__file__))
    if os.path.join(__root__, 'modules') not in sys.path: sys.path.insert(0, os.path.join(__root__, 'modules'))
      
    import c4d, eCon, cHelp
    from c4d import bitmaps, plugins, documents
      
    __res__ = c4d.plugins.GeResource()
    __res__.Init(__root__)
    ...
    

Log in to reply