SOLVED Python Plugin Unicode Convert

Hey Y'all,

I'm running into an issue with a JSON encoding bit, I'm getting a type error of this

TypeError: unable to convert unicode to @net.maxon.interface.url-C

I am trying to read a JSON file into cinema and make it a path in the plugin, below is the current code I have

import os
from os import listdir
from os.path import isfile, join
def import_objs(OBJ_LIST):
    global SETTINGS
    FILES           = [f for f in listdir(LIBPATH) if isfile(join(LIBPATH, f))]
    for OBJ in OBJ_LIST:
        OBJ_FILENAME    = OBJ[0] + ".c4d"
        if OBJ_FILENAME in FILES:
            FILEPATH = os.path.join(LIBPATH,OBJ_FILENAME)
            c4d.documents.MergeDocument(doc, FILEPATH, c4d.SCENEFILTER_OBJECTS | c4d.SCENEFILTER_MATERIALS, None)
    return True

Any thoughts?




with the information provided here it is rather hard to give you an answer (at least for me). You should provide:

  1. The full trace-back. I assume the exception is raised on c4d.documents.MergeDocument(...?
  2. Provide the full code or explain the environment if that is not possible.

No offense intended, but you also might want to stick to naming conventions, upper case symbols are universally reserved for global constants in all languages.

With that out of the way:

  1. My initial association for the given exception was that you wrote a file name as a string into a c4d.BaseContainer and Cinema is complaining about that (use BaseContainer.SetFilename instead of __setitem__ for that case).
  2. You also should check if FILEPATH forms an existing and valid path (LIBPATH could be malformed).


Hey Zipit!

Thanks for the response, I actually completely overlooked the fact that I had to convert it to a string......(insert hammer on head here)

Note to self hahaha!

Stay safe out there!



Just to add on top,
os.path.listdir and os.path.join in python 2 are context-specific, so if you input a Unicode string it will output a Unicode string, if you input a regular string it will output a regular string.
Now the culprit is on c4d.documents.MergeDocument because normally this method accepts a C++ Filename object (which is the Classic API that under the hood uses the new MaxonAPI maxon::Url). Unfortunately, the Python parser is not able to convert from a Python Unicode string to a C++ Filename, but only from a Python ASCII string to a filename.

So indeed casting from Unicode string to ASCII is the solution.