Skip to content
Snippets Groups Projects
measureit_main.py 82.3 KiB
Newer Older
  • Learn to ignore specific revisions
  •             # Add properties
                scene = context.scene
                mainobject = context.object
                mylist = get_smart_selected(mainobject)
                if len(mylist) < 1:  # if not selected linked vertex
                    mylist = get_selected_vertex(mainobject)
    
                if len(mylist) >= 1:
                    if 'MeasureGenerator' not in mainobject:
                        mainobject.MeasureGenerator.add()
    
                    mp = mainobject.MeasureGenerator[0]
    
    NBurn's avatar
    NBurn committed
                    for x in range(len(mylist)):
    
                        # -----------------------
                        # Only if not exist
                        # -----------------------
                        if exist_segment(mp, mylist[x], mylist[x], 12 + int(self.tag)) is False:
                            # Create all array elements
                            for cont in range(len(mp.measureit_segments) - 1, mp.measureit_num):
                                mp.measureit_segments.add()
    
                            # Set values
                            ms = mp.measureit_segments[mp.measureit_num]
                            ms.gltype = 12 + int(self.tag)
                            ms.glpointa = mylist[x]
                            ms.glpointb = mylist[x]
                            ms.glarrow_a = scene.measureit_glarrow_a
                            ms.glarrow_b = scene.measureit_glarrow_b
                            ms.glarrow_s = scene.measureit_glarrow_s
                            # color
                            ms.glcolor = scene.measureit_default_color
                            # dist
                            ms.glspace = scene.measureit_hint_space
                            # text
                            ms.gltxt = scene.measureit_gl_txt
                            ms.glfont_size = scene.measureit_font_size
    
                            ms.glfont_align = scene.measureit_font_align
                            ms.glfont_rotat = scene.measureit_font_rotation
    
                            # Sum group
                            ms.gltot = scene.measureit_sum
                            # Add index
                            mp.measureit_num += 1
    
                    # redraw
                    context.area.tag_redraw()
                    return {'FINISHED'}
                else:
                    self.report({'ERROR'},
                                "MeasureIt: Select at least one vertex for creating measure segment.")
                    return {'FINISHED'}
            else:
                self.report({'WARNING'},
                            "View3D not found, cannot run operator")
    
            return {'CANCELLED'}
    
    
    # -------------------------------------------------------------
    
    # Defines button that adds an angle measure
    
    #
    # -------------------------------------------------------------
    
    class MEASUREIT_OT_AddAngle(Operator):
        bl_idname = "measureit.addangle"
    
        bl_label = "Angle"
        bl_description = "(EDITMODE only) Add a new angle measure (select 3 vertices, 2nd is angle vertex)"
    
        # ------------------------------
        # Poll
        # ------------------------------
        @classmethod
        def poll(cls, context):
            o = context.object
            if o is None:
                return False
            else:
                if o.type == "MESH":
                    if bpy.context.mode == 'EDIT_MESH':
                        return True
                    else:
                        return False
                else:
                    return False
    
        # ------------------------------
        # Execute button action
        # ------------------------------
        def execute(self, context):
            if context.area.type == 'VIEW_3D':
                # Add properties
                scene = context.scene
                mainobject = context.object
                mylist = get_selected_vertex_history(mainobject)
                if len(mylist) == 3:
                    if 'MeasureGenerator' not in mainobject:
                        mainobject.MeasureGenerator.add()
    
                    mp = mainobject.MeasureGenerator[0]
                    # -----------------------
                    # Only if not exist
                    # -----------------------
                    if exist_segment(mp, mylist[0], mylist[1], 9, mylist[2]) is False:
                        # Create all array elements
                        for cont in range(len(mp.measureit_segments) - 1, mp.measureit_num):
                            mp.measureit_segments.add()
    
                        # Set values
                        ms = mp.measureit_segments[mp.measureit_num]
                        ms.gltype = 9
                        ms.glpointa = mylist[0]
                        ms.glpointb = mylist[1]
                        ms.glpointc = mylist[2]
                        # color
                        ms.glcolor = scene.measureit_default_color
                        # dist
                        ms.glspace = scene.measureit_hint_space
                        # text
                        ms.gltxt = scene.measureit_gl_txt
                        ms.glfont_size = scene.measureit_font_size
    
                        ms.glfont_align = scene.measureit_font_align
                        ms.glfont_rotat = scene.measureit_font_rotation
    
                        # Add index
                        mp.measureit_num += 1
    
                    # redraw
                    context.area.tag_redraw()
                    return {'FINISHED'}
                else:
                    self.report({'ERROR'},
                                "MeasureIt: Select three vertices for creating angle measure")
                    return {'FINISHED'}
            else:
                self.report({'WARNING'},
                            "View3D not found, cannot run operator")
    
            return {'CANCELLED'}
    
    
    # -------------------------------------------------------------
    
    # Defines button that adds an arc measure
    
    #
    # -------------------------------------------------------------
    
    class MEASUREIT_OT_AddArc(Operator):
        bl_idname = "measureit.addarc"
    
        bl_label = "Angle"
        bl_description = "(EDITMODE only) Add a new arc measure (select 3 vertices of the arc," \
                         " vertices 1st and 3rd are arc extremes)"
    
        # ------------------------------
        # Poll
        # ------------------------------
        @classmethod
        def poll(cls, context):
            o = context.object
            if o is None:
                return False
            else:
                if o.type == "MESH":
                    if bpy.context.mode == 'EDIT_MESH':
                        return True
                    else:
                        return False
                else:
                    return False
    
        # ------------------------------
        # Execute button action
        # ------------------------------
        def execute(self, context):
            if context.area.type == 'VIEW_3D':
                # Add properties
                scene = context.scene
                mainobject = context.object
                mylist = get_selected_vertex_history(mainobject)
                if len(mylist) == 3:
                    if 'MeasureGenerator' not in mainobject:
                        mainobject.MeasureGenerator.add()
    
                    mp = mainobject.MeasureGenerator[0]
                    # -----------------------
                    # Only if not exist
                    # -----------------------
                    if exist_segment(mp, mylist[0], mylist[1], 11, mylist[2]) is False:
                        # Create all array elements
                        for cont in range(len(mp.measureit_segments) - 1, mp.measureit_num):
                            mp.measureit_segments.add()
    
                        # Set values
                        ms = mp.measureit_segments[mp.measureit_num]
                        ms.gltype = 11
                        ms.glpointa = mylist[0]
                        ms.glpointb = mylist[1]
                        ms.glpointc = mylist[2]
                        ms.glarrow_a = scene.measureit_glarrow_a
                        ms.glarrow_b = scene.measureit_glarrow_b
                        ms.glarrow_s = scene.measureit_glarrow_s
                        # color
                        ms.glcolor = scene.measureit_default_color
                        # dist
                        ms.glspace = scene.measureit_hint_space
                        # text
                        ms.gltxt = scene.measureit_gl_txt
                        ms.glfont_size = scene.measureit_font_size
    
                        ms.glfont_align = scene.measureit_font_align
                        ms.glfont_rotat = scene.measureit_font_rotation
    
                        # Add index
                        mp.measureit_num += 1
    
                    # redraw
                    context.area.tag_redraw()
                    return {'FINISHED'}
                else:
                    self.report({'ERROR'},
                                "MeasureIt: Select three vertices for creating arc measure")
                    return {'FINISHED'}
            else:
                self.report({'WARNING'},
                            "View3D not found, cannot run operator")
    
            return {'CANCELLED'}
    
    
    # -------------------------------------------------------------
    
    # Defines button that adds a label segment
    
    #
    # -------------------------------------------------------------
    
    class MEASUREIT_OT_AddLabel(Operator):
        bl_idname = "measureit.addlabel"
    
        bl_label = "Add"
        bl_description = "(EDITMODE only) Add a new measure label (select 1 vertex)"
    
        # ------------------------------
        # Poll
        # ------------------------------
        @classmethod
        def poll(cls, context):
            o = context.object
            if o is None:
                return False
            else:
                if o.type == "MESH":
                    if bpy.context.mode == 'EDIT_MESH':
                        return True
                    else:
                        return False
                else:
                    return False
    
        # ------------------------------
        # Execute button action
        # ------------------------------
        def execute(self, context):
            if context.area.type == 'VIEW_3D':
                # Add properties
                scene = context.scene
                mainobject = context.object
                mylist = get_selected_vertex(mainobject)
                if len(mylist) == 1:
                    if 'MeasureGenerator' not in mainobject:
                        mainobject.MeasureGenerator.add()
    
                    mp = mainobject.MeasureGenerator[0]
                    # -----------------------
                    # Only if not exist
                    # -----------------------
                    if exist_segment(mp, mylist[0], mylist[0], 2) is False:  # Both equal
                        # Create all array elements
                        for cont in range(len(mp.measureit_segments) - 1, mp.measureit_num):
                            mp.measureit_segments.add()
    
                        # Set values
                        ms = mp.measureit_segments[mp.measureit_num]
                        ms.gltype = 2
                        ms.glpointa = mylist[0]
                        ms.glpointb = mylist[0]  # Equal
                        ms.glarrow_a = scene.measureit_glarrow_a
                        ms.glarrow_b = scene.measureit_glarrow_b
                        ms.glarrow_s = scene.measureit_glarrow_s
                        # color
                        ms.glcolor = scene.measureit_default_color
                        # dist
                        ms.glspace = scene.measureit_hint_space
                        # text
                        ms.gltxt = scene.measureit_gl_txt
                        ms.glfont_size = scene.measureit_font_size
    
                        ms.glfont_align = scene.measureit_font_align
                        ms.glfont_rotat = scene.measureit_font_rotation
    
                        # Add index
                        mp.measureit_num += 1
    
                    # redraw
                    context.area.tag_redraw()
                    return {'FINISHED'}
                else:
                    self.report({'ERROR'},
                                "MeasureIt: Select one vertex for creating measure label")
                    return {'FINISHED'}
            else:
                self.report({'WARNING'},
                            "View3D not found, cannot run operator")
    
            return {'CANCELLED'}
    
    
    # -------------------------------------------------------------
    
    # Defines button that adds a link
    
    #
    # -------------------------------------------------------------
    
    class MEASUREIT_OT_AddLink(Operator):
        bl_idname = "measureit.addlink"
    
        bl_label = "Add"
        bl_description = "(OBJECT mode only) Add a new measure between objects (select 2 " \
                         "objects and optionally 1 or 2 vertices)"
    
        # ------------------------------
        # Poll
        # ------------------------------
        @classmethod
        def poll(cls, context):
            o = context.object
            if o is None:
                return False
            else:
    
                if o.type == "MESH" or o.type == "EMPTY" or o.type == "CAMERA" or o.type == "LIGHT":
    
                    if bpy.context.mode == 'OBJECT':
                        return True
                    else:
                        return False
                else:
                    return False
    
        # ------------------------------
        # Execute button action
        # ------------------------------
        def execute(self, context):
            if context.area.type == 'VIEW_3D':
                scene = context.scene
                mainobject = context.object
                # -------------------------------
                # Verify number of objects
                # -------------------------------
                if len(context.selected_objects) != 2:
                    self.report({'ERROR'},
                                "MeasureIt: Select two objects only, and optionally 1 vertex or 2 vertices "
                                "(one of each object)")
                    return {'FINISHED'}
                # Locate other object
                linkobject = None
                for o in context.selected_objects:
                    if o.name != mainobject.name:
                        linkobject = o.name
                # Verify destination vertex
                lkobj = bpy.data.objects[linkobject]
                mylinkvertex = get_selected_vertex(lkobj)
                if len(mylinkvertex) > 1:
                    self.report({'ERROR'},
                                "MeasureIt: The destination object has more than one vertex selected. "
                                "Select only 1 or none")
                    return {'FINISHED'}
                # Verify origin vertex
                myobjvertex = get_selected_vertex(mainobject)
                if len(mylinkvertex) > 1:
                    self.report({'ERROR'},
                                "MeasureIt: The active object has more than one vertex selected. Select only 1 or none")
                    return {'FINISHED'}
    
                # -------------------------------
                # Add properties
                # -------------------------------
                flag = False
                if 'MeasureGenerator' not in mainobject:
                    mainobject.MeasureGenerator.add()
    
                mp = mainobject.MeasureGenerator[0]
    
                # if exist_segment(mp, mylist[0], mylist[0], 3) is False:
                #     flag = True
                # Create all array elements
                for cont in range(len(mp.measureit_segments) - 1, mp.measureit_num):
                    mp.measureit_segments.add()
    
                # Set values
                ms = mp.measureit_segments[mp.measureit_num]
                # -----------------------
                # Vertex to Vertex
                # -----------------------
                if len(myobjvertex) == 1 and len(mylinkvertex) == 1:
                    ms.gltype = 3
                    ms.glpointa = myobjvertex[0]
                    ms.glpointb = mylinkvertex[0]
                    flag = True
                # -----------------------
                # Vertex to Object
                # -----------------------
                if len(myobjvertex) == 1 and len(mylinkvertex) == 0:
                    ms.gltype = 4
                    ms.glpointa = myobjvertex[0]
                    ms.glpointb = 0
                    flag = True
                # -----------------------
                # Object to Vertex
                # -----------------------
                if len(myobjvertex) == 0 and len(mylinkvertex) == 1:
                    ms.gltype = 5
                    ms.glpointa = 0
                    ms.glpointb = mylinkvertex[0]
                    flag = True
                # -----------------------
                # Object to Object
                # -----------------------
                if len(myobjvertex) == 0 and len(mylinkvertex) == 0:
                    ms.gltype = 8
                    ms.glpointa = 0
                    ms.glpointb = 0  # Equal
                    flag = True
    
                # ------------------
                # only if created
                # ------------------
                if flag is True:
                    ms.glarrow_a = scene.measureit_glarrow_a
                    ms.glarrow_b = scene.measureit_glarrow_b
                    ms.glarrow_s = scene.measureit_glarrow_s
                    # color
                    ms.glcolor = scene.measureit_default_color
                    # dist
                    ms.glspace = scene.measureit_hint_space
                    # text
                    ms.gltxt = scene.measureit_gl_txt
                    ms.glfont_size = scene.measureit_font_size
    
                    ms.glfont_align = scene.measureit_font_align
                    ms.glfont_rotat = scene.measureit_font_rotation
    
                    # link
                    ms.gllink = linkobject
                    # Add index
                    mp.measureit_num += 1
    
                    # -----------------------
                    # Only if not exist
                    # -----------------------
                    # redraw
                    context.area.tag_redraw()
                    return {'FINISHED'}
            else:
                self.report({'WARNING'},
                            "View3D not found, cannot run operator")
    
            return {'CANCELLED'}
    
    
    # -------------------------------------------------------------
    
    # Defines button that adds an origin segment
    
    #
    # -------------------------------------------------------------
    
    class MEASUREIT_OT_AddOrigin(Operator):
        bl_idname = "measureit.addorigin"
    
        bl_label = "Add"
        bl_description = "(OBJECT mode only) Add a new measure to origin (select object and optionally 1 vertex)"
    
        # ------------------------------
        # Poll
        # ------------------------------
        @classmethod
        def poll(cls, context):
            o = context.object
            if o is None:
                return False
            else:
    
                if o.type == "MESH" or o.type == "EMPTY" or o.type == "CAMERA" or o.type == "LIGHT":
    
                    if bpy.context.mode == 'OBJECT':
                        return True
                    else:
                        return False
                else:
                    return False
    
        # ------------------------------
        # Execute button action
        # ------------------------------
        def execute(self, context):
            if context.area.type == 'VIEW_3D':
                # Add properties
                scene = context.scene
                mainobject = context.object
                mylist = get_selected_vertex(mainobject)
                if 'MeasureGenerator' not in mainobject:
                    mainobject.MeasureGenerator.add()
    
                mp = mainobject.MeasureGenerator[0]
                # Create all array elements
                for cont in range(len(mp.measureit_segments) - 1, mp.measureit_num):
                    mp.measureit_segments.add()
    
                # -----------------------
                # Set values
                # -----------------------
                ms = mp.measureit_segments[mp.measureit_num]
                flag = False
                if len(mylist) > 0:
                    if len(mylist) == 1:
                        if exist_segment(mp, mylist[0], mylist[0], 6) is False:  # Both equal
                            flag = True
                            # Vertex to origin
                            ms.gltype = 6
                            ms.glpointa = mylist[0]
                            ms.glpointb = mylist[0]
                    else:
                        self.report({'ERROR'},
                                    "MeasureIt: Enter in EDITMODE and select one vertex only for creating "
                                    "measure from vertex to origin")
                        return {'FINISHED'}
                else:
                    # Object to origin
                    if exist_segment(mp, 0, 0, 7) is False:  # Both equal
                        flag = True
                        ms.gltype = 7
                        ms.glpointa = 0
                        ms.glpointb = 0
                # ------------------
                # only if created
                # ------------------
                if flag is True:
                    ms.glarrow_a = scene.measureit_glarrow_a
                    ms.glarrow_b = scene.measureit_glarrow_b
                    ms.glarrow_s = scene.measureit_glarrow_s
                    # color
                    ms.glcolor = scene.measureit_default_color
                    # dist
                    ms.glspace = scene.measureit_hint_space
                    # text
                    ms.gltxt = scene.measureit_gl_txt
                    ms.glfont_size = scene.measureit_font_size
    
                    ms.glfont_align = scene.measureit_font_align
                    ms.glfont_rotat = scene.measureit_font_rotation
    
                    # Add index
                    mp.measureit_num += 1
    
                # redraw
                context.area.tag_redraw()
    
                return {'FINISHED'}
            else:
                self.report({'WARNING'},
                            "View3D not found, cannot run operator")
    
            return {'CANCELLED'}
    
    
    # -------------------------------------------------------------
    
    # Defines button that deletes a measure segment
    
    #
    # -------------------------------------------------------------
    
    class MEASUREIT_OT_DeleteSegment(Operator):
        bl_idname = "measureit.deletesegment"
    
        bl_label = "Delete"
        bl_description = "Delete a measure"
    
        tag: IntProperty()
    
    
        # ------------------------------
        # Execute button action
        # ------------------------------
        def execute(self, context):
            if context.area.type == 'VIEW_3D':
                # Add properties
                mainobject = context.object
                mp = mainobject.MeasureGenerator[0]
                ms = mp.measureit_segments[self.tag]
                ms.glfree = True
                # Delete element
                mp.measureit_segments.remove(self.tag)
                mp.measureit_num -= 1
                # redraw
                context.area.tag_redraw()
                return {'FINISHED'}
            else:
                self.report({'WARNING'},
                            "View3D not found, cannot run operator")
    
            return {'CANCELLED'}
    
    
    # -------------------------------------------------------------
    
    # Defines button that deletes all measure segments
    
    #
    # -------------------------------------------------------------
    
    class MEASUREIT_OT_DeleteAllSegment(Operator):
        bl_idname = "measureit.deleteallsegment"
    
        bl_label = "Delete"
        bl_description = "Delete all measures (it cannot be undone)"
    
        tag: IntProperty()
    
    
        # ------------------------------
        # Execute button action
        # ------------------------------
        def execute(self, context):
            if context.area.type == 'VIEW_3D':
                # Add properties
                mainobject = context.object
                mp = mainobject.MeasureGenerator[0]
    
                while len(mp.measureit_segments) > 0:
                    mp.measureit_segments.remove(0)
    
                # reset size
                mp.measureit_num = len(mp.measureit_segments)
                # redraw
                context.area.tag_redraw()
                return {'FINISHED'}
            else:
                self.report({'WARNING'},
                            "View3D not found, cannot run operator")
    
            return {'CANCELLED'}
    
    
    # -------------------------------------------------------------
    
    # Defines button that deletes all measure segment sums
    
    #
    # -------------------------------------------------------------
    
    class MEASUREIT_OT_DeleteAllSum(Operator):
        bl_idname = "measureit.deleteallsum"
    
        bl_label = "Delete"
        bl_description = "Delete all sum groups"
    
        tag: IntProperty()
    
    
        # ------------------------------
        # Execute button action
        # ------------------------------
        # noinspection PyMethodMayBeStatic
        def execute(self, context):
            if context.object is not None:
                if 'MeasureGenerator' in context.object:
                    mp = context.object.MeasureGenerator[0]
    
    NBurn's avatar
    NBurn committed
                    for idx in range(mp.measureit_num):
    
                        ms = mp.measureit_segments[idx]
                        ms.gltot = '99'
    
                return {'FINISHED'}
    
    
    # -------------------------------------------------------------
    
    # Defines button that expands all measure segments
    #
    # -------------------------------------------------------------
    
    class MEASUREIT_OT_ExpandAllSegment(Operator):
        bl_idname = "measureit.expandallsegment"
    
        bl_label = "Expand"
        bl_description = "Expand all measure properties"
    
        tag: IntProperty()
    
    
        # ------------------------------
        # Execute button action
        # ------------------------------
        def execute(self, context):
            if context.area.type == 'VIEW_3D':
                # Add properties
                mainobject = context.object
                mp = mainobject.MeasureGenerator[0]
    
                for i in mp.measureit_segments:
                    i.gladvance = True
    
                return {'FINISHED'}
            else:
                self.report({'WARNING'},
                            "View3D not found, cannot run operator")
    
            return {'CANCELLED'}
    
    
    # -------------------------------------------------------------
    # Defines button that collapses all measure segments
    #
    # -------------------------------------------------------------
    
    class MEASUREIT_OT_CollapseAllSegment(Operator):
        bl_idname = "measureit.collapseallsegment"
    
        bl_label = "Collapse"
        bl_description = "Collapses all measure properties"
    
        tag: IntProperty()
    
    
        # ------------------------------
        # Execute button action
        # ------------------------------
        def execute(self, context):
            if context.area.type == 'VIEW_3D':
                # Add properties
                mainobject = context.object
                mp = mainobject.MeasureGenerator[0]
    
                for i in mp.measureit_segments:
                    i.gladvance = False
    
                return {'FINISHED'}
            else:
                self.report({'WARNING'},
                            "View3D not found, cannot run operator")
    
            return {'CANCELLED'}
    
    
    # -------------------------------------------------------------
    # Defines button for render option
    
    #
    # -------------------------------------------------------------
    
    class MEASUREIT_OT_RenderSegment(Operator):
        bl_idname = "measureit.rendersegment"
    
        bl_label = "Render"
        bl_description = "Create a render image with measures. Use UV/Image editor to view image generated"
    
        tag: IntProperty()
    
    
        # ------------------------------
        # Execute button action
        # ------------------------------
        # noinspection PyMethodMayBeStatic,PyUnusedLocal
        def execute(self, context):
            scene = context.scene
            msg = "New image created with measures. Open it in UV/image editor"
            camera_msg = "Unable to render. No camera found"
            # -----------------------------
            # Check camera
            # -----------------------------
            if scene.camera is None:
                self.report({'ERROR'}, camera_msg)
                return {'FINISHED'}
            # -----------------------------
    
            # Frame render
    
            # -----------------------------
            if scene.measureit_render_type == "1":
                # noinspection PyBroadException
                if render_main(self, context) is True:
                    self.report({'INFO'}, msg)
            # -----------------------------
            # Animation
            # -----------------------------
    
            if scene.measureit_render_type == "2":
    
                oldframe = scene.frame_current
                flag = False
                # loop frames
                for frm in range(scene.frame_start, scene.frame_end + 1):
                    scene.frame_set(frm)
                    print("MeasureIt: Rendering frame %04d" % frm)
                    flag = render_main(self, context, True)
                    if flag is False:
                        break
    
                scene.frame_current = oldframe
                if flag is True:
                    self.report({'INFO'}, msg)
    
            return {'FINISHED'}
    
        # ---------------------
        # Set cameraView
        # ---------------------
        # noinspection PyMethodMayBeStatic
        def set_camera_view(self):
            for area in bpy.context.screen.areas:
                if area.type == 'VIEW_3D':
                    area.spaces[0].region_3d.view_perspective = 'CAMERA'
    
        # -------------------------------------
        # Set only render status
        # -------------------------------------
        # noinspection PyMethodMayBeStatic
        def set_only_render(self, status):
            screen = bpy.context.screen
    
            v3d = False
            s = None
            # get spaceview_3d in current screen
            for a in screen.areas:
                if a.type == 'VIEW_3D':
                    for s in a.spaces:
                        if s.type == 'VIEW_3D':
                            v3d = s
                            break
    
            if v3d is not False:
                s.show_only_render = status
    
    
    # -------------------------------------------------------------
    # Defines a new note
    #
    # -------------------------------------------------------------
    
    class MEASUREIT_OT_AddNote(Operator):
        bl_idname = "measureit.addnote"
    
        bl_label = "Note"
        bl_description = "(OBJECT mode only) Add a new annotation"
    
        tag: IntProperty()
    
    
        # ------------------------------
        # Poll
        # ------------------------------
        # noinspection PyUnusedLocal
        @classmethod
        def poll(cls, context):
            if bpy.context.mode == 'OBJECT':
                return True
            else:
                return False
    
        # ------------------------------
        # Execute button action
        # ------------------------------
        def execute(self, context):
            if context.area.type == 'VIEW_3D':
                bpy.ops.object.empty_add(type='PLAIN_AXES')
                myempty = bpy.data.objects[bpy.context.active_object.name]
    
                myempty.location = bpy.context.scene.cursor.location
    
                myempty.empty_display_size = 0.01
    
                myempty.name = "Annotation"
                # Add properties
                scene = context.scene
                mainobject = myempty
                if 'MeasureGenerator' not in mainobject:
                    mainobject.MeasureGenerator.add()
    
                mp = mainobject.MeasureGenerator[0]
                # Create all array elements
                for cont in range(len(mp.measureit_segments) - 1, mp.measureit_num):
                    mp.measureit_segments.add()
    
                # Set values
                ms = mp.measureit_segments[mp.measureit_num]
                ms.gltype = 10
                ms.glpointa = 0
                ms.glpointb = 0  # Equal
                # color
                ms.glcolor = scene.measureit_default_color
                # dist
                ms.glspace = scene.measureit_hint_space
                # text
                ms.gltxt = scene.measureit_gl_txt
                ms.glfont_size = scene.measureit_font_size
    
                ms.glfont_align = scene.measureit_font_align
                ms.glfont_rotat = scene.measureit_font_rotation
    
                # Add index
                mp.measureit_num += 1
    
                # redraw
                context.area.tag_redraw()
                return {'FINISHED'}
            else:
                self.report({'WARNING'},
                            "View3D not found, cannot run operator")
    
            return {'CANCELLED'}
    
    
    # -------------------------------------------------------------
    
    # Defines button that enables/disables the tip display
    
    #
    # -------------------------------------------------------------
    
    class MEASUREIT_OT_RunHintDisplay(Operator):
        bl_idname = "measureit.runopengl"
    
        bl_label = "Display hint data manager"
        bl_description = "Main control for enabling or disabling the display of measurements in the viewport"
    
        _handle = None  # keep function handler
    
        # ----------------------------------
        # Enable gl drawing adding handler
        # ----------------------------------
        @staticmethod
        def handle_add(self, context):
    
            if MEASUREIT_OT_RunHintDisplay._handle is None:
                MEASUREIT_OT_RunHintDisplay._handle = SpaceView3D.draw_handler_add(draw_callback_px, (self, context),
    
    Antonioya's avatar
    Antonioya committed
                                                                            'WINDOW',
                                                                            'POST_PIXEL')
    
                context.window_manager.measureit_run_opengl = True
    
        # ------------------------------------
        # Disable gl drawing removing handler
        # ------------------------------------
        # noinspection PyUnusedLocal
        @staticmethod
        def handle_remove(self, context):
    
            if MEASUREIT_OT_RunHintDisplay._handle is not None:
                SpaceView3D.draw_handler_remove(MEASUREIT_OT_RunHintDisplay._handle, 'WINDOW')
            MEASUREIT_OT_RunHintDisplay._handle = None
    
            context.window_manager.measureit_run_opengl = False
    
        # ------------------------------
        # Execute button action
        # ------------------------------
        def execute(self, context):
            if context.area.type == 'VIEW_3D':
                if context.window_manager.measureit_run_opengl is False:
                    self.handle_add(self, context)
                    context.area.tag_redraw()
                else:
                    self.handle_remove(self, context)
                    context.area.tag_redraw()
    
                return {'FINISHED'}
            else:
                self.report({'WARNING'},
                            "View3D not found, cannot run operator")
    
            return {'CANCELLED'}
    
    
    # -------------------------------------------------------------
    # Handle all draw routines (OpenGL main entry point)
    #
    # -------------------------------------------------------------
    def draw_main(context):
        region = bpy.context.region
        # Detect if Quadview to get drawing area
        if not context.space_data.region_quadviews:
            rv3d = bpy.context.space_data.region_3d
        else:
            # verify area
            if context.area.type != 'VIEW_3D' or context.space_data.type != 'VIEW_3D':
                return
            i = -1
            for region in context.area.regions:
                if region.type == 'WINDOW':
                    i += 1
                    if context.region.id == region.id:
                        break
            else:
                return
    
            rv3d = context.space_data.region_quadviews[i]
    
        scene = bpy.context.scene
    
        # Display selected or all
    
        if scene.measureit_gl_ghost is False:
    
            objlist = context.selected_objects
        else:
    
            objlist = context.view_layer.objects
    
        # Enable drawing
        gpu.state.blend_set('ALPHA')
    
        # ---------------------------------------
        # Generate all OpenGL calls for measures
        # ---------------------------------------
        for myobj in objlist:
    
            if myobj.visible_get() is True:
    
                if 'MeasureGenerator' in myobj:
    
                    op = myobj.MeasureGenerator[0]
                    draw_segments(context, myobj, op, region, rv3d)
    
    
        # ---------------------------------------
        # Generate all OpenGL calls for debug
        # ---------------------------------------
        if scene.measureit_debug is True:
            selobj = bpy.context.selected_objects
            for myobj in selobj:
    
                if scene.measureit_debug_objects is True:
                    draw_object(context, myobj, region, rv3d)
                elif scene.measureit_debug_object_loc is True:
                    draw_object(context, myobj, region, rv3d)
    
                if scene.measureit_debug_vertices is True:
                    draw_vertices(context, myobj, region, rv3d)
    
                elif scene.measureit_debug_vert_loc is True:
                    draw_vertices(context, myobj, region, rv3d)
                if scene.measureit_debug_edges is True:
                    draw_edges(context, myobj, region, rv3d)
    
                if scene.measureit_debug_faces is True or scene.measureit_debug_normals is True:
                    draw_faces(context, myobj, region, rv3d)
    
        # -----------------------
    
        # restore defaults
    
        gpu.state.blend_set('NONE')
    
    
    
    # -------------------------------------------------------------
    # Handler for drawing OpenGl
    # -------------------------------------------------------------
    # noinspection PyUnusedLocal
    def draw_callback_px(self, context):
        draw_main(context)
    
    
    # -------------------------------------------------------------
    # Check if the segment already exist
    #
    # -------------------------------------------------------------
    def exist_segment(mp, pointa, pointb, typ=1, pointc=None):
        #  for ms in mp.measureit_segments[mp.measureit_num]
        for ms in mp.measureit_segments:
            if ms.gltype == typ and ms.glfree is False:
                if typ != 9:
                    if ms.glpointa == pointa and ms.glpointb == pointb:
                        return True
                    if ms.glpointa == pointb and ms.glpointb == pointa:
                        return True
                else:
                    if ms.glpointa == pointa and ms.glpointb == pointb and ms.glpointc == pointc:
                        return True
    
        return False
    
    
    # -------------------------------------------------------------
    # Get vertex selected