Paste JSON Values on the Node Network?
-
Hi,
Recently learned that you can copy a node network (not just a node but a network) and paste it to a text editor, and it shows a JSON format.
So I wondering if its possible to retrieve this JSON format offdisk and load (i.e. paste it into the network) and consequently have the node network ready to go.
Performing a lot of
AddChild
andConnect
could work but using the already tried and proven network from the JSON file is much more easier and easier to debug.Is there a way around this?
-
@bentraje
I wrote the c4djson module to do what you described for ordinary c4d objects, but not for xpresso and node network(Neutron and node material). If it's impletmented, the json format maybe like this:{ "Node Graph Root": { "Node Identifier 1": { "Attr1": "Value1", "Attr2": "Value2", ... "In Ports": { "Port 1": {}, "Port 2": {}, ... }, "Out Ports": { "Port 1": {}, "Port 2": {}, ... }, }, "Node Identifier 2": {...}, ... "Connections": [ (OutPort, InPort), (OutPort, InPort), ... ] } }
There's not a decent way for the parser to define or find the ports. And some parameters dynamicly occur when connections made. So, the sequence of
node creating
parameters setting
andports connecting
must be carefully handled.Then too much more information is needed for node system, making things more complex.This goes against my original vision. From a certain point of view, the node system is essentially a kind of programming language, using json to serialize it seems stupid and superfluous. -
Thanks for the response. @iplai
your solution is definitely the ideal one and would have probably use it as a basis to create a node creation-json parser.
but at this time, I'm a bit pressed of time so I'm not any leisure to exploreI was hoping there is a
load json
method like hidden somewhere.
I mean the likehood that there is already an existing parser is high since you can copy and paste json already directly to the node editor, out of the box. -
Hello @bentraje,
Thank you for reaching out to us. What you want to do is not possible in the Python API, and at least not trivial in the C++ API.
Background
What you see there when you copy and paste the nodes, is the JSON serialization data format of the maxon API. It works similar to popular abstracted data type serialization systems, as for example the attribute driven XML serialization of C#. I.e., it can serialize almost any data structure and its values, not just nodes. The closest related concept in the classic API would be Resources, although they could only be used to deserialize GUIs and did not store any values (apart from strings), i.e., just stored the structure.
Realized is this with the interface contract DescribeIo, with which data can both be serialized (written from memory to disk) and deserialized (the other way).
DescribeIo
is a fairly low-level concept of the maxon C++ API. The more high-level concept isDataDescriptionInterface
. While some parts of this have been wrapped for Python, it has not been done to the extent required here. Added to this is that neitherGraphModelInterface
norGraphNode
are suchDataDescriptionInterface
and are instead serialized overNodeTemplateInterface
. So, in the end, you cannot instantiate aGraphNode
directly from a JSON file, even in C++.NodeTemplateInterface
has not been wrapped for Python, but I showed in the Asset API C++ docs how to create and load node assets. The loading part can be done in Python, the creating part not, due to some methods not being wrapped. But this all works over the serialized data stored in asset databases, not the raw JSON, but what a node template effectively stores is such JSON data.What you can do
Not much, unfortunately, direct node JSON serialization and deserialization is neither supported in the public C++ nor public Python API. You can of course try to start deserializing data yourself with the
json
module of Python, but we cannot provide any help with that.The most realistic thing would be a request for us to support
NodeTemplateInterface
in Python, so that you can load and store node setups programatically in a dummy or proper user database.Cheers,
Ferdinand -
Hi @ferdinand
Thanks for the confirmation.
No worries found a hack way to implement through python keyboard simulationSee illustration below. I can't upload MP4 so just dropbox link.
dl.dropbox.com/s/pp0lq208etyvix0/c4d312_load_json_c4d.mp4Maybe if I have extra time near the end I can use @iplai library for node json creation. Or maybe the C4D team has already implement one by then hehe
-
@bentraje
I misunderstood your question in my previous reply.
This is my trial:import c4d with open(r"Path\to\your\file.json") as f: c4d.CopyStringToClipboard(f.read()) # Paste command in Node Editor # Command ID can be got by Script Log c4d.CallCommand(465002305)
-
ah yep. I'll probably use this one since it does not require third party library. haha.
Thanks for the illustration!