def createConstraintsVisual(self, context, mesh):
        useprimitive = False
        referencemesh = None

        if (context.scene.landmarks_use_selection != ''):
            referencemesh = bpy.data.objects[
                context.scene.landmarks_use_selection]
        elif (self.markersource != ''
              and not self.markersource in '~PRIMITIVE~'):
            referencemesh = bpy.data.objects[self.markersource]
        else:
            useprimitive = True

        material = changeMarkerColor(mesh)
        unlinkedmaterial = changeUnlinkedMarkerColor(mesh)

        if (not context.mode == "OBJECT"):
            bpy.ops.object.mode_set(mode='OBJECT', toggle=False)

        deleteObjectWithMarkers(context, mesh)

        temp = -1

        mesh_loops = mesh.data.loops
        mesh_faces = mesh.data.polygons

        for index, marker in enumerate(mesh.generic_landmarks):
            markername = mesh.name + "_marker_" + str(marker.id)
            try:
                markerobj = context.data.objects[markername]
                createmarker = False
            except:
                createmarker = True

            if (marker.v_indices[0] == -1 and marker.v_indices[1] == -1
                    and marker.v_indices[-2] == -1):
                marker.v_indices[0], marker.v_indices[1], marker.v_indices[
                    2] = [
                        mesh_loops[lid].vertex_index
                        for lid in mesh_faces[marker.faceindex].loop_indices
                    ]

            vertex1 = mesh.data.vertices[marker.v_indices[0]].co
            vertex2 = mesh.data.vertices[marker.v_indices[1]].co
            vertex3 = mesh.data.vertices[marker.v_indices[2]].co

            location = getGeneralCartesianFromBarycentre(
                marker.v_ratios, [vertex1, vertex2, vertex3])
            marker.location = location

            if (useprimitive):
                bpy.ops.mesh.primitive_cube_add(location=location, radius=0.15)
            else:
                mk_mesh = bpy.data.meshes.new(mesh.name + "_marker_" +
                                              str(marker.id))
                # Create new object associated with the mesh
                ob_new = bpy.data.objects.new(
                    mesh.name + "_marker_" + str(marker.id), mk_mesh)
                ob_new.data = referencemesh.data.copy()
                ob_new.scale = referencemesh.scale
                # Link new object to the given scene and select it
                context.scene.objects.link(ob_new)
                bpy.ops.object.select_all(
                    action='DESELECT')  #deselect all object
                ob_new.select = True
                ob_new.location = location
                bpy.context.scene.objects.active = ob_new

#             markerobj = context.object;
            markerobj = context.active_object
            markerobj.is_visual_landmark = True
            markerobj.landmark_id = marker.id
            markerobj.name = mesh.name + "_marker_" + str(marker.id)
            markerobj.belongs_to = mesh.name

            markerobj.data.materials.clear()

            if (marker.is_linked):
                markerobj.data.materials.append(material)
            else:
                markerobj.data.materials.append(unlinkedmaterial)

            bpy.ops.object.select_all(action='DESELECT')  #deselect all object
            markerobj.parent = mesh

            if (marker.id > temp):
                temp = marker.id

#         for area in context.screen.areas: # iterate through areas in current screen
#             if area.type == 'VIEW_3D':
#                 for space in area.spaces: # iterate through spaces in current VIEW_3D area
#                     if space.type == 'VIEW_3D': # check if space is a 3D view
#                         space.viewport_shade = 'SOLID' # set the viewport shading to rendered

        context.scene.objects.active = mesh
    def unLinkMarkers(self, context, bmarkerobjects):
        if (len(bmarkerobjects) > 0):
            source, target = detectMN(bmarkerobjects[0])
            if (not source and not target):
                message = "Linking or Unlinking of landmarks is a concept applied only to mesh pairs with a bijective landmarks correspondence"
                bpy.ops.genericlandmarks.messagebox('INVOKE_DEFAULT',
                                                    messagetype='ERROR',
                                                    message=message,
                                                    messagelinesize=60)
                return
            for m in bmarkerobjects:
                info = m.name.split("_marker_")
                belongsto = bpy.data.objects[info[0]]
                hmarker = getGenericLandmark(belongsto, m)

                if (hmarker.is_linked):
                    hmarker.is_linked = False
                    hmarker.linked_id = -1
                else:
                    if (len(bmarkerobjects) < 2):
                        message = "You cannot unlink a marker that is not linked to any markers"
                        bpy.ops.genericlandmarks.messagebox(
                            'INVOKE_DEFAULT',
                            messagetype='ERROR',
                            message=message,
                            messagelinesize=60)

            for m in source.generic_landmarks:
                if (m.is_linked):
                    tm = [
                        tm for tm in target.generic_landmarks
                        if tm.id == m.linked_id
                    ][0]
                    if (not tm.is_linked):
                        m.is_linked = False
                        m.linked_id = -1
                        changeUnlinkedMarkerColor(source,
                                                  getBlenderMarker(source, m))
                        changeUnlinkedMarkerColor(target,
                                                  getBlenderMarker(target, tm))
                else:
                    changeUnlinkedMarkerColor(source,
                                              getBlenderMarker(source, m))

            for m in target.generic_landmarks:
                if (m.is_linked):
                    sm = [
                        sm for sm in source.generic_landmarks
                        if sm.id == m.linked_id
                    ][0]
                    if (not sm.is_linked):
                        m.is_linked = False
                        m.linked_id = -1
                        changeUnlinkedMarkerColor(target,
                                                  getBlenderMarker(target, m))
                        changeUnlinkedMarkerColor(source,
                                                  getBlenderMarker(source, sm))
                else:
                    changeUnlinkedMarkerColor(target,
                                              getBlenderMarker(target, m))
    def removeMarkers(self, context, bmarkerobjects):
        bmarkerobjects = [
            o for o in context.selected_objects if o.is_visual_landmark
        ]
        meshes = []

        bpy.ops.object.select_all(action="DESELECT")

        #Check if there are any markers in selection to be removed
        if (len(bmarkerobjects) > 0):
            #iterate through the selection to do the removal process
            for bmarker in bmarkerobjects:
                #For the current marker in iteration, find the mesh it belongs to
                info = bmarker.name.split("_marker_")
                #Access the blender mesh of the marker
                belongstoobject = getMeshForBlenderMarker(bmarker)
                #Access the original id of the marker
                originalid = int(info[1])
                #Index of the landmark object for the current blender marker in iteration
                hmindex = [
                    index for index, hm in enumerate(
                        belongstoobject.generic_landmarks)
                    if hm.id == originalid
                ]
                #The below check will work if the blender marker indeed has a landmark object pointer
                if (len(hmindex)):
                    hmindex = hmindex[0]
                    #Select the visual blender marker
                    bmarker.select = True
                    #Remove the pointer landmark based on the found index
                    belongstoobject.generic_landmarks.remove(hmindex)
                    #since there are many markers in selection, keep a track
                    #of the meshes (source or target) for which the markers were removed
                    try:
                        #The index method fails if the mesh was not in the list
                        meshes.index(belongstoobject.name)
                    except:
                        #The idea is to unlink markers for the markers removed
                        #in this iteration on the pair mesh. For example,
                        #removing a marker in source should ensure that the
                        #linked marker in the target should be unlinked and vice-versa
                        meshes.append(belongstoobject.name)

            #Blender object based delete operator to remove the marker objects
            #that would have been selected in the above iteration
            bpy.ops.object.delete()

            #Access the source and target meshes
            source, target = detectMN(bpy.data.objects[meshes[0]])

            if (not source and not target):
                return

            #iterate through the source landmarks
            for m in source.generic_landmarks:
                #Check if it the marker in source is a linked one
                if (m.is_linked):
                    #If linked, try accessing the target's landmark with the
                    #current iterated marker in source. If this operation fails
                    #It means the paired marker was removed in the previous iteration
                    #So, its time to unlink this source marker
                    try:
                        tm = [
                            tm for tm in target.generic_landmarks
                            if tm.id == m.linked_id
                        ][0]
                    except IndexError:
                        m.linked_id = -1
                        m.is_linked = False
                        changeUnlinkedMarkerColor(source,
                                                  getBlenderMarker(source, m))

            #iterate through the target landmarks
            for m in target.generic_landmarks:
                #Check if it the marker in target is a linked one
                if (m.is_linked):
                    #If linked, try accessing the source's landmark with the
                    #current iterated marker in target. If this operation fails
                    #It means the paired marker was removed in the previous iteration
                    #So, its time to unlink this target marker
                    try:
                        sm = [
                            sm for sm in source.generic_landmarks
                            if sm.id == m.linked_id
                        ][0]
                    except IndexError:
                        m.linked_id = -1
                        m.is_linked = False
                        changeUnlinkedMarkerColor(target,
                                                  getBlenderMarker(target, m))

            if (len(source.generic_landmarks) == 0):
                source.total_landmarks = len(source.generic_landmarks)

            if (len(target.generic_landmarks) == 0):
                target.total_landmarks = len(target.generic_landmarks)
    def createConstraintsVisual(self, context, mesh):
        useprimitive = False;
        referencemesh = None;
        
        if(context.scene.landmarks_use_selection != ''):
            referencemesh = bpy.data.objects[context.scene.landmarks_use_selection];
        elif(self.markersource != '' and not self.markersource in '~PRIMITIVE~'):
            referencemesh = bpy.data.objects[self.markersource];    
        else:
            useprimitive = True;
        
        
        material = changeMarkerColor(mesh);
        unlinkedmaterial = changeUnlinkedMarkerColor(mesh);
        
        if(not context.mode == "OBJECT"):
            bpy.ops.object.mode_set(mode='OBJECT', toggle=False);
        
        deleteObjectWithMarkers(context, mesh);
        
        temp = -1;
        
        for index, marker in enumerate(mesh.generic_landmarks):            
            markername = mesh.name + "_marker_"+str(marker.id);
            try:
                markerobj = context.data.objects[markername];
                createmarker = False;
            except:
                createmarker = True;
            
            vertex1 = mesh.data.vertices[marker.v_indices[0]].co;
            vertex2 = mesh.data.vertices[marker.v_indices[1]].co;
            vertex3 = mesh.data.vertices[marker.v_indices[2]].co;
            
            location = getGeneralCartesianFromBarycentre(marker.v_ratios, [vertex1, vertex2, vertex3]);
            marker.location = location;
            
            if(useprimitive):
                bpy.ops.mesh.primitive_cube_add(location=location, radius = 0.15);
            else:
                mk_mesh = bpy.data.meshes.new(mesh.name + "_marker_"+str(marker.id));
                # Create new object associated with the mesh
                ob_new = bpy.data.objects.new(mesh.name + "_marker_"+str(marker.id), mk_mesh);
                ob_new.data = referencemesh.data.copy();
                ob_new.scale = referencemesh.scale;
                # Link new object to the given scene and select it
                context.scene.objects.link(ob_new);
                bpy.ops.object.select_all(action='DESELECT') #deselect all object
                ob_new.select = True;
                ob_new.location = location;
                bpy.context.scene.objects.active = ob_new;
                
#             markerobj = context.object;
            markerobj = context.active_object;
            markerobj.is_visual_landmark = True;
            markerobj.landmark_id = marker.id;
            markerobj.name = mesh.name + "_marker_"+str(marker.id);
            markerobj.belongs_to = mesh.name;
            
            markerobj.data.materials.clear();
            
            if(marker.is_linked):
                markerobj.data.materials.append(material);
            else:
                markerobj.data.materials.append(unlinkedmaterial);
                
            bpy.ops.object.select_all(action='DESELECT') #deselect all object            
            markerobj.parent = mesh;
            
            if(marker.id > temp):
                temp = marker.id;
            
        for area in context.screen.areas: # iterate through areas in current screen
            if area.type == 'VIEW_3D':
                for space in area.spaces: # iterate through spaces in current VIEW_3D area
                    if space.type == 'VIEW_3D': # check if space is a 3D view
                        space.viewport_shade = 'SOLID' # set the viewport shading to rendered
        
        context.scene.objects.active = mesh;