140 lines
4.2 KiB
Python
140 lines
4.2 KiB
Python
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
import bpy
|
|
|
|
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()
|
|
|
|
from bpy.utils import unregister_class
|
|
for cls in classes:
|
|
unregister_class(cls)
|