mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-19 14:41:25 +00:00
Deprecate old material panel in the material tab and reimplement material duplication in the material manager
The material duplication now 1) actually creates a new blender material 2) uses the API to duplicate. One less panel outside our scene tab.
This commit is contained in:
@@ -30,7 +30,6 @@ classes = (
|
|||||||
operator.AssignMaterial,
|
operator.AssignMaterial,
|
||||||
operator.AssignParameterizedProfile,
|
operator.AssignParameterizedProfile,
|
||||||
operator.ContractMaterialCategory,
|
operator.ContractMaterialCategory,
|
||||||
operator.CopyMaterial,
|
|
||||||
operator.DisableEditingAssignedMaterial,
|
operator.DisableEditingAssignedMaterial,
|
||||||
operator.DisableEditingMaterial,
|
operator.DisableEditingMaterial,
|
||||||
operator.DisableEditingMaterialSetItem,
|
operator.DisableEditingMaterialSetItem,
|
||||||
@@ -64,7 +63,6 @@ classes = (
|
|||||||
prop.BIMMaterialProperties,
|
prop.BIMMaterialProperties,
|
||||||
prop.BIMObjectMaterialProperties,
|
prop.BIMObjectMaterialProperties,
|
||||||
ui.BIM_PT_materials,
|
ui.BIM_PT_materials,
|
||||||
ui.BIM_PT_material,
|
|
||||||
ui.BIM_PT_object_material,
|
ui.BIM_PT_object_material,
|
||||||
ui.BIM_UL_materials,
|
ui.BIM_UL_materials,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -141,8 +141,19 @@ class DuplicateMaterial(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
material: bpy.props.IntProperty(name="Material ID")
|
material: bpy.props.IntProperty(name="Material ID")
|
||||||
|
|
||||||
def _execute(self, context):
|
def _execute(self, context):
|
||||||
ifc_file = tool.Ifc.get()
|
material = tool.Ifc.get().by_id(self.material)
|
||||||
tool.Material.duplicate_material(ifc_file.by_id(self.material))
|
new = tool.Ifc.run("material.copy_material", material=material)
|
||||||
|
|
||||||
|
blender_material = tool.Ifc.get_object(material)
|
||||||
|
new_blender = blender_material.copy()
|
||||||
|
new_blender.use_fake_user = True
|
||||||
|
tool.Ifc.link(new, new_blender)
|
||||||
|
|
||||||
|
if not new.is_a("IfcMaterialList"):
|
||||||
|
name = new[0] + " Copy"
|
||||||
|
new[0] = name
|
||||||
|
new_blender.name = name
|
||||||
|
|
||||||
material_prop_purge()
|
material_prop_purge()
|
||||||
bpy.ops.bim.load_materials()
|
bpy.ops.bim.load_materials()
|
||||||
|
|
||||||
@@ -185,9 +196,10 @@ class UnlinkMaterial(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
bl_idname = "bim.unlink_material"
|
bl_idname = "bim.unlink_material"
|
||||||
bl_label = "Unlink Material"
|
bl_label = "Unlink Material"
|
||||||
bl_options = {"REGISTER", "UNDO"}
|
bl_options = {"REGISTER", "UNDO"}
|
||||||
|
material: bpy.props.IntProperty(name="Material ID")
|
||||||
|
|
||||||
def _execute(self, context):
|
def _execute(self, context):
|
||||||
core.unlink_material(tool.Ifc, obj=context.active_object.active_material)
|
core.unlink_material(tool.Ifc, obj=tool.Ifc.get_object(tool.Ifc.get().by_id(self.material)))
|
||||||
|
|
||||||
|
|
||||||
class AssignMaterial(bpy.types.Operator, tool.Ifc.Operator):
|
class AssignMaterial(bpy.types.Operator, tool.Ifc.Operator):
|
||||||
@@ -679,35 +691,6 @@ class EditMaterialSetItem(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
bpy.ops.bim.disable_editing_material_set_item(obj=obj.name)
|
bpy.ops.bim.disable_editing_material_set_item(obj=obj.name)
|
||||||
|
|
||||||
|
|
||||||
class CopyMaterial(bpy.types.Operator, tool.Ifc.Operator):
|
|
||||||
bl_idname = "bim.copy_material"
|
|
||||||
bl_label = "Copy Material"
|
|
||||||
bl_options = {"REGISTER", "UNDO"}
|
|
||||||
|
|
||||||
def _execute(self, context):
|
|
||||||
blender_material = context.active_object.active_material
|
|
||||||
material = tool.Ifc.get_entity(blender_material)
|
|
||||||
|
|
||||||
if tool.Ifc.has_changed_shading(blender_material):
|
|
||||||
blenderbim.core.style.update_style_colours(tool.Ifc, tool.Style, obj=blender_material)
|
|
||||||
|
|
||||||
copied_material = ifcopenshell.api.run("material.copy_material", tool.Ifc.get(), material=material)
|
|
||||||
copied_blender_material = blender_material.copy()
|
|
||||||
copied_style = self.get_style(copied_material)
|
|
||||||
tool.Ifc.link(copied_material, copied_blender_material)
|
|
||||||
if copied_style:
|
|
||||||
tool.Ifc.link(copied_style, copied_blender_material)
|
|
||||||
context.active_object.active_material = copied_blender_material
|
|
||||||
|
|
||||||
def get_style(self, material):
|
|
||||||
for material_representation in material.HasRepresentation:
|
|
||||||
for representation in material_representation.Representations:
|
|
||||||
for item in representation.Items:
|
|
||||||
for style in item.Styles:
|
|
||||||
if style.is_a("IfcSurfaceStyle"):
|
|
||||||
return style
|
|
||||||
|
|
||||||
|
|
||||||
class ExpandMaterialCategory(bpy.types.Operator):
|
class ExpandMaterialCategory(bpy.types.Operator):
|
||||||
bl_idname = "bim.expand_material_category"
|
bl_idname = "bim.expand_material_category"
|
||||||
bl_label = "Expand Material Category"
|
bl_label = "Expand Material Category"
|
||||||
|
|||||||
@@ -69,6 +69,8 @@ class BIM_PT_materials(Panel):
|
|||||||
op.material = material.ifc_definition_id
|
op.material = material.ifc_definition_id
|
||||||
op = row.operator("bim.enable_editing_material_style", text="", icon="SHADING_RENDERED")
|
op = row.operator("bim.enable_editing_material_style", text="", icon="SHADING_RENDERED")
|
||||||
op.material = material.ifc_definition_id
|
op.material = material.ifc_definition_id
|
||||||
|
op = row.operator("bim.unlink_material", icon="UNLINKED", text="")
|
||||||
|
op.material = material.ifc_definition_id
|
||||||
row.operator("bim.remove_material", text="", icon="X").material = material.ifc_definition_id
|
row.operator("bim.remove_material", text="", icon="X").material = material.ifc_definition_id
|
||||||
|
|
||||||
self.draw_editing_ui()
|
self.draw_editing_ui()
|
||||||
@@ -114,29 +116,6 @@ class BIM_PT_materials(Panel):
|
|||||||
row.operator("bim.disable_editing_material", text="", icon="CANCEL")
|
row.operator("bim.disable_editing_material", text="", icon="CANCEL")
|
||||||
|
|
||||||
|
|
||||||
class BIM_PT_material(Panel):
|
|
||||||
bl_label = "Material"
|
|
||||||
bl_idname = "BIM_PT_material"
|
|
||||||
bl_space_type = "PROPERTIES"
|
|
||||||
bl_region_type = "WINDOW"
|
|
||||||
bl_context = "material"
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def poll(cls, context):
|
|
||||||
return IfcStore.get_file() and context.active_object and context.active_object.active_material
|
|
||||||
|
|
||||||
def draw(self, context):
|
|
||||||
row = self.layout.row(align=True)
|
|
||||||
material_id = context.active_object.active_material.BIMObjectProperties.ifc_definition_id
|
|
||||||
if bool(material_id):
|
|
||||||
row.operator("bim.remove_material", icon="X", text="Remove IFC Material").material = material_id
|
|
||||||
row.operator("bim.copy_material", icon="DUPLICATE", text="")
|
|
||||||
row.operator("bim.unlink_material", icon="UNLINKED", text="")
|
|
||||||
else:
|
|
||||||
op = row.operator("bim.add_material", icon="ADD", text="Create IFC Material")
|
|
||||||
op.obj = context.active_object.active_material.name
|
|
||||||
|
|
||||||
|
|
||||||
class BIM_PT_object_material(Panel):
|
class BIM_PT_object_material(Panel):
|
||||||
bl_label = "Object Material"
|
bl_label = "Object Material"
|
||||||
bl_idname = "BIM_PT_object_material"
|
bl_idname = "BIM_PT_object_material"
|
||||||
|
|||||||
Reference in New Issue
Block a user