diff --git a/src/blenderbim/blenderbim/bim/module/sequence/prop.py b/src/blenderbim/blenderbim/bim/module/sequence/prop.py index 0a27e24757..07929a4771 100644 --- a/src/blenderbim/blenderbim/bim/module/sequence/prop.py +++ b/src/blenderbim/blenderbim/bim/module/sequence/prop.py @@ -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 diff --git a/src/blenderbim/blenderbim/tool/blender.py b/src/blenderbim/blenderbim/tool/blender.py index 23b87252c1..0b8771de4e 100644 --- a/src/blenderbim/blenderbim/tool/blender.py +++ b/src/blenderbim/blenderbim/tool/blender.py @@ -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) diff --git a/src/blenderbim/blenderbim/tool/loader.py b/src/blenderbim/blenderbim/tool/loader.py index f0958b2e06..72473b58f4 100644 --- a/src/blenderbim/blenderbim/tool/loader.py +++ b/src/blenderbim/blenderbim/tool/loader.py @@ -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)) diff --git a/src/blenderbim/blenderbim/tool/sequence.py b/src/blenderbim/blenderbim/tool/sequence.py index 1fd9b465e7..eef330f713 100644 --- a/src/blenderbim/blenderbim/tool/sequence.py +++ b/src/blenderbim/blenderbim/tool/sequence.py @@ -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(): diff --git a/src/blenderbim/test/tool/test_geometry.py b/src/blenderbim/test/tool/test_geometry.py index 9608aefbe8..f1e5a6c4b1 100644 --- a/src/blenderbim/test/tool/test_geometry.py +++ b/src/blenderbim/test/tool/test_geometry.py @@ -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"]) diff --git a/src/blenderbim/test/tool/test_style.py b/src/blenderbim/test/tool/test_style.py index 3de9896825..8b4bf6842d 100644 --- a/src/blenderbim/test/tool/test_style.py +++ b/src/blenderbim/test/tool/test_style.py @@ -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] diff --git a/src/ifcblender/io_import_scene_ifc/__init__.py b/src/ifcblender/io_import_scene_ifc/__init__.py index a182af1c92..2c3aaf1e26 100644 --- a/src/ifcblender/io_import_scene_ifc/__init__.py +++ b/src/ifcblender/io_import_scene_ifc/__init__.py @@ -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)