Using Console Variable in the Script Manager?
-
Hi,
Is it possible to use Console Variable in the Script Manager?
You can see what I am after in this video:
https://www.dropbox.com/s/13cma0qm8h7w4gn/c4d273_console_variable_in_script_manager_python.mp4?dl=0I don't mind if the method is "not ideal". I'm only using this on few isolated operations.
My use case is defining the variable fromDocument B
but using that same variable inDocument A
-
Hi,
I am not quite sure if I understand you correctly here, but generally speaking, no, you cannot access attributes of the module of Cinema's live interpreter from some other module. The usual way to send something from document A to document B would be using Cinema's message system. But if you do not want to do this, you can simply insert your data into the interpreter. There are multiple places you can choose from and they are all equally bad. Here is an example for inserting data as fake modules into the modules dictionary of the interpreter, which at least looks somewhat gracefully. But this is generally a bad idea, you have been warned.
Cheers,
zipit"""Put this into the script manager and run it twice. The first time it will say that it did not find any data and instead stored some, and the second time it will retrieve this data. You should keep in mind that this data is only as long present as long Cinema does not restart its Python Virtual Machine (which to my knowledge does not happen, but you never know). This (obviously) also means that this won't work with running c4dpy from the console in any fashion. Cinema's message system or simply writing the data to file would be much more suitable solutions. If you are using this, you should at least clean up the module dictionary after you are done. """ # We try to access our data by importing them. try: import some_string import some_object print "Found data:" print some_string print some_object # If no data is present, we write into the system module dictionary. except: import types import sys # Some data floating around we want to pass around in the interpreter. SOME_STRING = "Bob is your uncle." SOME_OBJECT = [3, 1, 4, 1, 5] # Now comes the really, really, really, ..., really bad stuff. We # just insert our data into the module dictionary. for name, data in (("some_string", SOME_STRING), ("some_object", SOME_OBJECT)): # Make sure we do not overwrite anything important. if name not in sys.modules: sys.modules[name] = data # The assumption here is that if something is there and it is not a # module, we probably put it there ourselves. elif not isinstance(sys.modules[name], types.ModuleType): sys.modules[name] = data # From now on we can import this data from anywhere, as long as the # interpreter instance is kept alive. print "No data was present, inserted data into the module dictionary."```
-
hi,
there's no possibilities to do it. The console and the script manager doesn't share the same context.
What you want to achieve is not clear to me. Maybe doing something like a copy/paste ?
The only place inside cinema4D where you can share data between document is the world Container but it's not really the right place to do it neither.
Cheers,
Manuel -
@m_magalhaes
Thanks for the confirmation. Although what zipit provided also works for my use case (i.e. defining the variable from Document B but using that same variable in Document A)@zipit
Thanks for the code. It works as expected