пятница, 16 декабря 2016 г.

Баловался.

     Всех с Пятницей!
     Возился с одной задумкой, хотелось добавить кнопочку на панель настройки оператора, для так сказать, оформления результата настройки. Делалось это для аддона взрыва, но он уже изрядно разросся, поэтому я не рискнул сразу в его коде писать. Если всё выгорит, а меня всё равно терзают смутные сомнения, то можно будет видеть траекторию разлета осколков, и настраивать параметры как нравится и только когда уже всё будет готово, запаковывать в ключи формы. Сейчас во время работы оператора приходится гонять туда -сюда текущий кадр сцены, чтобы просто увидеть результат.




    Еще пилил проверку типа объекта, чтобы не взорвать случайно лампочку, или активный НЕВЫБРАННЫЙ объект. Вроде получилось. Также пытался сделать выпадающий список, bpy.props.EnumProperty, не вышло, почему-то. Ну и фиг с ним. Да, еще внезапно узнал интересную фишку - можно разместить слишком длинный оператор условия на нескольких строках, если в конце строки писать "\". Такой вот я слоупок.
    Ниже учебный код, не удивляйтесь, что из-за такой малости я на неделю или около того застрял. Во-первых,  я опять залип на Warzone 2100, гениальная всё же стратежка, единственное, что хотелось бы поправить, это модели и поиск пути. Во-вторых, ускользающая от моего разумения логика модуля bpy, помноженная на мою нетерпеливость. В результате большее время разработки спускаю пар во FreeDOOM, остается только пожалеть зомби и демонов... В-третьих, слоупок, и не очень сообразительный. Что-то близкое я изобразил быстро, но не дошло, что вот оно, решение. Так и мучал себя, блендер и демонов. А в четвертых, задрала уже привычка Блендера откатывать изменения в тексте, р-р-р...,  пойду еще постреляю демонов...
   
    Код ниже создает сколько сказано клонов объекта, а при нажатии кнопки расставляет случайным образом дубли по оси х в пределах некоторого диапазона.


import bpy
import random


def createClones(count, context):
    basicObject = context.object
    names = []
    for iter in range(1, count + 1, 1):
        context.scene.objects.active = basicObject
        basicObject.select = True
        bpy.ops.object.duplicate()
        newObject = context.scene.objects.active
        newObject.location[1] += newObject.dimensions[1] * iter
        names.append(newObject.name)
        bpy.ops.object.select_all(action = 'DESELECT')
    return names
       
def randomPosition(names, context):
    for obName in names:
        newObject = context.scene.objects[obName]
        newObject.location[0] = random.randrange(-3, 3, 1)
                   
class operator_One(bpy.types.Operator):
    """Operator One"""
    bl_idname = "object.operator_one"
    bl_label = "Operator_One"
    bl_options = {'REGISTER', 'UNDO'}
   
    count = bpy.props.IntProperty(
        name = "count",
        default = 4,
        min = 1,
        max = 255,
        step = 1,
        description = "count"
        )
    tresult  = bpy.props.BoolProperty(
        name = 'tresult',
        default = False,
        description = 'tresult'
        )
       
    status = bpy.props.BoolProperty(
        name = 'status',
        default = False,
        description = 'status'
        )
           
    @classmethod
    def poll(cls, context):
        print('poll one')
       
        if context.active_object is not None and \
        context.active_object.select == True and \
        context.active_object.type == 'MESH':
            return context.active_object
                       
    def execute(self, context):      
        print("operator_one")
        try:
            self.status = bpy.types.Scene.tresult
        except:
            print('except')
            print('except', bpy.types.Scene.tresult)
            self.status = bpy.types.Scene.tresult = False
           
        if self.status == True:
            print('Done', bpy.types.Scene.tresult)
            bpy.types.Scene.tresult = None
            print('Done /', bpy.types.Scene.tresult)
            createClones(self.count, context)
            randomPosition(self.listNames, context)
                     
            return  {'FINISHED'}
        else:
            print('not')
            self.listNames = createClones(self.count, context)
           
            return {'FINISHED'}
   
   
    def draw(self, context):
       
        layout = self.layout      
        layout.label(text = 'Operator One:')
        box = layout.box()
        box.prop(self, 'count')
        box = layout.box()
        box.operator('object.operator_two')
 
class operator_Two(bpy.types.Operator):
    """Operator Two"""
    bl_idname = "object.operator_two"
    bl_label = "Operator_Two"
    bl_options = {'REGISTER', 'UNDO'}
       
    def execute(self, context):
        print("operator_two")      
        bpy.types.Scene.tresult = True
     
        return {'FINISHED'}
   
    def draw(self, context):
        layout = self.layout
        layout.label(text = 'Operator Two:')
       

       
def register():
    bpy.utils.register_class(operator_One)
    bpy.utils.register_class(operator_Two)



def unregister():
    bpy.utils.unregister_class(operator_One)
    bpy.utils.unregister_class(operator_Two)



if __name__ == "__main__":
    register()
    print("<<<<>>>>")

Комментариев нет:

Отправить комментарий