Всех с Пятницей!
Возился с одной задумкой, хотелось добавить кнопочку на панель настройки оператора, для так сказать, оформления результата настройки. Делалось это для аддона взрыва, но он уже изрядно разросся, поэтому я не рискнул сразу в его коде писать. Если всё выгорит, а меня всё равно терзают смутные сомнения, то можно будет видеть траекторию разлета осколков, и настраивать параметры как нравится и только когда уже всё будет готово, запаковывать в ключи формы. Сейчас во время работы оператора приходится гонять туда -сюда текущий кадр сцены, чтобы просто увидеть результат.
Еще пилил проверку типа объекта, чтобы не взорвать случайно лампочку, или активный НЕВЫБРАННЫЙ объект. Вроде получилось. Также пытался сделать выпадающий список, 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("<<<<>>>>")
Возился с одной задумкой, хотелось добавить кнопочку на панель настройки оператора, для так сказать, оформления результата настройки. Делалось это для аддона взрыва, но он уже изрядно разросся, поэтому я не рискнул сразу в его коде писать. Если всё выгорит, а меня всё равно терзают смутные сомнения, то можно будет видеть траекторию разлета осколков, и настраивать параметры как нравится и только когда уже всё будет готово, запаковывать в ключи формы. Сейчас во время работы оператора приходится гонять туда -сюда текущий кадр сцены, чтобы просто увидеть результат.
Еще пилил проверку типа объекта, чтобы не взорвать случайно лампочку, или активный НЕВЫБРАННЫЙ объект. Вроде получилось. Также пытался сделать выпадающий список, 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("<<<<>>>>")
Комментариев нет:
Отправить комментарий