IC Python API:Saving JSON

From Reallusion Wiki!
Revision as of 22:20, 8 March 2020 by Chuck (RL) (Talk | contribs) (Global Variables)

Jump to: navigation, search
Main article: RL Python Samples.
Related article: Loading JSON.

This article will go over the handling of JSON formatted data for iClone. This is done by saving transformational data for all the props in the current iClone scene to an external .json file.

Necessary Modules

Besides the fundamental Reallusion Python module, we'll also need Pyside2 to build the user interface, os to read/write to file, and json to interpret/convert JSON data.

import RLPy
import os
import json

Global Variables

Now we'll need some global variables for inputting object transformation data, creating an "exclusion" list for objects we don't want, and listing all the props in the scene; among other things.

data = {"props": []}  # Empty array to store object data
time = RLPy.RTime(0)
decimal_places = 3  # How accurately do we want to store the transform data?
exclusions = ["Shadow Catcher "]  # Create a list objects to ignore when saving
all_props = RLPy.RScene.FindObjects(RLPy.EObjectType_Prop)

Notice that we have an optional decimal_places variable to control the accuracy of the stored data.

Recording Transform Data

for prop in all_props:
    if prop.GetName() in exclusions:
        continue
    control = prop.GetControl("Transform")
    data_block = control.GetDataBlock()
    data["props"].append(
        {"Name": prop.GetName(),
         "Position": {
            "x": round(data_block.GetData("Position/PositionX", time).ToFloat(), decimal_places),
            "y": round(data_block.GetData("Position/PositionY", time).ToFloat(), decimal_places),
            "z": round(data_block.GetData("Position/PositionZ", time).ToFloat(), decimal_places)
        },
            "Rotation": {
            "x": round(data_block.GetData("Rotation/RotationX", time).ToFloat(), decimal_places),
            "y": round(data_block.GetData("Rotation/RotationY", time).ToFloat(), decimal_places),
            "z": round(data_block.GetData("Rotation/RotationZ", time).ToFloat(), decimal_places)
        },
            "Scale": {
            "x": round(data_block.GetData("Scale/ScaleX", time).ToFloat(), decimal_places),
            "y": round(data_block.GetData("Scale/ScaleY", time).ToFloat(), decimal_places),
            "z": round(data_block.GetData("Scale/ScaleZ", time).ToFloat(), decimal_places)
        }
        }
    )

Saving the JSON File

# Prepare the filepath and save the json file
file_name = "all_prop_transformations.json"

local_path = os.path.dirname(os.path.realpath(__file__))
json_file_path = os.path.join(local_path, file_name)

with open(json_file_path, "w") as json_file:
    json.dump(data, json_file)

Reading Back the JSON File

# Read back the data and pretty print it in the console
with open(json_file_path, "r") as json_file:
    data_in = json.load(json_file)
    print(json.dumps(data_in, indent=4, sort_keys=True))