Navigation

    • Register
    • Login
        No matches found
    • Search
    1. Home
    2. lasselauch
    3. Best
    • Profile
    • More
      • Following
      • Followers
      • Topics
      • Posts
      • Best
      • Groups

    Best posts made by lasselauch

    RE: Access Bake Objects (Timeline) or Bake Animation to Curves

    Hi @bentraje,

    The thread about baking curves is still the right way to go if you want to be exact and want to bake other properties than PSR.

    However, if you're just interested in baking only your PSR, you can use doc.Record(), this works on all selected Objects since R19. You can take a look at the following example for baking Cubes with a Vibrate-Tag for example...:

    import c4d
    
    #https://developers.maxon.net/docs/Cinema4DPythonSDK/html/modules/c4d.documents/BaseDocument/index.html?highlight=executepasses#BaseDocument.ExecutePasses
    def SetCurrentTime(currentTime, doc):
        doc.SetTime(currentTime)
        doc.ExecutePasses(None, True, True, False, 0)    
    
    def main():
        minTime = doc[c4d.DOCUMENT_MINTIME]
        maxTime = doc[c4d.DOCUMENT_MAXTIME]
        fps = doc.GetFps()
        
        if minTime != maxTime:
            currentTime = minTime
            while (currentTime <= maxTime): 
                SetCurrentTime(currentTime, doc)
                print "Baking: Frame: %s" %(currentTime.GetFrame(fps))
                
                #New since version R19.
                #Records the active objects in the document.
                doc.Record()
                
                currentTime += c4d.BaseTime(1, fps)
    
    if __name__=='__main__':
        main()
    

    Oh, and accessing the "Bake Objects..." Dialog via Python is not possible!

    posted in Cinema 4D SDK •
    RE: Rename object by filename

    You just need to add a python tag to your object and paste the following code.

    Simple as that:

    import c4d
    
    def main():
        if not doc:
            return
        doc_name = doc.GetDocumentName()
    
        null = op.GetMain()
        if not null:
            return
    
        null.SetName(doc_name)
    

    Download here: null-docname.c4d

    Hope it helps.

    Cheers,
    Lasse

    posted in Cinema 4D SDK •
    RE: Logging in Cinema 4D

    Hi @blastframe,

    I'm using it currently more or less like this:

    The StreamHandler will print the result to the Python-Console and the FileHandler will write to disk. However, I'm also keen to know how to create my own LoggerInterface via Python. A simple example on this would be really appreciated.

    import c4d
    import os
    import logging
    
    def get_logger():
        plugin_name = "YourAwesomePlugin"
    
        #Logger for printing to Python-Console
        formatter1 = logging.Formatter('YourAwesomePlugin: [%(asctime)s] : %(module)s[%(lineno)s] : [%(levelname)s] "%(message)s"')
        handler = logging.StreamHandler()
        handler.setFormatter(formatter1)
        logger = logging.Logger(plugin_name)
        logger.addHandler(handler)
    
        #Logger for *.log file
        formatter2 = logging.Formatter('[%(asctime)s] : %(module)s[%(lineno)s] : [%(levelname)s] "%(message)s"')
        logpath = os.path.join(c4d.storage.GeGetC4DPath(c4d.C4D_PATH_DESKTOP), "MyLog.log")
        filehandler = logging.FileHandler(logpath)
        filehandler.setFormatter(formatter2)
        logger.addHandler(filehandler)
    
        return logger
    
    def main():
        logger = get_logger()
        
        logger.debug('This is a debug message')
        logger.info('This is an info message')
        logger.warning('This is a warning message')
        logger.error('This is an error message')
        logger.critical('This is a critical message')
    
    if __name__=='__main__':
        main()
    

    Cheers,
    Lasse

    posted in Cinema 4D SDK •
    RE: Python Source Protector: Can it be called via CLI?

    @kbar said in Python Source Protector: Can it be called via CLI?:

    I am going to bump this also.This function should be able to be called by command line. I would like to do this via my build system. By calling the cinema4d.exe, or c4dpy, with the python plugin path.

    PPLLEEEAASSSEEEE!

    posted in Cinema 4D SDK •
    RE: Different behaviour with Resource File? R20/R21

    Wow, after some investigating I noticed that apperently BitmapButtonCustomGui.SetImage changed in R21.

    https://developers.maxon.net/docs/Cinema4DPythonSDK/html/modules/c4d.gui/BaseCustomGui/BitmapButtonCustomGui/index.html?highlight=setimage#BitmapButtonCustomGui.SetImage

        def fillResetButtons(self, buttonid):
            button = self.FindCustomGui(buttonid, c4d.CUSTOMGUI_BITMAPBUTTON)
            icon = c4d.bitmaps.InitResourceBitmap(c4d.RESOURCEIMAGE_CLEARSELECTION)
            button.SetImage(icon, copybmp=True)
    

    I just had to set the copybmp to True which was False and seemed to worked fine in all other versions.

    posted in Cinema 4D SDK •
    RE: Move Tag Position in the Stack?

    Hi @bentraje,

    I came across this problem some time ago.
    Have a look at: https://www.lasselauch.com/c4d-quicktip-shift-tags/

    2018-07-12_11-55-22.gif

    import c4d
     
    def main():
        doc.StartUndo()
        sel = doc.GetActiveTags()
     
        for tag in sel:
            obj = tag.GetMain()
            taglist = obj.GetTags()
     
            for i, t in enumerate(taglist):
                if t in sel:
                    index = i+1
                    if index == len(taglist):
                        return
                    #print """Tag: %s || Index: %s""" % (t.GetName(), i)
                    doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                    obj.InsertTag(t, taglist[index])
     
        doc.EndUndo()
        c4d.EventAdd()
     
    if __name__=='__main__':
        main()
    

    This was essentially my approach, it’s not bulletproof but it works if you want to send multiple tags from one index to the next.

    Cheers,
    Lasse

    posted in Cinema 4D SDK •
    RE: Make Button Invisible And Still Occupies Space?

    Quick way could be:

    Setting GeDialog.Enable to False and depending on your Button changing the background color to transparent..?!

    posted in Cinema 4D SDK •
    RE: Best plugin type for background (thread) processing?

    Yeah, I'm looking into this as well...

    Ideally I want to run different function with a decorator: @execute_on_own_thread which would be very convenient.

    posted in Cinema 4D SDK •
    RE: Python Source Protector: Can it be called via CLI?

    Just wanted to bump this old thread.

    Any updates on this? Would love to see this in conjunction with c4dpy!

    Thanks & Cheers,
    Lasse

    posted in Cinema 4D SDK •
    Plugin not loaded in R23 on macOS

    Hello everyone,

    I'm currently having some issues with one of my plugins for R23.

    Sadly I can't reproduce the issue, but I have two customers that report the plugin can't be loaded within R23 and they are both on macOS.

    I've also provided them with a DEBUG version, but no luck. My guess is the main module will not be loaded at all...
    There's nothing useful written to the console at all.

    This is the plugin they are trying to load (you can use the TRY button to download):
    https://aescripts.com/aec4d/

    They also reported that this happens with other plugins as well... I know that @mikeudin Tools4D also has the same problem. @mikeudin if you want to chime in and report your findings... I'm pretty much lost here... haha.

    Cheers,
    Lasse

    posted in Cinema 4D SDK •
    RE: Arranging Objects by order of Object Manager

    My guess is that iterating over with enumerate BaseDocument.GetObjects(self) would be efficient enough..?

    For example:

    all_objs = doc.GetObjects()
    for i, obj in enumerate(all_objs):
        # Distance can be whatever float or integer
        your_dist = i * 27
        pos = c4d.Vector(your_dist, 0, 0) 
        obj.SetAbsPos(pos)
    
    posted in Cinema 4D SDK •
    RE: Arranging Objects by order of Object Manager

    I could make a recursive iteration to go through all of the document's objects but that would slow it down significantly...

    Yeah, but that's basically the way to go... Not sure if the following yields faster results:

    def get_next_element(op):
        if not op:
            return
        if op.GetDown():
            return op.GetDown()
        while (not op.GetNext()) and op.GetUp():
            op = op.GetUp()
        return op.GetNext()
    
    def main():
        obj = doc.GetFirstObject()
            
        while obj:
            # act on obj
            print(obj.GetName())
    
            obj = get_next_element(obj)
    

    Always wondered what approach would yield faster results...

    Feel free to do some testing, would love to hear your results. 🙂

    posted in Cinema 4D SDK •
    RE: How to find the CallCommand id for Redshift 'Convert and Replace with Nodes'

    AFK currently, but I think you can open the "Script Log..." from the Extensions Menu to check the ID's right!?

    posted in Cinema 4D SDK •