import bpy
from ... icons import get_icon_id
from ... utils.addons import addon_exists
from ... utility import addon
class HOPS_MT_Export(bpy.types.Menu):
bl_idname = "HOPS_MT_Export"
bl_label = "Export Options"
def draw(self, context):
layout = self.layout
col = layout.column(align=True)
box = layout.column(align=True)
if (3, 2, 0) <= bpy.app.version: #new exporter in 3.2.0
ot = box.operator("wm.obj_export", text="OBJ")
ot.export_selected_objects = True
ot.export_triangulated_mesh = True
else:
ot = box.operator("export_scene.obj", text="OBJ")
ot.use_selection = True
ot.use_triangles = True
ot = box.operator("export_scene.fbx", text="FBX")
ot.use_selection = True
ot = box.operator("wm.alembic_export", text="ABC")
ot.selected = True
# Material
class HOPS_MT_MaterialListMenu(bpy.types.Menu):
bl_idname = "HOPS_MT_MaterialListMenu"
bl_label = "Material list"
@classmethod
def poll(cls, context):
return context.object
def draw(self, context):
layout = self.layout
preference = addon.preference().ui
col = layout.column(align=True)
object = context.active_object
filepathprefs = bpy.context.preferences.filepaths
# draw dot name toggle at the top of the menu
col.prop(filepathprefs, 'show_hidden_files_datablocks', text="hide .names")
col.separator()
col.operator_context = 'INVOKE_DEFAULT'
col.operator("material.hops_new", text = 'Add Blank Material', icon="PLUS")
col.operator_context = 'INVOKE_DEFAULT'
col.operator("hops.material_scroll", text = 'Material Scroll', icon_value=get_icon_id("StatusReset"))
if len(context.selected_objects) >= 2:
if object.material_slots:
col.operator("material.simplify", text="Material Link", icon_value=get_icon_id("Applyall"))
col.separator()
else:
col.operator("hops.map_scroll", text = 'Map Scroll', icon_value=get_icon_id("Plugin"))
col.separator()
# filter out dot name materials, based on blender prefs
materials = None
if context.object.type in {'GPENCIL', 'GREASEPENCIL'}:
if filepathprefs.show_hidden_files_datablocks:
materials = [mat for mat in bpy.data.materials if mat.grease_pencil and (not mat.name.startswith('.'))]
else:
materials = [mat for mat in bpy.data.materials if mat.grease_pencil]
elif hasattr(context.object, 'material_slots'):
if filepathprefs.show_hidden_files_datablocks:
materials = [mat for mat in bpy.data.materials if not mat.grease_pencil and (not mat.name.startswith('.'))]
else:
materials = [mat for mat in bpy.data.materials if not mat.grease_pencil]
if materials:
col_count = round(len(materials)/preference.Hops_material_count)
flow = layout.grid_flow(row_major=False, columns=col_count, even_columns=True, even_rows=True, align=False)
for mat in materials:
if preference.Hops_material_icons:
try:
icon_val = layout.icon(mat)
except:
icon_val = 1
print("WARNING [Mat Panel]: Could not get icon value for %s" % mat.name)
op = flow.operator("object.apply_material", text=mat.name, icon_value=icon_val)
op.mat_to_assign = mat.name
else:
op = flow.operator("object.apply_material", text=mat.name, icon='MATERIAL')
op.mat_to_assign = mat.name
class HOPS_MT_SculptSubmenu(bpy.types.Menu):
bl_label = 'Sculpt'
bl_idname = 'HOPS_MT_SculptSubmenu'
def draw(self, context):
layout = self.layout
# sculpt = context.tool_settings.sculpt
# settings = self.paint_settings(context)
# brush = settings.brush
layout.prop(context.preferences.inputs, 'use_mouse_emulate_3_button')
if context.sculpt_object.use_dynamic_topology_sculpting:
layout.operator("sculpt.dynamic_topology_toggle",text="Disable Dyntopo")
else:
layout.operator("sculpt.dynamic_topology_toggle", text="Enable Dyntopo")
layout.separator()
if (context.tool_settings.sculpt.detail_type_method == 'CONSTANT'):
layout.prop(context.tool_settings.sculpt, "constant_detail")
layout.operator("sculpt.sample_detail_size", text="", icon='EYEDROPPER')
elif (context.tool_settings.sculpt.detail_type_method == 'BRUSH'):
layout.prop(context.tool_settings.sculpt, "detail_percent")
else:
layout.prop(context.tool_settings.sculpt, "detail_size")
layout.prop(context.tool_settings.sculpt, "detail_refine_method", text="")
layout.prop(context.tool_settings.sculpt, "detail_type_method", text="")
layout.separator()
if hasattr(context.tool_settings.sculpt, "use_smooth_shading"):
layout.prop(context.tool_settings.sculpt, "use_smooth_shading")
else:
props = layout.operator('hops.set_smooth', text='Shade Smooth')
props.mode = 'ACTIVE'
props.smooth = True
props = layout.operator('hops.set_smooth', text='Shade Flat')
props.mode = 'ACTIVE'
props.smooth = False
layout.operator("sculpt.optimize")
if (context.tool_settings.sculpt.detail_type_method == 'CONSTANT'):
layout.operator("sculpt.detail_flood_fill")
layout.separator()
layout.prop(context.tool_settings.sculpt, "symmetrize_direction", text="")
layout.operator("sculpt.symmetrize")
class HOPS_MT_MiraSubmenu(bpy.types.Menu):
bl_label = 'Mira Panel'
bl_idname = 'HOPS_MT_MiraSubmenu'
def draw(self, context):
layout = self.layout
layout = self.layout.column_flow(columns=2)
# if mira_handler_enabled():
# layout.operator("mesh.curve_stretch", text="CurveStretch", icon="RNA")
# layout.operator("mesh.curve_guide", text='CurveGuide', icon="RNA")
layout.operator("mira.curve_stretch", text="CurveStretch", icon="RNA")
layout.operator("mira.curve_guide", text="CurveGuide", icon="RNA")
layout.prop(context.scene.mi_cur_stretch_settings, "points_number", text='')
layout.prop(context.scene.mi_curguide_settings, "points_number", text='')
class HOPS_MT_BasicObjectOptionsSubmenu(bpy.types.Menu):
bl_label = 'ObjectOptions'
bl_idname = 'HOPS_MT_BasicObjectOptionsSubmenu'
def draw(self, context):
layout = self.layout
layout = self.layout.column_flow(columns=1)
row = layout.row()
sub = row.row()
sub.scale_y = 1.2
obj = bpy.context.object
layout.prop(obj, "name", text="")
layout.separator()
obj = bpy.context.object
layout.prop(obj, "show_name", text="Show object's name"),
class HOPS_MT_FrameRangeSubmenu(bpy.types.Menu):
bl_label = 'FrameRange'
bl_idname = 'HOPS_MT_FrameRangeSubmenu'
def draw(self, context):
layout = self.layout
layout = self.layout
scene = context.scene
row = layout.row(align=False)
col = row.column(align=True)
layout.operator("hops.setframe_end", text="Frame Range", icon_value=get_icon_id("SetFrame"))
#col.prop(scene, 'frame_start')
#col.prop(scene, 'frame_end')
class HOPS_MT_SelectViewSubmenu(bpy.types.Menu):
bl_label = 'Selection'
bl_idname = 'HOPS_MT_SelectViewSubmenu'
def draw(self, context):
layout = self.layout
m_check = context.window_manager.m_check
layout.operator("hops.poly_debug_display", text="Polygon Debug", icon_value=get_icon_id("sm_logo_white"))
layout.separator()
if bpy.context.object and bpy.context.object.type == 'MESH':
if m_check.meshcheck_enabled:
layout.operator("object.remove_materials", text="Hide Ngons/Tris", icon_value=get_icon_id("ShowNgonsTris"))
else:
layout.operator("object.add_materials", text="Display Ngons/Tris", icon_value=get_icon_id("ShowNgonsTris"))
layout.operator("data.facetype_select", text="Ngons Select", icon_value=get_icon_id("Ngons")).face_type = "5"
layout.operator("data.facetype_select", text="Tris Select", icon_value=get_icon_id("Tris")).face_type = "3"
# Viewport
class HOPS_MT_ViewportSubmenu(bpy.types.Menu):
bl_label = 'Viewport'
bl_idname = 'HOPS_MT_ViewportSubmenu'
def draw(self, context):
layout = self.layout
view3d = context.space_data
scene = bpy.context.scene
row = layout.column().row()
row.operator_context = 'INVOKE_DEFAULT'
if addon.preference().ui.expanded_menu:
column = row.column()
else:
column =self.layout
column.prop(view3d.overlay, "show_overlays", text = 'Overlays')
column.prop(view3d.overlay, 'show_face_orientation')
column.prop(view3d.overlay, 'show_wireframes')
column.separator()
#column = row.column()
column.operator("hops.camera_rig", text="Add Camera", icon='OUTLINER_OB_CAMERA')
column.operator("hops.bloom_toggle", text="Toggle Bloom", icon='LIGHT_DATA')
if 'EEVEE' in scene.render.engine:
column.operator_context = 'INVOKE_DEFAULT'
column.operator("hops.adjust_viewport", text="(v)Lookdev+", icon_value=get_icon_id("RGui"))
column.operator("hops.blank_light", text = "Blank Light", icon_value=get_icon_id("GreyTaper"))
column.separator()
column.operator("render.setup", text="Eevee HQ", icon="RESTRICT_RENDER_OFF")
column.operator("hops.renderb_setup", text="Eevee LQ", icon="RESTRICT_RENDER_OFF")
column.operator("ui.reg", text="Solid / Texture Toggle", icon="RESTRICT_RENDER_OFF")
column.separator()
column.operator("view3d.view_align", text= "Align View", icon_value=get_icon_id("HardOps"))
column.operator("ui.clean", text="Simplify", icon="RESTRICT_RENDER_OFF")
if scene.render.engine == 'CYCLES':
column.operator("hops.adjust_viewport", text="(v)Lookdev+", icon_value=get_icon_id("RGui"))
column.operator("hops.blank_light", text = "Blank Light", icon_value=get_icon_id("GreyTaper"))
column.separator()
column.operator("render.setup", text="Cycles HQ", icon="RESTRICT_RENDER_OFF")
column.operator("hops.renderb_setup", text="Cycles LQ", icon="RESTRICT_RENDER_OFF")
column.operator("hops.renderc_setup", text="GPU HQ ", icon="RESTRICT_RENDER_OFF")
column.separator()
column.operator("view3d.view_align", text= "Align View", icon_value=get_icon_id("HardOps"))
column.operator("ui.clean", text="Simplify", icon="RESTRICT_RENDER_OFF")
if view3d.show_region_tool_header == False:
column.separator()
column.operator("hops.show_topbar", text = "Show Toolbar")
if view3d.shading.type == 'MATERIAL':
column.separator()
column.prop(view3d.shading, 'use_scene_lights')
column.prop(view3d.shading, 'use_scene_world')
column.prop(view3d.overlay, 'show_look_dev')
column.separator()
column.separator()
if view3d.shading.type == 'SOLID':
if view3d.overlay.show_overlays == True and view3d.overlay.show_wireframes == True:
column.prop(view3d.overlay, 'wireframe_threshold')
column.separator()
if view3d.shading.type == 'WIREFRAME':
column.prop(view3d.shading, "type", text = "")
column.separator()
if addon.preference().ui.expanded_menu:
column = row.column()
else:
column.separator()
if scene.render.engine in {'BLENDER_EEVEE', 'BLENDER_EEVEE_NEXT'} or scene.render.engine == 'CYCLES':
if view3d.shading.type != 'WIREFRAME' and view3d.shading.type != 'RENDERED':
if view3d.shading.light in ["STUDIO", "MATCAP"]:
column.template_icon_view(view3d.shading, "studio_light", show_labels=True, scale=3)
column.label(text='')
if view3d.shading.type != 'WIREFRAME':
if view3d.shading.type != 'RENDERED':
column.separator()
column.prop(view3d.shading, "type", text = "")
column.separator()
# if view3d.shading.type == 'MATERIAL' or (view3d.shading.type == 'RENDERED' and scene.render.engine == 'BLENDER_EEVEE'):
# column.separator()
# column.prop(scene.eevee, "taa_samples", text = "Viewport Samples")
# column.prop(scene.eevee, "gi_diffuse_bounces", text = "Indirect Bounces")
# if scene.eevee.use_motion_blur:
# column.prop(scene.eevee, "motion_blur_samples", text = "Motion Blur Samples")
# column.separator()
if view3d.shading.type == 'MATERIAL' or (view3d.shading.type == 'RENDERED' and scene.render.engine in {'BLENDER_EEVEE', 'BLENDER_EEVEE_NEXT'}):
if hasattr(scene.eevee, 'use_bloom'):
column.prop(scene.eevee, "use_bloom", text = "Bloom")
if hasattr(scene.eevee, 'use_ssr'):
column.prop(scene.eevee, "use_ssr", text = "Screen Space Reflections")
if scene.eevee.use_ssr == True:
column.prop(scene.eevee, "use_ssr_halfres", text = "Half Res")
if view3d.shading.type == 'MATERIAL' or scene.render.engine in {'BLENDER_EEVEE', 'BLENDER_EEVEE_NEXT'} and view3d.shading.type not in {'WIREFRAME', 'SOLID'}:
column.prop(scene.eevee, "use_gtao", text = "AO")
if hasattr(scene.eevee, 'use_soft_shadows'):
column.prop(scene.eevee, "use_soft_shadows", text = "Soft Shadows")
if view3d.shading.type == 'MATERIAL' or (view3d.shading.type == 'RENDERED' and scene.render.engine in {'BLENDER_EEVEE', 'BLENDER_EEVEE_NEXT'}):
if context.scene.render.engine == 'BLENDER_EEVEE':
column.prop(scene.eevee, "use_motion_blur", text = "Motion Blur")
else:
column.prop(scene.render, "use_motion_blur", text = "Motion Blur")
if view3d.shading.type == 'SOLID':
column.separator()
column.prop(view3d.shading, 'show_cavity')
column.prop(view3d.shading, 'show_shadows')
column.separator()
column.prop(view3d.shading, "light", text = "")
column.prop(view3d.shading, "color_type", text = "")
column.prop(view3d.shading, "background_type", text = "")
column.separator()
column.operator_context = 'INVOKE_DEFAULT'
column.operator("hops.modal_ui_purge", text="Purge Dead UI", icon_value=get_icon_id("Tris"))
class HOPS_MT_RenderSetSubmenuLQ(bpy.types.Menu):
bl_label = 'RenderSet_submenu_LQ'
bl_idname = 'HOPS_MT_RenderSetSubmenuLQ'
def draw(self, context):
layout = self.layout
layout.prop(addon.preference().property, "Eevee_preset_LQ", expand=True)
class HOPS_MT_RenderSetSubmenuHQ(bpy.types.Menu):
bl_label = 'RenderSet_submenu_HQ'
bl_idname = 'HOPS_MT_RenderSetSubmenuHQ'
def draw(self, context):
layout = self.layout
layout.prop(addon.preference().property, "Eevee_preset_HQ", expand=True)
class HOPS_MT_RenderSetSubmenu(bpy.types.Menu):
bl_label = 'RenderSet_submenu'
bl_idname = 'HOPS_MT_RenderSetSubmenu'
def draw(self, context):
layout = self.layout
c = bpy.context.scene
if c.render.engine == 'CYCLES':
layout.operator("render.setup", text="Render (1)", icon="RESTRICT_RENDER_OFF")
layout.operator("hops.renderb_setup", text="Render (2)", icon="RESTRICT_RENDER_OFF")
layout.operator("hops.renderc_setup", text="Cycles GPU HQ Grumble", icon="RESTRICT_RENDER_OFF")
if c.render.engine in {'BLENDER_EEVEE', 'BLENDER_EEVEE_NEXT'}:
layout.operator("render.setup", text="Eevee HQ", icon="RESTRICT_RENDER_OFF")
layout.menu("HOPS_MT_RenderSetSubmenuHQ", text="HQ Settings")
layout.operator("hops.renderb_setup", text="Eevee LQ", icon="RESTRICT_RENDER_OFF")
layout.menu("HOPS_MT_RenderSetSubmenuLQ", text="LQ Settings")
else:
pass
layout.separator()
row = layout.row(align=False)
col = row.column(align=True)
view_settings = context.scene.view_settings
col.prop(view_settings, "view_transform", text="")
col.prop(view_settings, "look", text="")
class HOPS_MT_ResetAxiSubmenu(bpy.types.Menu):
bl_idname = "HOPS_MT_ResetAxiSubmenu"
bl_label = "Reset Axis Submenu"
def draw(self, context):
layout = self.layout
#layout = self.layout.column_flow(columns=2)
#row = layout.row()
#sub = row.row()
#sub.scale_y = 1.0
#sub.scale_x = 0.05
layout.operator("hops.reset_axis", text=" X ", icon_value=get_icon_id("Xslap")).set_axis = "X"
layout.operator("hops.reset_axis", text=" Y ", icon_value=get_icon_id("Yslap")).set_axis = "Y"
layout.operator("hops.reset_axis", text=" Z ", icon_value=get_icon_id("Zslap")).set_axis = "Z"
class HOPS_MT_SymmetrySubmenu(bpy.types.Menu):
bl_idname = "HOPS_MT_SymmetrySubmenu"
bl_label = "Symmetry Submenu"
def draw(self, context):
layout = self.layout
layout.operator_context = 'INVOKE_DEFAULT'
layout.operator("hops.mirror_gizmo", text="Mirror", icon_value=get_icon_id("Mirror"))
class HOPS_MT_MiscSubmenu(bpy.types.Menu):
bl_idname = "HOPS_MT_MiscSubmenu"
bl_label = "Misc Submenu"
def draw(self, context):
layout = self.layout
layout.operator_context = 'INVOKE_DEFAULT'
layout.operator("hops.mirror_gizmo", text="Mirror", icon_value=get_icon_id("Mirror"))
layout.separator()
layout.operator("hops.bevel_helper", text="Bevel Helper", icon_value=get_icon_id("CSharpen"))
layout.operator("hops.sharp_manager", text="Edge Manager", icon_value=get_icon_id("Diagonal"))
layout.operator("view3d.bevel_multiplier", text="Bevel Exponent", icon_value=get_icon_id("BevelMultiply"))
class HOPS_MT_PluginSubmenu(bpy.types.Menu):
bl_label = 'Plugin Tools Submenu'
bl_idname = 'HOPS_MT_PluginSubmenu'
def draw(self, context):
layout = self.layout
# if any("kk_QuickLatticeCreate" in s for s in bpy.context.preferences.addons.keys()):
# layout.operator("object.easy_lattice", text="Easy Lattice", icon_value=get_icon_id("Easylattice"))
# if any("mesh_snap" in s for s in bpy.context.preferences.addons.keys()):
# layout.operator("mesh.snap_utilities_line", text="Snap Line")
# layout.operator("mesh.snap_push_pull", text="Push Pull Faces")
object = context.active_object
if object.mode == "EDIT" and object.type == "MESH":
if addon_exists('mira_tools'):
layout.label(text = "Mira Tools")
layout.separator()
op = layout.operator("mesh.curve_stretch", text="Curve Stretch")#,
layout.operator("mira.curve_stretch", text="MI_CurveStretch", icon="STYLUS_PRESSURE")
#layout.prop(bpy.context.scene.mi_cur_stretch_settings, "points_number", text='Curve Count')
layout.separator()
if addon_exists('bezier_mesh_shaper'):
layout.separator()
layout.label(text = "Bezier Mesh Shaper")
layout.separator()
op = layout.operator("mesh.bezier_mesh_shaper", text="Curved")#, icon_value=get_icon_id("Easylattice"))
op.startupAction = 'NORMAL'
op = layout.operator("mesh.bezier_mesh_shaper", text="Straight")#, icon_value=get_icon_id("Easylattice"))
op.startupAction ='SNAP_STRAIGHT'
layout.separator()
if object.mode == "OBJECT" or object.mode == "EDIT":
if addon_exists("MESHmachine"):
layout.label(text = "MeshMachine")
layout.separator()
layout.menu("MACHIN3_MT_mesh_machine", text="MESHmachine", icon_value=get_icon_id("Machine"))
layout.separator()
class HOPS_MT_BoolSumbenu(bpy.types.Menu):
bl_label = 'Bool Submenu'
bl_idname = 'HOPS_MT_BoolSumbenu'
def draw(self, context):
layout = self.layout
object = context.active_object
if object.mode == "OBJECT" and object.type == "MESH":
layout.operator_context = 'INVOKE_DEFAULT'
layout.operator("hops.bool_modal", text="Interactive Boolean", icon_value=get_icon_id("InteractiveBoolean"))
layout.separator()
layout.operator("hops.bool_difference", text="Difference", icon_value=get_icon_id("Difference"))
layout.operator("hops.bool_union", text="Union", icon_value=get_icon_id("Union"))
layout.operator("hops.slash", text="Slash", icon_value=get_icon_id("Slash"))
layout.separator()
layout.operator("hops.bool_inset", text="Inset / Outset", icon_value=get_icon_id("InsetOutset"))
layout.operator("hops.bool_knife", text="Knife", icon_value=get_icon_id("Knife"))
layout.operator("hops.bool_intersect", text="Intersection", icon_value=get_icon_id("Intersection"))
layout.separator()
layout.operator("hops.cut_in", text="Cut-in", icon_value=get_icon_id("Cutin"))
if object.mode == "EDIT" and object.type == "MESH":
layout.operator_context = 'INVOKE_DEFAULT'
layout.operator("hops.bool_modal", text="Interactive Boolean", icon_value=get_icon_id("InteractiveBoolean"))
layout.operator("hops.sel_to_bool_v3", text="Selection to Boolean", icon="MOD_BOOLEAN")
layout.separator()
layout.operator("hops.edit_bool_difference", text="Difference", icon_value=get_icon_id("Difference"))
layout.operator("hops.edit_bool_union", text="Union", icon_value=get_icon_id("Union"))
layout.operator("hops.edit_bool_slash", text="Slash", icon_value=get_icon_id("Slash"))
layout.separator()
layout.operator("hops.edit_bool_inset", text="Inset / Outset", icon_value=get_icon_id("InsetOutset"))
layout.operator("hops.edit_bool_knife", text="Knife", icon_value=get_icon_id("Knife"))
layout.operator("hops.edit_bool_intersect", text="Intersection", icon_value=get_icon_id("Intersection"))
class HOPS_MT_ModSubmenu(bpy.types.Menu):
bl_label = 'Mod Submenu'
bl_idname = 'HOPS_MT_ModSubmenu'
def draw(self, context):
layout = self.layout
object = context.active_object
if object.mode == "OBJECT" and object.type == "MESH":
row = layout.column().row()
if addon.preference().ui.expanded_menu:
column = row.column()
else:
column =self.layout
column.operator_context = 'INVOKE_DEFAULT'
column.operator("hops.adjust_bevel", text="Bevel", icon="MOD_BEVEL")
column.operator("hops.adjust_tthick", text="Solidify", icon="MOD_SOLIDIFY")
column.operator("hops.st3_array", text="Array V2", icon_value=get_icon_id("GreyArrayX"))
column.operator("hops.mirror_gizmo", text="Mirror", icon="MOD_MIRROR")
if addon.preference().ui.expanded_menu:
column.separator()
column.operator("hops.helper", text="Modifier Helper", icon="SCRIPTPLUGINS")
column.operator("hops.bool_toggle_viewport", text= "Toggle Modifiers", icon_value=get_icon_id("Tris")).all_modifiers = True
#column.separator()
column.operator("hops.mod_apply", text="Apply Modifiers", icon="REC")
column.separator()
column.operator("hops.bool_stack", text="Stack / Unstack", icon="NODETREE")
if addon.preference().property.workflow_modifier == 'NODES':
column.operator("hops.nodify", text="Nodify", icon="NODETREE")
if addon.preference().ui.expanded_menu:
column = row.column()
else:
column.separator()
column.operator("hops.mod_lattice", text="Lattice", icon="MOD_LATTICE")
column.operator("hops.mod_screw", text="Screw", icon="MOD_SCREW")
if (2, 82, 4) < bpy.app.version:
column.operator("hops.mod_weld", text="Weld", icon="AUTOMERGE_OFF")
column.operator("hops.mod_displace", text="Displace", icon="MOD_DISPLACE")
column.operator("hops.mod_decimate", text="Decimate", icon="MOD_DECIM")
column.operator("hops.mod_triangulate", text="Triangulate", icon="MOD_TRIANGULATE")
column.operator("hops.mod_wireframe", text="Wireframe", icon="MOD_WIREFRAME")
column.operator("hops.mod_weighted_normal", text="Weighted Normal", icon="MOD_NORMALEDIT")
column.operator("hops.mod_curve", text="Curve", icon="MOD_CURVE")
if addon.preference().ui.expanded_menu:
column = row.column()
else:
column.separator()
column.operator("hops.mod_smooth", text="Smooth", icon="MOD_SMOOTH")
column.operator("hops.mod_cloth", text="Cloth", icon="MOD_CLOTH")
#column.operator("hops.mod_lsmooth", text="Laplacian Smooth", icon="MOD_SMOOTH")
column.operator("hops.mod_simple_deform", text="Simple Deform", icon="MOD_SIMPLEDEFORM")
column.operator("hops.mod_subdivision", text="Subdivision", icon="MOD_SUBSURF")
column.operator("hops.mod_shrinkwrap", text="Shrinkwrap", icon="MOD_SHRINKWRAP")
column.operator("hops.mod_cast", text="Cast", icon="MOD_CAST")
column.operator("hops.mod_skin", text="Skin", icon="MOD_SKIN")
column.operator("hops.mod_uv_project", text="UV Project", icon="MOD_UVPROJECT")
#column.separator()
#Classic Q Menu Style
if addon.preference().ui.expanded_menu == False:
column.separator()
column.operator("hops.helper", text="Modifier Helper", icon="SCRIPTPLUGINS")
column.operator("hops.bool_toggle_viewport", text= "Toggle Modifiers", icon_value=get_icon_id("Tris")).all_modifiers = True
#column.separator()
column.operator("hops.mod_apply", text="Apply Modifiers", icon="REC")
if object.mode == "EDIT" and object.type == "MESH":
layout.operator_context = 'INVOKE_DEFAULT'
layout.operator("hops.adjust_bevel", text="Bevel", icon="MOD_BEVEL")
if (2, 82, 4) < bpy.app.version:
layout.operator("hops.mod_weld", text="Weld", icon="AUTOMERGE_OFF")
layout.operator("hops.mod_lattice", text="Lattice", icon="MOD_LATTICE")
layout.operator("hops.mod_hook", text="Hook", icon="HOOK")
layout.operator("hops.mod_mask", text="Mask", icon="MOD_MASK")
# if (2, 82, 4) < bpy.app.version:
# layout.operator("hops.mod_weld", text="Weld", icon="AUTOMERGE_OFF")
layout.operator("hops.mirror_gizmo", text="Mirror", icon_value=get_icon_id("Mirror"))
layout.operator("hops.mod_smooth", text="Smooth", icon="MOD_SMOOTH")
layout.operator("hops.mod_decimate", text="Decimate", icon="MOD_DECIM")
class HOPS_MT_ST3MeshToolsSubmenu(bpy.types.Menu):
bl_label = 'ST3 Mesh Tools Submenu'
bl_idname = 'HOPS_MT_ST3MeshToolsSubmenu'
def draw(self, context):
layout = self.layout
object = context.active_object
if object.mode == "EDIT" and object.type == "MESH":
if addon_exists("nSolve"):
layout.operator("nsolve.swap_mode", text="nSolve", icon_value=get_icon_id("nSolve"))
layout.separator()
layout.operator_context = 'INVOKE_DEFAULT'
layout.operator("hops.curve_extrude", text="Curve Extrude", icon="CURVE_DATA")
layout.operator("hops.flatten_to_face", text="Flatten to Face", icon="FACESEL")
layout.operator("hops.mesh_align", text="Align to Face", icon="MOD_EXPLODE")
layout.separator()
layout.operator("hops.vertext_align", text="Align Vertices Tool", icon="CON_TRACKTO")
layout.operator("hops.sel_to_bool_v3", text="Selection to Boolean", icon="MOD_BOOLEAN")
layout.operator("hops.fast_mesh_editor", text="Edit Multi Tool", icon="MOD_REMESH")
layout.separator()
layout.operator("view3d.view_align", text= "Align View", icon_value=get_icon_id("HardOps"))
layout.operator("hops.floor", text="To_floor", icon_value=get_icon_id("grey"))
layout.separator()
#layout.operator("hops.face_solver", text="Face Solver", icon_value=get_icon_id("grey"))
layout.operator("hops.clean_border", text="Clean Borders", icon="MEMORY")
layout.operator("hops.clean_edge", text="Clean Edge", icon="IPO_LINEAR")