Solved How to load a file with python and turn it into the active document ?


I am a total beginner in python ... so this might be easy :)

I am using C4D Release 20 and looking for a way to import files and then work with the files as if they where actually in my C4D Editor. With that I mean I want to work with those CallCommands etc. I know that´s not the pro way but... I am not a pro yet ;) Down below you se the code so far.

The issue now is that this line:

c4d.documents.LoadDocument(sk_doc, loadflags = 0)

...does not really load the file into a state where I can work with it. At this point my editor still shows my empty "BaseDocument" and if I try to "GetActiveDocument" I get a FALSE boolean return. So for python I still have loaded nothing it seams.

I allready tried all sorts of other "loading" methods as you can see here:

So somehow I think I need to get the loaded file out of some obscure hidden "position/state" into the state of the "ActiveDocument". So I added those lines here:


But with them I get a "TypeError: argument 1 must be c4d.documents.BaseDocument, not str"

And I have no idea how to change the file URL into a "c4d.documents.BaseDocument"-Type...

Any idea anybody?



import c4d
import os
from c4d import gui
from c4d import documents

# Main function
def main():

    def tool():
        return c4d.plugins.FindPlugin(doc.GetAction(), c4d.PLUGINTYPE_TOOL)

    def object():
        return doc.GetActiveObject()

    def tag():
        return doc.GetActiveTag()

    def renderdata():
        return doc.GetActiveRenderData()

    def prefs(id):
        return c4d.plugins.FindPlugin(id, c4d.PLUGINTYPE_PREFS)

    # Set Variables for pathes with dialog
    c4d.gui.MessageDialog("Please select the folder with the BVH files.", type = 0)
    sk_sourcefolder = = 2)
    c4d.gui.MessageDialog("Please select the destination folder for the converted .c4d files.", type = 0)
    sk_exportfolder = = 2)

    # Listing and filtering all .bvh files in directory
    sk_filteredfiles = filter(lambda x: x.endswith(".bvh"), os.listdir(sk_sourcefolder))

    # Loop through selected directory
    for file in sk_filteredfiles:

        # Load and activate current project from list
        sk_doc = file
        print sk_doc
        c4d.documents.LoadDocument(sk_doc, loadflags = 0)

        # Set Render Settings
        c4d.CallCommand(600000098) # Projectname_As_Rendername
        c4d.CallCommand(12161) # Edit Render Settings...
        renderdata()[c4d.RDATA_RENDERENGINE] = 300001061 # Use Hardware OpenGL
        renderdata()[c4d.RDATA_XRES] = 400 # X Render Resolution
        renderdata()[c4d.RDATA_YRES] = 400 # Y Render Resolution
        renderdata()[c4d.RDATA_FRAMERATE] = doc[c4d.DOCUMENT_FPS]
        renderdata()[c4d.RDATA_FRAMESEQUENCE] = 3 # Preview Range als Render Range

... much more but irrelevant code for the current issue...

I have replied your post at C4DCafe.

"The c4d.documents.LoadDocument returns you a BaseDocument, which you then need as argument for the InsertBaseDocument and SetActiveDocument."