Skip to content
Snippets Groups Projects
np_float_poly.py 84.8 KiB
Newer Older
  • Learn to ignore specific revisions
  •     # ON-SCREEN INSTRUCTIONS:
    
    
        if flag == 'BEVEL':
            main = 'specify bevel amount'
        else:
            main = 'specify extrusion height'
    
        region = bpy.context.region
        rv3d = bpy.context.region_data
        instruct = main
    
        if flag == 'BEVEL':
            keys_aff = 'LMB, ENTER - confirm, SCROLL - num of segments, M - mode, C - clamp overlap, NUMPAD - value'
            keys_nav = ''
            keys_neg = 'ESC, RMB - cancel bevel'
    
        else:
            keys_aff = 'CTRL - snap, LMB - confirm, ENTER - confirm without bevel, MMB - lock axis, NUMPAD - value'
            keys_nav = 'SPACE - change to navigate'
            keys_neg = 'ESC, RMB - cancel extrusion'
    
        display_instructions(region, rv3d, instruct, keys_aff, keys_nav, keys_neg)
    
    
        # ON-SCREEN INSTRUCTIONS:
    
        font_id = 0
    
    
        # Drawing the small badge near the cursor with the basic instructions:
        mouseloc = view3d_utils.location_3d_to_region_2d(region, rv3d, endloc3d)  # is this used ?
        # np_print(end, endloc, mouseloc)
        '''
        if badge == True:
            square = [[17, 30], [17, 40], [27, 40], [27, 30]]
            rectangle = [[27, 30], [27, 40], [67, 40], [67, 30]]
            polysymbol = copy.deepcopy(NP020FP.polysymbol)
            size = 2
            ipx = 29
            ipy = 33
            size = badge_size
            for co in square:
                co[0] = round((co[0] * size),0) -(size*10) + mouseloc[0]
                co[1] = round((co[1] * size),0) -(size*25) + mouseloc[1]
            for co in rectangle:
                co[0] = round((co[0] * size),0) -(size*10) + mouseloc[0]
                co[1] = round((co[1] * size),0) -(size*25) + mouseloc[1]
            for co in polysymbol:
                co[0] = round((co[0] * size),0) -(size*10) + mouseloc[0]
                co[1] = round((co[1] * size),0) -(size*25) + mouseloc[1]
            ipx = round((ipx * size),0) -(size*10) + mouseloc[0]
            ipy = round((ipy * size),0) -(size*25) + mouseloc[1]
            ipsize = int(6*size)
            bgl.glColor4f(0.0, 0.0, 0.0, 0.0)
            bgl.glBegin(bgl.GL_TRIANGLE_FAN)
            for x,y in square:
                bgl.glVertex2f(x,y)
            bgl.glEnd()
            bgl.glColor4f(1.0, 0.5, 0.0, 1.0)
            bgl.glBegin(bgl.GL_TRIANGLE_FAN)
            for x,y in rectangle:
                bgl.glVertex2f(x,y)
            bgl.glEnd()
            bgl.glColor4f(1.0, 1.0, 1.0, 1.0)
            bgl.glBegin(bgl.GL_LINE_STRIP)
            for x,y in polysymbol:
                bgl.glVertex2f(x,y)
            bgl.glEnd()
            bgl.glColor4f(1.0, 1.0, 1.0, 1.0)
            blf.position(font_id,ipx,ipy,0)
            blf.size(font_id,ipsize,72)
            blf.draw(font_id,'CTRL+SNAP')
    
        '''
        bgl.glLineWidth(1)
        bgl.glDisable(bgl.GL_BLEND)
        bgl.glColor4f(0.0, 0.0, 0.0, 1.0)
        # np_print('7')
        np_print('10_callback_EXTRUDE_END')
    
    
    class NPFPRunExtrude(bpy.types.Operator):
        bl_idname = 'object.np_fp_run_extrude'
        bl_label = 'NP FP Run Extrude'
        bl_options = {'INTERNAL'}
    
        np_print('10_run_EXTRUDE_START')
        count = 0
    
        def modal(self, context, event):
            context.area.tag_redraw()
            self.count += 1
            selob = NP020FP.selob
            flag = NP020FP.flag  # is this used ?
            polyob = NP020FP.polyob
            phase = NP020FP.phase
    
            if self.count == 1:
    
                if phase == 3:
                    bpy.ops.view3d.edit_mesh_extrude_move_normal('INVOKE_DEFAULT')
                else:
                    bpy.ops.transform.translate('INVOKE_DEFAULT',
                                                constraint_axis=(False, False, True),
    
    
                np_print('B')
                np_print('10_run_EXTRUDE_count_1_INVOKE_DEFAULT')
    
            elif event.type in ('LEFTMOUSE', 'NUMPAD_ENTER') and event.value == 'RELEASE':
                bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW')
                bpy.context.space_data.transform_orientation = NP020FP.trans_orient
                bpy.ops.object.mode_set(mode='OBJECT')
                bpy.ops.object.select_all(action='DESELECT')
                polyob.select = True
                bpy.ops.object.transform_apply(location=False, rotation=True, scale=True)
                bpy.ops.object.origin_set(type='ORIGIN_GEOMETRY')
                polyob.select = False
                bpy.ops.object.mode_set(mode='EDIT')
                NP020FP.flag = 'BEVEL'
                np_print('10_run_EXTRUDE_left_release_FINISHED')
                return{'FINISHED'}
    
            elif event.type == 'SPACE':
                bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW')
                NP020FP.phase = 3.5
                NP020FP.flag = 'NAVEX'
                np_print('10_run_TRANS_space_FINISHED_flag_NAVIGATE')
                return{'FINISHED'}
    
            elif event.type == 'RET':
                bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW')
                bpy.context.space_data.transform_orientation = NP020FP.trans_orient
                bpy.ops.object.mode_set(mode='OBJECT')
                bpy.ops.object.select_all(action='DESELECT')
                polyob.select = True
                bpy.ops.object.transform_apply(location=False, rotation=True, scale=True)
                bpy.ops.object.origin_set(type='ORIGIN_GEOMETRY')
                bpy.ops.object.select_all(action='DESELECT')
                if selob is not polyob:
                    for ob in selob:
    
                        ob.select_set(True)
    
                else:
                    polyob.select = True
                NP020FP.startloc3d = (0.0, 0.0, 0.0)
                NP020FP.endloc3d = (0.0, 0.0, 0.0)
                NP020FP.phase = 0
                NP020FP.start = None
                NP020FP.end = None
                NP020FP.dist = None
                NP020FP.polyob = None
                NP020FP.flag = 'TRANSLATE'
                NP020FP.snap = 'VERTEX'
                bpy.context.tool_settings.use_snap = NP020FP.use_snap
                bpy.context.tool_settings.snap_element = NP020FP.snap_element
                bpy.context.tool_settings.snap_target = NP020FP.snap_target
                bpy.context.space_data.pivot_point = NP020FP.pivot_point
                bpy.context.space_data.transform_orientation = NP020FP.trans_orient
                if NP020FP.acob is not None:
    
                    bpy.context.view_layer.objects.active = NP020FP.acob
    
                    bpy.ops.object.mode_set(mode=NP020FP.edit_mode)
                np_print('10_run_EXTRUDE_space_FINISHED_flag_TRANSLATE')
                return{'FINISHED'}
    
            elif event.type in ('ESC', 'RIGHTMOUSE'):
                # this actually begins when user RELEASES esc or rightmouse,
                # PRESS is taken by transform.translate operator
                bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW')
                bpy.context.space_data.transform_orientation = NP020FP.trans_orient
                bpy.ops.mesh.select_all(action='SELECT')
                bpy.ops.mesh.remove_doubles()
                bpy.ops.object.mode_set(mode='OBJECT')
                bpy.ops.object.select_all(action='DESELECT')
                if selob is not polyob:
                    for ob in selob:
    
                        ob.select_set(True)
    
                else:
                    polyob.select = True
                NP020FP.startloc3d = (0.0, 0.0, 0.0)
                NP020FP.endloc3d = (0.0, 0.0, 0.0)
                NP020FP.phase = 0
                NP020FP.start = None
                NP020FP.end = None
                NP020FP.dist = None
                NP020FP.polyob = None
                NP020FP.flag = 'TRANSLATE'
                NP020FP.snap = 'VERTEX'
                bpy.context.tool_settings.use_snap = NP020FP.use_snap
                bpy.context.tool_settings.snap_element = NP020FP.snap_element
                bpy.context.tool_settings.snap_target = NP020FP.snap_target
                bpy.context.space_data.pivot_point = NP020FP.pivot_point
                bpy.context.space_data.transform_orientation = NP020FP.trans_orient
                if NP020FP.acob is not None:
    
                    bpy.context.view_layer.objects.active = NP020FP.acob
    
                    bpy.ops.object.mode_set(mode=NP020FP.edit_mode)
                np_print('10_run_EXTRUDE_space_CANCELLED_flag_TRANSLATE')
                return{'CANCELLED'}
    
            np_print('10_run_EXTRUDE_PASS_THROUGH')
            return{'PASS_THROUGH'}
    
        def invoke(self, context, event):
            np_print('10_run_EXTRUDE_INVOKE_a')
    
            selob = NP020FP.selob  # is this used ?
            flag = NP020FP.flag
            np_print('flag = ', flag)
            polyob = NP020FP.polyob
    
            if flag == 'EXTRUDE':
                if context.area.type == 'VIEW_3D':
                    if bpy.context.mode == 'OBJECT':
                        bpy.ops.object.select_all(action='DESELECT')
    
                        bpy.context.view_layer.objects.active = polyob
    
                        polyob.select = True
                        bpy.ops.object.mode_set(mode='EDIT')
                        polyme = polyob.data
                        bpy.ops.mesh.select_all(action='SELECT')
                        bpy.ops.mesh.remove_doubles()
                        i = len(polyme.vertices)
                        i = int(i / 2)
                        NP020FP.startloc3d = polyme.vertices[0].co
                        NP020FP.startloc3d = polyme.vertices[i].co
                    if bpy.context.mode == 'EDIT':
                        polyme = polyob.data
                        i = len(polyme.vertices)
                        i = int(i / 2)
                        NP020FP.startloc3d = polyme.vertices[0].co
                        NP020FP.startloc3d = polyme.vertices[i].co
                    args = (self, context)
                    self._handle = bpy.types.SpaceView3D.draw_handler_add(draw_callback_px_EXTRUDE, args,
                                                                          'WINDOW', 'POST_PIXEL')
                    context.window_manager.modal_handler_add(self)
    
                    np_print('10_run_EXTRUDE_INVOKE_a_RUNNING_MODAL')
                    return {'RUNNING_MODAL'}
                else:
                    self.report({'WARNING'}, "View3D not found, cannot run operator")
                    np_print('10_run_EXTRUDE_INVOKE_a_CANCELLED')
                    return {'CANCELLED'}
            else:
                np_print('10_run_EXTRUDE_INVOKE_a_FINISHED')
                return {'FINISHED'}
    
    
    class NPFPRunBevel(bpy.types.Operator):
        bl_idname = 'object.np_fp_run_bevel'
        bl_label = 'NP FP Run Bevel'
        bl_options = {'INTERNAL'}
    
        np_print('11_run_BEVEL_START')
        count = 0
    
        def modal(self, context, event):
            context.area.tag_redraw()
            self.count += 1
            selob = NP020FP.selob
            flag = NP020FP.flag  # is this used ?
            polyob = NP020FP.polyob
    
            if self.count == 1:
    
                bpy.ops.mesh.bevel('INVOKE_DEFAULT')
    
                np_print('B')
                np_print('11_run_BEVEL_count_1_INVOKE_DEFAULT')
    
            elif event.type in ('LEFTMOUSE', 'RET', 'NUMPAD_ENTER', 'SPACE') and event.value == 'RELEASE':
                bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW')
                bpy.ops.mesh.select_all(action='DESELECT')
                bpy.ops.object.mode_set(mode='OBJECT')
                NP020FP.flag = 'TRANSLATE'
                bpy.ops.object.select_all(action='DESELECT')
                if selob is not polyob:
                    for ob in selob:
    
                        ob.select_set(True)
    
                else:
                    polyob.select = True
                NP020FP.startloc3d = (0.0, 0.0, 0.0)
                NP020FP.endloc3d = (0.0, 0.0, 0.0)
                NP020FP.phase = 0
                NP020FP.start = None
                NP020FP.end = None
                NP020FP.dist = None
                NP020FP.polyob = None
                NP020FP.snap = 'VERTEX'
                bpy.context.tool_settings.use_snap = NP020FP.use_snap
                bpy.context.tool_settings.snap_element = NP020FP.snap_element
                bpy.context.tool_settings.snap_target = NP020FP.snap_target
                bpy.context.space_data.pivot_point = NP020FP.pivot_point
                bpy.context.space_data.transform_orientation = NP020FP.trans_orient
                if NP020FP.acob is not None:
    
                    bpy.context.view_layer.objects.active = NP020FP.acob
    
                    bpy.ops.object.mode_set(mode=NP020FP.edit_mode)
                np_print('10_run_EXTRUDE_left_release_FINISHED')
                return{'FINISHED'}
    
            elif event.type in ('RIGHTMOUSE', 'ESC'):
                # this actually begins when user RELEASES esc or rightmouse,
                # PRESS is taken by transform.translate operator
                bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW')
                bpy.ops.object.mode_set(mode='OBJECT')
                bpy.ops.object.select_all(action='DESELECT')
                if selob is not polyob:
                    for ob in selob:
    
                        ob.select_set(True)
    
                else:
                    polyob.select = True
                NP020FP.startloc3d = (0.0, 0.0, 0.0)
                NP020FP.endloc3d = (0.0, 0.0, 0.0)
                NP020FP.phase = 0
                NP020FP.start = None
                NP020FP.end = None
                NP020FP.dist = None
                NP020FP.polyob = None
                NP020FP.flag = 'TRANSLATE'
                NP020FP.snap = 'VERTEX'
                bpy.context.tool_settings.use_snap = NP020FP.use_snap
                bpy.context.tool_settings.snap_element = NP020FP.snap_element
                bpy.context.tool_settings.snap_target = NP020FP.snap_target
                bpy.context.space_data.pivot_point = NP020FP.pivot_point
                bpy.context.space_data.transform_orientation = NP020FP.trans_orient
                if NP020FP.acob is not None:
    
                    bpy.context.view_layer.objects.active = NP020FP.acob
    
                    bpy.ops.object.mode_set(mode=NP020FP.edit_mode)
                np_print('11_run_BEVEL_esc_CANCELLED')
                return{'CANCELLED'}
    
            np_print('11_run_BEVEL_PASS_THROUGH')
            return{'PASS_THROUGH'}
    
        def invoke(self, context, event):
            np_print('11_run_BEVEL_INVOKE_a')
    
            addon_prefs = context.preferences.addons[__package__].preferences
    
            bevel = addon_prefs.npfp_bevel
            selob = NP020FP.selob
            flag = NP020FP.flag
            np_print('flag = ', flag)
            polyob = NP020FP.polyob
    
            if flag == 'BEVEL' and bevel:
                if context.area.type == 'VIEW_3D':
    
                    bpy.context.view_layer.objects.active = polyob
    
                    bpy.ops.mesh.select_all(action='SELECT')
                    args = (self, context)
                    NP020FP.main_BEVEL = 'DESIGNATE BEVEL AMOUNT'
                    self._handle = bpy.types.SpaceView3D.draw_handler_add(draw_callback_px_EXTRUDE,
                                                                          args, 'WINDOW', 'POST_PIXEL')
                    context.window_manager.modal_handler_add(self)
                    np_print('11_run_BEVEL_INVOKE_a_RUNNING_MODAL')
                    return {'RUNNING_MODAL'}
    
                else:
                    self.report({'WARNING'}, "View3D not found, cannot run operator")
                    np_print('11_run_BEVEL_INVOKE_a_CANCELLED')
                    return {'CANCELLED'}
            else:
                bpy.ops.object.mode_set(mode='OBJECT')
                bpy.ops.object.select_all(action='DESELECT')
                if selob is not polyob:
                    for ob in selob:
    
                        ob.select_set(True)
    
                else:
                    polyob.select = True
                NP020FP.startloc3d = (0.0, 0.0, 0.0)
                NP020FP.endloc3d = (0.0, 0.0, 0.0)
                NP020FP.phase = 0
                NP020FP.start = None
                NP020FP.end = None
                NP020FP.dist = None
                NP020FP.polyob = None
                NP020FP.flag = 'TRANSLATE'
                NP020FP.snap = 'VERTEX'
                bpy.context.tool_settings.use_snap = NP020FP.use_snap
                bpy.context.tool_settings.snap_element = NP020FP.snap_element
                bpy.context.tool_settings.snap_target = NP020FP.snap_target
                bpy.context.space_data.pivot_point = NP020FP.pivot_point
                bpy.context.space_data.transform_orientation = NP020FP.trans_orient
                if NP020FP.acob is not None:
    
                    bpy.context.view_layer.objects.active = NP020FP.acob
    
                    bpy.ops.object.mode_set(mode=NP020FP.edit_mode)
                np_print('11_run_BEVEL_INVOKE_a_FINISHED')
                return {'FINISHED'}
    
    
    
    
    # This is the actual addon process, the algorithm that defines the order of operator activation inside the main macro:
    
    def register():
    
        bpy.app.handlers.scene_update_post.append(scene_update)
    
        NP020FloatPoly.define('OBJECT_OT_np_fp_get_selection')
        NP020FloatPoly.define('OBJECT_OT_np_fp_read_mouse_loc')
        NP020FloatPoly.define('OBJECT_OT_np_fp_add_points')
        for i in range(1, 10):
            NP020FloatPoly.define('OBJECT_OT_np_fp_run_translate')
            NP020FloatPoly.define('OBJECT_OT_np_fp_run_navigate')
        NP020FloatPoly.define('OBJECT_OT_np_fp_change_phase')
        for i in range(1, 100):
            for i in range(1, 10):
                NP020FloatPoly.define('OBJECT_OT_np_fp_run_translate')
                NP020FloatPoly.define('OBJECT_OT_np_fp_run_navigate')
            NP020FloatPoly.define('OBJECT_OT_np_fp_make_segment')
        NP020FloatPoly.define('OBJECT_OT_np_fp_delete_points')
        NP020FloatPoly.define('OBJECT_OT_np_fp_make_surface')
        for i in range(1, 10):
            NP020FloatPoly.define('OBJECT_OT_np_fp_run_extrude')
            NP020FloatPoly.define('OBJECT_OT_np_fp_run_navex')
        NP020FloatPoly.define('OBJECT_OT_np_fp_run_bevel')
    
    
    def unregister():
    
        # bpy.app.handlers.scene_update_post.remove(scene_update)
        pass