Как перемещать объект мышью нашёл здесь:
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'}
Куда идти за знанием ответа на вопрос: " Какого хрена?"
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)
Очень сложно понять, чего ты хочешь добиться
Благодарю за правильную подсказку.
Мне нужно было вот это:
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'}