0
$\begingroup$

For now i can control mapping by name of material but the problem is , all in this object material use mapping , exist a way to get all mapping node inside at material and controll all with my rot_var? this object can 1 to multiple materials slots

i think but not work:

ob = context.object
rot_var = ###my variable(0 to 360)
   for s in ob.material_slots:
       if s.material.use_nodes:
           for n in s.material.node_tree.nodes:


                    mapping = n.get("Mapping")                                        
                    mapping.rotation[2] = radians(rot_var)

Edit: i find solution for Mapping:

for slots in ob.material_slots:
    for nodes in slots.material.node_tree.nodes:

        if nodes.type == 'MAPPING':    

            nodes.rotation[2] = radians(rot_var)

but inside i have 2 nodes "MixRGB" i not have idea to get because same name of nodes and not have idea about name of MixRgb

$\endgroup$
2
  • $\begingroup$ Ok i find my solution is put name inside the node and to if statement : if nodes.name == "My personal name": $\endgroup$
    – Noob Cat
    Mar 25, 2019 at 2:16
  • $\begingroup$ thats great. please add an answer so others may find the solution. As a new user you may have to wait 24hrs before you can add the answer. $\endgroup$
    – rob
    Mar 25, 2019 at 10:23

1 Answer 1

2
$\begingroup$

Wrote following in answer to this q. Noticed you sorted it out, thought I'd post anyway

enter image description here

  • Wrote a utility function to query an objects material nodes. query_mat_nodes(ob, "type", 'MAPPING') returns a list of all mapping type nodes. query_mat_nodes(ob, "name", "Frank") returns a list of all nodes named "Frank" in the objects materials.
  • Added a float property to the object with an update method to set all the mapping nodes on object to this property value. Notice giving the property the unit='ROTATION' will display the value in the UI dependant on the setting for scene rotation unit in units panel. (generally degrees is selected) The property value will always be in radians.
  • For want of a better place I tacked (prepended) draw_prop (a UI draw method) to the node space header to test.

Test script.

import bpy
from math import radians
def query_mat_nodes(ob, key, value):
    return set(n for s in ob.material_slots if s.material and s.material.use_nodes
            for n in s.material.node_tree.nodes if getattr(n, key, None) == value)


def update_map_nodes(self, context):
    for n in query_mat_nodes(self, "type", 'MAPPING'):
        n.rotation.z = self.map_rot

bpy.types.Object.map_rot = bpy.props.FloatProperty(
         min=0,
         max=radians(360),
         unit='ROTATION',
         update=update_map_nodes)

def draw_prop(self, context):
    self.layout.prop(context.object, "map_rot")

bpy.types.NODE_HT_header.prepend(draw_prop)
$\endgroup$
1
  • $\begingroup$ This is a good alternative! $\endgroup$
    – Noob Cat
    Mar 25, 2019 at 16:20

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .