mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-19 14:41:25 +00:00
Dumb slabs now are marked as parametric and inherit thickness from the slab type
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import bpy
|
import bpy
|
||||||
from . import operator, prop, ui, grid, stair, door, window, slab, opening, pie, workspace
|
from . import operator, prop, ui, grid, stair, door, window, opening, pie, workspace
|
||||||
|
|
||||||
classes = (
|
classes = (
|
||||||
operator.AddTypeInstance,
|
operator.AddTypeInstance,
|
||||||
@@ -16,7 +16,6 @@ classes = (
|
|||||||
stair.BIM_OT_add_object,
|
stair.BIM_OT_add_object,
|
||||||
door.BIM_OT_add_object,
|
door.BIM_OT_add_object,
|
||||||
window.BIM_OT_add_object,
|
window.BIM_OT_add_object,
|
||||||
slab.BIM_OT_add_object,
|
|
||||||
opening.BIM_OT_add_object,
|
opening.BIM_OT_add_object,
|
||||||
pie.OpenPieClass,
|
pie.OpenPieClass,
|
||||||
pie.PieUpdateContainer,
|
pie.PieUpdateContainer,
|
||||||
@@ -42,7 +41,6 @@ def register():
|
|||||||
bpy.types.VIEW3D_MT_mesh_add.append(stair.add_object_button)
|
bpy.types.VIEW3D_MT_mesh_add.append(stair.add_object_button)
|
||||||
bpy.types.VIEW3D_MT_mesh_add.append(door.add_object_button)
|
bpy.types.VIEW3D_MT_mesh_add.append(door.add_object_button)
|
||||||
bpy.types.VIEW3D_MT_mesh_add.append(window.add_object_button)
|
bpy.types.VIEW3D_MT_mesh_add.append(window.add_object_button)
|
||||||
bpy.types.VIEW3D_MT_mesh_add.append(slab.add_object_button)
|
|
||||||
bpy.types.VIEW3D_MT_mesh_add.append(opening.add_object_button)
|
bpy.types.VIEW3D_MT_mesh_add.append(opening.add_object_button)
|
||||||
wm = bpy.context.window_manager
|
wm = bpy.context.window_manager
|
||||||
if wm.keyconfigs.addon:
|
if wm.keyconfigs.addon:
|
||||||
@@ -59,7 +57,6 @@ def unregister():
|
|||||||
bpy.types.VIEW3D_MT_mesh_add.remove(stair.add_object_button)
|
bpy.types.VIEW3D_MT_mesh_add.remove(stair.add_object_button)
|
||||||
bpy.types.VIEW3D_MT_mesh_add.remove(door.add_object_button)
|
bpy.types.VIEW3D_MT_mesh_add.remove(door.add_object_button)
|
||||||
bpy.types.VIEW3D_MT_mesh_add.remove(window.add_object_button)
|
bpy.types.VIEW3D_MT_mesh_add.remove(window.add_object_button)
|
||||||
bpy.types.VIEW3D_MT_mesh_add.remove(slab.add_object_button)
|
|
||||||
bpy.types.VIEW3D_MT_mesh_add.remove(opening.add_object_button)
|
bpy.types.VIEW3D_MT_mesh_add.remove(opening.add_object_button)
|
||||||
wm = bpy.context.window_manager
|
wm = bpy.context.window_manager
|
||||||
kc = wm.keyconfigs.addon
|
kc = wm.keyconfigs.addon
|
||||||
|
|||||||
@@ -30,6 +30,10 @@ class AddTypeInstance(bpy.types.Operator):
|
|||||||
obj = DumbWallGenerator(self.file.by_id(int(relating_type))).generate()
|
obj = DumbWallGenerator(self.file.by_id(int(relating_type))).generate()
|
||||||
if obj:
|
if obj:
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
elif ifc_class == "IfcSlabType":
|
||||||
|
obj = DumbSlabGenerator(self.file.by_id(int(relating_type))).generate()
|
||||||
|
if obj:
|
||||||
|
return {"FINISHED"}
|
||||||
# A cube
|
# A cube
|
||||||
verts = [
|
verts = [
|
||||||
Vector((-1, -1, -1)),
|
Vector((-1, -1, -1)),
|
||||||
@@ -735,3 +739,67 @@ class DumbWallGenerator:
|
|||||||
MaterialData.load(self.file)
|
MaterialData.load(self.file)
|
||||||
obj.select_set(True)
|
obj.select_set(True)
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
|
||||||
|
class DumbSlabGenerator:
|
||||||
|
def __init__(self, relating_type):
|
||||||
|
self.relating_type = relating_type
|
||||||
|
|
||||||
|
def generate(self):
|
||||||
|
self.file = IfcStore.get_file()
|
||||||
|
unit_scale = ifcopenshell.util.unit.calculate_unit_scale(IfcStore.get_file())
|
||||||
|
thicknesses = []
|
||||||
|
for rel in self.relating_type.HasAssociations:
|
||||||
|
if rel.is_a("IfcRelAssociatesMaterial"):
|
||||||
|
material = rel.RelatingMaterial
|
||||||
|
if material.is_a("IfcMaterialLayerSet"):
|
||||||
|
thicknesses = [l.LayerThickness for l in material.MaterialLayers]
|
||||||
|
break
|
||||||
|
if not thicknesses:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.collection = bpy.context.view_layer.active_layer_collection.collection
|
||||||
|
self.collection_obj = bpy.data.objects.get(self.collection.name)
|
||||||
|
self.depth = sum(thicknesses) * unit_scale
|
||||||
|
self.width = 3
|
||||||
|
self.length = 3
|
||||||
|
self.rotation = 0
|
||||||
|
self.location = Vector((0, 0, 0))
|
||||||
|
return self.derive_from_cursor()
|
||||||
|
|
||||||
|
def derive_from_cursor(self):
|
||||||
|
self.location = bpy.context.scene.cursor.location
|
||||||
|
return self.create_slab()
|
||||||
|
|
||||||
|
def create_slab(self):
|
||||||
|
verts = [
|
||||||
|
Vector((0, 0, 0)),
|
||||||
|
Vector((0, self.width, 0)),
|
||||||
|
Vector((self.length, self.width, 0)),
|
||||||
|
Vector((self.length, 0, 0)),
|
||||||
|
]
|
||||||
|
edges = []
|
||||||
|
faces = [[0, 3, 2, 1]]
|
||||||
|
|
||||||
|
mesh = bpy.data.meshes.new(name="Dumb Slab")
|
||||||
|
mesh.from_pydata(verts, edges, faces)
|
||||||
|
obj = bpy.data.objects.new("Slab", mesh)
|
||||||
|
modifier = obj.modifiers.new("Slab Depth", "SOLIDIFY")
|
||||||
|
modifier.use_even_offset = True
|
||||||
|
modifier.offset = 1
|
||||||
|
modifier.thickness = self.depth
|
||||||
|
obj.name = "Slab"
|
||||||
|
if self.collection_obj and self.collection_obj.BIMObjectProperties.ifc_definition_id:
|
||||||
|
obj.location[2] = self.collection_obj.location[2] - self.depth
|
||||||
|
else:
|
||||||
|
obj.location[2] -= self.depth
|
||||||
|
self.collection.objects.link(obj)
|
||||||
|
bpy.ops.bim.assign_class(obj=obj.name, ifc_class="IfcSlab", predefined_type="FLOOR")
|
||||||
|
bpy.ops.bim.assign_type(relating_type=self.relating_type.id(), related_object=obj.name)
|
||||||
|
element = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id)
|
||||||
|
pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="EPset_Parametric")
|
||||||
|
ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Engine": "BlenderBIM.DumbSlab"})
|
||||||
|
ifcopenshell.api.run("material.assign_material", self.file, product=element, type="IfcMaterialLayerSetUsage")
|
||||||
|
MaterialData.load(self.file)
|
||||||
|
obj.select_set(True)
|
||||||
|
return obj
|
||||||
|
|||||||
@@ -1,46 +0,0 @@
|
|||||||
import bpy
|
|
||||||
from bpy.types import Operator
|
|
||||||
from bpy.props import FloatProperty
|
|
||||||
from mathutils import Vector
|
|
||||||
from blenderbim.bim.ifc import IfcStore
|
|
||||||
|
|
||||||
|
|
||||||
def add_object(self, context):
|
|
||||||
verts = [
|
|
||||||
Vector((0, 0, 0)),
|
|
||||||
Vector((0, self.width, 0)),
|
|
||||||
Vector((self.length, self.width, 0)),
|
|
||||||
Vector((self.length, 0, 0)),
|
|
||||||
]
|
|
||||||
edges = []
|
|
||||||
faces = [[0, 1, 2, 3]]
|
|
||||||
|
|
||||||
mesh = bpy.data.meshes.new(name="Dumb Slab")
|
|
||||||
mesh.from_pydata(verts, edges, faces)
|
|
||||||
obj = bpy.data.objects.new("Slab", mesh)
|
|
||||||
modifier = obj.modifiers.new("Slab Depth", "SOLIDIFY")
|
|
||||||
modifier.use_even_offset = True
|
|
||||||
modifier.offset = 1
|
|
||||||
modifier.thickness = self.depth
|
|
||||||
obj.name = "Slab"
|
|
||||||
context.view_layer.active_layer_collection.collection.objects.link(obj)
|
|
||||||
if IfcStore.get_file():
|
|
||||||
bpy.ops.bim.assign_class(obj=obj.name, ifc_class="IfcSlab", predefined_type="FLOOR")
|
|
||||||
obj.location = context.scene.cursor.location
|
|
||||||
|
|
||||||
|
|
||||||
class BIM_OT_add_object(Operator):
|
|
||||||
bl_idname = "mesh.add_slab"
|
|
||||||
bl_label = "Dumb Slab"
|
|
||||||
|
|
||||||
length: FloatProperty(name="Length", default=2)
|
|
||||||
width: FloatProperty(name="Width", default=2)
|
|
||||||
depth: FloatProperty(name="Depth", default=0.2)
|
|
||||||
|
|
||||||
def execute(self, context):
|
|
||||||
add_object(self, context)
|
|
||||||
return {"FINISHED"}
|
|
||||||
|
|
||||||
|
|
||||||
def add_object_button(self, context):
|
|
||||||
self.layout.operator(BIM_OT_add_object.bl_idname, icon="PLUGIN")
|
|
||||||
@@ -60,8 +60,8 @@ def remove_pre_listener(callback, usecase_path=""):
|
|||||||
for fun in callbacks:
|
for fun in callbacks:
|
||||||
if fun == callback:
|
if fun == callback:
|
||||||
pre_listeners[listener_key].remove(callback)
|
pre_listeners[listener_key].remove(callback)
|
||||||
|
|
||||||
|
|
||||||
def remove_post_listener(callback, usecase_path=""):
|
def remove_post_listener(callback, usecase_path=""):
|
||||||
for listener_key, callbacks in post_listeners.items():
|
for listener_key, callbacks in post_listeners.items():
|
||||||
if not listener_key.endswith(usecase_path):
|
if not listener_key.endswith(usecase_path):
|
||||||
@@ -69,8 +69,8 @@ def remove_post_listener(callback, usecase_path=""):
|
|||||||
for fun in callbacks:
|
for fun in callbacks:
|
||||||
if fun == callback:
|
if fun == callback:
|
||||||
post_listeners[listener_key].remove(callback)
|
post_listeners[listener_key].remove(callback)
|
||||||
|
|
||||||
|
|
||||||
def remove_all_listeners():
|
def remove_all_listeners():
|
||||||
registered_ifcs.clear()
|
registered_ifcs.clear()
|
||||||
pre_listeners.clear()
|
pre_listeners.clear()
|
||||||
|
|||||||
Reference in New Issue
Block a user