diff --git a/mesh_snap_utilities_line/__init__.py b/mesh_snap_utilities_line/__init__.py index c424a342894507412c36269584500c01e3837235..df73dd8047d405355fc48f81063f0f5bd2cc060f 100644 --- a/mesh_snap_utilities_line/__init__.py +++ b/mesh_snap_utilities_line/__init__.py @@ -10,7 +10,7 @@ bl_info = { "blender": (3, 2, 0), "location": "View3D > TOOLS > Line Tool", "description": "Extends Blender Snap controls", - "doc_url" : "{BLENDER_MANUAL_URL}/addons/mesh/snap_utilities_line.html", + "doc_url": "{BLENDER_MANUAL_URL}/addons/mesh/snap_utilities_line.html", "category": "Mesh", } @@ -28,15 +28,19 @@ else: from . import op_line from . import keys +# autopep8: off import bpy from bpy.utils.toolsystem import ToolDef +# autopep8: on if not __package__: __package__ = "mesh_snap_utilities_line" + @ToolDef.from_fn def tool_line(): import os + def draw_settings(context, layout, tool): addon_prefs = context.preferences.addons[__package__].preferences @@ -60,7 +64,7 @@ def tool_line(): ), icon=os.path.join(icons_dir, "ops.mesh.snap_utilities_line"), widget="MESH_GGT_snap_point", - #operator="mesh.snap_utilities_line", + # operator="mesh.snap_utilities_line", keymap=keys.km_tool_snap_utilities_line, draw_settings=draw_settings, ) @@ -91,7 +95,7 @@ def register_snap_tools(): def unregister_snap_tools(): tools = get_tool_list('VIEW_3D', 'EDIT_MESH') - index = tools.index(tool_line) - 1 #None + index = tools.index(tool_line) - 1 # None tools.pop(index) tools.remove(tool_line) @@ -109,11 +113,15 @@ def register_keymaps(): # TODO: find the user defined tool_mouse. from bl_keymap_utils.io import keyconfig_init_from_data - keyconfig_init_from_data(kc_defaultconf, keys.generate_empty_snap_utilities_tools_keymaps()) - keyconfig_init_from_data(kc_addonconf, keys.generate_snap_utilities_keymaps()) + keyconfig_init_from_data( + kc_defaultconf, keys.generate_empty_snap_utilities_tools_keymaps()) + keyconfig_init_from_data( + kc_addonconf, keys.generate_snap_utilities_keymaps()) #snap_modalkeymap = kc_addonconf.keymaps.find(keys.km_snap_utilities_modal_keymap) - #snap_modalkeymap.assign("MESH_OT_snap_utilities_line") + # snap_modalkeymap.assign("MESH_OT_snap_utilities_line") + + def unregister_keymaps(): keyconfigs = bpy.context.window_manager.keyconfigs defaultmap = getattr(keyconfigs.get("Blender"), "keymaps", None) @@ -152,6 +160,7 @@ classes = ( widgets.SnapPointWidgetGroup, ) + def register(): for cls in classes: bpy.utils.register_class(cls) diff --git a/mesh_snap_utilities_line/common_classes.py b/mesh_snap_utilities_line/common_classes.py index 274c8f35164d991f5b9769f4efc9972a0df1a25f..990f1e46d8e48a85c7af5a33900b18ce09b2e915 100644 --- a/mesh_snap_utilities_line/common_classes.py +++ b/mesh_snap_utilities_line/common_classes.py @@ -5,14 +5,14 @@ import bpy from mathutils import ( Vector, Matrix, - ) +) from mathutils.geometry import intersect_point_line from .drawing_utilities import SnapDrawn from .common_utilities import ( convert_distance, get_units_info, location_3d_to_region_2d, - ) +) class SnapNavigation(): @@ -26,7 +26,6 @@ class SnapNavigation(): '_ndof_orbit_zoom', '_ndof_pan') - @staticmethod def debug_key(key): for member in dir(key): @@ -53,34 +52,44 @@ class SnapNavigation(): for key in context.window_manager.keyconfigs.user.keymaps['3D View'].keymap_items: if key.idname == 'view3d.rotate': - self._rotate.add((self.convert_to_flag(key.shift, key.ctrl, key.alt), key.type, key.value)) + self._rotate.add((self.convert_to_flag( + key.shift, key.ctrl, key.alt), key.type, key.value)) elif key.idname == 'view3d.move': - self._move.add((self.convert_to_flag(key.shift, key.ctrl, key.alt), key.type, key.value)) + self._move.add((self.convert_to_flag( + key.shift, key.ctrl, key.alt), key.type, key.value)) elif key.idname == 'view3d.zoom': if key.type == 'WHEELINMOUSE': - self._zoom.add((self.convert_to_flag(key.shift, key.ctrl, key.alt), 'WHEELUPMOUSE', key.value, key.properties.delta)) + self._zoom.add((self.convert_to_flag( + key.shift, key.ctrl, key.alt), 'WHEELUPMOUSE', key.value, key.properties.delta)) elif key.type == 'WHEELOUTMOUSE': - self._zoom.add((self.convert_to_flag(key.shift, key.ctrl, key.alt), 'WHEELDOWNMOUSE', key.value, key.properties.delta)) + self._zoom.add((self.convert_to_flag( + key.shift, key.ctrl, key.alt), 'WHEELDOWNMOUSE', key.value, key.properties.delta)) else: - self._zoom.add((self.convert_to_flag(key.shift, key.ctrl, key.alt), key.type, key.value, key.properties.delta)) + self._zoom.add((self.convert_to_flag( + key.shift, key.ctrl, key.alt), key.type, key.value, key.properties.delta)) elif self.use_ndof: if key.idname == 'view3d.ndof_all': - self._ndof_all.add((self.convert_to_flag(key.shift, key.ctrl, key.alt), key.type)) + self._ndof_all.add((self.convert_to_flag( + key.shift, key.ctrl, key.alt), key.type)) elif key.idname == 'view3d.ndof_orbit': - self._ndof_orbit.add((self.convert_to_flag(key.shift, key.ctrl, key.alt), key.type)) + self._ndof_orbit.add((self.convert_to_flag( + key.shift, key.ctrl, key.alt), key.type)) elif key.idname == 'view3d.ndof_orbit_zoom': - self._ndof_orbit_zoom.add((self.convert_to_flag(key.shift, key.ctrl, key.alt), key.type)) + self._ndof_orbit_zoom.add( + (self.convert_to_flag(key.shift, key.ctrl, key.alt), key.type)) elif key.idname == 'view3d.ndof_pan': - self._ndof_pan.add((self.convert_to_flag(key.shift, key.ctrl, key.alt), key.type)) - + self._ndof_pan.add((self.convert_to_flag( + key.shift, key.ctrl, key.alt), key.type)) def run(self, context, event, snap_location): - evkey = (self.convert_to_flag(event.shift, event.ctrl, event.alt), event.type, event.value) + evkey = (self.convert_to_flag(event.shift, event.ctrl, + event.alt), event.type, event.value) if evkey in self._rotate: if snap_location: - bpy.ops.view3d.rotate_custom_pivot('INVOKE_DEFAULT', pivot=snap_location) + bpy.ops.view3d.rotate_custom_pivot( + 'INVOKE_DEFAULT', pivot=snap_location) else: bpy.ops.view3d.rotate('INVOKE_DEFAULT', use_cursor_init=True) return True @@ -93,7 +102,8 @@ class SnapNavigation(): if evkey == key[0:3]: if key[3]: if snap_location: - bpy.ops.view3d.zoom_custom_target('INVOKE_DEFAULT', delta=key[3], target=snap_location) + bpy.ops.view3d.zoom_custom_target( + 'INVOKE_DEFAULT', delta=key[3], target=snap_location) else: bpy.ops.view3d.zoom('INVOKE_DEFAULT', delta=key[3]) else: @@ -132,11 +142,11 @@ class CharMap: "c", "m", "d", "k", "h", "a", " ", "/", "*", "'", "\"" # "=" - } + } type = { 'BACK_SPACE', 'DEL', 'LEFT_ARROW', 'RIGHT_ARROW' - } + } def __init__(self, context): scale = context.scene.unit_settings.scale_length @@ -155,28 +165,34 @@ class CharMap: pos = self.line_pos if ascii == ",": ascii = "." - self.length_entered = self.length_entered[:pos] + ascii + self.length_entered[pos:] + self.length_entered = self.length_entered[:pos] + \ + ascii + self.length_entered[pos:] self.line_pos += 1 if self.length_entered: pos = self.line_pos if type == 'BACK_SPACE': - self.length_entered = self.length_entered[:pos - 1] + self.length_entered[pos:] + self.length_entered = self.length_entered[:pos - + 1] + self.length_entered[pos:] self.line_pos -= 1 elif type == 'DEL': - self.length_entered = self.length_entered[:pos] + self.length_entered[pos + 1:] + self.length_entered = self.length_entered[:pos] + \ + self.length_entered[pos + 1:] elif type == 'LEFT_ARROW': - self.line_pos = (pos - 1) % (len(self.length_entered) + 1) + self.line_pos = ( + pos - 1) % (len(self.length_entered) + 1) elif type == 'RIGHT_ARROW': - self.line_pos = (pos + 1) % (len(self.length_entered) + 1) + self.line_pos = ( + pos + 1) % (len(self.length_entered) + 1) try: - self.length_entered_value = bpy.utils.units.to_value(self.unit_system, 'LENGTH', self.length_entered) + self.length_entered_value = bpy.utils.units.to_value( + self.unit_system, 'LENGTH', self.length_entered) except: # ValueError: - self.length_entered_value = 0.0 #invalid + self.length_entered_value = 0.0 # invalid #self.report({'INFO'}, "Operation not supported yet") else: self.length_entered_value = 0.0 @@ -236,7 +252,7 @@ class Constrain: vec = self.orientation[self.orientation_id][1] type = 'Y' - else: # dot_z > dot_y and dot_z > dot_x: + else: # dot_z > dot_y and dot_z > dot_x: vec = self.orientation[self.orientation_id][2] type = 'Z' @@ -280,7 +296,7 @@ class Constrain: return True def toggle(self): - self.rotMat = None # update + self.rotMat = None # update if self.preferences.auto_constrain: self.orientation_id = (self.orientation_id + 1) % 2 self.preferences.auto_constrain = self.orientation_id != 0 @@ -292,14 +308,18 @@ class Constrain: self.rotMat = rv3d.view_matrix.copy() self.center = center.copy() - self.center_2d = location_3d_to_region_2d(region, rv3d, self.center) + self.center_2d = location_3d_to_region_2d( + region, rv3d, self.center) vec = self.center + self.orientation[self.orientation_id][0] - self.projected_vecs[0] = location_3d_to_region_2d(region, rv3d, vec) - self.center_2d + self.projected_vecs[0] = location_3d_to_region_2d( + region, rv3d, vec) - self.center_2d vec = self.center + self.orientation[self.orientation_id][1] - self.projected_vecs[1] = location_3d_to_region_2d(region, rv3d, vec) - self.center_2d + self.projected_vecs[1] = location_3d_to_region_2d( + region, rv3d, vec) - self.center_2d vec = self.center + self.orientation[self.orientation_id][2] - self.projected_vecs[2] = location_3d_to_region_2d(region, rv3d, vec) - self.center_2d + self.projected_vecs[2] = location_3d_to_region_2d( + region, rv3d, vec) - self.center_2d self.projected_vecs[0].normalize() self.projected_vecs[1].normalize() @@ -331,12 +351,12 @@ class SnapUtilities: """ constrain_keys = { - 'X': Vector((1,0,0)), - 'Y': Vector((0,1,0)), - 'Z': Vector((0,0,1)), + 'X': Vector((1, 0, 0)), + 'Y': Vector((0, 1, 0)), + 'Z': Vector((0, 0, 1)), 'RIGHT_SHIFT': 'shift', 'LEFT_SHIFT': 'shift', - } + } snapwidgets = [] constrain = None @@ -364,7 +384,6 @@ class SnapUtilities: SnapUtilities.constrain = key - def snap_context_update_and_return_moving_objects(self, context): moving_objects = set() moving_snp_objects = set() @@ -405,7 +424,6 @@ class SnapUtilities: del children return moving_objects, moving_snp_objects - def snap_context_update(self, context): def visible_objects_and_duplis(): if self.preferences.outer_verts: @@ -425,12 +443,12 @@ class SnapUtilities: for obj, matrix in visible_objects_and_duplis(): self.sctx.add_obj(obj, matrix) - def snap_context_init(self, context, snap_edge_and_vert=True): from .snap_context_l import global_snap_context_get - #Create Snap Context - self.sctx = global_snap_context_get(context.evaluated_depsgraph_get(), context.region, context.space_data) + # Create Snap Context + self.sctx = global_snap_context_get( + context.evaluated_depsgraph_get(), context.region, context.space_data) ui_scale = context.preferences.system.ui_scale self.sctx.set_pixel_dist(12 * ui_scale) @@ -448,7 +466,7 @@ class SnapUtilities: self.normal = widget.normal else: - #init these variables to avoid errors + # init these variables to avoid errors self.obj = context.active_object self.bm = None self.geom = None @@ -458,7 +476,7 @@ class SnapUtilities: preferences = context.preferences.addons[__package__].preferences self.preferences = preferences - #Init DrawCache + # Init DrawCache self.draw_cache = SnapDrawn( preferences.out_color, preferences.face_color, @@ -467,26 +485,32 @@ class SnapUtilities: preferences.center_color, preferences.perpendicular_color, preferences.constrain_shift_color, - tuple(context.preferences.themes[0].user_interface.axis_x) + (1.0,), - tuple(context.preferences.themes[0].user_interface.axis_y) + (1.0,), - tuple(context.preferences.themes[0].user_interface.axis_z) + (1.0,), + tuple( + context.preferences.themes[0].user_interface.axis_x) + (1.0,), + tuple( + context.preferences.themes[0].user_interface.axis_y) + (1.0,), + tuple( + context.preferences.themes[0].user_interface.axis_z) + (1.0,), self.sctx.rv3d, ui_scale) self.snap_vert = self.snap_edge = snap_edge_and_vert shading = context.space_data.shading - self.snap_face = not (snap_edge_and_vert and (shading.show_xray or shading.type == 'WIREFRAME')) + self.snap_face = not (snap_edge_and_vert and ( + shading.show_xray or shading.type == 'WIREFRAME')) self.sctx.set_snap_mode(self.snap_vert, self.snap_edge, self.snap_face) - #Configure the unit of measure + # Configure the unit of measure unit_system = context.scene.unit_settings.system scale = context.scene.unit_settings.scale_length scale /= context.space_data.overlay.grid_scale - self.rd = bpy.utils.units.to_value(unit_system, 'LENGTH', str(1 / scale)) + self.rd = bpy.utils.units.to_value( + unit_system, 'LENGTH', str(1 / scale)) - self.incremental = bpy.utils.units.to_value(unit_system, 'LENGTH', str(self.preferences.incremental)) + self.incremental = bpy.utils.units.to_value( + unit_system, 'LENGTH', str(self.preferences.incremental)) def snap_to_grid(self): if self.type == 'OUT' and self.preferences.increments_grid: diff --git a/mesh_snap_utilities_line/common_utilities.py b/mesh_snap_utilities_line/common_utilities.py index d992141a7f0af306e4949e556b6dfcdd0e171e39..7336eadb1d793bb5af714985d5eabd2009a1356c 100644 --- a/mesh_snap_utilities_line/common_utilities.py +++ b/mesh_snap_utilities_line/common_utilities.py @@ -1,17 +1,17 @@ # SPDX-License-Identifier: GPL-2.0-or-later -#python tip: from-imports don't save memory. -#They execute and cache the entire module just like a regular import. +# python tip: from-imports don't save memory. +# They execute and cache the entire module just like a regular import. import bpy import bmesh from mathutils import Vector from mathutils.geometry import ( - intersect_point_line, - intersect_line_line, - intersect_ray_tri, - ) + intersect_point_line, + intersect_line_line, + intersect_ray_tri, +) from .snap_context_l import SnapContext @@ -19,10 +19,10 @@ from .snap_context_l import SnapContext def get_units_info(scale, unit_system, separate_units): if unit_system == 'METRIC': scale_steps = ((1000, 'km'), (1, 'm'), (1 / 100, 'cm'), - (1 / 1000, 'mm'), (1 / 1000000, '\u00b5m')) + (1 / 1000, 'mm'), (1 / 1000000, '\u00b5m')) elif unit_system == 'IMPERIAL': scale_steps = ((5280, 'mi'), (1, '\''), - (1 / 12, '"'), (1 / 12000, 'thou')) + (1 / 12, '"'), (1 / 12000, 'thou')) scale /= 0.3048 # BU to feet else: scale_steps = ((1, ' BU'),) @@ -71,14 +71,17 @@ def location_3d_to_region_2d(region, rv3d, coord): def out_Location(rv3d, orig, vector): view_matrix = rv3d.view_matrix - v1 = (int(view_matrix[0][0]*1.5), int(view_matrix[0][1]*1.5), int(view_matrix[0][2]*1.5)) - v2 = (int(view_matrix[1][0]*1.5), int(view_matrix[1][1]*1.5), int(view_matrix[1][2]*1.5)) + v1 = (int(view_matrix[0][0]*1.5), int(view_matrix[0] + [1]*1.5), int(view_matrix[0][2]*1.5)) + v2 = (int(view_matrix[1][0]*1.5), int(view_matrix[1] + [1]*1.5), int(view_matrix[1][2]*1.5)) - hit = intersect_ray_tri((1,0,0), (0,1,0), (0,0,0), (vector), (orig), False) + hit = intersect_ray_tri((1, 0, 0), (0, 1, 0), + (0, 0, 0), (vector), (orig), False) if hit is None: - hit = intersect_ray_tri(v1, v2, (0,0,0), (vector), (orig), False) + hit = intersect_ray_tri(v1, v2, (0, 0, 0), (vector), (orig), False) if hit is None: - hit = intersect_ray_tri(v1, v2, (0,0,0), (-vector), (orig), False) + hit = intersect_ray_tri(v1, v2, (0, 0, 0), (-vector), (orig), False) if hit is None: hit = Vector() return hit @@ -114,7 +117,8 @@ def get_snap_bm_geom(sctx, main_snap_obj, mcursor): r_bm.verts[r_elem[2]], ] - faces = set(tri[0].link_faces).intersection(tri[1].link_faces, tri[2].link_faces) + faces = set(tri[0].link_faces).intersection( + tri[1].link_faces, tri[2].link_faces) if len(faces) == 1: r_bm_geom = faces.pop() else: @@ -162,17 +166,19 @@ class SnapCache(object): def clear(self): self.edge.snp_obj = self.face.bm_face = None + _snap_cache = SnapCache() def snap_utilities( sctx, main_snap_obj, mcursor, - constrain = None, - previous_vert = None, - increment = 0.0): + constrain=None, + previous_vert=None, + increment=0.0): - snp_obj, loc, elem, elem_co, view_vector, orig, bm, bm_geom = get_snap_bm_geom(sctx, main_snap_obj, mcursor) + snp_obj, loc, elem, elem_co, view_vector, orig, bm, bm_geom = get_snap_bm_geom( + sctx, main_snap_obj, mcursor) is_increment = False r_loc = None @@ -209,40 +215,43 @@ def snap_utilities( v1 = elem_co[1] _snap_cache.edge.vmid = 0.5 * (v0 + v1) _snap_cache.edge.v2dmid = location_3d_to_region_2d( - sctx.region, sctx.rv3d, _snap_cache.edge.vmid) + sctx.region, sctx.rv3d, _snap_cache.edge.vmid) if previous_vert and (not bm_geom or previous_vert not in bm_geom.verts): pvert_co = main_snap_obj.mat @ previous_vert.co perp_point = intersect_point_line(pvert_co, v0, v1) _snap_cache.edge.vperp = perp_point[0] #factor = point_perpendicular[1] - _snap_cache.edge.v2dperp = location_3d_to_region_2d(sctx.region, sctx.rv3d, perp_point[0]) + _snap_cache.edge.v2dperp = location_3d_to_region_2d( + sctx.region, sctx.rv3d, perp_point[0]) _snap_cache.edge.is_increment = False else: _snap_cache.edge.is_increment = True - #else: _snap_cache.edge.v2dperp = None + # else: _snap_cache.edge.v2dperp = None if constrain: - t_loc = intersect_line_line(constrain[0], constrain[1], elem_co[0], elem_co[1]) + t_loc = intersect_line_line( + constrain[0], constrain[1], elem_co[0], elem_co[1]) if t_loc is None: is_increment = True end = orig + view_vector - t_loc = intersect_line_line(constrain[0], constrain[1], orig, end) + t_loc = intersect_line_line( + constrain[0], constrain[1], orig, end) r_loc = t_loc[0] elif _snap_cache.edge.v2dperp and\ - abs(_snap_cache.edge.v2dperp[0] - mcursor[0]) < sctx._dist_px and abs(_snap_cache.edge.v2dperp[1] - mcursor[1]) < sctx._dist_px: - r_type = 'PERPENDICULAR' - r_loc = _snap_cache.edge.vperp + abs(_snap_cache.edge.v2dperp[0] - mcursor[0]) < sctx._dist_px and abs(_snap_cache.edge.v2dperp[1] - mcursor[1]) < sctx._dist_px: + r_type = 'PERPENDICULAR' + r_loc = _snap_cache.edge.vperp elif abs(_snap_cache.edge.v2dmid[0] - mcursor[0]) < sctx._dist_px and abs(_snap_cache.edge.v2dmid[1] - mcursor[1]) < sctx._dist_px: - r_type = 'CENTER' - r_loc = _snap_cache.edge.vmid + r_type = 'CENTER' + r_loc = _snap_cache.edge.vmid else: - r_loc = loc - is_increment = _snap_cache.edge.is_increment + r_loc = loc + is_increment = _snap_cache.edge.is_increment elif len(elem) == 3: r_type = 'FACE' @@ -283,4 +292,5 @@ def snap_utilities( return snp_obj, loc, r_loc, r_type, bm, bm_geom, r_len + snap_utilities.cache = _snap_cache diff --git a/mesh_snap_utilities_line/drawing_utilities.py b/mesh_snap_utilities_line/drawing_utilities.py index 7f3fba391b3ec59b94811590d67cab87cf19f0b2..ee37dac22ba709f4520b182edfc5e86aaa6736ef 100644 --- a/mesh_snap_utilities_line/drawing_utilities.py +++ b/mesh_snap_utilities_line/drawing_utilities.py @@ -4,7 +4,7 @@ from mathutils import Vector, Matrix class SnapDrawn(): - __slots__ = (\ + __slots__ = ( 'out_color', 'face_color', 'edge_color', @@ -50,11 +50,14 @@ class SnapDrawn(): self._line_width = 3 * ui_scale self._format_pos = gpu.types.GPUVertFormat() - self._format_pos.attr_add(id="pos", comp_type='F32', len=3, fetch_mode='FLOAT') + self._format_pos.attr_add( + id="pos", comp_type='F32', len=3, fetch_mode='FLOAT') self._format_pos_and_color = gpu.types.GPUVertFormat() - self._format_pos_and_color.attr_add(id="pos", comp_type='F32', len=3, fetch_mode='FLOAT') - self._format_pos_and_color.attr_add(id="color", comp_type='F32', len=4, fetch_mode='FLOAT') + self._format_pos_and_color.attr_add( + id="pos", comp_type='F32', len=3, fetch_mode='FLOAT') + self._format_pos_and_color.attr_add( + id="color", comp_type='F32', len=4, fetch_mode='FLOAT') self._UBO = None @@ -63,8 +66,10 @@ class SnapDrawn(): def _gl_state_push(self, ob_mat=None): clip_planes = self.rv3d.clip_planes if self.rv3d.use_clip_planes else None config = 'CLIPPED' if clip_planes else 'DEFAULT' - self._program_unif_col = gpu.shader.from_builtin("3D_UNIFORM_COLOR", config=config) - self._program_smooth_col = gpu.shader.from_builtin("3D_SMOOTH_COLOR", config=config) + self._program_unif_col = gpu.shader.from_builtin( + "3D_UNIFORM_COLOR", config=config) + self._program_smooth_col = gpu.shader.from_builtin( + "3D_SMOOTH_COLOR", config=config) gpu.state.program_point_size_set(False) gpu.state.blend_set('ALPHA') @@ -76,6 +81,7 @@ class SnapDrawn(): gpu.state.clip_distances_set(4) if self._UBO is None: import ctypes + class _GPUClipPlanes(ctypes.Structure): _pack_ = 16 _fields_ = [ @@ -118,9 +124,9 @@ class SnapDrawn(): GPUBatch, ) - vbo = GPUVertBuf(self._format_pos, len = len(coords)) - vbo.attr_fill(0, data = coords) - batch_lines = GPUBatch(type = "LINE_STRIP", buf = vbo) + vbo = GPUVertBuf(self._format_pos, len=len(coords)) + vbo.attr_fill(0, data=coords) + batch_lines = GPUBatch(type="LINE_STRIP", buf=vbo) return batch_lines def batch_lines_smooth_color_create(self, coords, colors): @@ -129,10 +135,10 @@ class SnapDrawn(): GPUBatch, ) - vbo = GPUVertBuf(self._format_pos_and_color, len = len(coords)) - vbo.attr_fill(0, data = coords) - vbo.attr_fill(1, data = colors) - batch_lines = GPUBatch(type = "LINES", buf = vbo) + vbo = GPUVertBuf(self._format_pos_and_color, len=len(coords)) + vbo.attr_fill(0, data=coords) + vbo.attr_fill(1, data=colors) + batch_lines = GPUBatch(type="LINES", buf=vbo) return batch_lines def batch_triangles_create(self, coords): @@ -141,9 +147,9 @@ class SnapDrawn(): GPUBatch, ) - vbo = GPUVertBuf(self._format_pos, len = len(coords)) - vbo.attr_fill(0, data = coords) - batch_tris = GPUBatch(type = "TRIS", buf = vbo) + vbo = GPUVertBuf(self._format_pos, len=len(coords)) + vbo.attr_fill(0, data=coords) + batch_tris = GPUBatch(type="TRIS", buf=vbo) return batch_tris def batch_point_get(self): @@ -152,9 +158,9 @@ class SnapDrawn(): GPUVertBuf, GPUBatch, ) - vbo = GPUVertBuf(self._format_pos, len = 1) + vbo = GPUVertBuf(self._format_pos, len=1) vbo.attr_fill(0, ((0.0, 0.0, 0.0),)) - self._batch_point = GPUBatch(type = "POINTS", buf = vbo) + self._batch_point = GPUBatch(type="POINTS", buf=vbo) return self._batch_point def draw(self, type, location, list_verts_co, vector_constrain, prevloc): @@ -171,7 +177,8 @@ class SnapDrawn(): gpu.matrix.load_projection_matrix(winmat) gpu.state.line_width_set(self._line_width) - batch = self.batch_line_strip_create([v.to_tuple() for v in list_verts_co] + [location.to_tuple()]) + batch = self.batch_line_strip_create( + [v.to_tuple() for v in list_verts_co] + [location.to_tuple()]) self._program_unif_col.bind() self._program_unif_col.uniform_float("color", (1.0, 0.8, 0.0, 0.5)) @@ -189,7 +196,8 @@ class SnapDrawn(): gpu.matrix.translate(prevloc) self._program_unif_col.bind() - self._program_unif_col.uniform_float("color", (1.0, 1.0, 1.0, 0.5)) + self._program_unif_col.uniform_float( + "color", (1.0, 1.0, 1.0, 0.5)) point_batch.draw(self._program_unif_col) gpu.matrix.translate(-prevloc) @@ -215,7 +223,7 @@ class SnapDrawn(): Color4f = self.center_color elif type == 'PERPENDICULAR': Color4f = self.perpendicular_color - else: # type == None + else: # type == None Color4f = self.out_color gpu.state.point_size_set(2 * self._point_size) @@ -233,7 +241,7 @@ class SnapDrawn(): self._gl_state_restore() def draw_elem(self, snap_obj, bm, elem): - #TODO: Cache coords (because antialiasing) + # TODO: Cache coords (because antialiasing) import gpu from bmesh.types import( BMVert, @@ -249,16 +257,19 @@ class SnapDrawn(): import numpy as np color = self.vert_color - edges = np.empty((len(elem.link_edges), 2), [("pos", "f4", 3), ("color", "f4", 4)]) + edges = np.empty((len(elem.link_edges), 2), [ + ("pos", "f4", 3), ("color", "f4", 4)]) edges["pos"][:, 0] = elem.co - edges["pos"][:, 1] = [e.other_vert(elem).co for e in elem.link_edges] + edges["pos"][:, 1] = [e.other_vert( + elem).co for e in elem.link_edges] edges["color"][:, 0] = color edges["color"][:, 1] = (color[0], color[1], color[2], 0.0) edges.shape = -1 self._program_smooth_col.bind() gpu.state.line_width_set(self._line_width) - batch = self.batch_lines_smooth_color_create(edges["pos"], edges["color"]) + batch = self.batch_lines_smooth_color_create( + edges["pos"], edges["color"]) batch.draw(self._program_smooth_col) gpu.state.line_width_set(1.0) else: @@ -267,7 +278,8 @@ class SnapDrawn(): self._program_unif_col.uniform_float("color", self.edge_color) gpu.state.line_width_set(self._line_width) - batch = self.batch_line_strip_create([v.co for v in elem.verts]) + batch = self.batch_line_strip_create( + [v.co for v in elem.verts]) batch.draw(self._program_unif_col) gpu.state.line_width_set(1.0) diff --git a/mesh_snap_utilities_line/keys.py b/mesh_snap_utilities_line/keys.py index 6fcd29869d11a10bd3c6652e99ffced9c3bc288d..d00e11aded1414b1222ec176021d31f028ec9fb2 100644 --- a/mesh_snap_utilities_line/keys.py +++ b/mesh_snap_utilities_line/keys.py @@ -4,6 +4,7 @@ km_tool_snap_utilities_line = "3D View Tool: Edit Mesh, Make Line" + def km_mesh_snap_utilities_operators(): return ( "Mesh", @@ -15,6 +16,7 @@ def km_mesh_snap_utilities_operators(): ]}, ) + """ def km_snap_utilities_modal_map(): items = [] @@ -50,6 +52,7 @@ def km_snap_utilities_modal_map(): return keymap """ + def km_3d_view_tool_snap_utilities_line(tool_mouse): return ( km_tool_snap_utilities_line, @@ -60,6 +63,7 @@ def km_3d_view_tool_snap_utilities_line(tool_mouse): ]}, ) + def km_view3d_empty(km_name): return ( km_name, @@ -70,30 +74,34 @@ def km_view3d_empty(km_name): # ------------------------------------------------------------------------------ # Full Configuration + def generate_empty_snap_utilities_tools_keymaps(): return [ - #km_view3d_empty(km_snap_utilities_modal_keymap), + # km_view3d_empty(km_snap_utilities_modal_keymap), km_view3d_empty(km_tool_snap_utilities_line), ] -def generate_snap_utilities_global_keymaps(tool_mouse = 'LEFTMOUSE'): + +def generate_snap_utilities_global_keymaps(tool_mouse='LEFTMOUSE'): return [ km_mesh_snap_utilities_operators(), ] -def generate_snap_utilities_tools_keymaps(tool_mouse = 'LEFTMOUSE'): + +def generate_snap_utilities_tools_keymaps(tool_mouse='LEFTMOUSE'): return [ # Tool System. km_3d_view_tool_snap_utilities_line(tool_mouse), ] -def generate_snap_utilities_keymaps(tool_mouse = 'LEFTMOUSE'): + +def generate_snap_utilities_keymaps(tool_mouse='LEFTMOUSE'): return [ km_mesh_snap_utilities_operators(), # Modal maps. - #km_snap_utilities_modal_map(), + # km_snap_utilities_modal_map(), # Tool System. km_3d_view_tool_snap_utilities_line(tool_mouse), diff --git a/mesh_snap_utilities_line/navigation_ops.py b/mesh_snap_utilities_line/navigation_ops.py index d92dcb5819391c1554d15ccd8493ff43c5c22cdf..d38eb786c713b71df05f59ca65cab6e80d38ae47 100644 --- a/mesh_snap_utilities_line/navigation_ops.py +++ b/mesh_snap_utilities_line/navigation_ops.py @@ -11,7 +11,8 @@ class VIEW3D_OT_rotate_custom_pivot(bpy.types.Operator): __slots__ = 'rv3d', 'init_coord', 'pos1', 'view_rot' pivot: bpy.props.FloatVectorProperty("Pivot", subtype='XYZ') - g_up_axis: bpy.props.FloatVectorProperty("up_axis", default=(0.0, 0.0, 1.0), subtype='XYZ') + g_up_axis: bpy.props.FloatVectorProperty( + "up_axis", default=(0.0, 0.0, 1.0), subtype='XYZ') sensitivity: bpy.props.FloatProperty("sensitivity", default=0.007) def modal(self, context, event): @@ -19,9 +20,11 @@ class VIEW3D_OT_rotate_custom_pivot(bpy.types.Operator): if event.value == 'PRESS' and event.type in {'MOUSEMOVE', 'INBETWEEN_MOUSEMOVE'}: dx = self.init_coord[0] - event.mouse_region_x dy = self.init_coord[1] - event.mouse_region_y - rot_ver = Matrix.Rotation(-dx * self.sensitivity, 3, self.g_up_axis) - rot_hor = Matrix.Rotation(dy * self.sensitivity, 3, self.view_rot[0]) - rot_mat = rot_hor @ rot_ver + rot_ver = Matrix.Rotation(-dx * + self.sensitivity, 3, self.g_up_axis) + rot_hor = Matrix.Rotation( + dy * self.sensitivity, 3, self.view_rot[0]) + rot_mat = rot_hor @ rot_ver view_matrix = self.view_rot @ rot_mat pos = self.pos1 @ rot_mat + self.pivot @@ -64,13 +67,15 @@ class VIEW3D_OT_zoom_custom_target(bpy.types.Operator): self.heigt_up = context.area.height - self.init_mouse_region_y self.rv3d.view_location = self.target - fac = (event.mouse_region_y - self.init_mouse_region_y) / self.heigt_up + fac = (event.mouse_region_y - + self.init_mouse_region_y) / self.heigt_up ret = 'RUNNING_MODAL' else: fac = self.step_factor * self.delta ret = 'FINISHED' - self.rv3d.view_location = self.init_loc + (self.target - self.init_loc) * fac + self.rv3d.view_location = self.init_loc + \ + (self.target - self.init_loc) * fac self.rv3d.view_distance = self.init_dist - self.init_dist * fac context.area.tag_redraw() @@ -82,10 +87,10 @@ class VIEW3D_OT_zoom_custom_target(bpy.types.Operator): self.rv3d = context.region_data self.init_dist = self.rv3d.view_distance if ((self.delta <= 0 and self.init_dist < dist_range[1]) or - (self.delta > 0 and self.init_dist > dist_range[0])): - self.init_loc = self.rv3d.view_location.copy() + (self.delta > 0 and self.init_dist > dist_range[0])): + self.init_loc = self.rv3d.view_location.copy() - context.window_manager.modal_handler_add(self) - return {'RUNNING_MODAL'} + context.window_manager.modal_handler_add(self) + return {'RUNNING_MODAL'} return {'FINISHED'} diff --git a/mesh_snap_utilities_line/op_line.py b/mesh_snap_utilities_line/op_line.py index 2a0d9953e8147b959860ff54f429dad782585137..7dcb4a522dd462da16bd4b5a856d55fbe807c49b 100644 --- a/mesh_snap_utilities_line/op_line.py +++ b/mesh_snap_utilities_line/op_line.py @@ -12,7 +12,7 @@ from .common_classes import ( Constrain, SnapNavigation, SnapUtilities, - ) +) if not __package__: @@ -81,7 +81,8 @@ def make_line(self, bm_geom, location): elif isinstance(bm_geom, bmesh.types.BMEdge): self.list_edges.append(bm_geom) - ret = intersect_point_line(location, bm_geom.verts[0].co, bm_geom.verts[1].co) + ret = intersect_point_line( + location, bm_geom.verts[0].co, bm_geom.verts[1].co) if (ret[0] - location).length_squared < .001: if ret[1] == 0.0: @@ -89,12 +90,13 @@ def make_line(self, bm_geom, location): elif ret[1] == 1.0: vert = bm_geom.verts[1] else: - edge, vert = bmesh.utils.edge_split(bm_geom, bm_geom.verts[0], ret[1]) + edge, vert = bmesh.utils.edge_split( + bm_geom, bm_geom.verts[0], ret[1]) update_edit_mesh = True if self.list_verts == [] or self.list_verts[-1] != vert: self.list_verts.append(vert) - self.geom = vert # hack to highlight in the drawing + self.geom = vert # hack to highlight in the drawing # self.list_edges.append(edge) else: # constrain point is near @@ -113,7 +115,7 @@ def make_line(self, bm_geom, location): v1, v2 = self.list_verts[-2:] edge = bm.edges.get([v1, v2]) if edge: - self.list_edges.append(edge) + self.list_edges.append(edge) else: if not v2.link_edges: edge = bm.edges.new([v1, v2]) @@ -122,7 +124,8 @@ def make_line(self, bm_geom, location): v1_link_faces = v1.link_faces v2_link_faces = v2.link_faces if v1_link_faces and v2_link_faces: - split_faces.update(set(v1_link_faces).intersection(v2_link_faces)) + split_faces.update( + set(v1_link_faces).intersection(v2_link_faces)) else: if v1_link_faces: @@ -147,7 +150,8 @@ def make_line(self, bm_geom, location): del split_faces else: if self.intersect: - facesp = bmesh.ops.connect_vert_pair(bm, verts=[v1, v2], verts_exclude=bm.verts) + facesp = bmesh.ops.connect_vert_pair( + bm, verts=[v1, v2], verts_exclude=bm.verts) # print(facesp) if not self.intersect or not facesp['edges']: edge = bm.edges.new([v1, v2]) @@ -178,7 +182,7 @@ def make_line(self, bm_geom, location): obj.update_tag() bmesh.update_edit_mesh(obj.data) self.sctx.tag_update_drawn_snap_object(self.main_snap_obj) - #bm.verts.index_update() + # bm.verts.index_update() bpy.ops.ed.undo_push(message="Undo draw line*") @@ -191,10 +195,10 @@ class SnapUtilitiesLine(SnapUtilities, bpy.types.Operator): bl_label = "Line Tool" bl_options = {'REGISTER'} - wait_for_input : bpy.props.BoolProperty(name="Wait for Input", default=True) + wait_for_input: bpy.props.BoolProperty(name="Wait for Input", default=True) def _exit(self, context): - #avoids unpredictable crashes + # avoids unpredictable crashes del self.main_snap_obj del self.main_bm del self.list_edges @@ -205,7 +209,7 @@ class SnapUtilitiesLine(SnapUtilities, bpy.types.Operator): context.area.header_text_set(None) self.snap_context_free() - #Restore initial state + # Restore initial state context.tool_settings.mesh_select_mode = self.select_mode context.space_data.overlay.show_face_center = self.show_face_center @@ -222,7 +226,8 @@ class SnapUtilitiesLine(SnapUtilities, bpy.types.Operator): self.obj = context.edit_object self.bm = bmesh.from_edit_mesh(self.obj.data) - self.main_snap_obj = self.snap_obj = self.sctx._get_snap_obj_by_obj(self.obj) + self.main_snap_obj = self.snap_obj = self.sctx._get_snap_obj_by_obj( + self.obj) self.main_bm = self.bm def _shift_contrain_callback(self): @@ -247,7 +252,7 @@ class SnapUtilitiesLine(SnapUtilities, bpy.types.Operator): del self.main_bm self.charmap.clear() - bpy.ops.object.mode_set(mode='EDIT') # just to be sure + bpy.ops.object.mode_set(mode='EDIT') # just to be sure bpy.ops.mesh.select_all(action='DESELECT') context.tool_settings.mesh_select_mode = (True, False, True) context.space_data.overlay.show_face_center = True @@ -271,18 +276,20 @@ class SnapUtilitiesLine(SnapUtilities, bpy.types.Operator): self.bool_update = False self.snap_obj, self.prevloc, self.location, self.type, self.bm, self.geom, self.len = snap_utilities( - self.sctx, - self.main_snap_obj, - mval, - constrain=self.vector_constrain, - previous_vert=(self.list_verts[-1] if self.list_verts else None), - increment=self.incremental) + self.sctx, + self.main_snap_obj, + mval, + constrain=self.vector_constrain, + previous_vert=( + self.list_verts[-1] if self.list_verts else None), + increment=self.incremental) self.snap_to_grid() if is_making_lines and self.preferences.auto_constrain: loc = self.list_verts_co[-1] - vec, type = self.constrain.update(self.sctx.region, self.sctx.rv3d, mval, loc) + vec, type = self.constrain.update( + self.sctx.region, self.sctx.rv3d, mval, loc) self.vector_constrain = [loc, loc + vec, type] if event.value == 'PRESS': @@ -291,8 +298,10 @@ class SnapUtilitiesLine(SnapUtilities, bpy.types.Operator): if not self.bool_update: text_value = self.charmap.length_entered_value - vector = (self.location - self.list_verts_co[-1]).normalized() - self.location = self.list_verts_co[-1] + (vector * text_value) + vector = (self.location - + self.list_verts_co[-1]).normalized() + self.location = self.list_verts_co[-1] + \ + (vector * text_value) del vector elif self.constrain.modal(event, self._shift_contrain_callback): @@ -303,7 +312,8 @@ class SnapUtilitiesLine(SnapUtilities, bpy.types.Operator): else: loc = self.location - self.vector_constrain = (loc, loc + self.constrain.last_vec, self.constrain.last_type) + self.vector_constrain = ( + loc, loc + self.constrain.last_vec, self.constrain.last_type) else: self.vector_constrain = None @@ -352,7 +362,8 @@ class SnapUtilitiesLine(SnapUtilities, bpy.types.Operator): if is_making_lines: a = 'length: ' + self.charmap.get_converted_length_str(self.len) - context.area.header_text_set(text = "hit: %.3f %.3f %.3f %s" % (*self.location, a)) + context.area.header_text_set( + text="hit: %.3f %.3f %.3f %s" % (*self.location, a)) if True or is_making_lines: return {'RUNNING_MODAL'} @@ -362,14 +373,16 @@ class SnapUtilitiesLine(SnapUtilities, bpy.types.Operator): def draw_callback_px(self): if self.bm: self.draw_cache.draw_elem(self.snap_obj, self.bm, self.geom) - self.draw_cache.draw(self.type, self.location, self.list_verts_co, self.vector_constrain, self.prevloc) + self.draw_cache.draw(self.type, self.location, + self.list_verts_co, self.vector_constrain, self.prevloc) def invoke(self, context, event): if context.space_data.type == 'VIEW_3D': self.snap_context_init(context) self.snap_context_update(context) - self.constrain = Constrain(self.preferences, context.scene, self.obj) + self.constrain = Constrain( + self.preferences, context.scene, self.obj) self.intersect = self.preferences.intersect self.create_face = self.preferences.create_face @@ -380,21 +393,21 @@ class SnapUtilitiesLine(SnapUtilities, bpy.types.Operator): # print('name', __name__, __package__) - #Store current state + # Store current state self.select_mode = context.tool_settings.mesh_select_mode[:] self.show_face_center = context.space_data.overlay.show_face_center - #Modify the current state + # Modify the current state bpy.ops.mesh.select_all(action='DESELECT') context.tool_settings.mesh_select_mode = (True, False, True) context.space_data.overlay.show_face_center = True - #Store values from 3d view context + # Store values from 3d view context self.rv3d = context.region_data self.rotMat = self.rv3d.view_matrix.copy() # self.obj_matrix.transposed()) - #modals + # modals context.window_manager.modal_handler_add(self) if not self.wait_for_input: @@ -405,7 +418,8 @@ class SnapUtilitiesLine(SnapUtilities, bpy.types.Operator): point = mat_inv @ self.location self.list_verts_co = make_line(self, self.geom, point) - self._handle = bpy.types.SpaceView3D.draw_handler_add(self.draw_callback_px, (), 'WINDOW', 'POST_VIEW') + self._handle = bpy.types.SpaceView3D.draw_handler_add( + self.draw_callback_px, (), 'WINDOW', 'POST_VIEW') return {'RUNNING_MODAL'} else: @@ -416,5 +430,6 @@ class SnapUtilitiesLine(SnapUtilities, bpy.types.Operator): def register(): bpy.utils.register_class(SnapUtilitiesLine) + if __name__ == "__main__": register() diff --git a/mesh_snap_utilities_line/preferences.py b/mesh_snap_utilities_line/preferences.py index 2336de9021fd7696c214c0be81d4a8b5eb4dfa77..3552ca95c774d2820f6eef1f3d83023199379936 100644 --- a/mesh_snap_utilities_line/preferences.py +++ b/mesh_snap_utilities_line/preferences.py @@ -9,7 +9,7 @@ from bpy.props import ( IntProperty, FloatVectorProperty, FloatProperty, - ) +) from bpy.app.translations import contexts as i18n_contexts @@ -21,94 +21,94 @@ class SnapUtilitiesPreferences(bpy.types.AddonPreferences): # when defining this in a submodule of a python package. bl_idname = __package__ - intersect : BoolProperty(name="Intersect", - description="intersects created line with the existing edges, even if the lines do not intersect", - default=True) - - create_face : BoolProperty(name="Create faces", - description="Create faces defined by enclosed edges", - default=False) - - outer_verts : BoolProperty(name="Snap to outer vertices", - description="The vertices of the objects are not activated also snapped", - default=True) - - increments_grid : BoolProperty(name="Increments of Grid", - description="Snap to increments of grid", - default=False) - - auto_constrain : BoolProperty(name="Automatic Constraint", - description="Detects a direction to constrain depending on the position of the mouse", - default=False) - - incremental : FloatProperty(name="Incremental", - description="Snap in defined increments", - default=0, - min=0, - step=1, - precision=3) - - relative_scale : FloatProperty(name="Relative Scale", - description="Value that divides the global scale", - default=1, - min=0, - step=1, - precision=3) - - out_color : FloatVectorProperty(name="Floor", - default=(0.0, 0.0, 0.0, 0.5), - size=4, - subtype="COLOR", - min=0, - max=1) - - face_color : FloatVectorProperty(name="Face Highlighted", - default=(1.0, 0.8, 0.0, 0.5), - size=4, - subtype="COLOR", - min=0, - max=1) - - edge_color : FloatVectorProperty(name="Edge Highlighted", - default=(0.0, 0.8, 1.0, 0.5), - size=4, - subtype="COLOR", - min=0, - max=1) - - vert_color : FloatVectorProperty(name="Vertex Highlighted", - default=(1.0, 0.5, 0.0, 0.5), - size=4, subtype="COLOR", - min=0, - max=1) - - center_color : FloatVectorProperty(name="Middle of the Edge", - default=(1.0, 0.0, 1.0, 1.0), - size=4, - subtype="COLOR", - min=0, - max=1) - - perpendicular_color : FloatVectorProperty(name="Perpendicular Point", - default=(0.1, 0.5, 0.5, 1.0), - size=4, - subtype="COLOR", - min=0, - max=1) - - constrain_shift_color : FloatVectorProperty(name="Shift Constrain", - default=(0.8, 0.5, 0.4, 1.0), - size=4, - subtype="COLOR", - min=0, - max=1) - - tabs : EnumProperty(name="Tabs", - items = [("GENERAL", "General", ""), - ("KEYMAPS", "Keymaps", ""), - ("COLORS", "Colors", ""), - ("HELP", "Links", ""),], - default="GENERAL") + intersect: BoolProperty(name="Intersect", + description="intersects created line with the existing edges, even if the lines do not intersect", + default=True) + + create_face: BoolProperty(name="Create faces", + description="Create faces defined by enclosed edges", + default=False) + + outer_verts: BoolProperty(name="Snap to outer vertices", + description="The vertices of the objects are not activated also snapped", + default=True) + + increments_grid: BoolProperty(name="Increments of Grid", + description="Snap to increments of grid", + default=False) + + auto_constrain: BoolProperty(name="Automatic Constraint", + description="Detects a direction to constrain depending on the position of the mouse", + default=False) + + incremental: FloatProperty(name="Incremental", + description="Snap in defined increments", + default=0, + min=0, + step=1, + precision=3) + + relative_scale: FloatProperty(name="Relative Scale", + description="Value that divides the global scale", + default=1, + min=0, + step=1, + precision=3) + + out_color: FloatVectorProperty(name="Floor", + default=(0.0, 0.0, 0.0, 0.5), + size=4, + subtype="COLOR", + min=0, + max=1) + + face_color: FloatVectorProperty(name="Face Highlighted", + default=(1.0, 0.8, 0.0, 0.5), + size=4, + subtype="COLOR", + min=0, + max=1) + + edge_color: FloatVectorProperty(name="Edge Highlighted", + default=(0.0, 0.8, 1.0, 0.5), + size=4, + subtype="COLOR", + min=0, + max=1) + + vert_color: FloatVectorProperty(name="Vertex Highlighted", + default=(1.0, 0.5, 0.0, 0.5), + size=4, subtype="COLOR", + min=0, + max=1) + + center_color: FloatVectorProperty(name="Middle of the Edge", + default=(1.0, 0.0, 1.0, 1.0), + size=4, + subtype="COLOR", + min=0, + max=1) + + perpendicular_color: FloatVectorProperty(name="Perpendicular Point", + default=(0.1, 0.5, 0.5, 1.0), + size=4, + subtype="COLOR", + min=0, + max=1) + + constrain_shift_color: FloatVectorProperty(name="Shift Constrain", + default=(0.8, 0.5, 0.4, 1.0), + size=4, + subtype="COLOR", + min=0, + max=1) + + tabs: EnumProperty(name="Tabs", + items=[("GENERAL", "General", ""), + ("KEYMAPS", "Keymaps", ""), + ("COLORS", "Colors", ""), + ("HELP", "Links", ""), ], + default="GENERAL") def draw(self, context): layout = self.layout @@ -152,7 +152,8 @@ class SnapUtilitiesPreferences(bpy.types.AddonPreferences): def draw_snap_utilities_colors(self, layout): layout.use_property_split = True - flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False) + flow = layout.grid_flow( + row_major=False, columns=0, even_columns=True, even_rows=False, align=False) flow.prop(self, "out_color") flow.prop(self, "constrain_shift_color") @@ -165,9 +166,10 @@ class SnapUtilitiesPreferences(bpy.types.AddonPreferences): def draw_snap_utilities_help(self, layout): #layout.operator("wm.url_open", text="Gumroad Page", icon='HELP',).url = "https://gum.co/IaqQf" #layout.operator("wm.url_open", text="Blender Market Page", icon='HELP',).url = "https://blendermarket.com/products/snap-utilities" - layout.operator("wm.url_open", text="Wiki", icon='HELP',).url = "https://github.com/Mano-Wii/Addon-Snap-Utilities-Line/wiki" - layout.operator("wm.url_open", text="Forum", icon='HELP',).url = "https://blenderartists.org/t/cad-snap-utilities" - + layout.operator("wm.url_open", text="Wiki", icon='HELP', + ).url = "https://github.com/Mano-Wii/Addon-Snap-Utilities-Line/wiki" + layout.operator("wm.url_open", text="Forum", icon='HELP', + ).url = "https://blenderartists.org/t/cad-snap-utilities" def draw_snap_utilities_keymaps(self, context, layout): from .keys import ( @@ -206,4 +208,5 @@ class SnapUtilitiesPreferences(bpy.types.AddonPreferences): for kmi in km.keymap_items: if "snap_utilities" in kmi.idname: - rna_keymap_ui.draw_kmi(["ADDON", "USER", "DEFAULT"], kc, km, kmi, col, 0) + rna_keymap_ui.draw_kmi( + ["ADDON", "USER", "DEFAULT"], kc, km, kmi, col, 0) diff --git a/mesh_snap_utilities_line/widgets.py b/mesh_snap_utilities_line/widgets.py index 36be306bbc30cbdb0a829f0b6798b57c1fe8b318..28e14826842e1b4e2b1ba188496898b56bb34d63 100644 --- a/mesh_snap_utilities_line/widgets.py +++ b/mesh_snap_utilities_line/widgets.py @@ -6,7 +6,7 @@ from .common_classes import SnapUtilities from .common_utilities import snap_utilities -#def mesh_runtime_batchcache_isdirty(me): +# def mesh_runtime_batchcache_isdirty(me): # import ctypes # batch_cache = ctypes.c_void_p.from_address(me.as_pointer() + 1440) # if batch_cache: @@ -15,7 +15,7 @@ from .common_utilities import snap_utilities class SnapWidgetCommon(SnapUtilities, bpy.types.Gizmo): -# __slots__ = ('inited', 'mode', 'last_mval') + # __slots__ = ('inited', 'mode', 'last_mval') snap_to_update = False @@ -24,9 +24,9 @@ class SnapWidgetCommon(SnapUtilities, bpy.types.Gizmo): if cls.snap_to_update is False: last_operator = self.wm_operators[-1] if self.wm_operators else None if (not last_operator or - last_operator.name not in {'Select', 'Loop Select', '(De)select All'}): - cls.snap_to_update = depsgraph.id_type_updated('MESH') or \ - depsgraph.id_type_updated('OBJECT') + last_operator.name not in {'Select', 'Loop Select', '(De)select All'}): + cls.snap_to_update = depsgraph.id_type_updated('MESH') or \ + depsgraph.id_type_updated('OBJECT') def draw_point_and_elem(self): if self.bm: @@ -76,7 +76,7 @@ class SnapWidgetCommon(SnapUtilities, bpy.types.Gizmo): self.last_mval = mval if (SnapWidgetCommon.snap_to_update): - ## Something has changed since the last time. + # Something has changed since the last time. # Has the mesh been changed? # In the doubt lets clear the snap context. self.snap_context_update(context) @@ -84,22 +84,24 @@ class SnapWidgetCommon(SnapUtilities, bpy.types.Gizmo): #print('test_select', mval) space = context.space_data - self.sctx.update_viewport_context(context.evaluated_depsgraph_get(), context.region, space, True) + self.sctx.update_viewport_context( + context.evaluated_depsgraph_get(), context.region, space, True) shading = space.shading snap_face = not ((self.snap_vert or self.snap_edge) and - (shading.show_xray or shading.type == 'WIREFRAME')) + (shading.show_xray or shading.type == 'WIREFRAME')) if snap_face != self.snap_face: self.snap_face = snap_face - self.sctx.set_snap_mode(self.snap_vert, self.snap_edge, self.snap_face) + self.sctx.set_snap_mode( + self.snap_vert, self.snap_edge, self.snap_face) snap_utilities.cache.clear() self.snap_obj, prev_loc, self.location, self.type, self.bm, self.geom, len = snap_utilities( - self.sctx, - None, - mval, - increment=self.incremental + self.sctx, + None, + mval, + increment=self.incremental )