Skip to content
Snippets Groups Projects
toggle_wire.py 4.13 KiB
Newer Older
  • Learn to ignore specific revisions
  • # SPDX-License-Identifier: GPL-2.0-or-later
    
    class AMTH_VIEW3D_PT_wire_toggle(bpy.types.Panel):
        bl_space_type = 'VIEW_3D'
        bl_region_type = 'UI'
        bl_category = "View"
        bl_label = "Wireframes "
        bl_parent_id = "VIEW3D_PT_view3d_properties"
    
        def draw(self, context):
            layout = self.layout
    
            layout.use_property_split = True
            layout.use_property_decorate = False  # No animation.
    
            scene = context.scene
    
            row = layout.row(align=True)
            row.operator(AMTH_OBJECT_OT_wire_toggle.bl_idname,
                        icon="MOD_WIREFRAME", text="Display").clear = False
            row.operator(AMTH_OBJECT_OT_wire_toggle.bl_idname,
                        icon="X", text="Clear").clear = True
    
            layout.separator()
    
            col = layout.column(heading="Display", align=True)
            col.prop(scene, "amth_wire_toggle_edges_all")
            col.prop(scene, "amth_wire_toggle_optimal")
    
            col = layout.column(heading="Apply to", align=True)
            sub = col.row(align=True)
            sub.active = not scene.amth_wire_toggle_scene_all
            sub.prop(scene, "amth_wire_toggle_is_selected")
            sub = col.row(align=True)
            sub.active = not scene.amth_wire_toggle_is_selected
            sub.prop(scene, "amth_wire_toggle_scene_all")
    
    
    
    # FEATURE: Toggle Wire Display
    class AMTH_OBJECT_OT_wire_toggle(bpy.types.Operator):
    
        """Turn on/off wire display on mesh objects"""
        bl_idname = "object.amth_wire_toggle"
        bl_label = "Display Wireframe"
        bl_options = {"REGISTER", "UNDO"}
    
        clear: bpy.props.BoolProperty(
            default=False, name="Clear Wireframe",
            description="Clear Wireframe Display")
    
        def execute(self, context):
    
            scene = context.scene
            is_all_scenes = scene.amth_wire_toggle_scene_all
            is_selected = scene.amth_wire_toggle_is_selected
            is_all_edges = scene.amth_wire_toggle_edges_all
            is_optimal = scene.amth_wire_toggle_optimal
            clear = self.clear
    
            if is_all_scenes:
                which = bpy.data.objects
            elif is_selected:
                if not context.selected_objects:
                    self.report({"INFO"}, "No selected objects")
                which = context.selected_objects
            else:
                which = scene.objects
    
            if which:
                for ob in which:
                    if ob and ob.type in {
                            "MESH", "EMPTY", "CURVE",
                            "META", "SURFACE", "FONT"}:
    
                        ob.show_wire = False if clear else True
                        ob.show_all_edges = is_all_edges
    
                        for mo in ob.modifiers:
                            if mo and mo.type == "SUBSURF":
                                mo.show_only_control_edges = is_optimal
    
            return {"FINISHED"}
    
    
    def init_properties():
        scene = bpy.types.Scene
        scene.amth_wire_toggle_scene_all = bpy.props.BoolProperty(
            default=False,
            name="All Scenes",
            description="Toggle wire on objects in all scenes")
        scene.amth_wire_toggle_is_selected = bpy.props.BoolProperty(
            default=False,
            name="Only Selected Objects",
            description="Only toggle wire on selected objects")
        scene.amth_wire_toggle_edges_all = bpy.props.BoolProperty(
            default=True,
            name="Draw All Edges",
            description="Draw all the edges even on coplanar faces")
        scene.amth_wire_toggle_optimal = bpy.props.BoolProperty(
            default=False,
    
            name="Optimal Display Subdivision",
    
            description="Skip drawing/rendering of interior subdivided edges "
                        "on meshes with Subdivision Surface modifier")
    
    
    def clear_properties():
        props = (
            'amth_wire_toggle_is_selected',
            'amth_wire_toggle_scene_all',
            "amth_wire_toggle_edges_all",
            "amth_wire_toggle_optimal"
        )
        wm = bpy.context.window_manager
        for p in props:
            if p in wm:
                del wm[p]
    
    # //FEATURE: Toggle Wire Display
    
    
    classes = (
        AMTH_VIEW3D_PT_wire_toggle,
        AMTH_OBJECT_OT_wire_toggle
    )
    
    
    def register():
        init_properties()
    
    
        from bpy.utils import register_class
        for cls in classes:
            register_class(cls)
    
    
    def unregister():
        clear_properties()