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;