Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² написаниС скриптов Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅ для Π‘Π»Π΅Π½Π΄Π΅Ρ€Π° 2.5x. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π°Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 12

Автор Thomas Larsson

    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):