diff --git a/src/blenderbim/blenderbim/bim/handler.py b/src/blenderbim/blenderbim/bim/handler.py index 3ae69b7008..2e232c56c4 100644 --- a/src/blenderbim/blenderbim/bim/handler.py +++ b/src/blenderbim/blenderbim/bim/handler.py @@ -21,6 +21,7 @@ import bpy import json import addon_utils import ifcopenshell.api.owner.settings +from blenderbim.bim.module.drawing.prop import RasterStyleProperty from bpy.app.handlers import persistent from blenderbim.bim.ifc import IfcStore from blenderbim.bim.module.owner.prop import getPersons, getOrganisations @@ -246,30 +247,30 @@ def setDefaultProperties(scene): drawing_style.render_type = "VIEWPORT" drawing_style.raster_style = json.dumps( { - "bpy.data.worlds[0].color": (1, 1, 1), - "bpy.context.scene.render.engine": "BLENDER_WORKBENCH", - "bpy.context.scene.render.film_transparent": False, - "bpy.context.scene.display.shading.show_object_outline": True, - "bpy.context.scene.display.shading.show_cavity": False, - "bpy.context.scene.display.shading.cavity_type": "BOTH", - "bpy.context.scene.display.shading.curvature_ridge_factor": 1, - "bpy.context.scene.display.shading.curvature_valley_factor": 1, - "bpy.context.scene.view_settings.view_transform": "Standard", - "bpy.context.scene.display.shading.light": "FLAT", - "bpy.context.scene.display.shading.color_type": "SINGLE", - "bpy.context.scene.display.shading.single_color": (1, 1, 1), - "bpy.context.scene.display.shading.show_shadows": False, - "bpy.context.scene.display.shading.shadow_intensity": 0.5, - "bpy.context.scene.display.light_direction": (0.5, 0.5, 0.5), - "bpy.context.scene.view_settings.use_curve_mapping": False, - "space.overlay.show_wireframes": True, - "space.overlay.wireframe_threshold": 0, - "space.overlay.show_floor": False, - "space.overlay.show_axis_x": False, - "space.overlay.show_axis_y": False, - "space.overlay.show_axis_z": False, - "space.overlay.show_object_origins": False, - "space.overlay.show_relationship_lines": False, + RasterStyleProperty.WORLD_COLOR.value: (1, 1, 1), + RasterStyleProperty.RENDER_ENGINE.value: "BLENDER_WORKBENCH", + RasterStyleProperty.RENDER_TRANSPARENT.value: False, + RasterStyleProperty.SHADING_SHOW_OBJECT_OUTLINE.value: True, + RasterStyleProperty.SHADING_SHOW_CAVITY.value: False, + RasterStyleProperty.SHADING_CAVITY_TYPE.value: "BOTH", + RasterStyleProperty.SHADING_CURVATURE_RIDGE_FACTOR.value: 1, + RasterStyleProperty.SHADING_CURVATURE_VALLEY_FACTOR.value: 1, + RasterStyleProperty.VIEW_TRANSFORM.value: "Standard", + RasterStyleProperty.SHADING_LIGHT.value: "FLAT", + RasterStyleProperty.SHADING_COLOR_TYPE.value: "SINGLE", + RasterStyleProperty.SHADING_SINGLE_COLOR.value: (1, 1, 1), + RasterStyleProperty.SHADING_SHOW_SHADOWS.value: False, + RasterStyleProperty.SHADING_SHADOW_INTENSITY.value: 0.5, + RasterStyleProperty.DISPLAY_LIGHT_DIRECTION.value: (0.5, 0.5, 0.5), + RasterStyleProperty.VIEW_USE_CURVE_MAPPING.value: False, + RasterStyleProperty.OVERLAY_SHOW_WIREFRAMES.value: True, + RasterStyleProperty.OVERLAY_WIREFRAME_THRESHOLD.value: 0, + RasterStyleProperty.OVERLAY_SHOW_FLOOR.value: False, + RasterStyleProperty.OVERLAY_SHOW_AXIS_X.value: False, + RasterStyleProperty.OVERLAY_SHOW_AXIS_Y.value: False, + RasterStyleProperty.OVERLAY_SHOW_AXIS_Z.value: False, + RasterStyleProperty.OVERLAY_SHOW_OBJECT_ORIGINS.value: False, + RasterStyleProperty.OVERLAY_SHOW_RELATIONSHIP_LINES.value: False, } ) drawing_style = scene.DocProperties.drawing_styles.add() @@ -277,30 +278,30 @@ def setDefaultProperties(scene): drawing_style.render_type = "VIEWPORT" drawing_style.raster_style = json.dumps( { - "bpy.data.worlds[0].color": (1, 1, 1), - "bpy.context.scene.render.engine": "BLENDER_WORKBENCH", - "bpy.context.scene.render.film_transparent": False, - "bpy.context.scene.display.shading.show_object_outline": True, - "bpy.context.scene.display.shading.show_cavity": True, - "bpy.context.scene.display.shading.cavity_type": "BOTH", - "bpy.context.scene.display.shading.curvature_ridge_factor": 1, - "bpy.context.scene.display.shading.curvature_valley_factor": 1, - "bpy.context.scene.view_settings.view_transform": "Standard", - "bpy.context.scene.display.shading.light": "STUDIO", - "bpy.context.scene.display.shading.color_type": "MATERIAL", - "bpy.context.scene.display.shading.single_color": (1, 1, 1), - "bpy.context.scene.display.shading.show_shadows": True, - "bpy.context.scene.display.shading.shadow_intensity": 0.5, - "bpy.context.scene.display.light_direction": (0.5, 0.5, 0.5), - "bpy.context.scene.view_settings.use_curve_mapping": False, - "space.overlay.show_wireframes": True, - "space.overlay.wireframe_threshold": 0, - "space.overlay.show_floor": False, - "space.overlay.show_axis_x": False, - "space.overlay.show_axis_y": False, - "space.overlay.show_axis_z": False, - "space.overlay.show_object_origins": False, - "space.overlay.show_relationship_lines": False, + RasterStyleProperty.WORLD_COLOR.value: (1, 1, 1), + RasterStyleProperty.RENDER_ENGINE.value: "BLENDER_WORKBENCH", + RasterStyleProperty.RENDER_TRANSPARENT.value: False, + RasterStyleProperty.SHADING_SHOW_OBJECT_OUTLINE.value: True, + RasterStyleProperty.SHADING_SHOW_CAVITY.value: True, + RasterStyleProperty.SHADING_CAVITY_TYPE.value: "BOTH", + RasterStyleProperty.SHADING_CURVATURE_RIDGE_FACTOR.value: 1, + RasterStyleProperty.SHADING_CURVATURE_VALLEY_FACTOR.value: 1, + RasterStyleProperty.VIEW_TRANSFORM.value: "Standard", + RasterStyleProperty.SHADING_LIGHT.value: "STUDIO", + RasterStyleProperty.SHADING_COLOR_TYPE.value: "MATERIAL", + RasterStyleProperty.SHADING_SINGLE_COLOR.value: (1, 1, 1), + RasterStyleProperty.SHADING_SHOW_SHADOWS.value: True, + RasterStyleProperty.SHADING_SHADOW_INTENSITY.value: 0.5, + RasterStyleProperty.DISPLAY_LIGHT_DIRECTION.value: (0.5, 0.5, 0.5), + RasterStyleProperty.VIEW_USE_CURVE_MAPPING.value: False, + RasterStyleProperty.OVERLAY_SHOW_WIREFRAMES.value: True, + RasterStyleProperty.OVERLAY_WIREFRAME_THRESHOLD.value: 0, + RasterStyleProperty.OVERLAY_SHOW_FLOOR.value: False, + RasterStyleProperty.OVERLAY_SHOW_AXIS_X.value: False, + RasterStyleProperty.OVERLAY_SHOW_AXIS_Y.value: False, + RasterStyleProperty.OVERLAY_SHOW_AXIS_Z.value: False, + RasterStyleProperty.OVERLAY_SHOW_OBJECT_ORIGINS.value: False, + RasterStyleProperty.OVERLAY_SHOW_RELATIONSHIP_LINES.value: False, } ) drawing_style = scene.DocProperties.drawing_styles.add() diff --git a/src/blenderbim/blenderbim/bim/module/drawing/operator.py b/src/blenderbim/blenderbim/bim/module/drawing/operator.py index c51a471d19..8b00164eca 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -36,6 +36,7 @@ import blenderbim.bim.module.drawing.annotation as annotation import blenderbim.bim.module.drawing.sheeter as sheeter import blenderbim.bim.module.drawing.scheduler as scheduler import blenderbim.bim.module.drawing.helper as helper +from blenderbim.bim.module.drawing.prop import RasterStyleProperty from mathutils import Vector, Matrix, Euler, geometry from blenderbim.bim.ifc import IfcStore from ifcopenshell.api.group.data import Data as GroupData @@ -876,42 +877,26 @@ class SaveDrawingStyle(bpy.types.Operator): # TODO: check undo redo def execute(self, context): - space = self.get_view_3d() - style = { - "bpy.data.worlds[0].color": tuple(bpy.data.worlds[0].color), - "bpy.context.scene.render.engine": bpy.context.scene.render.engine, - "bpy.context.scene.render.film_transparent": bpy.context.scene.render.film_transparent, - "bpy.context.scene.display.shading.show_object_outline": bpy.context.scene.display.shading.show_object_outline, - "bpy.context.scene.display.shading.show_cavity": bpy.context.scene.display.shading.show_cavity, - "bpy.context.scene.display.shading.cavity_type": bpy.context.scene.display.shading.cavity_type, - "bpy.context.scene.display.shading.curvature_ridge_factor": bpy.context.scene.display.shading.curvature_ridge_factor, - "bpy.context.scene.display.shading.curvature_valley_factor": bpy.context.scene.display.shading.curvature_valley_factor, - "bpy.context.scene.view_settings.view_transform": bpy.context.scene.view_settings.view_transform, - "bpy.context.scene.display.shading.light": bpy.context.scene.display.shading.light, - "bpy.context.scene.display.shading.color_type": bpy.context.scene.display.shading.color_type, - "bpy.context.scene.display.shading.single_color": tuple(bpy.context.scene.display.shading.single_color), - "bpy.context.scene.display.shading.show_shadows": bpy.context.scene.display.shading.show_shadows, - "bpy.context.scene.display.shading.shadow_intensity": bpy.context.scene.display.shading.shadow_intensity, - "bpy.context.scene.display.light_direction": tuple(bpy.context.scene.display.light_direction), - "bpy.context.scene.view_settings.use_curve_mapping": bpy.context.scene.view_settings.use_curve_mapping, - "space.overlay.show_wireframes": space.overlay.show_wireframes, - "space.overlay.wireframe_threshold": space.overlay.wireframe_threshold, - "space.overlay.show_floor": space.overlay.show_floor, - "space.overlay.show_axis_x": space.overlay.show_axis_x, - "space.overlay.show_axis_y": space.overlay.show_axis_y, - "space.overlay.show_axis_z": space.overlay.show_axis_z, - "space.overlay.show_object_origins": space.overlay.show_object_origins, - "space.overlay.show_relationship_lines": space.overlay.show_relationship_lines, - } + space = self.get_view_3d(context) # Do not remove. It is used later in eval + scene = context.scene + style = {} + for prop in RasterStyleProperty: + value = eval(prop.value) + if not isinstance(value, str): + try: + value = tuple(value) + except TypeError: + pass + style[prop.value] = value if self.index: index = int(self.index) else: - index = bpy.context.active_object.data.BIMCameraProperties.active_drawing_style_index - bpy.context.scene.DocProperties.drawing_styles[index].raster_style = json.dumps(style) + index = context.active_object.data.BIMCameraProperties.active_drawing_style_index + scene.DocProperties.drawing_styles[index].raster_style = json.dumps(style) return {"FINISHED"} - def get_view_3d(self): - for area in bpy.context.screen.areas: + def get_view_3d(self, context): + for area in context.screen.areas: if area.type != "VIEW_3D": continue for space in area.spaces: @@ -933,50 +918,25 @@ class ActivateDrawingStyle(bpy.types.Operator): self.drawing_style = scene.DocProperties.drawing_styles[ scene.camera.data.BIMCameraProperties.active_drawing_style_index ] - self.set_raster_style() - self.set_query() + self.set_raster_style(context) + self.set_query(context) return {"FINISHED"} - def set_raster_style(self): - space = self.get_view_3d() + def set_raster_style(self, context): + scene = context.scene # Do not remove. It is used in exec later + space = self.get_view_3d(context) # Do not remove. It is used in exec later style = json.loads(self.drawing_style.raster_style) - bpy.data.worlds[0].color = style["bpy.data.worlds[0].color"] - bpy.context.scene.render.engine = style["bpy.context.scene.render.engine"] - bpy.context.scene.render.film_transparent = style["bpy.context.scene.render.film_transparent"] - bpy.context.scene.display.shading.show_object_outline = style[ - "bpy.context.scene.display.shading.show_object_outline" - ] - bpy.context.scene.display.shading.show_cavity = style["bpy.context.scene.display.shading.show_cavity"] - bpy.context.scene.display.shading.cavity_type = style["bpy.context.scene.display.shading.cavity_type"] - bpy.context.scene.display.shading.curvature_ridge_factor = style[ - "bpy.context.scene.display.shading.curvature_ridge_factor" - ] - bpy.context.scene.display.shading.curvature_valley_factor = style[ - "bpy.context.scene.display.shading.curvature_valley_factor" - ] - bpy.context.scene.view_settings.view_transform = style["bpy.context.scene.view_settings.view_transform"] - bpy.context.scene.display.shading.light = style["bpy.context.scene.display.shading.light"] - bpy.context.scene.display.shading.color_type = style["bpy.context.scene.display.shading.color_type"] - bpy.context.scene.display.shading.single_color = style["bpy.context.scene.display.shading.single_color"] - bpy.context.scene.display.shading.show_shadows = style["bpy.context.scene.display.shading.show_shadows"] - bpy.context.scene.display.shading.shadow_intensity = style["bpy.context.scene.display.shading.shadow_intensity"] - bpy.context.scene.display.light_direction = style["bpy.context.scene.display.light_direction"] + for path, value in style.items(): + if isinstance(value, str): + exec(f"{path} = '{value}'") + else: + exec(f"{path} = {value}") - bpy.context.scene.view_settings.use_curve_mapping = style["bpy.context.scene.view_settings.use_curve_mapping"] - space.overlay.show_wireframes = style["space.overlay.show_wireframes"] - space.overlay.wireframe_threshold = style["space.overlay.wireframe_threshold"] - space.overlay.show_floor = style["space.overlay.show_floor"] - space.overlay.show_axis_x = style["space.overlay.show_axis_x"] - space.overlay.show_axis_y = style["space.overlay.show_axis_y"] - space.overlay.show_axis_z = style["space.overlay.show_axis_z"] - space.overlay.show_object_origins = style["space.overlay.show_object_origins"] - space.overlay.show_relationship_lines = style["space.overlay.show_relationship_lines"] - - def set_query(self): + def set_query(self, context): self.selector = ifcopenshell.util.selector.Selector() self.include_global_ids = [] self.exclude_global_ids = [] - for ifc_file in bpy.context.scene.DocProperties.ifc_files: + for ifc_file in context.scene.DocProperties.ifc_files: try: ifc = ifcopenshell.open(ifc_file.name) except: @@ -988,15 +948,15 @@ class ActivateDrawingStyle(bpy.types.Operator): results = self.selector.parse(ifc, self.drawing_style.exclude_query) self.exclude_global_ids.extend([e.GlobalId for e in results]) if self.drawing_style.include_query: - self.parse_filter_query("INCLUDE") + self.parse_filter_query("INCLUDE", context) if self.drawing_style.exclude_query: - self.parse_filter_query("EXCLUDE") + self.parse_filter_query("EXCLUDE", context) - def parse_filter_query(self, mode): + def parse_filter_query(self, mode, context): if mode == "INCLUDE": - objects = bpy.context.scene.objects + objects = context.scene.objects elif mode == "EXCLUDE": - objects = bpy.context.visible_objects + objects = context.visible_objects for obj in objects: if mode == "INCLUDE": obj.hide_viewport = False # Note: this breaks alt-H @@ -1011,8 +971,8 @@ class ActivateDrawingStyle(bpy.types.Operator): if global_id in self.exclude_global_ids: obj.hide_viewport = True # Note: this breaks alt-H - def get_view_3d(self): - for area in bpy.context.screen.areas: + def get_view_3d(self, context): + for area in context.screen.areas: if area.type != "VIEW_3D": continue for space in area.spaces: diff --git a/src/blenderbim/blenderbim/bim/module/drawing/prop.py b/src/blenderbim/blenderbim/bim/module/drawing/prop.py index b678920bab..210ad986e8 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/prop.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/prop.py @@ -21,6 +21,7 @@ import os import bpy import blenderbim.bim.module.drawing.annotation as annotation import blenderbim.bim.module.drawing.decoration as decoration +import enum from pathlib import Path from blenderbim.bim.prop import Attribute, StrProperty from bpy.types import PropertyGroup @@ -218,6 +219,33 @@ class DrawingStyle(PropertyGroup): attributes: CollectionProperty(name="Attributes", type=StrProperty) +class RasterStyleProperty(enum.Enum): + WORLD_COLOR = "bpy.data.worlds[0].color" + RENDER_ENGINE = "scene.render.engine" + RENDER_TRANSPARENT = "scene.render.film_transparent" + VIEW_TRANSFORM = "scene.view_settings.view_transform" + SHADING_SHOW_OBJECT_OUTLINE = "scene.display.shading.show_object_outline" + SHADING_SHOW_CAVITY = "scene.display.shading.show_cavity" + SHADING_CAVITY_TYPE = "scene.display.shading.cavity_type" + SHADING_CURVATURE_RIDGE_FACTOR = "scene.display.shading.curvature_ridge_factor" + SHADING_CURVATURE_VALLEY_FACTOR = "scene.display.shading.curvature_valley_factor" + SHADING_LIGHT = "scene.display.shading.light" + SHADING_COLOR_TYPE = "scene.display.shading.color_type" + SHADING_SINGLE_COLOR = "scene.display.shading.single_color" + SHADING_SHOW_SHADOWS = "scene.display.shading.show_shadows" + SHADING_SHADOW_INTENSITY = "scene.display.shading.shadow_intensity" + DISPLAY_LIGHT_DIRECTION = "scene.display.light_direction" + VIEW_USE_CURVE_MAPPING = "scene.view_settings.use_curve_mapping" + OVERLAY_SHOW_WIREFRAMES = "space.overlay.show_wireframes" + OVERLAY_WIREFRAME_THRESHOLD = "space.overlay.wireframe_threshold" + OVERLAY_SHOW_FLOOR = "space.overlay.show_floor" + OVERLAY_SHOW_AXIS_X = "space.overlay.show_axis_x" + OVERLAY_SHOW_AXIS_Y = "space.overlay.show_axis_y" + OVERLAY_SHOW_AXIS_Z = "space.overlay.show_axis_z" + OVERLAY_SHOW_OBJECT_ORIGINS = "space.overlay.show_object_origins" + OVERLAY_SHOW_RELATIONSHIP_LINES = "space.overlay.show_relationship_lines" + + class DocProperties(PropertyGroup): has_underlay: BoolProperty(name="Underlay", default=False) has_linework: BoolProperty(name="Linework", default=True)