New operator that creates a ceiling from cursor position in covering tool

This commit is contained in:
Massimo Fabbro
2023-10-22 22:12:56 +02:00
committed by Massimo Fabbro
parent 5cf1dd4249
commit 74132dcd49
8 changed files with 121 additions and 30 deletions
@@ -30,12 +30,10 @@ from bpy.props import (
FloatVectorProperty, FloatVectorProperty,
CollectionProperty, CollectionProperty,
) )
import blenderbim.tool as tool #import blenderbim.tool as tool
import blenderbim.core.geometry #import blenderbim.core.geometry
import ifcopenshell #import ifcopenshell
class BIMCoveringProperties(PropertyGroup): class BIMCoveringProperties(PropertyGroup):
pass ceiling_height: bpy.props.FloatProperty(name="ceiling_height", default=2.7, subtype="DISTANCE", description="Ceiling height")
# depth: bpy.props.FloatProperty(name="Depth", default=0.1, subtype="DISTANCE", description="Flooring depth")
depth: bpy.props.FloatProperty(name="ceiling_height", default=2.7, subtype="DISTANCE", description="Ceiling height")
@@ -92,6 +92,8 @@ class CoveringToolUI:
def draw_default_interface(cls): def draw_default_interface(cls):
row = cls.layout.row(align=True) row = cls.layout.row(align=True)
row.prop(data=cls.props, property="rl3", text="RL") row.prop(data=cls.props, property="rl3", text="RL")
row = cls.layout.row(align=True)
row.prop(data=cls.covering_props, property="ceiling_height", text="Ceiling Height")
if AuthoringData.data["ifc_classes"]: if AuthoringData.data["ifc_classes"]:
active_obj = bpy.context.active_object active_obj = bpy.context.active_object
element = tool.Ifc.get_entity(active_obj) element = tool.Ifc.get_entity(active_obj)
@@ -101,17 +103,26 @@ class CoveringToolUI:
relating_type_id = int(cls.props.relating_type_id) relating_type_id = int(cls.props.relating_type_id)
type_material_usage = ifcopenshell.util.element.get_material(tool.Ifc.get().by_id(relating_type_id)).is_a() type_material_usage = ifcopenshell.util.element.get_material(tool.Ifc.get().by_id(relating_type_id)).is_a()
if (AuthoringData.data["predefined_type"] == "FLOORING" and # PLEASE KEEP COMMENTS AS A REMINDER
type_material_usage == "IfcMaterialLayerSet" and # elif element and bpy.context.selected_objects and element.is_a("IfcSpace"):
# op. = row.operator("bim.add_istance_flooring_from_spaces"):
if (type_material_usage == "IfcMaterialLayerSet" and
not bpy.context.selected_objects): not bpy.context.selected_objects):
row = cls.layout.row(align=True) row = cls.layout.row(align=True)
row.label(text="", icon="EVENT_SHIFT") row.label(text="", icon="EVENT_SHIFT")
row.label(text="", icon="EVENT_A") row.label(text="", icon="EVENT_A")
# PLEASE KEEP COMMENTS AS A REMINDER
# elif element and bpy.context.selected_objects and element.is_a("IfcSpace"):
# op. = row.operator("bim.add_istance_flooring_from_spaces"):
if tool.Ifc.get_entity(collection_obj): if tool.Ifc.get_entity(collection_obj):
op = row.operator("bim.add_instance_flooring_covering_from_cursor") if AuthoringData.data["predefined_type"] == "FLOORING":
op = row.operator("bim.add_instance_flooring_covering_from_cursor")
elif AuthoringData.data["predefined_type"] == "CEILING":
op = row.operator("bim.add_instance_ceiling_covering_from_cursor")
else:
op = row.operator("bim.add_constr_type_instance", text="Add")
op.from_invoke = True
if cls.props.relating_type_id.isnumeric():
op.relating_type_id = int(cls.props.relating_type_id)
else: else:
op = row.operator("bim.add_constr_type_instance", text="Add") op = row.operator("bim.add_constr_type_instance", text="Add")
op.from_invoke = True op.from_invoke = True
@@ -136,7 +147,7 @@ class CoveringToolUI:
row = cls.layout.row(align=True) row = cls.layout.row(align=True)
row.label(text="", icon="EVENT_SHIFT") row.label(text="", icon="EVENT_SHIFT")
row.label(text="", icon="EVENT_G") row.label(text="", icon="EVENT_G")
op = row.operator("bim.regen_selected_flooring_object") op = row.operator("bim.regen_selected_covering_object")
@@ -230,13 +241,22 @@ class Hotkey(bpy.types.Operator, Operator):
bpy.ops.bim.add_instance_flooring_covering_from_cursor() bpy.ops.bim.add_instance_flooring_covering_from_cursor()
else: else:
bpy.ops.bim.add_constr_type_instance() bpy.ops.bim.add_constr_type_instance()
elif AuthoringData.data["predefined_type"] == "CEILING":
if element and bpy.context.selected_objects and element.is_a("IfcWall"):
pass
elif tool.Ifc.get_entity(collection_obj):
bpy.ops.bim.add_instance_ceiling_covering_from_cursor()
else:
bpy.ops.bim.add_constr_type_instance()
else: else:
bpy.ops.bim.add_constr_type_instance() bpy.ops.bim.add_constr_type_instance()
def hotkey_S_G(self): def hotkey_S_G(self):
active_obj = bpy.context.active_object active_obj = bpy.context.active_object
element = tool.Ifc.get_entity(active_obj) element = tool.Ifc.get_entity(active_obj)
if (element and
bpy.context.selected_objects and
element.is_a("IfcCovering") and
AuthoringData.data["active_material_usage"] == "LAYER3"):
bpy.ops.bim.regen_selected_covering_object()
if AuthoringData.data["predefined_type"] == "FLOORING":
if element and bpy.context.selected_objects and element.is_a("IfcCovering"):
bpy.ops.bim.regen_selected_flooring_object()
@@ -109,7 +109,8 @@ classes = (
space.GenerateSpacesFromWalls, space.GenerateSpacesFromWalls,
covering.AddInstanceFlooringCoveringsFromWalls, covering.AddInstanceFlooringCoveringsFromWalls,
covering.AddInstanceFlooringCoveringFromCursor, covering.AddInstanceFlooringCoveringFromCursor,
covering.RegenSelectedFlooringObject, covering.AddInstanceCeilingCoveringFromCursor,
covering.RegenSelectedCoveringObject,
space.ToggleSpaceVisibility, space.ToggleSpaceVisibility,
mep.FitFlowSegments, mep.FitFlowSegments,
mep.RegenerateDistributionElement, mep.RegenerateDistributionElement,
@@ -51,11 +51,40 @@ class AddInstanceFlooringCoveringFromCursor(bpy.types.Operator, tool.Ifc.Operato
core.add_instance_flooring_covering_from_cursor(tool.Ifc, tool.Spatial, tool.Model, tool.Type, tool.Geometry) core.add_instance_flooring_covering_from_cursor(tool.Ifc, tool.Spatial, tool.Model, tool.Type, tool.Geometry)
class RegenSelectedFlooringObject(bpy.types.Operator, tool.Ifc.Operator): class AddInstanceCeilingCoveringFromCursor(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.regen_selected_flooring_object" bl_idname = "bim.add_instance_ceiling_covering_from_cursor"
bl_label = "Regen Flooring" bl_label = "Add Ceiling From Cursor"
bl_options = {"REGISTER"} bl_options = {"REGISTER"}
bl_description = "Regen selected flooring object" bl_description = "Add a typed instance ceiling covering from cursor position. Move the cursor position into the desired position, select the right space collection and run the operator"
@classmethod
def poll(cls, context):
collection = context.view_layer.active_layer_collection.collection
collection_obj = collection.BIMCollectionProperties.obj
return tool.Ifc.get_entity(collection_obj)
def _execute(self, context):
def msg(self, context):
self.layout.label(text="NO ACTIVE STOREY")
collection = context.view_layer.active_layer_collection.collection
collection_obj = collection.BIMCollectionProperties.obj
if not collection_obj:
bpy.context.window_manager.popup_menu(msg, title="Error", icon="ERROR")
return
spatial_element = tool.Ifc.get_entity(collection_obj)
if not spatial_element:
bpy.context.window_manager.popup_menu(msg, title="Error", icon="ERROR")
return
core.add_instance_ceiling_covering_from_cursor(tool.Ifc, tool.Spatial, tool.Model, tool.Type, tool.Geometry, tool.Covering)
class RegenSelectedCoveringObject(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.regen_selected_covering_object"
bl_label = "Regen"
bl_options = {"REGISTER"}
bl_description = "Regen selected covering object"
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
@@ -74,7 +103,7 @@ class RegenSelectedFlooringObject(bpy.types.Operator, tool.Ifc.Operator):
bpy.context.window_manager.popup_menu(msg, title="Error", icon="ERROR") bpy.context.window_manager.popup_menu(msg, title="Error", icon="ERROR")
return return
core.regen_selected_flooring_object(tool.Ifc, tool.Spatial, tool.Model, tool.Type, tool.Geometry) core.regen_selected_covering_object(tool.Ifc, tool.Spatial, tool.Model, tool.Type, tool.Geometry)
class AddInstanceFlooringCoveringsFromWalls(bpy.types.Operator, tool.Ifc.Operator): class AddInstanceFlooringCoveringsFromWalls(bpy.types.Operator, tool.Ifc.Operator):
+43 -8
View File
@@ -44,13 +44,6 @@ def add_instance_flooring_covering_from_cursor(ifc, spatial, model, Type, geomet
name = "Covering" name = "Covering"
mesh = spatial.get_named_mesh_from_bmesh(name = name, bmesh = bm) mesh = spatial.get_named_mesh_from_bmesh(name = name, bmesh = bm)
# spatial.edit_active_space_obj_from_mesh(mesh)
# else:
# if relating_type:
# name = model.generate_occurrence_name(relating_type, "IfcCovering")
# else:
obj = spatial.get_named_obj_from_mesh(name, mesh) obj = spatial.get_named_obj_from_mesh(name, mesh)
spatial.set_obj_origin_to_cursor_position(obj) spatial.set_obj_origin_to_cursor_position(obj)
@@ -63,7 +56,49 @@ def add_instance_flooring_covering_from_cursor(ifc, spatial, model, Type, geomet
body = spatial.get_body_representation(obj) body = spatial.get_body_representation(obj)
spatial.regen_obj_representation(ifc, geometry, obj, body) spatial.regen_obj_representation(ifc, geometry, obj, body)
def regen_selected_flooring_object(ifc, spatial, model, Type, geometry): def add_instance_ceiling_covering_from_cursor(ifc, spatial, model, Type, geometry, covering):
active_obj = spatial.get_active_obj()
selected_objects = spatial.get_selected_objects()
element = None
relating_type_id = spatial.get_relating_type_id()
relating_type = None
if relating_type_id:
relating_type = ifc.get().by_id(int(relating_type_id))
if not relating_type.is_a("IfcCoveringType"):
relating_type = None
if selected_objects and active_obj:
x, y, z, h, mat = spatial.get_x_y_z_h_mat_from_active_obj(active_obj)
element = ifc.get_entity(active_obj)
else:
x, y, z, h, mat = spatial.get_x_y_z_h_mat_from_cursor()
z = covering.get_z_from_ceiling_height()
space_polygon = spatial.get_space_polygon_from_context_visible_objects(x, y)
if not space_polygon:
return
bm = spatial.get_bmesh_from_polygon(space_polygon, h=0)
name = "Covering"
mesh = spatial.get_named_mesh_from_bmesh(name = name, bmesh = bm)
obj = spatial.get_named_obj_from_mesh(name, mesh)
spatial.set_obj_origin_to_cursor_position(obj)
spatial.traslate_obj_to_z_location(obj, z)
spatial.link_obj_to_active_collection(obj)
points = spatial.get_2d_vertices_from_obj(obj)
spatial.assign_type_to_obj(obj)
spatial.assign_swept_area_outer_curve_from_2d_vertices(obj, vertices = points)
body = spatial.get_body_representation(obj)
spatial.regen_obj_representation(ifc, geometry, obj, body)
def regen_selected_covering_object(ifc, spatial, model, Type, geometry):
active_obj = spatial.get_active_obj() active_obj = spatial.get_active_obj()
selected_objects = spatial.get_selected_objects() selected_objects = spatial.get_selected_objects()
+3
View File
@@ -851,6 +851,9 @@ class Spatial:
def regen_obj_representation(cls, ifc, geometry, obj, body): pass def regen_obj_representation(cls, ifc, geometry, obj, body): pass
def toggle_spaces_visibility_wired_and_textured(cls, spaces): pass def toggle_spaces_visibility_wired_and_textured(cls, spaces): pass
@interface
class Covering:
def get_z_from_ceiling_height(cls): pass
@interface @interface
class Structural: class Structural:
@@ -47,6 +47,7 @@ from blenderbim.tool.resource import Resource
from blenderbim.tool.root import Root from blenderbim.tool.root import Root
from blenderbim.tool.sequence import Sequence from blenderbim.tool.sequence import Sequence
from blenderbim.tool.spatial import Spatial from blenderbim.tool.spatial import Spatial
from blenderbim.tool.covering import Covering
from blenderbim.tool.structural import Structural from blenderbim.tool.structural import Structural
from blenderbim.tool.style import Style from blenderbim.tool.style import Style
from blenderbim.tool.surveyor import Surveyor from blenderbim.tool.surveyor import Surveyor
@@ -32,6 +32,10 @@ from shapely import Polygon, MultiPolygon
class Covering(blenderbim.core.tool.Covering): class Covering(blenderbim.core.tool.Covering):
@classmethod @classmethod
def get_z_from_ceiling_height(cls):
props = bpy.context.scene.BIMCoveringProperties
return props.ceiling_height
# def toggle_spaces_visibility_wired_and_textured(cls, spaces): # def toggle_spaces_visibility_wired_and_textured(cls, spaces):
# first_obj = tool.Ifc.get_object(spaces[0]) # first_obj = tool.Ifc.get_object(spaces[0])
# if bpy.data.objects[first_obj.name].display_type == "TEXTURED": # if bpy.data.objects[first_obj.name].display_type == "TEXTURED":