mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-25 00:09:59 +00:00
Fix #2769. Bug where parametric UI was hardcoded to only work for walls. Now works on any generic parametric vertical layers.
This commit is contained in:
@@ -176,12 +176,7 @@ class AuthoringData:
|
|||||||
def active_material_usage(cls):
|
def active_material_usage(cls):
|
||||||
element = tool.Ifc.get_entity(bpy.context.active_object)
|
element = tool.Ifc.get_entity(bpy.context.active_object)
|
||||||
if element:
|
if element:
|
||||||
material = ifcopenshell.util.element.get_material(element, should_inherit=False)
|
return tool.Model.get_usage_type(element)
|
||||||
if material:
|
|
||||||
if material.is_a("IfcMaterialLayerSetUsage"):
|
|
||||||
return f"LAYER{material.LayerSetDirection[-1]}"
|
|
||||||
elif material.is_a("IfcMaterialProfileSetUsage"):
|
|
||||||
return "PROFILE"
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def ifc_classes(cls):
|
def ifc_classes(cls):
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ class JoinWall(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
if targets:
|
if targets:
|
||||||
target = tool.Ifc.get_object(targets[0])
|
target = tool.Ifc.get_object(targets[0])
|
||||||
for element in elements:
|
for element in elements:
|
||||||
if element.is_a("IfcWall"):
|
if tool.Model.get_usage_type(element) == "LAYER2":
|
||||||
joiner.join_Z(tool.Ifc.get_object(element), target)
|
joiner.join_Z(tool.Ifc.get_object(element), target)
|
||||||
else:
|
else:
|
||||||
for obj in selected_objs:
|
for obj in selected_objs:
|
||||||
@@ -232,7 +232,7 @@ class ChangeExtrusionDepth(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
return context.selected_objects
|
return context.selected_objects
|
||||||
|
|
||||||
def _execute(self, context):
|
def _execute(self, context):
|
||||||
wall_objs = []
|
layer2_objs = []
|
||||||
for obj in context.selected_objects:
|
for obj in context.selected_objects:
|
||||||
element = tool.Ifc.get_entity(obj)
|
element = tool.Ifc.get_entity(obj)
|
||||||
if not element:
|
if not element:
|
||||||
@@ -246,7 +246,7 @@ class ChangeExtrusionDepth(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
x, y, z = extrusion.ExtrudedDirection.DirectionRatios
|
x, y, z = extrusion.ExtrudedDirection.DirectionRatios
|
||||||
x_angle = Vector((0, 1)).angle_signed(Vector((y, z)))
|
x_angle = Vector((0, 1)).angle_signed(Vector((y, z)))
|
||||||
extrusion.Depth = self.depth * (1 / cos(x_angle))
|
extrusion.Depth = self.depth * (1 / cos(x_angle))
|
||||||
if element.is_a("IfcWall"):
|
if tool.Model.get_usage_type(element) == "LAYER2":
|
||||||
for rel in element.ConnectedFrom:
|
for rel in element.ConnectedFrom:
|
||||||
if rel.is_a() == "IfcRelConnectsElements":
|
if rel.is_a() == "IfcRelConnectsElements":
|
||||||
ifcopenshell.api.run(
|
ifcopenshell.api.run(
|
||||||
@@ -255,9 +255,9 @@ class ChangeExtrusionDepth(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
relating_element=rel.RelatingElement,
|
relating_element=rel.RelatingElement,
|
||||||
related_element=element,
|
related_element=element,
|
||||||
)
|
)
|
||||||
wall_objs.append(obj)
|
layer2_objs.append(obj)
|
||||||
if wall_objs:
|
if layer2_objs:
|
||||||
DumbWallRecalculator().recalculate(wall_objs)
|
DumbWallRecalculator().recalculate(layer2_objs)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
@@ -272,7 +272,7 @@ class ChangeExtrusionXAngle(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
return context.selected_objects
|
return context.selected_objects
|
||||||
|
|
||||||
def _execute(self, context):
|
def _execute(self, context):
|
||||||
wall_objs = []
|
layer2_objs = []
|
||||||
other_objs = []
|
other_objs = []
|
||||||
x_angle = radians(self.x_angle)
|
x_angle = radians(self.x_angle)
|
||||||
unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
|
unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
|
||||||
@@ -291,8 +291,8 @@ class ChangeExtrusionXAngle(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
perpendicular_depth = extrusion.Depth / (1 / cos(existing_x_angle))
|
perpendicular_depth = extrusion.Depth / (1 / cos(existing_x_angle))
|
||||||
extrusion.Depth = perpendicular_depth * (1 / cos(x_angle))
|
extrusion.Depth = perpendicular_depth * (1 / cos(x_angle))
|
||||||
extrusion.ExtrudedDirection.DirectionRatios = (0.0, sin(x_angle), cos(x_angle))
|
extrusion.ExtrudedDirection.DirectionRatios = (0.0, sin(x_angle), cos(x_angle))
|
||||||
if element.is_a("IfcWall"):
|
if tool.Model.get_usage_type(element) == "LAYER2":
|
||||||
wall_objs.append(obj)
|
layer2_objs.append(obj)
|
||||||
else:
|
else:
|
||||||
blenderbim.core.geometry.switch_representation(
|
blenderbim.core.geometry.switch_representation(
|
||||||
tool.Ifc,
|
tool.Ifc,
|
||||||
@@ -309,8 +309,8 @@ class ChangeExtrusionXAngle(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
new_matrix = euler.to_matrix().to_4x4()
|
new_matrix = euler.to_matrix().to_4x4()
|
||||||
new_matrix.col[3] = obj.matrix_world.col[3]
|
new_matrix.col[3] = obj.matrix_world.col[3]
|
||||||
obj.matrix_world = new_matrix
|
obj.matrix_world = new_matrix
|
||||||
if wall_objs:
|
if layer2_objs:
|
||||||
DumbWallRecalculator().recalculate(wall_objs)
|
DumbWallRecalculator().recalculate(layer2_objs)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
@@ -464,7 +464,7 @@ class DumbWallRecalculator:
|
|||||||
queue.add((rel.RelatingElement, tool.Ifc.get_object(rel.RelatingElement)))
|
queue.add((rel.RelatingElement, tool.Ifc.get_object(rel.RelatingElement)))
|
||||||
joiner = DumbWallJoiner()
|
joiner = DumbWallJoiner()
|
||||||
for element, wall in queue:
|
for element, wall in queue:
|
||||||
if element.is_a("IfcWall") and wall:
|
if tool.Model.get_usage_type(element) == "LAYER2" and wall:
|
||||||
joiner.recreate_wall(element, wall)
|
joiner.recreate_wall(element, wall)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -330,6 +330,15 @@ class Model(blenderbim.core.tool.Model):
|
|||||||
items.append(item.FirstOperand)
|
items.append(item.FirstOperand)
|
||||||
return booleans
|
return booleans
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_usage_type(cls, element):
|
||||||
|
material = ifcopenshell.util.element.get_material(element, should_inherit=False)
|
||||||
|
if material:
|
||||||
|
if material.is_a("IfcMaterialLayerSetUsage"):
|
||||||
|
return f"LAYER{material.LayerSetDirection[-1]}"
|
||||||
|
elif material.is_a("IfcMaterialProfileSetUsage"):
|
||||||
|
return "PROFILE"
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_wall_axis(cls, obj, layers=None):
|
def get_wall_axis(cls, obj, layers=None):
|
||||||
x_values = [v[0] for v in obj.bound_box]
|
x_values = [v[0] for v in obj.bound_box]
|
||||||
|
|||||||
Reference in New Issue
Block a user