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

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

Автор Thomas Larsson

    bpy.types.Scene.MyInt = IntProperty(

        name = "Integer",

        description = "Enter an integer")

    scn['MyInt'] = 17


    bpy.types.Scene.MyFloat = FloatProperty(

        name = "Float",

        description = "Enter a float",

        default = 33.33,

        min = -100,

        max = 100)


    bpy.types.Scene.MyBool = BoolProperty(

        name = "Boolean",

        description = "True or False?")

    scn['MyBool'] = True


    bpy.types.Scene.MyEnum = EnumProperty(

        items = [('Eine', 'Un', 'One'),

                 ('Zwei', 'Deux', 'Two'),

                 ('Drei', 'Trois', 'Three')],

        name = "Ziffer")

    scn['MyEnum'] = 2


    bpy.types.Scene.MyString = StringProperty(

        name = "String")

    scn['MyString'] = "Lorem ipsum dolor sit amet"

    return 


initSceneProperties(bpy.context.scene)  


#

# МСню Π² Ρ€Π°ΠΉΠΎΠ½Π΅ UI

#

class UIPanel(bpy.types.Panel):

    bl_label = "Property panel"

    bl_space_type = "VIEW_3D"

    bl_region_type = "UI" 


    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, 'MyEnum')

        layout.prop(scn, 'MyString')

        layout.operator("idname_must.be_all_lowercase_and_contain_one_dot")  


#

# Кнопка Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ значСния свойств Π² ΠΎΠΊΠ½Π΅ консоли.

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: ", 'MyEnum', scn)

        printProp("String: ", 'MyString', scn)

        return{'FINISHED'}  


def printProp(label, key, scn):

    try:

        val = scn[key]

    except:

        val = 'Undefined'

    print("%s %s" % (key, val))  


# РСгистрация

bpy.utils.register_module(__name__)


ΠžΠΏΡ€ΠΎΡ (Polling)

Π‘ΠΊΡ€ΠΈΠΏΡ‚ часто Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… условиях, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° Π°ΠΊΡ‚ΠΈΠ²Π΅Π½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. НапримСр, скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Π΅Ρ€ΡˆΠΈΠ½Π°ΠΌΠΈ мСша, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π·Π½Π°Ρ‡ΠΈΠΌΠΎΠ΅, Ссли Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ β€” Π°Ρ€ΠΌΠ°Ρ‚ΡƒΡ€Π°.

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° добавляСт панСль, которая ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ПанСль находится Π² сСкции интСрфСйса ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (открываСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ N), Π½ΠΎ ΠΎΠ½Π° Π²ΠΈΠ΄ΠΈΠΌΠ°, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ являСтся мСш ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ с ΠΎΠ΄Π½ΠΈΠΌ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠΌ. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, сколько ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² ΠΈΠΌΠ΅Π΅Ρ‚ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, дСлаСтся Ρ‡Π΅Ρ€Π΅Π· poll(). Π­Ρ‚ΠΎ Π½Π΅ функция, Π° скорСС ΠΌΠ΅Ρ‚ΠΎΠ΄ класса, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ @classmethod Π²Ρ‹ΡˆΠ΅ опрСдСлСния. Π’Π°ΠΊ Π² Ρ‡Π΅ΠΌ ΠΆΠ΅ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ класса? НС ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°ΠΉΡ‚Π΅ мСня! ВсС, Ρ‡Ρ‚ΠΎ я знаю, Ρ‡Ρ‚ΠΎ со строкой @classmethod ΠΊΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π° Π±Π΅Π· Π½Π΅Ρ‘ Π½Π΅Ρ‚.

Ну, с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния программирования Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅ дСйствиС этого Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π° Ρ…ΠΎΡ€ΠΎΡˆΠΎ объяснили здСсь python.su/forum, Π° Π²ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ класса с ΠΈΠΌΠ΅Π½Π΅ΠΌ poll влияСт Π½Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ элСмСнтов интСрфСйса Π² Π‘Π»Π΅Π½Π΄Π΅Ρ€Π΅, я Ρ‚Π°ΠΊ ΠΈ Π½Π΅ понял β€” ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€.



#----------------------------------------------------------

# File poll.py

#----------------------------------------------------------

import bpy, random 


#

# МСню Π² Ρ€Π°ΠΉΠΎΠ½Π΅ UI

#

class ColorPanel(bpy.types.Panel):

    bl_label = "Modify colors"

    bl_space_type = "VIEW_3D"

    bl_region_type = "UI"


    @classmethod

    def poll(self, context):

        if context.object and context.object.type == 'MESH':

            return len(context.object.data.materials)  


    def draw(self, context):

        layout = self.layout

        scn = context.scene

        layout.operator("random.button")

        layout.operator("darken_random.button")

        layout.operator("invert.button")  


#

# Π’Ρ€ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ


class RandomButton(bpy.types.Operator):

    bl_idname = "random.button"

    bl_label = "Randomize" 


    def execute(self, context):

        mat = context.object.data.materials[0]

        for i in range(3):

            mat.diffuse_color[i] = random.random()

        return{'FINISHED'}


class DarkenRandomButton(bpy.types.Operator):

    bl_idname = "darken_random.button"

    bl_label = "Darken Randomly" 


def execute(self, context):

    mat = context.object.data.materials[0]

    for i in range(3):

        mat.diffuse_color[i] *= random.random()

    return{'FINISHED'}  


class InvertButton(bpy.types.Operator):

    bl_idname = "invert.button"

    bl_label = "Invert" 


    def execute(self, context):

        mat = context.object.data.materials[0]

        for i in range(3):

            mat.diffuse_color[i] = 1 - mat.diffuse_color[i]

        return{'FINISHED'}  


# РСгистрация

bpy.utils.register_module(__name__)


ДинамичСскоС Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π΅ мСню

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° добавляСт панСль с Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΌ мСню Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ интСрфСйса ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π’ Π½Π°Ρ‡Π°Π»Π΅ мСню содСрТит Ρ‚Ρ€ΠΈ ΠΏΡƒΠ½ΠΊΡ‚Π°: красный, Π·Π΅Π»Π΅Π½Ρ‹ΠΉ ΠΈ синий. Π•ΡΡ‚ΡŒ Π΄Π²Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ, ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Π΅ Set color (Π—Π°Π΄Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚). ВСрхняя измСняСт Ρ†Π²Π΅Ρ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π° Ρ†Π²Π΅Ρ‚, Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Π² Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅ΠΌ мСню, Π° ниТняя устанавливаСт Ρ†Π²Π΅Ρ‚, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ трСмя Π΄Π²ΠΈΠΆΠΊΠ°ΠΌΠΈ. Π¦Π²Π΅Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π΅ мСню ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΈΡ… ΠΈΠ· Π½Π΅Π³ΠΎ.

Π’Π°ΠΊΠΆΠ΅ Π·Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ с Ρ‚Π΅ΠΌ ΠΆΠ΅ успСхом Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ опрос для ΠΊΠ½ΠΎΠΏΠΎΠΊ; ΠΊΠ½ΠΎΠΏΠΊΠ° Set color становится сСрой, Ссли Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ являСтся мСшСм с ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄Π½ΠΈΠΌ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠΌ.



#----------------------------------------------------------

# File swatches.py

#----------------------------------------------------------

import bpy

from bpy.props import *


theSwatches = [

    ("1 0 0" , "Red" , "1 0 0"),

    ("0 1 0" , "Green" , "0 1 0"),

    ("0 0 1" , "Blue" , "0 0 1")]  


def setSwatches():

    global theSwatches

    bpy.types.Object.my_swatch = EnumProperty(

        items = theSwatches,

        name = "Swatch") 


setSwatches() 


bpy.types.Object.my_red = FloatProperty(

    name = "Red", default = 0.5,

    min = 0, max = 1)  


bpy.types.Object.my_green = FloatProperty(

    name = "Green", default = 0.5,

    min = 0, max = 1)  


bpy.types.Object.my_blue = FloatProperty(

    name = "Blue", default = 0.5,

    min = 0, max = 1)  


def findSwatch(key):

    for n,swatch in enumerate(theSwatches):

        (key1, name, colors) = swatch

        if key == key1:

        return n

    raise NameError("Unrecognized key %s" % key)  


# ПанСль ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠ²

class SwatchPanel(bpy.types.Panel):

    bl_label = "Swatches"

    #bl_idname = "myPanelID"

    bl_space_type = "PROPERTIES"

    bl_region_type = "WINDOW"

    bl_context = "material" 


def draw(self , context):

    layout = self.layout

    ob = context.active_object

    layout.prop_menu_enum(ob, "my_swatch")

    layout.operator("swatches.set").swatch=True

    layout.separator()

    layout.prop(ob, "my_red")

    layout.prop(ob, "my_green")

    layout.prop(ob, "my_blue")

    layout.operator("swatches.set").swatch=False

    layout.operator("swatches.add")

    layout.operator("swatches.delete")  


# Установка ΠΊΠ½ΠΎΠΏΠΊΠΈ

class OBJECT_OT_SetButton(bpy.types.Operator):

    bl_idname = "swatches.set"

    bl_label = "Set color"

    swatch = bpy.props.BoolProperty()


    @classmethod

    def poll(self, context):

        if context.object and context.object.type == 'MESH':

            return len(context.object.data.materials)  


    def execute(self, context):

        global theSwatches

        ob = context.object

        if self.swatch:

            n = findSwatch(ob.my_swatch)

            (key, name, colors) = theSwatches[n]

             words = colors.split()

            color = (float(words[0]), float(words[1]), float(words[2]))

        else:

            color = (ob.my_red, ob.my_green, ob.my_blue)

        ob.data.materials[0].diffuse_color = color

        return{'FINISHED'}  


# Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ

class OBJECT_OT_AddButton(bpy.types.Operator):

    bl_idname = "swatches.add"

    bl_label = "Add swatch" 


    def execute(self, context):

        global theSwatches

        ob = context.object

        colors = "%.2f %.2f %.2f" % (ob.my_red, ob.my_green, ob.my_blue)

         theSwatches.append((colors, colors, colors))

         setSwatches()

         return{'FINISHED'}