Автор Тема: Events.  (Прочитано 1437 раз)

Оффлайн LanuHum

  • Житель
Events.
« : 15 Июль 2014, 22:56:32 »
Как перемещать объект мышью нашёл здесь:
http://www.blender.org/documentation/blender_python_api_2_57_release/bpy.types.Operator.html#invoke-function
Попробовал перенести код на ноды - не работает
Код
class NODE_OT_povray_node_texture_map_add(Operator):
    bl_idname = "povray.nodetexmapadd"
    bl_label = "Texture map"

    def execute(self, context):
        tree=bpy.context.object.active_material.node_tree
        tmap = tree.nodes.new('ShaderNodeValToRGB')     
        tmap.location=(self.x/100,self.y/100)
        bpy.context.object.active_material.node_tree.nodes.active=tmap
        el=tmap.color_ramp.elements.new(0.5)
        for el in tmap.color_ramp.elements:
            el.color=(0,0,0,1)
        for inp in tmap.inputs:
            tmap.inputs.remove(inp)
        for outp in tmap.outputs:
            tmap.outputs.remove(outp)
        pattern=tmap.inputs.new('NodeSocketVector', "Pattern")
        pattern.hide_value=True
        for i in range(0,3):
            tmap.inputs.new('NodeSocketColor', "Shader")
        tmap.outputs.new('NodeSocketShader', "BSDF")
        tmap.label="Texture Map"

    def modal(self, context, event):
        if event.type == 'MOUSEMOVE':  # Apply
            self.x = event.mouse_x
            self.y = event.mouse_y
            self.execute(context)
        elif event.type == 'LEFTMOUSE':  # Confirm
            return {'FINISHED'}
        elif event.type in ('RIGHTMOUSE', 'ESC'):  # Cancel
            return {'CANCELLED'}

    def invoke(self, context, event):
        self.x = event.mouse_x
        self.y = event.mouse_y
        self.execute(context)
        return {'RUNNING_MODAL'}
Куда идти за знанием ответа на вопрос: " Какого хрена?"

bdancer

  • Гость
Re: Events.
« Ответ #1 : 16 Июль 2014, 19:29:29 »
1. Не надо читать старые доки, есть же посвежее: http://www.blender.org/documentation/blender_python_api_2_71_0/contents.html

2. Очень сложно понять, чего ты хочешь добиться -- execute() у тебя вызывается и из invoke() и из modal(), причем, при вызове из modal() (при правильной реализации всего остального) нода будет создаваться при каждом передвижение мыши.

3. Нужно использовать event.mouse_region_{x,y} для получения координат внутри региона, а потом с помощью view2d.region_to_view() получить необходимые координаты для ноды.

4. Дерево проще взять прямо из редактора через contex.space_data.edit_tree.

Если уж так надо вставлять ноду на каждое перемещение мыши, то вот код. Там есть комментарии, как сделать, чтобы создавать ноду только по клику:

Код
import bpy


class ForLanuHumNodeModal(bpy.types.Operator):
    bl_idname = "for_lanuhum.node_modal"
    bl_label  = "For LanuHum Node Modal"

    def execute(self, context):
        space = context.space_data
        tree = space.edit_tree
        v2d = context.region.view2d

        x, y = v2d.region_to_view(self.x, self.y)

        tmap = tree.nodes.new('ShaderNodeValToRGB')
        tmap.location = (x, y)
        tmap.label="Texture Map"

        el = tmap.color_ramp.elements.new(0.5)

        for el in tmap.color_ramp.elements:
            el.color = (0,0,0,1)

        for inp in tmap.inputs:
            tmap.inputs.remove(inp)

        for outp in tmap.outputs:
            tmap.outputs.remove(outp)

        pattern = tmap.inputs.new('NodeSocketVector', "Pattern")
        pattern.hide_value = True

        for i in range(0,3):
            tmap.inputs.new('NodeSocketColor', "Shader")

        tmap.outputs.new('NodeSocketShader', "BSDF")

        return {'FINISHED'}

    def modal(self, context, event):
        # Apply
        if event.type == 'MOUSEMOVE':
            self.x = event.mouse_region_x
            self.y = event.mouse_region_y
            # Comment next line if you want to
            # create a node on left mouse click
            self.execute(context)
            return {'RUNNING_MODAL'}

        # Confirm
        elif event.type == 'LEFTMOUSE':
            # Uncomment next line if you want to
            # create a node on left mouse click
            # self.execute(context)
            return {'FINISHED'}

        # Cancel
        elif event.type in ('RIGHTMOUSE', 'ESC'):
            return {'CANCELLED'}

        return {'RUNNING_MODAL'}

    def invoke(self, context, event):
        context.window_manager.modal_handler_add(self)
        return {'RUNNING_MODAL'}


bpy.utils.register_class(ForLanuHumNodeModal)
« Последнее редактирование: 16 Июль 2014, 19:49:46 от bdancer »

Оффлайн LanuHum

  • Житель
Re: Events.
« Ответ #2 : 16 Июль 2014, 20:03:59 »
Цитировать
Очень сложно понять, чего ты хочешь добиться
Благодарю за правильную подсказку.
Мне нужно было вот это:
Код
class PovrayNodeModal(bpy.types.Operator):
    bl_idname = "povray.node_modal"
    bl_label  = "Node Modal"

    add=True

    def execute(self, context):
        space = context.space_data
        tree = space.edit_tree
        for node in tree.nodes:
            node.select=False
        if self.add==True:
            tmap = tree.nodes.new('ShaderNodeValToRGB')
            tmap.label="Texture Map"
            el = tmap.color_ramp.elements.new(0.5)
            for el in tmap.color_ramp.elements:
                el.color = (0,0,0,1)
            for inp in tmap.inputs:
                tmap.inputs.remove(inp)
            for outp in tmap.outputs:
                tmap.outputs.remove(outp)
            pattern = tmap.inputs.new('NodeSocketVector', "Pattern")
            pattern.hide_value = True
            for i in range(0,3):
                tmap.inputs.new('NodeSocketColor', "Shader")
            tmap.outputs.new('NodeSocketShader', "BSDF")
            tree.nodes.active=tmap
            self.add=False
        aNode=tree.nodes.active
        aNode.select=True
        v2d = context.region.view2d
        x, y = v2d.region_to_view(self.x, self.y)
        aNode.location = (x, y)

    def modal(self, context, event):
        if event.type == 'MOUSEMOVE':
            self.x = event.mouse_region_x
            self.y = event.mouse_region_y
            self.execute(context)
            return {'RUNNING_MODAL'}
        elif event.type == 'LEFTMOUSE':
            return {'FINISHED'}
        elif event.type in ('RIGHTMOUSE', 'ESC'):
            return {'CANCELLED'}

        return {'RUNNING_MODAL'}

    def invoke(self, context, event):
        context.window_manager.modal_handler_add(self)
        return {'RUNNING_MODAL'}
« Последнее редактирование: 16 Июль 2014, 22:01:43 от LanuHum »

 


Яметрика

* По форуму

* Рекламный блок

* Последние вложения

1 (1).png
Скачано: 106
Автор: LEXA ANЭGROWND
blender.png
Скачано: 112
Автор: ipv2007
4.png
Скачано: 139
Автор: hiroyukiss
2.png
Скачано: 162
Автор: hiroyukiss

Скачано: 172
Автор: Dilifa12