Hi Guys,
I’m new to python and scripting but I thought I would have a crack at writing an add-on which can add a dimension to 2 selected vertices.
I’ve been searching the net for snippets of code I might be able to use but I’m coming to the realisation that hacking something together may be a little harder than I thought.
So basically I can get the vertex coordinates, create a panel in the toolbar and write the distance in the different planes to this panel. But I’m sure that my code would make a programmer wince in pain if they saw it :no:.
What I would like this add-on to do is:
- Update when different vertices are selected.
- Have a button which adds a separate object (this would be the dimension arrows) and the text.
- Update this dimension to the different axis/plane from the drop down menu.
Any advice/help/information would be greatly appreciated and sorry in advance for any noobie mistakes :o
import bpy
import math
from bpy.props import *
#Set mode to object mode
bpy.ops.object.mode_set(mode='OBJECT')
#Get active vertex coordinates
vert_coordinates = [i.co for i in bpy.context.active_object.data.vertices if i.select == True]
#Set mode back to edit mode
bpy.ops.object.mode_set(mode='EDIT')
#Function to determine vector magnitude
def mangnitude(x,y,z):
w = math.sqrt(x*x + y*y + z*z)
return w
#Determin the Dimension vector and magnitude
dimension_vector = vert_coordinates[0]-vert_coordinates[1]
dimension_vector_string = [str(round(x,2)) for x in dimension_vector]
dimension_magnitude = mangnitude(dimension_vector[0],dimension_vector[1],dimension_vector[2])
# Function to create different pannel types
def initSceneProperties(scn):
'''
bpy.types.Scene.MyInt = IntProperty(
name = "Integer",
description = "Enter an integer")
scn['MyInt'] = 17
bpy.types.Scene.MyFloat = FloatProperty(
name = "Length",
description = "Enter a Length",
default = 1,
min = -100,max = 100)
scn['MyFloat'] = True
bpy.types.Scene.MyBool = BoolProperty(
name = "Face Camera",
description = "True or False?")
scn['MyBool'] = True
'''
bpy.types.Scene.DimensionAxis = EnumProperty(
items = [('0', 'X',''),
('1', 'Y', ''),
('2', 'Z', ''),('3', 'Vector', '')], #<-- Not sure what the 3 values contained in the brackets mean. The middle one is the dispalyed text
name = "Axis")
scn['DimensionAxis'] = 3
'''
bpy.types.Scene.MyString = StringProperty(
name = "String")
scn['MyString'] = "Lorem ipsum dolor sit amet"
return
'''
#I think this links the properties we defined above to the current scene???
initSceneProperties(bpy.context.scene)
#Create the UI Pannel
class UIPanel(bpy.types.Panel):
bl_label = "Add Dimension"
bl_space_type = "VIEW_3D"
bl_region_type = "TOOLS"
def draw(self, context):
layout = self.layout
scn = context.scene
#layout.prop(scn, 'MyInt', icon='BLENDER', toggle=True)
#layout.prop(scn, 'MyFloat')
#layout.prop(scn, 'MyBool')
layout.prop(scn, 'DimensionAxis')
#layout.prop(scn, 'MyString')
if scn['DimensionAxis'] == 0:
row = layout.row()
row.label(text = 'Delta X : '+dimension_vector_string[0])
if scn['DimensionAxis'] == 1:
row = layout.row()
row.label(text = 'Delta Y : '+dimension_vector_string[1])
if scn['DimensionAxis'] == 2:
row = layout.row()
row.label(text = 'Delta Z : '+dimension_vector_string[2])
if scn['DimensionAxis'] == 3:
row = layout.row()
row.label(text = 'Vector : '+str(round(dimension_magnitude,2)))
#Not quite sure whats happening below but it doesen't work without this part :)
class OBJECT_OT_PrintPropsButton(bpy.types.Operator):
bl_idname = "idname_must.be_all_lowercase_and_contain_one_dot"
bl_label = "Print props"
def execute(self, context):
scn = context.scene
printProp("Int: ", 'MyInt', scn)
printProp("Float: ", 'MyFloat', scn)
printProp("Bool: ", 'MyBool', scn)
printProp("Enum: ", 'DimensionAxis', scn)
printProp("String: ", 'MyString', scn)
return{'FINISHED'}
def printProp(label, key, scn):
try:
val = scn[key]
except:
val = 'Undefined'
print("%s %s" % (key, val))
# Registration
bpy.utils.register_module(__name__)