mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-28 03:05:33 +00:00
Refactor how offset and direction sense interact for wall and slabs.
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
Reference in New Issue
Block a user