1
$\begingroup$

Transform orientations in Blender 2.80 are marked as read-only. What is the proper way to provide a custom matrix as a transform orientation in 2.80?

It looks like this call is needed to create a new orientation, which has a .matrix attribute which is NOT read only. Is this the intended usage? The user interface and docs for this don't make it clear.

$\endgroup$

2 Answers 2

2
$\begingroup$

It appears that the custom_orientation field of the slot is only valid if the slot type is set to the name of the custom orientation. Also, somewhere I saw a post that said that slot 0 is the slot for the 3D view's Transform Orientation. If so, searching for the correct slot shouldn't be necessary.

I really needed this feature, so this is how I did it. Assume m contains the matrix for the new orientation.

# Create view for manual alignment along baseline.
bpy.ops.transform.create_orientation(name="BASELINE", overwrite=True)
### Set baseline
slot = C.scene.transform_orientation_slots[0]
# Save current orientation setting
last_slot = slot.type
# Set new orientation (custom_orientation isn't available until we set the
# type to a custom orientation)
slot.type = 'BASELINE'
slot.custom_orientation.matrix = m
# Set orientation back to what it was
slot.type = last_slot

I haven't tested it a lot yet, but it appears to work.

$\endgroup$
1
$\begingroup$

Here's a working solution/snippet, with a description below:

        orthonormal_basis_matrix = mathutils.Matrix(
            [
                [vcross[0], vnorm[0], vdest[0]],
                [vcross[1], vnorm[1], vdest[1]],
                [vcross[2], vnorm[2], vdest[2]]
            ]
        )
        bpy.ops.transform.create_orientation(
            name='MAPlus',
            use=active_item.apl_use_custom_orientation,
            overwrite=True
        )
        orient_slot = [
            slot for slot in
            bpy.context.scene.transform_orientation_slots
            if slot.custom_orientation
               and slot.custom_orientation.name == 'MAPlus'
        ]
        if orient_slot:
            orient_slot[0].custom_orientation.matrix = orthonormal_basis_matrix
        else:
            print('Error: Could not find MAPlus transform orientation...')
  • Call create_transformation to add a named transformation
  • Use a list comprehension to search through the available bpy.context.scene.transform_orientation_slots for a slot having a custom_orientation (TransformOrientation object) with the name you provided
  • Test whether the list comprehension/search came up with any results, then use the discovered object and set its matrix
$\endgroup$
1
  • $\begingroup$ transform_orientation_slots doesn't appear to work that way. custom_orientation appears to only get set in slot 0, and then only if a custom orientation is currently selected. $\endgroup$
    – Jabberwock
    Commented Oct 12, 2020 at 2:41

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .