bl_region_type = "WINDOW" bl_context = "object"
def draw(self, context):
self.layout.operator("hello.hello", text='Bonjour').country = "France"
#
# ΠΠ΅Π½Ρ Π² ΡΠ°ΠΉΠΎΠ½Π΅ ΠΎΠΊΠ½Π° Properties, ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΎΠ²
#
class MaterialPanel(bpy.types.Panel):
bl_label = "Hello from Material context"
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW" bl_context = "material"
def draw(self, context):
self.layout.operator("hello.hello", text='Ciao').country = "Italy"
#
# ΠΠ½ΠΎΠΏΠΊΠ° Hello Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ
#
class OBJECT_OT_HelloButton(bpy.types.Operator):
bl_idname = "hello.hello"
bl_label = "Say Hello"
country = bpy.props.StringProperty()
def execute(self, context):
if self.country == '':
print("Hello world!")
else:
print("Hello world from %s!" % self.country)
return{'FINISHED'}
#
# Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ
# ΠΡΠ΅ ΠΏΠ°Π½Π΅Π»ΠΈ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Ρ Π² ΠΠ»Π΅Π½Π΄Π΅ΡΠ΅; Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ
# ΡΠ»ΡΡΠ°Π΅ ΠΎΠ½ΠΈ Π½Π΅ ΠΏΠΎΡΠ²ΡΡΡΡ. Π‘Π°ΠΌΡΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΡΡ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΡ Π² ΡΠ°ΠΉΠ»Π΅ -
# Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²ΡΠ·ΠΎΠ²Π° bpy.utils.register_module(__name__).
#
bpy.utils.register_module(__name__)
ΠΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅Ρ, ΠΊΠ°ΠΊ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ. ΠΠΎΠ³Π΄Π° ΡΠΊΡΠΈΠΏΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡ, Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π½Π° ΠΏΠ°Π½Π΅Π»Ρ Π² ΠΎΠ±Π»Π°ΡΡΠΈ tool props, Ρ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΌΠΈ Π½Π΅ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ.
Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅ΡΠΎΠ΄ ΠΎΡΡΡΠ»Π°Π½ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ. ΠΠ»Π°ΡΡ OBJECT_OT_Button ΠΈΠΌΠ΅Π΅Ρ Π΄Π²Π° ΡΠ²ΠΎΠΉΡΡΠ²Π°, number (Π½ΠΎΠΌΠ΅Ρ) ΠΈ row (ΡΡΡΠΎΠΊΠ°) ΠΈ ΠΏΠ΅ΡΠ°ΡΠ°Π΅Ρ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ ΡΡΠΈΡ ΡΠ²ΠΎΠΉΡΡΠ² Π² ΠΎΠΊΠ½Π΅ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π°. ΠΡΠ΄ΡΡΠΈ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠΌΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌΠΈ, ΠΎΠ½ΠΈ ΠΎΠ±Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ 0 ΠΏΠΎ-ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π΅ΡΠ»ΠΈ Π½Π΅ Π·Π°Π΄Π°Π½Ρ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π΅ΡΠ»ΠΈ ΠΌΡ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ 7, 8 ΠΈ 23, ΡΠΊΡΠΈΠΏΡ Π²ΡΠ²Π΅Π΄Π΅Ρ
Row 0 button 7
Row 3 button 0
Row 0 button 0
ΠΠΎ ΡΡΠΎ, Π΅ΡΠ»ΠΈ ΠΌΡ Ρ ΠΎΡΠΈΠΌ Π·Π°Π΄Π°ΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΊΠ°ΠΊ number, ΡΠ°ΠΊ ΠΈ row, ΡΠΎ Π΅ΡΡΡ Π²ΡΠ·Π²Π°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ Ρ Π΄Π²ΡΠΌΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ? ΠΡΠΎ Π½Π΅Π»ΡΠ·Ρ ΡΠ΄Π΅Π»Π°ΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ, Π½ΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΠ΅ΡΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ loc, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΡΠΎΠΊΠΎΠΉ, ΠΈ ΠΊΠΎΡΠΎΡΠΎΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ, Π΅ΡΠ»ΠΈ Π½Π΅ Π½ΡΠ»Ρ. ΠΡΠ»ΠΈ ΠΌΡ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΡ 13, ΡΠΊΡΠΈΠΏΡ Π²ΡΠ²Π΅Π΄Π΅Ρ
Row 4 button 13
ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΡΠ»Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Ρ ΡΡΠΎΠΉ ΡΠ΅Π»ΡΡ, ΡΠΌΠΎΡΡΠΈΡΠ΅ ΠΏΠΎΠ΄ΡΠ°Π·Π΄Π΅Π» A popup dialog
#----------------------------------------------------------
# File layout.py
#----------------------------------------------------------
import bpy
# ΠΠ»Π°Π½ΠΈΡΠΎΠ²ΠΊΠ° ΠΏΠ°Π½Π΅Π»ΠΈ
class LayoutPanel(bpy.types.Panel):
bl_label = "Panel with funny layout"
bl_space_type = "VIEW_3D"
bl_region_type = "TOOL_PROPS"
def draw(self, context):
layout = self.layout
layout.label("First row")
row = layout.row(align=True)
row.alignment = 'EXPAND'
row.operator("my.button", text="1").number=1
row.operator("my.button", text="2", icon='MESH_DATA').number=2
row.operator("my.button", icon='LAMP_DATA').number=3
row = layout.row(align=False)
row.alignment = 'LEFT'
row.operator("my.button", text="4").number=4
row.operator("my.button", text="", icon='MATERIAL').number=5
row.operator("my.button", text="6", icon='BLENDER').number=6
row.operator("my.button", text="7", icon='WORLD').number=7
layout.label("Third row", icon='TEXT')
row = layout.row()
row.alignment = 'RIGHT'
row.operator("my.button", text="8").row=3
row.operator("my.button", text="9", icon='SCENE').row=3
row.operator("my.button", text="10", icon='BRUSH_INFLATE').row=3
layout.label("Fourth row", icon='ACTION')
row = layout.row() box = row.box()
box.operator("my.button", text="11", emboss=False).loc="4 11"
box.operator("my.button", text="12", emboss=False).loc="4 12"
col = row.column() subrow = col.row()
subrow.operator("my.button", text="13").loc="4 13"
subrow.operator("my.button", text="14").loc="4 14"
subrow = col.row(align=True)
subrow.operator("my.button", text="15").loc="4 15"
subrow.operator("my.button", text="16").loc="4 16"
box = row.box() box.operator("my.button", text="17").number=17
box.separator()
box.operator("my.button", text="18")
box.operator("my.button", text="19")
layout.label("Fifth row")
row = layout.row() split = row.split(percentage=0.25)
col = split.column()
col.operator("my.button", text="21").loc="5 21"
col.operator("my.button", text="22")
split = split.split(percentage=0.3)
col = split.column()
col.operator("my.button", text="23")
split = split.split(percentage=0.5)
col = split.column()
col.operator("my.button", text="24")
col.operator("my.button", text="25")
# ΠΠ½ΠΎΠΏΠΊΠ°
class OBJECT_OT_Button(bpy.types.Operator):
bl_idname = "my.button"
bl_label = "Button" number = bpy.props.IntProperty()
row = bpy.props.IntProperty()
loc = bpy.props.StringProperty()
def execute(self, context):
if self.loc:
words = self.loc.split()
self.row = int(words[0])
self.number = int(words[1])
print("Row %d button %d" % (self.row, self.number))
return{'FINISHED'}
# Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ
bpy.utils.register_module(__name__)
Π‘Π²ΠΎΠΉΡΡΠ²Π° ΠΎΠ±ΡΡΠΆΠ΄Π°Π»ΠΈΡΡ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ Π‘Π²ΠΎΠΉΡΡΠ²Π°, Π½ΠΎ ΠΌΡ Π½Π΅ ΠΎΠ±ΡΡΡΠ½ΠΈΠ»ΠΈ, ΠΊΠ°ΠΊ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ Π·Π°ΠΊΠ°Π·Π½ΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ. ΠΡΠΎΡ ΡΠΊΡΠΈΠΏΡ ΠΊΠ°ΠΊ ΡΠ°Π· Π΄Π΅Π»Π°Π΅Ρ ΡΡΠΎ. RNA-ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠΎΠΌ
layout.prop(ob, 'myRnaInt')
ID-ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ
layout.prop(ob, '["myRnaInt"]')
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ ΠΏΠ°Π½Π΅Π»Ρ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠ΅ΡΡΡ ΡΠ²Π½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ bpy.utils.register_class(MyPropPanel) Π²ΠΌΠ΅ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ register_module, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠ΅Ρ Π²ΡΡ. ΠΠ°ΠΊΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ MyPropPanel - Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ.
#----------------------------------------------------------
# File panel_props.py
#----------------------------------------------------------
import bpy
from bpy.props import *
# ΠΡΠΈΡΡΠΊΠ° ΡΡΠ΅Π½Ρ ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²
bpy.ops.object.select_by_type(type='MESH')
bpy.ops.object.delete()
bpy.ops.mesh.primitive_cube_add(location=(-3,0,0))
cube = bpy.context.object
bpy.ops.mesh.primitive_cylinder_add(location=(0,0,0))
cyl = bpy.context.object
bpy.ops.mesh.primitive_uv_sphere_add(location=(3,0,0))
sphere = bpy.context.object
# ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ RNA-ΡΠ²ΠΎΠΉΡΡΠ² Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
bpy.types.Object.myRnaInt = IntProperty(
name="RNA int",
min = -100, max = 100,
default = 33)
# ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ RNA-ΡΠ²ΠΎΠΉΡΡΠ² Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠ°
bpy.types.Mesh.myRnaFloat = FloatProperty(
name="RNA float",
default = 12.345)
# ΠΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ RNA-ΡΠ²ΠΎΠΉΡΡΠ² ΠΊΡΠ±Ρ
cube.myRnaInt = -99
cube.data.myRnaFloat = -1
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ID-ΡΠ²ΠΎΠΉΡΡΠ² ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΡ
cube["MyIdString"] = "I am an ID prop"
cube.data["MyIdBool"] = True
# ΠΠ°Π½Π΅Π»Ρ ΡΠ²ΠΎΠΉΡΡΠ²
class MyPropPanel(bpy.types.Panel):
bl_label = "My properties"
bl_space_type = "VIEW_3D"
bl_region_type = "UI"
def draw(self, context):
ob = context.object
if not ob:
return
layout = self.layout
layout.prop(ob, 'myRnaInt')
try:
ob["MyIdString"]
layout.prop(ob, '["MyIdString"]')
except:
pass
if ob.type == 'MESH':
me = ob.data
layout.prop(me, 'myRnaFloat')
try:
me["MyIdBool"]
layout.prop(me, '["MyIdBool"]')
except:
pass
# Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ
bpy.utils.register_class(MyPropPanel)
ΠΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²Π²Π΅ΡΡΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ Π·Π°ΡΠ΅ΠΌ ΠΏΠΎΡΡΠ»Π°Π΅ΡΡΡ Π½Π° ΠΏΠ°Π½Π΅Π»Ρ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌ. ΠΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ RNA-ΡΠ²ΠΎΠΉΡΡΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠ°Π½Π΅Π»ΠΈ ΠΈ ΡΠΈΡΠ°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ½ΠΎΠΏΠΊΠΈ. ΠΡΠ΅ ΡΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ ΠΠ»Π΅Π½Π΄Π΅ΡΠ° ΠΌΠΎΠ³ΡΡ ΠΈΠΌΠ΅ΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Π°. ΠΠ»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π°, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π½Π΅ ΡΠ²ΡΠ·Π°Π½Ρ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ, ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΡΠ΄ΠΎΠ±Π½ΠΎ Ρ ΡΠ°Π½ΠΈΡΡ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΠ΅Π½Π΅. ΠΠ°ΠΌΠ΅ΡΠΈΠΌ, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΡΡΠΎ ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ ΠΏΠΎΡΠ΅ΡΡΠ½Ρ, Π΅ΡΠ»ΠΈ ΠΡ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΡΠ΅ΡΡ Π½Π° Π½ΠΎΠ²ΡΡ ΡΡΠ΅Π½Ρ.
#----------------------------------------------------------
# File scene_props.py
#----------------------------------------------------------
import bpy
from bpy.props import *
#
# Π‘ΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ² Π² Π°ΠΊΡΠΈΠ²Π½ΠΎΠΉ ΡΡΠ΅Π½Π΅
#
def initSceneProperties(scn):