#!BPY """ Name: 'Realsize' Blender: 236 Group: 'Object' Tooltip: 'Measure real size of objects' """ ###################################################### # # realsize.py # ###################################################### # This script measures distances of vetices and objects ###################################################### ###################################################### # Importing modules ###################################################### import Blender from Blender import NMesh from Blender.BGL import * from Blender.Draw import * import math from math import * # Events EVENT_EXIT = 1 EVENT_NOEVENT = 2 EVENT_MEASURE = 3 EVENT_SET = 4 UNIT_KM = 0 UNIT_M = 1 UNIT_MM = 2 MEASURE_VV = 0 MEASURE_OO = 2 MEASURE_VC = 1 MEASURE_OC = 3 T_Distance = Create(0.0) T_Distance_metric = Create(0.0) unit_menu = Create (UNIT_M) measure_menu = Create (MEASURE_VV) ###################################################### # GUI drawing ###################################################### def draw(): global EVENT_NOEVENT,EVENT_MEASURE,EVENT_SET,EVENT_EXIT global T_Distance global T_Distance_metric global unit_menu global measure_menu ########## Titles glClear(GL_COLOR_BUFFER_BIT) glRasterPos2d(8, 103) Text("Measured distances:") ######### Parameters GUI Buttons T_Distance = Number("Blender Distance: ", EVENT_NOEVENT, 10, 80, 210, 18, T_Distance.val, 0, 10000, "Distance in Blender units"); T_Distance_metric = Number("Metric Distance: ", EVENT_NOEVENT, 10, 55, 210, 18, T_Distance_metric.val, 0, 10000, "Distance in the metric system"); menu_name = """Measure Points %t|Vertex <-> Vertex %x0|Vertex <-> 3D-Cursor %x1 |Object <-> Object %x2O|Object <-> 3D-Cursor %x3""" measure_menu = Blender.Draw.Menu(menu_name, EVENT_NOEVENT, 10, 120, 200, 20, measure_menu.val, "Select the measure points") menu_name = "Measure Unit %t|km %x0|m %x1|mm %x2" unit_menu = Blender.Draw.Menu(menu_name, EVENT_NOEVENT, 250, 53, 50, 20, unit_menu.val, "Select the measure unit") ######### Draw and Exit Buttons Button("Measure" ,EVENT_MEASURE, 10, 10, 80, 18) Button("Set", EVENT_SET, 140, 10, 80, 18) Button("Exit", EVENT_EXIT, 270, 10, 80, 18) def event(evt, val): if (evt == QKEY and not val): Exit() def bevent(evt): global EVENT_NOEVENT,EVENT_MEASURE,EVENT_SET,EVENT_EXIT global T_Distance global T_Distance_metric global real_factor global unit_menu global measure_menu multi = 1 ######### Manages GUI events if (evt == EVENT_EXIT): Exit() elif (evt == EVENT_MEASURE): objects = Blender.Object.GetSelected () if (measure_menu.val == MEASURE_VV): dist = MeasureVertexVertex (objects) elif (measure_menu.val == MEASURE_OO): dist = MeasureObjectObject (objects) elif (measure_menu.val == MEASURE_OC): dist = MeasureObjectCursor (objects) elif (measure_menu.val == MEASURE_VC): dist = MeasureVertexCursor (objects) else: dist = 0 T_Distance.val = dist if (T_Distance_metric.val != 0): if (unit_menu.val == UNIT_KM): multi = 0.001 elif (unit_menu.val == UNIT_M): multi = 1 elif (unit_menu.val == UNIT_MM): multi = 1000 T_Distance_metric.val = dist / real_factor * multi elif (evt == EVENT_SET): if (T_Distance_metric.val != 0): if (unit_menu.val == UNIT_KM): multi = 0.001 elif (unit_menu.val == UNIT_M): multi = 1 elif (unit_menu.val == UNIT_MM): multi = 1000 real_factor = T_Distance.val / T_Distance_metric.val * multi else: real_factor = 1 Blender.Draw.Redraw () def MultiplyMatrixVector (matrix, vector, size): pos = [0,0,0,0] for i in range (0, size): for n in range (0, size): pos[i] = pos[i] + matrix[n][i] * vector[n] return pos def TwoVectorDistance (v1, v2): dist = sqrt( pow(v1[0]-v2[0],2) + pow(v1[1]-v2[1],2) + pow(v1[2]-v2[2],2) ) return dist def error (str): Blender.Draw.PupMenu (str) def MeasureVertexVertex (objects): # enter end leave Editmode to update selection state if (Blender.Window.EditMode () == 1): Blender.Window.EditMode (0) Blender.Window.EditMode (1) if (len(objects) == 0): error ("Select a object!") return 0 # get mesh data nmesh = objects[0].getData () sel_verts = 0 sel_verts_lst = [0, 0] for v in nmesh.verts: if (v.sel == 1): if (sel_verts > 1): sel_verts = 3 break vec_tmp = [v.co[0], v.co[1], v.co[2], 1] pos = MultiplyMatrixVector (objects[0].matrixWorld, vec_tmp, 4) sel_verts_lst[sel_verts] = pos #increase for counter sel_verts = sel_verts + 1 if (sel_verts == 2): dist = TwoVectorDistance (sel_verts_lst[0], sel_verts_lst[1]) return dist else: error ("Select exact two vertices!") return 0 def MeasureVertexCursor (objects): # enter end leave Editmode to update selection state if (Blender.Window.EditMode () == 1): Blender.Window.EditMode (0) Blender.Window.EditMode (1) if (len(objects) == 0): error ("Select a object!") return 0 # get mesh data nmesh = objects[0].getData () sel_verts = 0 sel_verts_lst = [0] for v in nmesh.verts: if (v.sel == 1): if (sel_verts > 0): sel_verts = 2 break vec_tmp = [v.co[0], v.co[1], v.co[2], 1] pos = MultiplyMatrixVector (objects[0].matrixWorld, vec_tmp, 4) sel_verts_lst[sel_verts] = pos #increase for counter sel_verts = sel_verts + 1 if (sel_verts == 1): dist = TwoVectorDistance (sel_verts_lst[0], Blender.Window.GetCursorPos ()) return dist else: error ("Select exact two vertices!") return 0 def MeasureObjectObject (objects): if (len(objects) != 2): error ("Select exact two objects!") return 0 dist = TwoVectorDistance (objects[0].loc, objects[1].loc) return dist def MeasureObjectCursor (objects): if (len(objects) != 1): error ("Select exact one object!") return 0 dist = TwoVectorDistance (objects[0].loc, Blender.Window.GetCursorPos ()) return dist ###################################################### # Main Body ###################################################### Register(draw, event, bevent) global real_factor real_factor = 1 # print cursor pos #print ("Cursor Pos") #print (Blender.Window.GetCursorPos ())