Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormeta-androcto <meta.androcto1@gmail.com>2019-05-24 09:03:30 +0300
committermeta-androcto <meta.androcto1@gmail.com>2019-05-24 09:03:30 +0300
commit9e99e90f08c985cb764ecb3a7bba6ff534d4d874 (patch)
tree1e415d32af5aac63399250bf15eeaad97684751d /mesh_extra_tools/__init__.py
parent01d80b8f602f392d975255d5fef97dcab2e0589b (diff)
mesh_extra_tools: move to contrib: T63750
Diffstat (limited to 'mesh_extra_tools/__init__.py')
-rw-r--r--mesh_extra_tools/__init__.py905
1 files changed, 0 insertions, 905 deletions
diff --git a/mesh_extra_tools/__init__.py b/mesh_extra_tools/__init__.py
deleted file mode 100644
index 669d22f0..00000000
--- a/mesh_extra_tools/__init__.py
+++ /dev/null
@@ -1,905 +0,0 @@
-# ##### BEGIN GPL LICENSE BLOCK #####
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ##### END GPL LICENSE BLOCK #####
-
-# Contributed to by:
-# meta-androcto, Hidesato Ikeya, zmj100, Gert De Roost, TrumanBlending, PKHG, #
-# Oscurart, Greg, Stanislav Blinov, komi3D, BlenderLab, Paul Marshall (brikbot), #
-# metalliandy, macouno, CoDEmanX, dustractor, Liero, lijenstina, Germano Cavalcante #
-# Pistiwique, Jimmy Hazevoet #
-
-bl_info = {
- "name": "Edit Tools 2",
- "author": "meta-androcto",
- "version": (0, 3, 4),
- "blender": (2, 78, 0),
- "location": "View3D > Toolshelf > Tools and Specials (W-key)",
- "description": "Extra mesh edit tools - modifying meshes and selection",
- "warning": "",
- "wiki_url": "https://wiki.blender.org/index.php/Extensions:2.6/"
- "Py/Scripts/Modeling/Extra_Tools",
- "category": "Mesh"}
-
-
-# Import From Files
-if "bpy" in locals():
- import importlib
- importlib.reload(face_inset_fillet)
- importlib.reload(mesh_filletplus)
- importlib.reload(mesh_vertex_chamfer)
- importlib.reload(mesh_mextrude_plus)
- importlib.reload(mesh_offset_edges)
- importlib.reload(pkhg_faces)
- importlib.reload(mesh_edge_roundifier)
- importlib.reload(mesh_cut_faces)
- importlib.reload(split_solidify)
- importlib.reload(mesh_edges_floor_plan)
- importlib.reload(mesh_edges_length)
- importlib.reload(random_vertices)
- importlib.reload(mesh_fastloop)
- importlib.reload(mesh_edgetools)
- importlib.reload(mesh_pen_tool)
- importlib.reload(vfe_context_menu)
- importlib.reload(mesh_help)
- importlib.reload(mesh_select_by_direction)
- importlib.reload(mesh_select_by_edge_length)
- importlib.reload(mesh_select_by_pi)
- importlib.reload(mesh_select_by_type)
- importlib.reload(mesh_select_connected_faces)
- importlib.reload(mesh_index_select)
- importlib.reload(mesh_selection_topokit)
- importlib.reload(mesh_info_select)
- importlib.reload(mesh_extrude_and_reshape)
- importlib.reload(mesh_check)
- importlib.reload(vertex_align)
-
-else:
- from . import face_inset_fillet
- from . import mesh_filletplus
- from . import mesh_vertex_chamfer
- from . import mesh_mextrude_plus
- from . import mesh_offset_edges
- from . import pkhg_faces
- from . import mesh_edge_roundifier
- from . import mesh_cut_faces
- from . import split_solidify
- from . import mesh_edges_floor_plan
- from . import mesh_edges_length
- from . import random_vertices
- from . import mesh_fastloop
- from . import mesh_edgetools
- from . import mesh_pen_tool
- from . import vfe_context_menu
- from . import mesh_help
- from . import mesh_extrude_and_reshape
- from . import mesh_check
- from . import vertex_align
-
- from .mesh_select_tools import mesh_select_by_direction
- from .mesh_select_tools import mesh_select_by_edge_length
- from .mesh_select_tools import mesh_select_by_pi
- from .mesh_select_tools import mesh_select_by_type
- from .mesh_select_tools import mesh_select_connected_faces
- from .mesh_select_tools import mesh_index_select
- from .mesh_select_tools import mesh_selection_topokit
- from .mesh_select_tools import mesh_info_select
-
- from . icons.icons import load_icons
-
-import bpy
-import bpy_extras.keyconfig_utils
-from bpy.types import (
- Menu,
- Panel,
- PropertyGroup,
- AddonPreferences,
- )
-from bpy.props import (
- BoolProperty,
- BoolVectorProperty,
- EnumProperty,
- FloatProperty,
- FloatVectorProperty,
- IntVectorProperty,
- PointerProperty,
- )
-
-
-# ------ MENUS ------ #
-
-# Define the "Extras" menu
-class VIEW3D_MT_edit_mesh_extras(Menu):
- bl_idname = "VIEW3D_MT_edit_mesh_extras"
- bl_label = "Edit Tools"
-
- def draw(self, context):
- layout = self.layout
- layout.operator_context = 'INVOKE_REGION_WIN'
- mode = context.tool_settings.mesh_select_mode
-
- if mode[0]:
- split = layout.split()
- col = split.column()
-
- col.label(text="Vertex", icon="VERTEXSEL")
- col.separator()
-
- col.operator("mesh.vertex_chamfer", text="Vertex Chamfer")
- col.operator("mesh.random_vertices", text="Random Vertices")
-
- col = split.column()
- col.label(text="Utilities", icon="SCRIPTWIN")
- col.separator()
-
- col.operator("object_ot.fastloop", text="Fast loop")
- col.operator("mesh.flip_normals", text="Normals Flip")
- col.operator("mesh.remove_doubles", text="Remove Doubles")
- col.operator("mesh.subdivide", text="Subdivide")
- col.operator("mesh.dissolve_limited", text="Dissolve Limited")
-
- elif mode[1]:
- split = layout.split()
- col = split.column()
- col.label(text="Edge", icon="EDGESEL")
- col.separator()
-
- col.operator("mesh.fillet_plus", text="Edge Fillet Plus")
- col.operator("mesh.offset_edges", text="Offset Edges")
- col.operator("mesh.edge_roundifier", text="Edge Roundify")
- col.operator("object.mesh_edge_length_set", text="Set Edge Length")
- col.operator("mesh.edges_floor_plan")
-
- col = split.column()
- col.label(text="Utilities", icon="SCRIPTWIN")
- col.separator()
-
- col.operator("object_ot.fastloop", text="Fast loop")
- col.operator("mesh.flip_normals", text="Normals Flip")
- col.operator("mesh.remove_doubles", text="Remove Doubles")
-
- col.operator("mesh.subdivide", text="Subdivide")
- col.operator("mesh.dissolve_limited", text="Dissolve Limited")
-
- elif mode[2]:
- split = layout.split()
- col = split.column()
- col.label(text="Face", icon="FACESEL")
- col.separator()
-
- col.operator("object.mextrude", text="Multi Extrude")
- col.operator("mesh.face_inset_fillet", text="Face Inset Fillet")
- col.operator("mesh.extrude_reshape", text="Push/Pull")
- col.operator("mesh.add_faces_to_object", text="PKHG Faces")
- col.operator("mesh.ext_cut_faces", text="Cut Faces")
- col.operator("mesh.split_solidify", text="Split Solidify")
-
- col = split.column()
- col.label(text="Utilities", icon="SCRIPTWIN")
- col.separator()
-
- col.operator("object_ot.fastloop", text="Fast loop")
- col.operator("mesh.flip_normals", text="Normals Flip")
- col.operator("mesh.remove_doubles", text="Remove Doubles")
- col.operator("mesh.subdivide", text="Subdivide")
- col.operator("mesh.dissolve_limited", text="Dissolve Limited")
-
-
-class EditToolsPanel(Panel):
- bl_label = "Mesh Edit Tools"
- bl_space_type = "VIEW_3D"
- bl_region_type = "TOOLS"
- bl_context = "mesh_edit"
- bl_category = "Tools"
- bl_options = {"DEFAULT_CLOSED"}
-
- def draw(self, context):
- scene = context.scene
- VERTDROP = scene.mesh_extra_tools.UiTabDrop[0]
- EDGEDROP = scene.mesh_extra_tools.UiTabDrop[1]
- FACEDROP = scene.mesh_extra_tools.UiTabDrop[2]
- UTILSDROP = scene.mesh_extra_tools.UiTabDrop[3]
- # Change icons depending on the bool state (compliant with the rest of the UI)
- icon_active_0 = "TRIA_RIGHT" if not VERTDROP else "TRIA_DOWN"
- icon_active_1 = "TRIA_RIGHT" if not EDGEDROP else "TRIA_DOWN"
- icon_active_2 = "TRIA_RIGHT" if not FACEDROP else "TRIA_DOWN"
- icon_active_3 = "TRIA_RIGHT" if not UTILSDROP else "TRIA_DOWN"
-
- layout = self.layout
-
- # Vert options
- box1 = self.layout.box()
- col = box1.column(align=True)
- row = col.row(align=True)
- row.prop(scene.mesh_extra_tools, "UiTabDrop", text="Vertex", index=0, icon=icon_active_0)
- if not VERTDROP:
- row.menu("mesh.vert_select_tools", icon="RESTRICT_SELECT_OFF", text="")
- row.menu("VIEW3D_MT_Select_Vert", icon="VERTEXSEL", text="")
- else:
- layout = self.layout
-
- row = layout.row()
- row.label(text="Vertex Tools:", icon="VERTEXSEL")
-
- row = layout.split(0.8, align=True)
- row.operator("mesh.vertex_chamfer", text="Chamfer")
- row.operator("mesh.extra_tools_help",
- icon="LAYER_USED").help_ids = "mesh_vertex_chamfer"
-
- row = layout.split(0.8, align=True)
- row.operator("mesh.random_vertices", text="Random Vertices")
- row.operator("mesh.extra_tools_help",
- icon="LAYER_USED").help_ids = "random_vertices"
-
- # Vertex Align Properties And Menu
- cen0 = scene.mesh_extra_tools.vert_align_to
-
- layout = self.layout
- layout.label(text="Vertex Align:", icon="UV_VERTEXSEL")
-
- # Draw the menu with 2 options
- layout.prop(scene.mesh_extra_tools, "vert_align_to", expand=False)
- if cen0 == 'vertex':
- row = layout.row(align=True)
- row.operator("vertex_align.store_id", text="Store Selected Vertex")
-
- row = layout.split(0.8, align=True)
- row.operator("vertex_align.align_original", text="Align to Axis")
- props = row.operator("mesh.extra_tools_help", icon="LAYER_USED")
- props.help_ids = "vertex_align"
- props.popup_size = 400
- elif cen0 == "coordinates":
- layout.prop(scene.mesh_extra_tools, "vert_align_use_stored", toggle=True)
-
- if scene.mesh_extra_tools.vert_align_use_stored:
- col = layout.column(align=True)
- col.prop(scene.mesh_extra_tools, "vert_align_store_axis", expand=True)
-
- row = layout.split(0.8, align=True)
- row.operator("vertex_align.coord_list_id", text="Align Coordinates")
- row.operator("mesh.extra_tools_help",
- icon="LAYER_USED").help_ids = "vertex_align"
-
- # Edge options
- box1 = self.layout.box()
- col = box1.column(align=True)
- row = col.row(align=True)
- row.prop(scene.mesh_extra_tools, "UiTabDrop", text="Edge", index=1, icon=icon_active_1)
-
- if not EDGEDROP:
- row.menu("mesh.edge_select_tools", icon="RESTRICT_SELECT_OFF", text="")
- row.menu("VIEW3D_MT_Select_Edge", icon="EDGESEL", text="")
- else:
- layout = self.layout
-
- row = layout.row()
- row.label(text="Edge Tools:", icon="EDGESEL")
- row.menu("VIEW3D_MT_edit_mesh_edgetools", icon="GRID")
-
- row = layout.split(0.8, align=True)
- row.operator("mesh.fillet_plus", text="Fillet plus")
-
- props = row.operator("mesh.extra_tools_help", icon="LAYER_USED")
- props.help_ids = "mesh_filletplus"
- props.popup_size = 400
-
- row = layout.split(0.8, align=True)
- row.operator("mesh.offset_edges", text="Offset Edges")
- row.operator("mesh.extra_tools_help",
- icon="LAYER_USED").help_ids = "mesh_offset_edges"
-
- row = layout.split(0.8, align=True)
- row.operator("mesh.edge_roundifier", text="Roundify")
- row.operator("mesh.extra_tools_help",
- icon="LAYER_USED").help_ids = "mesh_edge_roundifier"
-
- row = layout.split(0.8, align=True)
- row.operator("object.mesh_edge_length_set", text="Set Edge Length")
- row.operator("mesh.extra_tools_help",
- icon="LAYER_USED").help_ids = "mesh_edges_length"
-
- row = layout.split(0.8, align=True)
- row.operator("mesh.edges_floor_plan")
-
- props = row.operator("mesh.extra_tools_help", icon="LAYER_USED")
- props.help_ids = "mesh_edges_floor_plan"
- props.popup_size = 400
-
- # Face options
- box1 = self.layout.box()
- col = box1.column(align=True)
- row = col.row(align=True)
- row.prop(scene.mesh_extra_tools, "UiTabDrop", text="Face", index=2, icon=icon_active_2)
-
- if not FACEDROP:
- row.menu("mesh.face_select_tools", icon="RESTRICT_SELECT_OFF", text="")
- row.menu("VIEW3D_MT_Select_Face", icon="FACESEL", text="")
- else:
- layout = self.layout
-
- row = layout.row()
- row.label(text="Face Tools:", icon="FACESEL")
-
- row = layout.split(0.8, align=True)
- row.operator("object.mextrude", text="Multi Extrude")
- row.operator("mesh.extra_tools_help",
- icon="LAYER_USED").help_ids = "mesh_mextrude_plus"
-
- row = layout.split(0.8, align=True)
- row.operator("mesh.extrude_reshape", text="Push/Pull")
- row.operator("mesh.extra_tools_help",
- icon="LAYER_USED").help_ids = "mesh_extrude_and_reshape"
-
- row = layout.split(0.8, align=True)
- row.operator("mesh.face_inset_fillet", text="Inset Fillet")
- row.operator("mesh.extra_tools_help",
- icon="LAYER_USED").help_ids = "face_inset_fillet"
-
- row = layout.split(0.8, align=True)
- row.operator("mesh.ext_cut_faces", text="Cut Faces")
- row.operator("mesh.extra_tools_help",
- icon="LAYER_USED").help_ids = "mesh_cut_faces"
-
- row = layout.split(0.8, align=True)
- row.operator("mesh.split_solidify", text="Split Solidify")
- row.operator("mesh.extra_tools_help",
- icon="LAYER_USED").help_ids = "split_solidify"
-
- row = layout.split(0.8, align=True)
- row.operator("mesh.add_faces_to_object", "Shape Extrude")
- row.operator("mesh.extra_tools_help",
- icon="LAYER_USED").help_ids = "pkhg_faces"
-
- # Utils options
- box1 = self.layout.box()
- col = box1.column(align=True)
- row = col.row(align=True)
- row.prop(scene.mesh_extra_tools, "UiTabDrop", text="Utils", index=3, icon=icon_active_3)
-
- if not UTILSDROP:
- row.menu("mesh.utils specials", icon="SOLO_OFF", text="")
- row.menu("VIEW3D_MT_Edit_MultiMET", icon="LOOPSEL", text="")
- else:
- layout = self.layout
-
- row = layout.row()
- row.label(text="Utilities:")
-
- row = layout.row()
- row = layout.split(0.8, align=True)
- row.operator("object_ot.fastloop", text="Fast Loop")
-
- props = row.operator("mesh.extra_tools_help", icon="LAYER_USED")
- props.help_ids = "mesh_fastloop"
- props.popup_size = 400
-
- col = layout.column(align=True)
- col.operator("mesh.flip_normals", text="Normals Flip")
- col.operator("mesh.remove_doubles", text="Remove Doubles")
- col.operator("mesh.subdivide", text="Subdivide")
- col.operator("mesh.dissolve_limited", text="Dissolve Limited")
-
- row = layout.row(align=True)
- row.operator("mesh.select_vert_edge_face_index",
- icon="VERTEXSEL", text="Select By Index").select_type = 'VERT'
-
- # Mesh Check
- layout = self.layout
- icons = load_icons()
- tris = icons.get("triangles")
- ngons = icons.get("ngons")
-
- mesh_check = context.window_manager.mesh_check
- icon_active_4 = "TRIA_RIGHT" if not mesh_check.mesh_check_use else "TRIA_DOWN"
-
- row = layout.row()
- row = layout.split(0.8, align=True)
- row.prop(mesh_check, "mesh_check_use", toggle=True, icon=icon_active_4)
- row.operator("mesh.extra_tools_help", icon="LAYER_USED").help_ids = "mesh_check"
-
- if mesh_check.mesh_check_use:
- layout = self.layout
-
- row = layout.row(align=True)
- row.operator("object.face_type_select", text="Tris",
- icon_value=tris.icon_id).face_type = 'tris'
- row.operator("object.face_type_select", text="Ngons",
- icon_value=ngons.icon_id).face_type = 'ngons'
-
- row = layout.row()
- row.prop(mesh_check, "display_faces", text="Display Faces")
-
- if mesh_check.display_faces:
- col = layout.column(align=True)
- col.prop(mesh_check, "edge_width")
- col.prop(mesh_check, "face_opacity")
-
- row = layout.row()
- row.label(text="Custom Colors:", icon="COLOR")
-
- col = layout.column().split(factor=0.1, align=True)
- col.label(text="", icon_value=tris.icon_id)
- col.prop(mesh_check, "custom_tri_color", text="")
-
- col = layout.column().split(factor=0.1, align=True)
- col.label(text="", icon_value=ngons.icon_id)
- col.prop(mesh_check, "custom_ngons_color", text="")
-
- layout.separator()
-
- row = layout.row(align=True)
- if bpy.app.debug:
- obj_data = getattr(context.active_object, "data", None)
- if obj_data:
- row.prop(obj_data, "show_extra_indices",
- icon="LINENUMBERS_ON", toggle=True)
-
- if context.mode == 'EDIT_MESH' and not context.space_data.use_occlude_geometry:
- row.prop(mesh_check, "finer_lines_behind_use", icon="ORTHO")
-
-
-# ********** Edit Multiselect **********
-class VIEW3D_MT_Edit_MultiMET(Menu):
- bl_label = "Multi Select"
- bl_description = "Multi Select Modes"
-
- def draw(self, context):
- layout = self.layout
- layout.operator_context = 'INVOKE_REGION_WIN'
-
- prop = layout.operator("wm.context_set_value",
- text="Vertex Select",
- icon='VERTEXSEL')
- prop.value = "(True, False, False)"
- prop.data_path = "tool_settings.mesh_select_mode"
-
- prop = layout.operator("wm.context_set_value",
- text="Edge Select",
- icon='EDGESEL')
- prop.value = "(False, True, False)"
- prop.data_path = "tool_settings.mesh_select_mode"
-
- prop = layout.operator("wm.context_set_value",
- text="Face Select",
- icon='FACESEL')
- prop.value = "(False, False, True)"
- prop.data_path = "tool_settings.mesh_select_mode"
-
- layout.separator()
-
- prop = layout.operator("wm.context_set_value",
- text="Vertex and Edge Select",
- icon='EDITMODE_HLT')
- prop.value = "(True, True, False)"
- prop.data_path = "tool_settings.mesh_select_mode"
-
- prop = layout.operator("wm.context_set_value",
- text="Vertex and Face Select",
- icon='ORTHO')
- prop.value = "(True, False, True)"
- prop.data_path = "tool_settings.mesh_select_mode"
-
- prop = layout.operator("wm.context_set_value",
- text="Edge and Face Select",
- icon='SNAP_FACE')
- prop.value = "(False, True, True)"
- prop.data_path = "tool_settings.mesh_select_mode"
-
- prop = layout.operator("wm.context_set_value",
- text="Vertex, Edge and Face Select",
- icon='SNAP_VOLUME')
- prop.value = "(True, True, True)"
- prop.data_path = "tool_settings.mesh_select_mode"
-
-
-# Select Tools
-class VIEW3D_MT_Select_Vert(Menu):
- bl_label = "Select Vert"
- bl_description = "Vertex Selection Modes"
-
- def draw(self, context):
- layout = self.layout
- layout.operator_context = 'INVOKE_REGION_WIN'
-
- prop = layout.operator("wm.context_set_value",
- text="Vertex Select",
- icon='VERTEXSEL')
- prop.value = "(True, False, False)"
- prop.data_path = "tool_settings.mesh_select_mode"
-
- prop = layout.operator("wm.context_set_value",
- text="Vertex and Edge Select",
- icon='EDITMODE_HLT')
- prop.value = "(True, True, False)"
- prop.data_path = "tool_settings.mesh_select_mode"
-
- prop = layout.operator("wm.context_set_value",
- text="Vertex and Face Select",
- icon='ORTHO')
- prop.value = "(True, False, True)"
- prop.data_path = "tool_settings.mesh_select_mode"
-
-
-class VIEW3D_MT_Select_Edge(Menu):
- bl_label = "Select Edge"
- bl_description = "Edge Selection Modes"
-
- def draw(self, context):
- layout = self.layout
- layout.operator_context = 'INVOKE_REGION_WIN'
-
- prop = layout.operator("wm.context_set_value",
- text="Edge Select",
- icon='EDGESEL')
- prop.value = "(False, True, False)"
- prop.data_path = "tool_settings.mesh_select_mode"
-
- prop = layout.operator("wm.context_set_value",
- text="Vertex and Edge Select",
- icon='EDITMODE_HLT')
- prop.value = "(True, True, False)"
- prop.data_path = "tool_settings.mesh_select_mode"
-
- prop = layout.operator("wm.context_set_value",
- text="Edge and Face Select",
- icon='SNAP_FACE')
- prop.value = "(False, True, True)"
- prop.data_path = "tool_settings.mesh_select_mode"
-
-
-class VIEW3D_MT_Select_Face(Menu):
- bl_label = "Select Face"
- bl_description = "Face Selection Modes"
-
- def draw(self, context):
- layout = self.layout
- layout.operator_context = 'INVOKE_REGION_WIN'
-
- prop = layout.operator("wm.context_set_value",
- text="Face Select",
- icon='FACESEL')
- prop.value = "(False, False, True)"
- prop.data_path = "tool_settings.mesh_select_mode"
-
- prop = layout.operator("wm.context_set_value",
- text="Vertex and Face Select",
- icon='ORTHO')
- prop.value = "(True, False, True)"
- prop.data_path = "tool_settings.mesh_select_mode"
-
- prop = layout.operator("wm.context_set_value",
- text="Edge and Face Select",
- icon='SNAP_FACE')
- prop.value = "(False, True, True)"
- prop.data_path = "tool_settings.mesh_select_mode"
-
-
-class VIEW3D_MT_selectface_edit_mesh_add(Menu):
- bl_label = "Select by Face"
- bl_idname = "mesh.face_select_tools"
- bl_description = "Face Selection Tools"
-
- def draw(self, context):
- layout = self.layout
- layout.operator_context = 'INVOKE_REGION_WIN'
-
- layout.label(text="Face Selection Tools", icon="RESTRICT_SELECT_OFF")
- layout.separator()
-
- layout.operator("mesh.select_all").action = 'TOGGLE'
- layout.operator("mesh.select_all", text="Inverse").action = 'INVERT'
- layout.operator("mesh.ext_deselect_boundary", text="Deselect Boundary")
- layout.separator()
-
- layout.operator("data.facetype_select", text="Triangles").face_type = "3"
- layout.operator("data.facetype_select", text="Quads").face_type = "4"
- layout.operator("data.facetype_select", text="Ngons").face_type = "5"
- layout.separator()
-
- layout.operator("mesh.select_vert_edge_face_index",
- text="By Face Index").select_type = 'FACE'
- layout.operator("mesh.select_by_direction", text="By Direction")
- layout.operator("mesh.select_by_pi", text="By Pi or e")
- layout.operator("mesh.select_connected_faces", text="By Connected Faces")
- layout.operator("mesh.conway", text="By Conway's game of life")
- layout.separator()
-
- layout.operator("mesh.e2e_efe", text="Neighbors by Face")
- layout.operator("mesh.f2f_fvnef", text="Neighbors by Vert not Edge")
-
-
-class VIEW3D_MT_selectedge_edit_mesh_add(Menu):
- bl_label = "Select by Edge"
- bl_idname = "mesh.edge_select_tools"
- bl_description = "Edge Selection Tools"
-
- def draw(self, context):
- layout = self.layout
- layout.operator_context = 'INVOKE_REGION_WIN'
-
- layout.label(text="Edge Selection Tools", icon="RESTRICT_SELECT_OFF")
- layout.separator()
-
- layout.operator("mesh.select_all").action = 'TOGGLE'
- layout.operator("mesh.select_all", text="Inverse").action = 'INVERT'
- layout.separator()
-
- layout.operator("mesh.select_vert_edge_face_index",
- text="By Edge Index").select_type = 'EDGE'
- layout.operator("mesh.select_by_direction", text="By Direction")
- layout.operator("mesh.select_by_pi", text="By Pi or e")
- layout.operator("mesh.select_by_edge_length", text="By Edge Length")
- layout.separator()
-
- layout.operator("mesh.e2e_eve", text="Neighbors by Vertex")
- layout.operator("mesh.e2e_evfe", text="Neighbors by Vertex and Face")
- layout.operator("mesh.e2e_efnve", text="Lateral Neighbors")
- layout.operator("mesh.e2e_evnfe", text="Longitudinal Edges")
-
-
-class VIEW3D_MT_selectvert_edit_mesh_add(Menu):
- bl_label = "Select by Vert"
- bl_idname = "mesh.vert_select_tools"
- bl_description = "Vertex Selection Tools"
-
- def draw(self, context):
- layout = self.layout
- layout.operator_context = 'INVOKE_REGION_WIN'
-
- layout.label(text="Vertex Selection Tools", icon="RESTRICT_SELECT_OFF")
- layout.separator()
-
- layout.operator("mesh.select_all").action = 'TOGGLE'
- layout.operator("mesh.select_all", text="Inverse").action = 'INVERT'
- layout.separator()
-
- layout.operator("mesh.select_vert_edge_face_index",
- text="By Vert Index").select_type = 'VERT'
- layout.operator("mesh.select_by_direction", text="By Direction")
- layout.operator("mesh.select_by_pi", text="By Pi or e")
- layout.separator()
-
- layout.operator("mesh.v2v_by_edge", text="Neighbors by Edge")
- layout.operator("mesh.e2e_eve", text="Neighbors by Vertex")
- layout.operator("mesh.e2e_efe", text="Neighbors by Face")
- layout.operator("mesh.v2v_facewise", text="Neighbors by Face - Edge")
-
-
-class VIEW3D_MT_utils_context_menu(Menu):
- bl_label = "Specials Menu"
- bl_idname = "mesh.utils specials"
- bl_description = "Utils Quick Specials"
-
- def draw(self, context):
- layout = self.layout
- layout.operator_context = 'INVOKE_REGION_WIN'
-
- layout.label(text="Fast Specials")
- layout.separator()
-
- layout.menu("VIEW3D_MT_edit_mesh_clean")
- layout.separator()
-
- layout.operator("mesh.subdivide", text="Subdivide").smoothness = 0.0
- layout.operator("mesh.merge", text="Merge...")
- layout.operator("mesh.remove_doubles")
- layout.operator("mesh.inset")
- layout.operator("mesh.bevel", text="Bevel")
- layout.operator("mesh.bridge_edge_loops")
- layout.separator()
-
- layout.operator("mesh.normals_make_consistent",
- text="Recalculate Outside").inside = False
- layout.operator("mesh.normals_make_consistent",
- text="Recalculate Inside").inside = True
- layout.operator("mesh.flip_normals")
-
-
-# Define the "Extras" Menu append
-class VIEW3D_MT_edit_mesh_all(Menu):
- bl_idname = "VIEW3D_MT_edit_mesh_all"
- bl_label = "Mesh Edit Tools"
-
- def draw(self, context):
- layout = self.layout
-
- layout.menu("VIEW3D_MT_edit_mesh_extras")
- layout.menu("VIEW3D_MT_edit_mesh_edgetools")
-
-
-def menu_func(self, context):
- self.layout.menu("VIEW3D_MT_edit_mesh_extras")
- self.layout.menu("VIEW3D_MT_edit_mesh_edgetools")
-
-
-# Define "Select" Menu append
-def menu_select(self, context):
- if context.tool_settings.mesh_select_mode[2]:
- self.layout.menu("mesh.face_select_tools", icon="FACESEL")
- if context.tool_settings.mesh_select_mode[1]:
- self.layout.menu("mesh.edge_select_tools", icon="EDGESEL")
- if context.tool_settings.mesh_select_mode[0]:
- self.layout.menu("mesh.vert_select_tools", icon="VERTEXSEL")
-
-
-# Scene Properties
-class MeshExtraToolsSceneProps(PropertyGroup):
- # Define the UI drop down prop
- UiTabDrop = BoolVectorProperty(
- name="Tab",
- description="Expand/Collapse UI elements",
- default=(False,) * 4,
- size=4,
- )
- # Vertex align
- vert_align_store_axis: FloatVectorProperty(
- name="Define Custom Coordinates",
- description="Store the values of coordinates, for repeated use\n"
- "as a starting point",
- default=(0.0, 0.0, 0.0),
- min=-100.0, max=100.0,
- step=1, size=3,
- subtype='XYZ',
- precision=3
- )
- vert_align_use_stored: BoolProperty(
- name="Use Stored Coordinates",
- description="Use starting point coordinates for alignment",
- default=False
- )
- vert_align_to: EnumProperty(
- items=(('vertex', "Original vertex",
- "Use the stored vertex coordinates for aligning"),
- ('coordinates', "Custom coordinates",
- "Use defined custom coordinates for aligning")),
- name="Align to",
- default='vertex'
- )
- vert_align_axis = BoolVectorProperty(
- name="Axis",
- description="Align to a specific Axis",
- default=(True, False, False),
- size=3,
- )
- # Mesh Info select
- mesh_info_show: BoolProperty(
- name="Show Face Info",
- description="Display the Object's Face Count information\n"
- "Note: it can have some performance impact on dense meshes\n"
- "Leave it closed if not needed or set the Delay to a higher value",
- default=False
- )
- mesh_info_delay: FloatProperty(
- name="Delay",
- description="Set the Update time Delay in seconds\n"
- "Set to zero to update with the UI refresh\n"
- "Higher values will sometimes need to hover over the cursor",
- default=2.0,
- min=0.0, max=20.0,
- step=100,
- subtype='TIME',
- precision=1
- )
-
-
-# Add-on Preferences
-class mesh_extra_tools_pref(AddonPreferences):
- bl_idname = __name__
-
- show_info: BoolProperty(
- name="Info",
- default=False,
- description="Some general information about the add-on",
- )
- show_shortcuts: BoolProperty(
- name="Hot Keys",
- default=False,
- description="List of the shortcuts used for the included various tools",
- )
-
- def draw(self, context):
- layout = self.layout
- box = layout.box()
-
- box.prop(self, "show_info", icon="INFO")
- if self.show_info:
- box.label(text="Collection of various extra Mesh Edit Functions",
- icon="LAYER_ACTIVE")
- box.label(text="The majority of the tools can be found in"
- "Mesh Edit Mode Toolshelf or W key Specials Menu",
- icon="LAYER_USED")
- box.label(text="The Pen tool is a separate Panel in the Toolshelf",
- icon="LAYER_USED")
- box.label(text="The Face Extrude tool is only available in Object Mode "
- "as a separate panel in the Toolshelf",
- icon="LAYER_USED")
- box.label(text="Face Info / Select is a separate Panel located in Properties > Data Editor",
- icon="LAYER_USED")
-
- box.prop(self, "show_shortcuts", icon="KEYINGSET")
- if self.show_shortcuts:
- col = box.column()
- col.label(text="Double Right Click in Edit mode in the 3D Viewport",
- icon="LAYER_ACTIVE")
- col.label(text="Used for quick access to the Vertex, Edge and Face context menus",
- icon="LAYER_USED")
- col.separator()
- col.label(text="W-key in Edit Mode in the 3D Viewport",
- icon="LAYER_ACTIVE")
- col.label(text="Tools are grouped into menus prepended to the Specials Menu",
- icon="LAYER_USED")
- col.separator()
- col.label(text="Ctrl+D in Edit Mode in the 3D Viewport",
- icon="LAYER_ACTIVE")
- col.label(text="Used by the Pen Tool to start drawing. When activated:",
- icon="LAYER_USED")
- col.label(text="Shift + Mouse Move is used to draw along the X axis",
- icon="LAYER_USED")
- col.label(text="Alt + Mouse Move is used to draw along the Y axis",
- icon="LAYER_USED")
- col.separator()
- col.label(text="Note: when using Fast Loop operator, press Esc twice to finish",
- icon="LAYER_ACTIVE")
-
-
-def register():
- mesh_pen_tool.register()
- vfe_context_menu.register()
- mesh_extrude_and_reshape.register()
- mesh_check.register()
-
- bpy.utils.register_module(__name__)
-
- # Register Scene Properties
- bpy.types.Scene.mesh_extra_tools = PointerProperty(
- type=MeshExtraToolsSceneProps
- )
- # Used in mesh_selection_topokit to store cache selection data
- bpy.types.Object.tkkey = IntVectorProperty(size=4)
-
- # Add "Extras" menu to the "W-key Specials" menu
- bpy.types.VIEW3D_MT_edit_mesh_context_menu.prepend(menu_func)
- bpy.types.VIEW3D_MT_select_edit_mesh.prepend(menu_select)
-
- try:
- bpy.types.VIEW3D_MT_Select_Edit_Mesh.prepend(menu_select)
- except:
- pass
-
-
-def unregister():
- mesh_pen_tool.unregister()
- vfe_context_menu.unregister()
- mesh_extrude_and_reshape.unregister()
- mesh_check.unregister()
-
- del bpy.types.Scene.mesh_extra_tools
- del bpy.types.Object.tkkey
-
- bpy.utils.unregister_module(__name__)
-
- # Remove "Extras" menu from the "" menu.
- bpy.types.VIEW3D_MT_edit_mesh_context_menu.remove(menu_func)
- bpy.types.VIEW3D_MT_select_edit_mesh.remove(menu_select)
-
- try:
- bpy.types.VIEW3D_MT_Select_Edit_Mesh.remove(menu_select)
- except:
- pass
-
-
-if __name__ == "__main__":
- register()