Advertisement
Guest User

Untitled

a guest
Jun 5th, 2017
432
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.78 KB | None | 0 0
  1. #=======================================
  2. #  Code by Andreas Strømberg
  3. #=======================================
  4. def draw_callback_px(self, context):
  5.     # 50% alpha, 2 pixel width line
  6.     bgl.glEnable(bgl.GL_BLEND)
  7.     bgl.glColor4f(1.0, 1.0, 1.0, 1.0)
  8.     bgl.glLineWidth(4)
  9.  
  10.     bgl.glBegin(bgl.GL_LINES)
  11.     if self.started:
  12.         bgl.glVertex2i(self.start_vertex[0], self.start_vertex[1])
  13.         bgl.glVertex2i(self.end_vertex[0], self.end_vertex[1])
  14.  
  15.     bgl.glEnd()
  16.  
  17.     # restore opengl defaults
  18.     bgl.glLineWidth(1)
  19.     bgl.glDisable(bgl.GL_BLEND)
  20.     bgl.glColor4f(0.0, 0.0, 0.0, 1.0)
  21.  
  22.  
  23. def main(context, event, started):
  24.     """Run this function on left mouse, execute the ray cast"""
  25.     coord = event.mouse_region_x, event.mouse_region_y
  26.  
  27.     if started:
  28.         result = bpy.ops.view3d.select(extend=True, location=coord)
  29.     else:
  30.         result = bpy.ops.view3d.select(extend=False, location=coord)
  31.  
  32.     if result == {'PASS_THROUGH'}:
  33.         bpy.ops.mesh.select_all(action='DESELECT')
  34.  
  35. #Connect modal
  36. class RMB_Smart_Connect_Tool_Raycast(bpy.types.Operator):
  37.     """Modal object selection with a ray cast"""
  38.     bl_idname = "object.smart_connect_tool_raycast"
  39.     bl_label = "Smart Connect Tool Operator"
  40.     bl_options = {'REGISTER'}
  41.  
  42.     def __init__(self):
  43.         self.started = None
  44.         self.start_vertex = None
  45.         self.end_vertex = None
  46.         self._handle = None
  47.  
  48.     def modal(self, context, event):
  49.         context.area.tag_redraw()
  50.  
  51.         if event.type in {'MIDDLEMOUSE', 'WHEELUPMOUSE', 'WHEELDOWNMOUSE'}:
  52.             return {'PASS_THROUGH'}
  53.        
  54.         elif event.type == 'MOUSEMOVE':
  55.             if self.started:
  56.                 self.end_vertex = (event.mouse_region_x, event.mouse_region_y)
  57.  
  58.         elif event.type == 'LEFTMOUSE':
  59.             main(context, event, self.started)
  60.             if not self.started:
  61.                 if context.object.data.total_vert_sel == 1:
  62.                     self.start_vertex = (event.mouse_region_x, event.mouse_region_y)
  63.                     self.end_vertex = (event.mouse_region_x, event.mouse_region_y)
  64.                     self.started = True
  65.             elif context.object.data.total_vert_sel == 2:
  66.                
  67.                 if event.ctrl:
  68.                     bpy.ops.mesh.merge(type='CENTER')
  69.                 else:
  70.                     bpy.ops.mesh.vert_connect_path()
  71.                 if event.shift:
  72.                     bpy.ops.mesh.merge(type='LAST')
  73.                    
  74.                 bpy.ops.ed.undo_push(message="Add an undo step *function may be moved*")
  75.                 self.started = False
  76.            
  77.             return {'RUNNING_MODAL'}
  78.        
  79.         elif event.type == 'SPACE':
  80.             self.started = False
  81.            
  82.            
  83.         elif event.type in {'RIGHTMOUSE', 'ESC'}:
  84.             context.area.header_text_set()
  85.             bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW')
  86.             return {'CANCELLED'}
  87.  
  88.         return {'RUNNING_MODAL'}
  89.  
  90.     def invoke(self, context, event):
  91.         if context.space_data.type == 'VIEW_3D':
  92.             args = (self, context)
  93.  
  94.             self.start_vertex = (0, 0)
  95.             self.end_vertex = (0, 0)
  96.            
  97.             context.window_manager.modal_handler_add(self)
  98.             self._handle = bpy.types.SpaceView3D.draw_handler_add(draw_callback_px, args, 'WINDOW', 'POST_PIXEL')
  99.             context.area.header_text_set("Click: Continuos Connect, Drag+Click: Connect, Shift+Click: merge at Last, Ctrl+Click: Merge at Center, Space: Restart Auto Connect, RMB/ESC: Exit")
  100.             self.started = False
  101.             return {'RUNNING_MODAL'}
  102.         else:
  103.             self.report({'WARNING'}, "Active space must be a View3d")
  104.             return {'CANCELLED'}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement