Refactor how offset and direction sense interact for wall and slabs.

This commit is contained in:
Bruno Perdigão
2025-01-25 16:05:04 -03:00
parent c49ca699eb
commit 2b1a59a4f8
5 changed files with 15 additions and 11 deletions
@@ -78,7 +78,6 @@ def get_wall_preview_data(context, relating_type):
offset_type = model_props.offset_type_vertical offset_type = model_props.offset_type_vertical
unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
offset = model_props.offset * unit_scale offset = model_props.offset * unit_scale
offset *= direction
height = float(model_props.extrusion_depth) height = float(model_props.extrusion_depth)
rl = float(model_props.rl1) rl = float(model_props.rl1)
@@ -206,7 +205,6 @@ def get_slab_preview_data(context, relating_type):
offset_type = model_props.offset_type_horizontal offset_type = model_props.offset_type_horizontal
unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
offset = model_props.offset * unit_scale offset = model_props.offset * unit_scale
offset *= direction
data = {} data = {}
data["verts"] = [] data["verts"] = []
@@ -915,10 +913,13 @@ class PolylineOperator:
def set_offset(self, context: bpy.types.Context, relating_type: ifcopenshell.entity_instance) -> None: def set_offset(self, context: bpy.types.Context, relating_type: ifcopenshell.entity_instance) -> None:
props = bpy.context.scene.BIMModelProperties props = bpy.context.scene.BIMModelProperties
direction_sense = props.direction_sense
if tool.Model.get_usage_type(relating_type) == "LAYER2": if tool.Model.get_usage_type(relating_type) == "LAYER2":
offset_type = "offset_type_vertical" offset_type = "offset_type_vertical"
direction = 1 if direction_sense == "POSITIVE" else -1
elif tool.Model.get_usage_type(relating_type) == "LAYER3": elif tool.Model.get_usage_type(relating_type) == "LAYER3":
offset_type = "offset_type_horizontal" offset_type = "offset_type_horizontal"
direction = 1
else: else:
return return
@@ -926,9 +927,9 @@ class PolylineOperator:
thickness = layers["thickness"] thickness = layers["thickness"]
self.offset = 0 self.offset = 0
if getattr(props, offset_type) == "CENTER": if getattr(props, offset_type) == "CENTER":
self.offset = -thickness / 2 self.offset = (-thickness / 2) * direction
elif getattr(props, offset_type) in {"INTERIOR", "TOP"}: elif getattr(props, offset_type) in {"INTERIOR", "TOP"}:
self.offset = -thickness self.offset = -thickness * direction
props.offset = self.offset / self.unit_scale props.offset = self.offset / self.unit_scale
tool.Blender.update_viewport() tool.Blender.update_viewport()
@@ -306,7 +306,6 @@ class DumbSlabPlaner:
elif layer_params["direction_sense"] == "NEGATIVE": elif layer_params["direction_sense"] == "NEGATIVE":
y = -abs(y) if existing_x_angle > 0 else abs(y) y = -abs(y) if existing_x_angle > 0 else abs(y)
z = -abs(z) z = -abs(z)
offset_vector = -offset_vector
extrusion.ExtrudedDirection.DirectionRatios = (x, y, z) extrusion.ExtrudedDirection.DirectionRatios = (x, y, z)
extrusion.Depth = thickness extrusion.Depth = thickness
+3 -1
View File
@@ -263,7 +263,6 @@ class ChangeExtrusionXAngle(bpy.types.Operator, tool.Ifc.Operator):
if layer_params["direction_sense"] == "NEGATIVE": if layer_params["direction_sense"] == "NEGATIVE":
y = -abs(y) if x_angle > 0 else abs(y) y = -abs(y) if x_angle > 0 else abs(y)
z = -abs(z) z = -abs(z)
offset_vector = -offset_vector
extrusion.ExtrudedDirection.DirectionRatios = (x, y, z) extrusion.ExtrudedDirection.DirectionRatios = (x, y, z)
if offset != 0.0 and not extrusion.Position: if offset != 0.0 and not extrusion.Position:
@@ -418,6 +417,7 @@ class DrawPolylineWall(bpy.types.Operator, PolylineOperator):
context.scene.BIMModelProperties.direction_sense = ( context.scene.BIMModelProperties.direction_sense = (
"NEGATIVE" if direction_sense == "POSITIVE" else "POSITIVE" "NEGATIVE" if direction_sense == "POSITIVE" else "POSITIVE"
) )
self.set_offset(context, self.relating_type)
props = bpy.context.scene.BIMModelProperties props = bpy.context.scene.BIMModelProperties
if event.value == "RELEASE" and event.type == "O": if event.value == "RELEASE" and event.type == "O":
@@ -828,6 +828,7 @@ class DumbWallGenerator:
tool.Ifc.get(), tool.Ifc.get(),
context=self.body_context, context=self.body_context,
thickness=self.layers["thickness"], thickness=self.layers["thickness"],
direction_sense=self.layers["direction_sense"],
offset=self.layers["offset"], offset=self.layers["offset"],
length=self.length, length=self.length,
height=self.height, height=self.height,
@@ -1391,6 +1392,7 @@ class DumbWallJoiner:
length=length, length=length,
height=height, height=height,
x_angle=x_angle, x_angle=x_angle,
direction_sense=layers["direction_sense"],
offset=layers["offset"], offset=layers["offset"],
thickness=layers["thickness"], thickness=layers["thickness"],
clippings=self.clippings, clippings=self.clippings,
+3 -5
View File
@@ -536,9 +536,6 @@ class Model(bonsai.core.tool.Model):
material = material.ForLayerSet material = material.ForLayerSet
if material.is_a("IfcMaterialLayerSet"): if material.is_a("IfcMaterialLayerSet"):
thickness = sum([l.LayerThickness for l in material.MaterialLayers]) * unit_scale thickness = sum([l.LayerThickness for l in material.MaterialLayers]) * unit_scale
if direction_sense == "NEGATIVE":
thickness *= -1
offset *= -1
return { return {
"layer_set_direction": layer_set_direction, "layer_set_direction": layer_set_direction,
"thickness": thickness, "thickness": thickness,
@@ -672,14 +669,15 @@ class Model(bonsai.core.tool.Model):
max_x = max(x_values) max_x = max(x_values)
axes = {} axes = {}
if layers: if layers:
direction = 1 if layers["direction_sense"] == "POSITIVE" else -1
axes = { axes = {
"base": [ "base": [
(obj.matrix_world @ Vector((min_x, layers["offset"], 0.0))).to_2d(), (obj.matrix_world @ Vector((min_x, layers["offset"], 0.0))).to_2d(),
(obj.matrix_world @ Vector((max_x, layers["offset"], 0.0))).to_2d(), (obj.matrix_world @ Vector((max_x, layers["offset"], 0.0))).to_2d(),
], ],
"side": [ "side": [
(obj.matrix_world @ Vector((min_x, layers["offset"] + layers["thickness"], 0.0))).to_2d(), (obj.matrix_world @ Vector((min_x, layers["offset"] + (layers["thickness"] * direction), 0.0))).to_2d(),
(obj.matrix_world @ Vector((max_x, layers["offset"] + layers["thickness"], 0.0))).to_2d(), (obj.matrix_world @ Vector((max_x, layers["offset"] + (layers["thickness"] * direction), 0.0))).to_2d(),
], ],
} }
axes["reference"] = [ axes["reference"] = [
@@ -28,6 +28,7 @@ def add_wall_representation(
context: ifcopenshell.entity_instance, context: ifcopenshell.entity_instance,
length: float = 1.0, length: float = 1.0,
height: float = 3.0, height: float = 3.0,
direction_sense: str = "POSITIVE",
offset: float = 0.0, offset: float = 0.0,
thickness: float = 0.2, thickness: float = 0.2,
x_angle: float = 0.0, x_angle: float = 0.0,
@@ -55,6 +56,7 @@ def add_wall_representation(
"context": context, "context": context,
"length": length, "length": length,
"height": height, "height": height,
"direction_sense": direction_sense,
"offset": offset, "offset": offset,
"thickness": thickness, "thickness": thickness,
"x_angle": x_angle, "x_angle": x_angle,
@@ -83,6 +85,8 @@ class Usecase:
length = self.convert_si_to_unit(self.settings["length"]) length = self.convert_si_to_unit(self.settings["length"])
thickness = self.convert_si_to_unit(self.settings["thickness"]) thickness = self.convert_si_to_unit(self.settings["thickness"])
thickness *= 1 / cos(self.settings["x_angle"]) thickness *= 1 / cos(self.settings["x_angle"])
if self.settings["direction_sense"] == "NEGATIVE":
thickness *= -1
points = ( points = (
(0.0, 0.0), (0.0, 0.0),
(0.0, thickness), (0.0, thickness),