mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-09 21:53:40 +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")
|
material = bpy.data.materials.get("color_full")
|
||||||
if material:
|
if material:
|
||||||
color_full = bpy.context.scene.BIMAnimationProperties.color_full
|
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 = inputs["Base Color"].default_value
|
||||||
color[0] = color_full.r
|
color[0] = color_full.r
|
||||||
color[1] = color_full.g
|
color[1] = color_full.g
|
||||||
@@ -272,7 +272,7 @@ def update_color_progress(self, context):
|
|||||||
material = bpy.data.materials.get("color_progress")
|
material = bpy.data.materials.get("color_progress")
|
||||||
if material:
|
if material:
|
||||||
color_progress = bpy.context.scene.BIMAnimationProperties.color_progress
|
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 = inputs["Base Color"].default_value
|
||||||
color[0] = color_progress.r
|
color[0] = color_progress.r
|
||||||
color[1] = color_progress.g
|
color[1] = color_progress.g
|
||||||
|
|||||||
@@ -144,6 +144,16 @@ class Blender:
|
|||||||
# restore shader editor settings
|
# restore shader editor settings
|
||||||
shader_editor.pin = previous_pin_setting
|
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
|
@classmethod
|
||||||
def update_screen(cls):
|
def update_screen(cls):
|
||||||
bpy.ops.wm.redraw_timer(type="DRAW_WIN_SWAP", iterations=1)
|
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"]:
|
if surface_style.ReflectanceMethod in ["PHYSICAL", "NOTDEFINED"]:
|
||||||
blender_material.use_nodes = True
|
blender_material.use_nodes = True
|
||||||
cls.restart_material_node_tree(blender_material)
|
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:
|
||||||
if surface_style.DiffuseColour.is_a("IfcColourRgb"):
|
if surface_style.DiffuseColour.is_a("IfcColourRgb"):
|
||||||
bsdf.inputs["Base Color"].default_value = (
|
bsdf.inputs["Base Color"].default_value = (
|
||||||
@@ -114,7 +114,7 @@ class Loader(blenderbim.core.tool.Loader):
|
|||||||
cls.restart_material_node_tree(blender_material)
|
cls.restart_material_node_tree(blender_material)
|
||||||
|
|
||||||
output = {n.type: n for n in blender_material.node_tree.nodes}.get("OUTPUT_MATERIAL", None)
|
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 = blender_material.node_tree.nodes.new(type="ShaderNodeMixShader")
|
||||||
mix.location = bsdf.location
|
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)
|
image_url = os.path.join(os.path.dirname(tool.Ifc.get_path()), texture.URLReference)
|
||||||
|
|
||||||
if rendering_style.ReflectanceMethod in ["PHYSICAL", "NOTDEFINED"]:
|
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":
|
if mode == "NORMAL":
|
||||||
normalmap = blender_material.node_tree.nodes.new(type="ShaderNodeNormalMap")
|
normalmap = blender_material.node_tree.nodes.new(type="ShaderNodeNormalMap")
|
||||||
normalmap.location = bsdf.location - mathutils.Vector((200, 0))
|
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.node_tree.links.new(node.outputs[1], bsdf.inputs["Alpha"])
|
||||||
blender_material.blend_method = "BLEND"
|
blender_material.blend_method = "BLEND"
|
||||||
elif rendering_style.ReflectanceMethod == "FLAT":
|
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":
|
if mode == "EMISSIVE":
|
||||||
node = blender_material.node_tree.nodes.new(type="ShaderNodeTexImage")
|
node = blender_material.node_tree.nodes.new(type="ShaderNodeTexImage")
|
||||||
node.location = bsdf.location - mathutils.Vector((200, 0))
|
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):
|
def set_material(name, r, g, b):
|
||||||
material = bpy.data.materials.new(name)
|
material = bpy.data.materials.new(name)
|
||||||
material.use_nodes = True
|
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
|
return material
|
||||||
|
|
||||||
def get_animation_materials():
|
def get_animation_materials():
|
||||||
|
|||||||
@@ -478,7 +478,7 @@ class TestShouldGenerateUVs(NewFile):
|
|||||||
obj.data.materials.append(material)
|
obj.data.materials.append(material)
|
||||||
material.use_nodes = True
|
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")
|
node = material.node_tree.nodes.new(type="ShaderNodeTexImage")
|
||||||
material.node_tree.links.new(bsdf.inputs["Base Color"], node.outputs["Color"])
|
material.node_tree.links.new(bsdf.inputs["Base Color"], node.outputs["Color"])
|
||||||
|
|
||||||
@@ -494,7 +494,7 @@ class TestShouldGenerateUVs(NewFile):
|
|||||||
obj.data.materials.append(material)
|
obj.data.materials.append(material)
|
||||||
material.use_nodes = True
|
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")
|
node = material.node_tree.nodes.new(type="ShaderNodeTexImage")
|
||||||
material.node_tree.links.new(bsdf.inputs["Base Color"], node.outputs["Color"])
|
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 = bpy.data.materials.new("Material")
|
||||||
obj.diffuse_color = [1, 1, 1, 1]
|
obj.diffuse_color = [1, 1, 1, 1]
|
||||||
obj.use_nodes = True
|
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["Alpha"].default_value = 0.8
|
||||||
node.inputs["Base Color"].default_value = [0.5, 0.5, 0.5, 0.5]
|
node.inputs["Base Color"].default_value = [0.5, 0.5, 0.5, 0.5]
|
||||||
node.inputs["Roughness"].default_value = 0.2
|
node.inputs["Roughness"].default_value = 0.2
|
||||||
@@ -163,7 +163,7 @@ class TestGetSurfaceRenderingAttributes(NewFile):
|
|||||||
obj = bpy.data.materials.new("Material")
|
obj = bpy.data.materials.new("Material")
|
||||||
obj.diffuse_color = [1, 1, 1, 1]
|
obj.diffuse_color = [1, 1, 1, 1]
|
||||||
obj.use_nodes = True
|
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)
|
obj.node_tree.nodes.remove(node)
|
||||||
node = obj.node_tree.nodes.new(type="ShaderNodeBsdfGlossy")
|
node = obj.node_tree.nodes.new(type="ShaderNodeBsdfGlossy")
|
||||||
node.inputs["Color"].default_value = [0.5, 0.5, 0.5, 0.5]
|
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 = bpy.data.materials.new("Material")
|
||||||
obj.diffuse_color = [1, 1, 1, 1]
|
obj.diffuse_color = [1, 1, 1, 1]
|
||||||
obj.use_nodes = True
|
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)
|
obj.node_tree.nodes.remove(node)
|
||||||
node = obj.node_tree.nodes.new(type="ShaderNodeBsdfDiffuse")
|
node = obj.node_tree.nodes.new(type="ShaderNodeBsdfDiffuse")
|
||||||
node.inputs["Color"].default_value = [0.5, 0.5, 0.5, 0.5]
|
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 = bpy.data.materials.new("Material")
|
||||||
obj.diffuse_color = [1, 1, 1, 1]
|
obj.diffuse_color = [1, 1, 1, 1]
|
||||||
obj.use_nodes = True
|
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)
|
obj.node_tree.nodes.remove(node)
|
||||||
node = obj.node_tree.nodes.new(type="ShaderNodeBsdfGlass")
|
node = obj.node_tree.nodes.new(type="ShaderNodeBsdfGlass")
|
||||||
node.inputs["Color"].default_value = [0.5, 0.5, 0.5, 0.5]
|
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 = bpy.data.materials.new("Material")
|
||||||
obj.diffuse_color = [1, 1, 1, 1]
|
obj.diffuse_color = [1, 1, 1, 1]
|
||||||
obj.use_nodes = True
|
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)
|
obj.node_tree.nodes.remove(node)
|
||||||
node = obj.node_tree.nodes.new(type="ShaderNodeEmission")
|
node = obj.node_tree.nodes.new(type="ShaderNodeEmission")
|
||||||
node.inputs["Color"].default_value = [0.5, 0.5, 0.5, 0.5]
|
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 = bpy.data.materials.new("Material")
|
||||||
obj.diffuse_color = [1, 1, 1, 1]
|
obj.diffuse_color = [1, 1, 1, 1]
|
||||||
obj.use_nodes = True
|
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)
|
obj.node_tree.nodes.remove(node)
|
||||||
node = obj.node_tree.nodes.new(type="ShaderNodeVolumePrincipled")
|
node = obj.node_tree.nodes.new(type="ShaderNodeVolumePrincipled")
|
||||||
node.inputs["Color"].default_value = [0.5, 0.5, 0.5, 0.5]
|
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.use_screen_refraction = True
|
||||||
mat.refraction_depth = 0.1
|
mat.refraction_depth = 0.1
|
||||||
mat.use_nodes = True
|
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:
|
else:
|
||||||
setattr(mat, k, v)
|
setattr(mat, k, v)
|
||||||
me.materials.append(mat)
|
me.materials.append(mat)
|
||||||
|
|||||||
Reference in New Issue
Block a user