First draft of style manager panel

This commit is contained in:
Dion Moult
2023-10-13 17:38:55 +11:00
parent 8f4bc0ea00
commit a47c57c22c
5 changed files with 289 additions and 31 deletions
@@ -20,24 +20,29 @@ import bpy
from . import ui, prop, operator from . import ui, prop, operator
classes = ( classes = (
operator.AddStyle,
operator.EnableEditingStyle,
operator.DisableEditingStyle,
operator.EditStyle,
operator.UpdateCurrentStyle,
operator.EnableEditingExternalStyle,
operator.DisableEditingExternalStyle,
operator.EditExternalStyle,
operator.DisableEditingStyles,
operator.BrowseExternalStyle,
operator.ActivateExternalStyle, operator.ActivateExternalStyle,
operator.AddPresentationStyle,
operator.AddStyle,
operator.BrowseExternalStyle,
operator.ClearTextureMapPath,
operator.DisableAddPresentationStyle,
operator.DisableEditingExternalStyle,
operator.DisableEditingStyle,
operator.DisableEditingStyles,
operator.EditExternalStyle,
operator.EditStyle,
operator.EditSurfaceStyle,
operator.EnableAddPresentationStyle,
operator.EnableEditingExternalStyle,
operator.EnableEditingStyle,
operator.EnableEditingSurfaceStyle,
operator.LoadStyles, operator.LoadStyles,
operator.RemoveStyle, operator.RemoveStyle,
operator.SelectByStyle, operator.SelectByStyle,
operator.UnlinkStyle, operator.UnlinkStyle,
operator.UpdateCurrentStyle,
operator.UpdateStyleColours, operator.UpdateStyleColours,
operator.UpdateStyleTextures, operator.UpdateStyleTextures,
operator.ClearTextureMapPath,
prop.Style, prop.Style,
prop.BIMStylesProperties, prop.BIMStylesProperties,
prop.BIMStyleProperties, prop.BIMStyleProperties,
@@ -16,15 +16,16 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>. # along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
import os
import bpy import bpy
import blenderbim.bim.helper
import blenderbim.bim.handler import blenderbim.bim.handler
import blenderbim.tool as tool import blenderbim.tool as tool
import blenderbim.core.style as core import blenderbim.core.style as core
import ifcopenshell.util.representation import ifcopenshell.util.representation
from pathlib import Path
from blenderbim.bim.ifc import IfcStore from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.module.style.data import StylesData, StyleAttributesData from blenderbim.bim.module.style.data import StylesData, StyleAttributesData
from pathlib import Path
import os
class UpdateStyleColours(bpy.types.Operator, tool.Ifc.Operator): class UpdateStyleColours(bpy.types.Operator, tool.Ifc.Operator):
@@ -99,9 +100,16 @@ class EnableEditingStyle(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.enable_editing_style" bl_idname = "bim.enable_editing_style"
bl_label = "Enable Editing Style" bl_label = "Enable Editing Style"
bl_options = {"REGISTER", "UNDO"} bl_options = {"REGISTER", "UNDO"}
style: bpy.props.IntProperty(default=0)
def _execute(self, context): def _execute(self, context):
core.enable_editing_style(tool.Style, obj=context.active_object.active_material) props = bpy.context.scene.BIMStylesProperties
style = tool.Ifc.get().by_id(self.style)
props.is_editing_style = style.id()
props.is_editing_class = "IfcSurfaceStyle"
attributes = props.attributes
attributes.clear()
blenderbim.bim.helper.import_attributes2(style, attributes)
class DisableEditingStyle(bpy.types.Operator, tool.Ifc.Operator): class DisableEditingStyle(bpy.types.Operator, tool.Ifc.Operator):
@@ -110,7 +118,8 @@ class DisableEditingStyle(bpy.types.Operator, tool.Ifc.Operator):
bl_label = "Disable Editing Style" bl_label = "Disable Editing Style"
def _execute(self, context): def _execute(self, context):
core.disable_editing_style(tool.Style, obj=context.active_object.active_material) props = bpy.context.scene.BIMStylesProperties
props.is_editing_style = 0
class EditStyle(bpy.types.Operator, tool.Ifc.Operator): class EditStyle(bpy.types.Operator, tool.Ifc.Operator):
@@ -119,7 +128,12 @@ class EditStyle(bpy.types.Operator, tool.Ifc.Operator):
bl_options = {"REGISTER", "UNDO"} bl_options = {"REGISTER", "UNDO"}
def _execute(self, context): def _execute(self, context):
core.edit_style(tool.Ifc, tool.Style, obj=context.active_object.active_material) props = bpy.context.scene.BIMStylesProperties
style = tool.Ifc.get().by_id(props.is_editing_style)
attributes = blenderbim.bim.helper.export_attributes(props.attributes)
ifcopenshell.api.run("style.edit_presentation_style", tool.Ifc.get(), style=style, attributes=attributes)
props.is_editing_style = 0
core.load_styles(tool.Style, style_type=props.style_type)
class UpdateCurrentStyle(bpy.types.Operator): class UpdateCurrentStyle(bpy.types.Operator):
@@ -415,3 +429,122 @@ class ClearTextureMapPath(bpy.types.Operator):
props = context.material.BIMStyleProperties props = context.material.BIMStyleProperties
setattr(props, self.texture_map_prop, "") setattr(props, self.texture_map_prop, "")
return {"FINISHED"} return {"FINISHED"}
class EnableAddPresentationStyle(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.enable_add_presentation_style"
bl_label = "Enable Add Presentation Style"
bl_options = {"REGISTER", "UNDO"}
def _execute(self, context):
props = bpy.context.scene.BIMStylesProperties
props.is_adding = True
class DisableAddPresentationStyle(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.disable_add_presentation_style"
bl_label = "Disable Add Presentation Style"
bl_options = {"REGISTER", "UNDO"}
def _execute(self, context):
props = bpy.context.scene.BIMStylesProperties
props.is_adding = False
class AddPresentationStyle(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.add_presentation_style"
bl_label = "Add Presentation Style"
bl_options = {"REGISTER", "UNDO"}
def _execute(self, context):
props = bpy.context.scene.BIMStylesProperties
if props.style_type == "IfcSurfaceStyle":
style = ifcopenshell.api.run("style.add_style", tool.Ifc.get(), name=props.style_name)
if props.surface_style_class in ("IfcSurfaceStyleShading", "IfcSurfaceStyleRendering"):
surface_style = ifcopenshell.api.run(
"style.add_surface_style",
tool.Ifc.get(),
style=style,
ifc_class=props.surface_style_class,
attributes={
"SurfaceColour": {
"Name": None,
"Red": props.surface_colour[0],
"Green": props.surface_colour[1],
"Blue": props.surface_colour[2],
}
},
)
if props.surface_style_class == "IfcSurfaceStyleRendering":
surface_style.ReflectanceMethod = "NOTDEFINED"
props.is_adding = False
core.load_styles(tool.Style, style_type=props.style_type)
class EnableEditingSurfaceStyle(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.enable_editing_surface_style"
bl_label = "Enable Editing Surface Style"
bl_options = {"REGISTER", "UNDO"}
style: bpy.props.IntProperty(default=0)
ifc_class: bpy.props.StringProperty(default="")
def _execute(self, context):
props = bpy.context.scene.BIMStylesProperties
style = tool.Ifc.get().by_id(self.style)
surface_style = None
for style2 in style.Styles:
if style2.is_a() == self.ifc_class:
surface_style = style2
break
if surface_style:
color_to_tuple = lambda x: (x.Red, x.Green, x.Blue)
if self.ifc_class == "IfcSurfaceStyleShading":
props.surface_colour = color_to_tuple(surface_style.SurfaceColour)
props.transparency = surface_style.Transparency or 0.
elif self.ifc_class == "IfcSurfaceStyleRendering":
props.surface_colour = color_to_tuple(surface_style.SurfaceColour)
props.transparency = surface_style.Transparency or 0.
props.is_editing_style = self.style
props.is_editing_class = self.ifc_class
class EditSurfaceStyle(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.edit_surface_style"
bl_label = "Edit Surface Style"
bl_options = {"REGISTER", "UNDO"}
def _execute(self, context):
self.props = bpy.context.scene.BIMStylesProperties
style = tool.Ifc.get().by_id(self.props.is_editing_style)
self.surface_style = None
self.shading_style = None
self.rendering_style = None
for style2 in style.Styles:
if style2.is_a() == self.props.is_editing_class:
self.surface_style = style2
if style2.is_a() == "IfcSurfaceStyleShading":
self.shading_style = style2
if style2.is_a() == "IfcSurfaceStyleRendering":
self.rendering_style = style2
if self.surface_style:
self.edit_existing_style()
else:
self.add_new_style()
self.props.is_editing_style = 0
core.load_styles(tool.Style, style_type=self.props.style_type)
def edit_existing_style(self):
if self.surface_style.is_a() == "IfcSurfaceStyleShading":
self.surface_style.SurfaceColour.Red = self.props.surface_colour[0]
self.surface_style.SurfaceColour.Green = self.props.surface_colour[1]
self.surface_style.SurfaceColour.Blue = self.props.surface_colour[2]
self.surface_style.Transparency = self.props.transparency or None
def add_new_style(self):
pass
@@ -44,6 +44,11 @@ class Style(PropertyGroup):
name: StringProperty(name="Name") name: StringProperty(name="Name")
ifc_definition_id: IntProperty(name="IFC Definition ID") ifc_definition_id: IntProperty(name="IFC Definition ID")
total_elements: IntProperty(name="Total Elements") total_elements: IntProperty(name="Total Elements")
style_classes: CollectionProperty(name="Style Classes", type=StrProperty)
has_surface_colour: BoolProperty(name="Has Surface Colour", default=False)
surface_colour: bpy.props.FloatVectorProperty(
name="Surface Colour", subtype="COLOR", default=(1, 1, 1), min=0.0, max=1.0, size=3
)
STYLE_TYPES = [ STYLE_TYPES = [
@@ -60,8 +65,32 @@ def update_shading_styles(self, context):
class BIMStylesProperties(PropertyGroup): class BIMStylesProperties(PropertyGroup):
is_adding: BoolProperty(name="Is Adding")
is_editing: BoolProperty(name="Is Editing") is_editing: BoolProperty(name="Is Editing")
style_type: EnumProperty(items=get_style_types, name="Style Type") is_editing_style: IntProperty(name="Is Editing Style")
is_editing_class: StringProperty(name="Is Editing Class")
attributes: CollectionProperty(name="Attributes", type=Attribute)
style_type: EnumProperty(items=get_style_types, default=2, name="Style Type")
style_name: StringProperty(name="Style Name")
surface_style_class: EnumProperty(
items=[
(x, x, "")
for x in (
"IfcSurfaceStyleShading",
"IfcSurfaceStyleRendering",
"IfcSurfaceStyleWithTextures",
"IfcSurfaceStyleLighting",
"IfcSurfaceStyleRefraction",
"IfcExternallyDefinedSurfaceStyle",
)
],
name="Surface Style Class",
default="IfcSurfaceStyleShading",
)
surface_colour: bpy.props.FloatVectorProperty(
name="Surface Colour", subtype="COLOR", default=(1, 1, 1), min=0.0, max=1.0, size=3
)
transparency: bpy.props.FloatProperty(name="Transparency", default=0.0, min=0.0, max=1.0)
styles: CollectionProperty(name="Styles", type=Style) styles: CollectionProperty(name="Styles", type=Style)
active_style_index: IntProperty(name="Active Style Index") active_style_index: IntProperty(name="Active Style Index")
active_style_type: EnumProperty( active_style_type: EnumProperty(
@@ -28,11 +28,11 @@ from blenderbim.tool.style import TEXTURE_MAPS_BY_METHODS, STYLE_TEXTURE_PROPS_M
class BIM_PT_styles(Panel): class BIM_PT_styles(Panel):
bl_label = "Styles" bl_label = "Styles"
bl_idname = "BIM_PT_styles" bl_idname = "BIM_PT_styles"
bl_options = {"DEFAULT_CLOSED"} bl_options = {"HIDE_HEADER"}
bl_space_type = "PROPERTIES" bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW" bl_region_type = "WINDOW"
bl_context = "scene" bl_context = "scene"
bl_parent_id = "BIM_PT_geometry" bl_parent_id = "BIM_PT_tab_styles"
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
@@ -44,28 +44,97 @@ class BIM_PT_styles(Panel):
self.props = context.scene.BIMStylesProperties self.props = context.scene.BIMStylesProperties
row = self.layout.row(align=True)
row.label(text="{} Styles Found".format(StylesData.data["total_styles"]), icon="MATERIAL")
row = self.layout.row(align=True)
if self.props.is_editing: if self.props.is_editing:
row = self.layout.row(align=True)
row.label(text="{} {}s".format(len(self.props.styles), self.props.style_type), icon="SHADING_RENDERED")
if not self.props.is_adding:
row.operator("bim.enable_add_presentation_style", text="", icon="ADD")
row.operator("bim.disable_editing_styles", text="", icon="CANCEL") row.operator("bim.disable_editing_styles", text="", icon="CANCEL")
else: else:
row = self.layout.row(align=True)
row.label(text="{} Styles".format(StylesData.data["total_styles"]), icon="SHADING_RENDERED")
blenderbim.bim.helper.prop_with_search(row, self.props, "style_type", text="") blenderbim.bim.helper.prop_with_search(row, self.props, "style_type", text="")
row.operator("bim.load_styles", text="", icon="IMPORT").style_type = self.props.style_type row.operator("bim.load_styles", text="", icon="IMPORT").style_type = self.props.style_type
return return
row = self.layout.row(align=True) if self.props.is_adding:
row.alignment = "RIGHT" box = self.layout.box()
row = box.row()
row.prop(self.props, "style_name", text="Name")
if self.props.style_type == "IfcSurfaceStyle":
row = box.row()
row.prop(self.props, "surface_style_class", text="Class")
if self.props.surface_style_class in ("IfcSurfaceStyleShading", "IfcSurfaceStyleRendering"):
row = box.row()
row.prop(self.props, "surface_colour", text="Colour")
row = box.row(align=True)
row.operator("bim.add_presentation_style", text="Save New Style", icon="CHECKMARK")
row.operator("bim.disable_add_presentation_style", text="", icon="CANCEL")
# row.operator("bim.add_presentation_style", text="", icon="ADD")
if self.props.styles and self.props.active_style_index < len(self.props.styles): if self.props.styles and self.props.active_style_index < len(self.props.styles):
row = self.layout.row(align=True)
style = self.props.styles[self.props.active_style_index] style = self.props.styles[self.props.active_style_index]
op = row.operator("bim.select_by_style", text="", icon="RESTRICT_SELECT_OFF") op = row.operator("bim.enable_editing_style", text="Edit Style", icon="GREASEPENCIL")
op.style = style.ifc_definition_id op.style = style.ifc_definition_id
row.operator("bim.select_by_style", text="", icon="RESTRICT_SELECT_OFF").style = style.ifc_definition_id
row.operator("bim.remove_style", text="", icon="X").style = style.ifc_definition_id row.operator("bim.remove_style", text="", icon="X").style = style.ifc_definition_id
if self.props.style_type == "IfcSurfaceStyle":
col = self.layout.column(align=True)
row = col.row(align=True)
op = row.operator("bim.enable_editing_surface_style", text="Shade", icon="SHADING_SOLID")
op.ifc_class = "IfcSurfaceStyleShading"
op.style = style.ifc_definition_id
op = row.operator("bim.enable_editing_surface_style", text="Render", icon="SHADING_RENDERED")
op.ifc_class = "IfcSurfaceStyleRendering"
op.style = style.ifc_definition_id
op = row.operator("bim.enable_editing_surface_style", text="Texture", icon="SHADING_TEXTURE")
op.ifc_class = "IfcSurfaceStyleWithTextures"
op.style = style.ifc_definition_id
row = col.row(align=True)
op = row.operator("bim.enable_editing_surface_style", text="Lighting", icon="LIGHT_SUN")
op.ifc_class = "IfcSurfaceStyleLighting"
op.style = style.ifc_definition_id
op = row.operator("bim.enable_editing_surface_style", text="Refract", icon="LIGHT_POINT")
op.ifc_class = "IfcSurfaceStyleRefraction"
op.style = style.ifc_definition_id
op = row.operator("bim.enable_editing_surface_style", text="External", icon="APPEND_BLEND")
op.ifc_class = "IfcExternallyDefinedSurfaceStyle"
op.style = style.ifc_definition_id
self.layout.template_list("BIM_UL_styles", "", self.props, "styles", self.props, "active_style_index") self.layout.template_list("BIM_UL_styles", "", self.props, "styles", self.props, "active_style_index")
if self.props.is_editing_style:
if self.props.is_editing_class == "IfcSurfaceStyle":
blenderbim.bim.helper.draw_attributes(self.props.attributes, self.layout)
row = self.layout.row(align=True)
row.operator("bim.edit_style", text="Save Attributes", icon="CHECKMARK")
row.operator("bim.disable_editing_style", text="", icon="CANCEL")
elif self.props.is_editing_class == "IfcSurfaceStyleShading":
self.draw_surface_style_shading()
elif self.props.is_editing_class == "IfcSurfaceStyleRendering":
self.draw_surface_style_rendering()
def draw_surface_style_shading(self):
row = self.layout.row()
row.prop(self.props, "surface_colour")
row = self.layout.row()
row.prop(self.props, "transparency")
row = self.layout.row(align=True)
row.operator("bim.edit_surface_style", text="Save Shading Style", icon="CHECKMARK")
row.operator("bim.disable_editing_style", text="", icon="CANCEL")
def draw_surface_style_rendering(self):
row = self.layout.row()
row.prop(self.props, "surface_colour")
row = self.layout.row()
row.prop(self.props, "transparency")
row = self.layout.row(align=True)
row.operator("bim.edit_surface_style", text="Save Rendering Style", icon="CHECKMARK")
row.operator("bim.disable_editing_style", text="", icon="CANCEL")
def draw_style_ui(self, context): def draw_style_ui(self, context):
mat = context.material mat = context.material
@@ -145,9 +214,6 @@ class BIM_PT_style_attributes(Panel):
row.operator("bim.disable_editing_style", icon="CANCEL", text="") row.operator("bim.disable_editing_style", icon="CANCEL", text="")
blenderbim.bim.helper.draw_attributes(props.attributes, self.layout) blenderbim.bim.helper.draw_attributes(props.attributes, self.layout)
else: else:
row = self.layout.row()
row.operator("bim.enable_editing_style", icon="GREASEPENCIL", text="Edit")
row = self.layout.row(align=True) row = self.layout.row(align=True)
row.label(text="STEP ID") row.label(text="STEP ID")
row.label(text=str(mprops.ifc_style_id)) row.label(text=str(mprops.ifc_style_id))
@@ -218,9 +284,26 @@ class BIM_UL_styles(UIList):
if item: if item:
row = layout.row(align=True) row = layout.row(align=True)
row.label(text=item.name) row.label(text=item.name)
if item.has_surface_colour:
row = row.row()
row.enabled = False
row.prop(item, "surface_colour", text="")
row2 = row.row() row2 = row.row()
row2.alignment = "RIGHT" row2.alignment = "RIGHT"
row2.label(text=str(item.total_elements)) row2.label(text=str(item.total_elements))
for style in item.style_classes:
if style.name == "IfcSurfaceStyleShading":
row2.label(text="", icon="SHADING_SOLID")
elif style.name == "IfcSurfaceStyleRendering":
row2.label(text="", icon="SHADING_RENDERED")
elif style.name == "IfcSurfaceStyleWithTextures":
row2.label(text="", icon="SHADING_TEXTURE")
elif style.name == "IfcSurfaceStyleLighting":
row2.label(text="", icon="LIGHT_SUN")
elif style.name == "IfcSurfaceStyleRefraction":
row2.label(text="", icon="LIGHT_POINT")
elif style.name == "IfcExternallyDefinedSurfaceStyle":
row2.label(text="", icon="APPEND_BLEND")
class BIM_PT_STYLE_GRAPH(Panel): class BIM_PT_STYLE_GRAPH(Panel):
+8
View File
@@ -430,6 +430,14 @@ class Style(blenderbim.core.tool.Style):
new = props.styles.add() new = props.styles.add()
new.ifc_definition_id = style.id() new.ifc_definition_id = style.id()
new.name = style.Name or "Unnamed" new.name = style.Name or "Unnamed"
new.ifc_class = style.is_a()
for surface_style in getattr(style, "Styles", []):
new2 = new.style_classes.add()
new2.name = surface_style.is_a()
if surface_style.is_a("IfcSurfaceStyleShading"):
color_to_tuple = lambda x: (x.Red, x.Green, x.Blue)
new.has_surface_colour = True
new.surface_colour = color_to_tuple(surface_style.SurfaceColour)
new.total_elements = len(ifcopenshell.util.element.get_elements_by_style(tool.Ifc.get(), style)) new.total_elements = len(ifcopenshell.util.element.get_elements_by_style(tool.Ifc.get(), style))
@classmethod @classmethod