Openings are now auto dissolved when authoring for easier editing.

This commit is contained in:
Dion Moult
2021-07-24 22:08:50 +10:00
parent 8c1eff5c26
commit 08d6c0a2d8
2 changed files with 30 additions and 1 deletions
@@ -1,7 +1,7 @@
import bpy import bpy
import ifcopenshell import ifcopenshell
import ifcopenshell.api import ifcopenshell.api
from blenderbim.bim.module.model import product, wall, slab, profile from blenderbim.bim.module.model import product, wall, slab, profile, opening
from blenderbim.bim.ifc import IfcStore from blenderbim.bim.ifc import IfcStore
from bpy.app.handlers import persistent from bpy.app.handlers import persistent
@@ -17,6 +17,8 @@ def load_post(*args):
product.regenerate_profile_usage, product.regenerate_profile_usage,
) )
IfcStore.add_element_listener(opening.element_listener)
IfcStore.add_element_listener(wall.element_listener) IfcStore.add_element_listener(wall.element_listener)
ifcopenshell.api.add_pre_listener( ifcopenshell.api.add_pre_listener(
"geometry.add_representation", "BlenderBIM.DumbWall.EnsureSolid", wall.ensure_solid "geometry.add_representation", "BlenderBIM.DumbWall.EnsureSolid", wall.ensure_solid
@@ -1,10 +1,37 @@
import bpy import bpy
import bmesh import bmesh
import blenderbim.bim.handler
from blenderbim.bim.ifc import IfcStore
from math import pi
from bpy.types import Operator from bpy.types import Operator
from bpy.props import FloatProperty from bpy.props import FloatProperty
from bpy_extras.object_utils import AddObjectHelper, object_data_add from bpy_extras.object_utils import AddObjectHelper, object_data_add
def element_listener(element, obj):
blenderbim.bim.handler.subscribe_to(obj, "mode", mode_callback)
def mode_callback(obj, data):
for obj in bpy.context.selected_objects + [bpy.context.active_object]:
if (
obj.mode != "EDIT"
or not obj.data
or not isinstance(obj.data, (bpy.types.Mesh, bpy.types.Curve, bpy.types.TextCurve))
or not obj.BIMObjectProperties.ifc_definition_id
or not bpy.context.scene.BIMProjectProperties.is_authoring
):
return
product = IfcStore.get_file().by_id(obj.BIMObjectProperties.ifc_definition_id)
if not product.is_a("IfcOpeningElement"):
return
IfcStore.edited_objs.add(obj)
bm = bmesh.from_edit_mesh(obj.data)
bmesh.ops.dissolve_limit(bm, angle_limit=pi / 180 * 1, verts=bm.verts, edges=bm.edges)
bmesh.update_edit_mesh(obj.data)
bm.free()
def add_object(self, context): def add_object(self, context):
bm = bmesh.new() bm = bmesh.new()
bmesh.ops.create_cube(bm, size=self.size) bmesh.ops.create_cube(bm, size=self.size)