mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-09 17:31:45 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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():
|
||||
|
||||
@@ -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"])
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user