Getting shader graph nodes by type rather than name #3316

Because relying on names doesn't work for non english users
This commit is contained in:
Andrej730
2023-06-19 16:09:42 +05:00
parent dfc5a280a4
commit a34be6ae5d
7 changed files with 27 additions and 16 deletions
@@ -261,7 +261,7 @@ def update_color_full(self, context):
material = bpy.data.materials.get("color_full")
if material:
color_full = bpy.context.scene.BIMAnimationProperties.color_full
inputs = material.node_tree.nodes["Principled BSDF"].inputs
inputs = tool.Blender.get_material_node(material, "BSDF_PRINCIPLED").inputs
color = inputs["Base Color"].default_value
color[0] = color_full.r
color[1] = color_full.g
@@ -272,7 +272,7 @@ def update_color_progress(self, context):
material = bpy.data.materials.get("color_progress")
if material:
color_progress = bpy.context.scene.BIMAnimationProperties.color_progress
inputs = material.node_tree.nodes["Principled BSDF"].inputs
inputs = tool.Blender.get_material_node(material, "BSDF_PRINCIPLED").inputs
color = inputs["Base Color"].default_value
color[0] = color_progress.r
color[1] = color_progress.g
+10
View File
@@ -144,6 +144,16 @@ class Blender:
# restore shader editor settings
shader_editor.pin = previous_pin_setting
@classmethod
def get_material_node(cls, blender_material, node_type):
"""returns first node from the `blender_material` shader graph with type `node_type`"""
if not blender_material.use_nodes:
return
nodes = blender_material.node_tree.nodes
for node in nodes:
if node.type == node_type:
return node
@classmethod
def update_screen(cls):
bpy.ops.wm.redraw_timer(type="DRAW_WIN_SWAP", iterations=1)
+4 -4
View File
@@ -85,7 +85,7 @@ class Loader(blenderbim.core.tool.Loader):
if surface_style.ReflectanceMethod in ["PHYSICAL", "NOTDEFINED"]:
blender_material.use_nodes = True
cls.restart_material_node_tree(blender_material)
bsdf = blender_material.node_tree.nodes["Principled BSDF"]
bsdf = tool.Blender.get_material_node(blender_material, "BSDF_PRINCIPLED")
if surface_style.DiffuseColour:
if surface_style.DiffuseColour.is_a("IfcColourRgb"):
bsdf.inputs["Base Color"].default_value = (
@@ -114,7 +114,7 @@ class Loader(blenderbim.core.tool.Loader):
cls.restart_material_node_tree(blender_material)
output = {n.type: n for n in blender_material.node_tree.nodes}.get("OUTPUT_MATERIAL", None)
bsdf = blender_material.node_tree.nodes["Principled BSDF"]
bsdf = tool.Blender.get_material_node(blender_material, "BSDF_PRINCIPLED")
mix = blender_material.node_tree.nodes.new(type="ShaderNodeMixShader")
mix.location = bsdf.location
@@ -154,7 +154,7 @@ class Loader(blenderbim.core.tool.Loader):
image_url = os.path.join(os.path.dirname(tool.Ifc.get_path()), texture.URLReference)
if rendering_style.ReflectanceMethod in ["PHYSICAL", "NOTDEFINED"]:
bsdf = blender_material.node_tree.nodes["Principled BSDF"]
bsdf = tool.Blender.get_material_node(blender_material, "BSDF_PRINCIPLED")
if mode == "NORMAL":
normalmap = blender_material.node_tree.nodes.new(type="ShaderNodeNormalMap")
normalmap.location = bsdf.location - mathutils.Vector((200, 0))
@@ -208,7 +208,7 @@ class Loader(blenderbim.core.tool.Loader):
blender_material.node_tree.links.new(node.outputs[1], bsdf.inputs["Alpha"])
blender_material.blend_method = "BLEND"
elif rendering_style.ReflectanceMethod == "FLAT":
bsdf = blender_material.node_tree.nodes["Mix Shader"]
bsdf = tool.Blender.get_material_node(blender_material, "MIX_SHADER")
if mode == "EMISSIVE":
node = blender_material.node_tree.nodes.new(type="ShaderNodeTexImage")
node.location = bsdf.location - mathutils.Vector((200, 0))
+1 -1
View File
@@ -947,7 +947,7 @@ class Sequence(blenderbim.core.tool.Sequence):
def set_material(name, r, g, b):
material = bpy.data.materials.new(name)
material.use_nodes = True
material.node_tree.nodes["Principled BSDF"].inputs[0].default_value = (r, g, b, 1.0)
tool.Blender.get_material_node(material, "BSDF_PRINCIPLED").inputs[0].default_value = (r, g, b, 1.0)
return material
def get_animation_materials():
+2 -2
View File
@@ -478,7 +478,7 @@ class TestShouldGenerateUVs(NewFile):
obj.data.materials.append(material)
material.use_nodes = True
bsdf = material.node_tree.nodes["Principled BSDF"]
bsdf = tool.Blender.get_material_node(material, "BSDF_PRINCIPLED")
node = material.node_tree.nodes.new(type="ShaderNodeTexImage")
material.node_tree.links.new(bsdf.inputs["Base Color"], node.outputs["Color"])
@@ -494,7 +494,7 @@ class TestShouldGenerateUVs(NewFile):
obj.data.materials.append(material)
material.use_nodes = True
bsdf = material.node_tree.nodes["Principled BSDF"]
bsdf = tool.Blender.get_material_node(material, "BSDF_PRINCIPLED")
node = material.node_tree.nodes.new(type="ShaderNodeTexImage")
material.node_tree.links.new(bsdf.inputs["Base Color"], node.outputs["Color"])
+6 -6
View File
@@ -136,7 +136,7 @@ class TestGetSurfaceRenderingAttributes(NewFile):
obj = bpy.data.materials.new("Material")
obj.diffuse_color = [1, 1, 1, 1]
obj.use_nodes = True
node = obj.node_tree.nodes["Principled BSDF"]
node = tool.Blender.get_material_node(obj, "BSDF_PRINCIPLED")
node.inputs["Alpha"].default_value = 0.8
node.inputs["Base Color"].default_value = [0.5, 0.5, 0.5, 0.5]
node.inputs["Roughness"].default_value = 0.2
@@ -163,7 +163,7 @@ class TestGetSurfaceRenderingAttributes(NewFile):
obj = bpy.data.materials.new("Material")
obj.diffuse_color = [1, 1, 1, 1]
obj.use_nodes = True
node = obj.node_tree.nodes["Principled BSDF"]
node = tool.Blender.get_material_node(obj, "BSDF_PRINCIPLED")
obj.node_tree.nodes.remove(node)
node = obj.node_tree.nodes.new(type="ShaderNodeBsdfGlossy")
node.inputs["Color"].default_value = [0.5, 0.5, 0.5, 0.5]
@@ -190,7 +190,7 @@ class TestGetSurfaceRenderingAttributes(NewFile):
obj = bpy.data.materials.new("Material")
obj.diffuse_color = [1, 1, 1, 1]
obj.use_nodes = True
node = obj.node_tree.nodes["Principled BSDF"]
node = tool.Blender.get_material_node(obj, "BSDF_PRINCIPLED")
obj.node_tree.nodes.remove(node)
node = obj.node_tree.nodes.new(type="ShaderNodeBsdfDiffuse")
node.inputs["Color"].default_value = [0.5, 0.5, 0.5, 0.5]
@@ -217,7 +217,7 @@ class TestGetSurfaceRenderingAttributes(NewFile):
obj = bpy.data.materials.new("Material")
obj.diffuse_color = [1, 1, 1, 1]
obj.use_nodes = True
node = obj.node_tree.nodes["Principled BSDF"]
node = tool.Blender.get_material_node(obj, "BSDF_PRINCIPLED")
obj.node_tree.nodes.remove(node)
node = obj.node_tree.nodes.new(type="ShaderNodeBsdfGlass")
node.inputs["Color"].default_value = [0.5, 0.5, 0.5, 0.5]
@@ -244,7 +244,7 @@ class TestGetSurfaceRenderingAttributes(NewFile):
obj = bpy.data.materials.new("Material")
obj.diffuse_color = [1, 1, 1, 1]
obj.use_nodes = True
node = obj.node_tree.nodes["Principled BSDF"]
node = tool.Blender.get_material_node(obj, "BSDF_PRINCIPLED")
obj.node_tree.nodes.remove(node)
node = obj.node_tree.nodes.new(type="ShaderNodeEmission")
node.inputs["Color"].default_value = [0.5, 0.5, 0.5, 0.5]
@@ -270,7 +270,7 @@ class TestGetSurfaceRenderingAttributes(NewFile):
obj = bpy.data.materials.new("Material")
obj.diffuse_color = [1, 1, 1, 1]
obj.use_nodes = True
node = obj.node_tree.nodes["Principled BSDF"]
node = tool.Blender.get_material_node(obj, "BSDF_PRINCIPLED")
obj.node_tree.nodes.remove(node)
node = obj.node_tree.nodes.new(type="ShaderNodeVolumePrincipled")
node.inputs["Color"].default_value = [0.5, 0.5, 0.5, 0.5]
@@ -176,7 +176,8 @@ def import_ifc(filename, use_names, process_relations, blender_booleans):
mat.use_screen_refraction = True
mat.refraction_depth = 0.1
mat.use_nodes = True
mat.node_tree.nodes["Principled BSDF"].inputs[15].default_value = v
bsdf = next(n for n in mat.node_tree.nodes if n.type == "BSDF_PRINCIPLED")
bsdf.inputs[15].default_value = v
else:
setattr(mat, k, v)
me.materials.append(mat)