I have an Add-On which resides in the N-Panel of the View_3D window. From this Add-on, I would like to manipulate the current view with buttons.

As there are many View_3D view ports in Blender and all of them has my Add-on in their respective N-Panel, I need to find out in which of those View_3D windows was the button pressed so I can manipulate the view matrix of that view port.

Is there a simple way to get that screen without fiddling with the location of the mouse pointer?


1 Answer 1


Three ways to get the active SpaceView3D link


This works because all sidebars are part of an area View3D. No need to override the context here. For matrix you need datas from View3D.region_3d [RegionView3D] link

import bpy

### UI                      
class TEST_PT_Panel(bpy.types.Panel):
    bl_idname = 'TEST_PT_Panel'
    bl_label = "Test Panel"                      
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'UI'
    bl_category = "TEST"
    def draw(self, context):
        tool = context.scene.tool     
        layout = self.layout
        layout.prop(tool, 'bool')
        layout.operator('test.operator', text="Test Operator")

class TEST_OT_Operator(bpy.types.Operator):
    bl_idname = 'test.operator'
    bl_label = "Test Operator"
    bl_description = "...testing"    
    def execute(self, context):

      # get active space:
        activeA = context.space_data
        activeA.overlay.show_overlays = not activeA.overlay.show_overlays  

        activeB = context.area.spaces.active
        activeB.show_gizmo = not activeB.show_gizmo  

        activeC = context.area.spaces[0]
        activeC.show_region_toolbar = not activeC.show_region_toolbar                  

      # get matrix example

        r3d = activeA.region_3d
        view_mat = r3d.view_matrix
        print("view matrix: ", view_mat)

        return {'FINISHED'}        

class Test_Properties(bpy.types.PropertyGroup):
    bool : bpy.props.BoolProperty(default=False)
classes = (

def register():
    from bpy.utils import register_class
    for cls in classes:
    bpy.types.Scene.tool = bpy.props.PointerProperty(type=Test_Properties)
def unregister():
    from bpy.utils import unregister_class
    for cls in reversed(classes):
if __name__ == "__main__":
  • $\begingroup$ Thank you. Now I stumbled on to the next problem. I wanted to apply the matrix from a camera to the view_matrix but obviously they are not "interchangeable" as the view is 90° turned (X axis) and mirrored on the Y axis. How do the Matrix of a camera relate to the region_3d.view_matrix? $\endgroup$
    – Steve
    Commented Mar 4, 2023 at 14:42
  • 1
    $\begingroup$ I figured it out. The camera matrix needs to be inverted. ( view_matrix.inverted() ) $\endgroup$
    – Steve
    Commented Mar 4, 2023 at 16:54

You must log in to answer this question.

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