Here's a proof of concept that should get you started.
In this example I didn't need to create properties, I just extract the scatterer data and use it to set the attributes of the created combiners.
python code
def get_scatterer_data(sc):
"""
Extract the following data, as a tuple, from the specified scatterer `sc`.
- data[0]: instance IDs
- data[1]: support point IDs
- data[2]: instance translation
- data[3]: instance rotation
- data[4]: instance scale
- data[5]: instance object
Returns None on failure.
"""
if not sc or not sc.is_kindof("SceneObjectScatterer"):
ix.log_warning("Please select a Scatterer.")
return None
scmod = sc.get_module()
instance_count = scmod.get_instance_count()
if instance_count == 0:
ix.log_warning("Scatterer is empty")
return None
# scatterer's source objects
base_objects = scmod.get_base_objects() # type = ix.api.ModuleSceneObjectArray
instance_ids = scmod.get_instances() # type = ix.api.UIntArray
support_ids = scmod.get_support_point_indices() # type = ix.api.UIntArray
t = ix.api.GMathVec3dArray(instance_count)
r = ix.api.GMathVec3dArray(instance_count)
s = ix.api.GMathVec3dArray(instance_count)
objects = ix.api.CoreStringArray(instance_count)
for i in range(instance_count):
m = scmod.get_instance_matrix(i)
# extract translation
ix.api.GMathMatrix4x4d.extract_translation(m, t[i])
# extract rotation
# warning rotation are not normalized, they are between [-180, 180]
ix.api.GMathMatrix4x4d.compute_euler_angles(m, r[i])
# extract scale
ix.api.GMathMatrix4x4d.extract_scaling(m, s[i])
# get instanced object
objects[i] = base_objects[instance_ids[i]].get_object().get_full_name()
# for debug
#print("#{}: instance ID = {}, support ID = {}, T = {}, R = {}, S = {}, object = '{}'".format(i, instance_ids[i], support_ids[i], t[i], r[i], s[i], objects[i]))
return (instance_ids, support_ids, t, r, s, objects)
#scatterer = ix.selection[0]
scatterer = ix.get_item('build://project/scene/scatterer')
data = get_scatterer_data(scatterer)
if data:
assert len(data) == 6, "Invalid scatterer data."
instance_ids = data[0] # unused in this example
support_ids = data[1] # unused in this example
t = data[2]
r = data[3]
s = data[4]
objects = data[5]
output_ctx_path = "build://project/bake"
# optional: clear existing output context
output_ctx = ix.item_exists(output_ctx_path)
if output_ctx:
ix.cmds.DeleteItem(output_ctx_path)
# create output context
output_ctx = ix.cmds.CreateContext("bake", "", "build://project")
assert output_ctx, "Failed to create the output context."
instance_count = instance_ids.get_count()
for i in range(instance_count):
# create the combiner
combiner_name = "baked_combiner_{}".format(i)
combiner = ix.cmds.CreateObject(combiner_name, "SceneObjectCombiner", "Global", output_ctx.get_full_name())
assert combiner, "Failed to create combiner #{}".format(i)
# set combiner kinematics
combiner.get_attribute("translate").set_vec3d(t[i])
combiner.get_attribute("rotate").set_vec3d(r[i])
combiner.get_attribute("scale").set_vec3d(s[i])
# set the combiner object
ix.cmds.AddValues([combiner.get_full_name() + ".objects"], [objects[i]])
Let us know if you need further help.
Cheers,