13
$\begingroup$

I am currently in the process of writing a project in python for Blender to simulate crowds automatically. However I would need for there to be a custom UI to allow the user to choose their settings such as min to max speed, how much they want locations to randomised by etc. But from tutorials I have watched, and links I have followed all seem to have the buttons and sliders only do what is already predefined in blender and does not allow me to make it execute a function I have wrote. I managed to find a workaround for creating a custom shape by adding it to the operator menu, but is there a way for it to save the value of a slider to a variable rather than doing a predefined Blender function.

import bpy
import math
import mathutils

class TargetMakerPanel(bpy.types.Panel) :
    bl_space_type = "VIEW_3D"
    bl_region_type = "TOOLS"
    bl_context = "objectmode"
    bl_label = "CrowD"
        def draw(self, context) :
        layout = self.layout
        scene = context.scene
        TheCol = self.layout.column(align = True)
        TheCol.operator("mesh.make_target", text = "Add Target")
        layout.label(text=" Random Speed:")
        row = layout.row()
        row.prop(scene, "frame_start")
        row.prop(scene, "frame_end")

class MakeTarget(bpy.types.Operator) :
    bl_idname = "mesh.make_target"
    bl_label = "Add Target"
    bl_options = {"UNDO"}

    def invoke(self, context, event) :
        Vertices = \
          [
            mathutils.Vector((-0.5, -0.5,0)),
            mathutils.Vector((0.5, -0.5, 0)),
            mathutils.Vector((0.5, 0.5, 0)),
            mathutils.Vector((-0.5, 0.5, 0)),

          ]
        NewMesh = bpy.data.meshes.new("Target")
        NewMesh.from_pydata \
            (
            Vertices,
            [],
            [[0, 1, 2], [0, 1, 3], [1, 2, 3], [2, 0, 3]]
          )
        NewMesh.update()
        NewObj = bpy.data.objects.new("Target", NewMesh)
        context.scene.objects.link(NewObj)
        return {"FINISHED"}
    #end invoke


def register() :
    bpy.utils.register_class(MakeTarget)
    bpy.utils.register_class(TargetMakerPanel)

def unregister() :
    bpy.utils.unregister_class(MakeTarget)
    bpy.utils.unregister_class(TargetMakerPanel)

if __name__ == "__main__" :
    register()

In my code I would ideally like it so that the row that slider that says "Start Frame" would allow me to recognise that value and assign it to a variable called MinSpeed.... Rather than it automatically changing the frame as blender had already defined it as...

$\endgroup$

1 Answer 1

9
$\begingroup$

You can use custom properties in Blender by defining it like so (for example):

bpy.types.Scene.your_property = bpy.props.IntProperty(
    name = "Name your int prop", # as you want it to appear on the slider
    default = 1, # optional
    description = "Short description of your prop, to show in the popup"
    )

or

bpy.types.Scene.your_property = bpy.props.StringProperty(
    name = "Name your prop",
    default = "default value for your prop (optional)",
    description = "Short description of your prop, to show in the popup"
    )

You can read this for documentation about properties: http://www.blender.org/documentation/blender_python_api_2_68_2/bpy.props.html

Later, you can use your property in the code, by calling it like so (for example, and assuming you're in a function with context available, like your invoke function of your MakeTarget class) :

if context.scene.your_property == 2:
    do_something()

And, to use it in Blender's UI (TargetMakerPanel class):

row = layout.row()
row.prop(context.scene, "your_property")

Blender will automatically make the UI that correspond the property type. (eg. a slider for an IntProperty, input box for a string, etc.)

You can see more examples here : http://wiki.blender.org/index.php/Dev:2.5/Py/Scripts/Cookbook/Code_snippets/Interface#Using_scene_properties_to_store_information

Hope this helps!

$\endgroup$
0

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .