allow SI with CAD tools.

This commit is contained in:
Ryan Schultz
2023-10-18 17:07:29 -05:00
parent eb0873996f
commit ac41a9e63a
@@ -24,6 +24,8 @@ import bpy_extras
import blenderbim.tool as tool import blenderbim.tool as tool
from mathutils import Vector, Matrix from mathutils import Vector, Matrix
from math import pi, radians, sin, cos, sqrt from math import pi, radians, sin, cos, sqrt
import ifcopenshell.util.unit
messages = { messages = {
"SHARED_VERTEX": "Shared Vertex, no intersection possible", "SHARED_VERTEX": "Shared Vertex, no intersection possible",
@@ -140,6 +142,9 @@ class CadFillet(bpy.types.Operator):
layout.prop(self, prop) layout.prop(self, prop)
def execute(self, context): def execute(self, context):
si_conversion = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
self.radius = self.radius * si_conversion
bpy.ops.object.mode_set(mode="OBJECT") bpy.ops.object.mode_set(mode="OBJECT")
bpy.ops.object.mode_set(mode="EDIT") bpy.ops.object.mode_set(mode="EDIT")
@@ -361,6 +366,10 @@ class CadOffset(bpy.types.Operator):
# dialog that Mesh Tools has. Sverchok is 2D based, but has a weird side # dialog that Mesh Tools has. Sverchok is 2D based, but has a weird side
# effect of converting an unclosed loop into a closed loop which is also # effect of converting an unclosed loop into a closed loop which is also
# not what users expect. # not what users expect.
si_conversion = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
self.distance = self.distance * si_conversion
bpy.ops.object.mode_set(mode="OBJECT") bpy.ops.object.mode_set(mode="OBJECT")
bpy.ops.object.mode_set(mode="EDIT") bpy.ops.object.mode_set(mode="EDIT")
@@ -498,6 +507,8 @@ class CadOffset(bpy.types.Operator):
local_direction = (rotation_i @ direction).normalized() local_direction = (rotation_i @ direction).normalized()
normals.append(local_direction) normals.append(local_direction)
if len(normals) == 2: if len(normals) == 2:
# https://stackoverflow.com/a/54042831/9627415 # https://stackoverflow.com/a/54042831/9627415
new_normal = (normals[0].lerp(normals[1], 0.5)).normalized() new_normal = (normals[0].lerp(normals[1], 0.5)).normalized()
@@ -531,7 +542,7 @@ class CadOffset(bpy.types.Operator):
class AddIfcCircle(bpy.types.Operator): class AddIfcCircle(bpy.types.Operator):
bl_idname = "bim.add_ifccircle" bl_idname = "bim.add_ifccircle"
bl_label = "Add IfcCircle" bl_label = "Add IfcCircle"
radius: bpy.props.FloatProperty(name="Radius", default=0.1) radius: bpy.props.FloatProperty(name="Radius", default=0.5)
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
@@ -539,6 +550,9 @@ class AddIfcCircle(bpy.types.Operator):
return bool(obj) and obj.type == "MESH" return bool(obj) and obj.type == "MESH"
def execute(self, context): def execute(self, context):
si_conversion = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
self.radius = self.radius * si_conversion
if self.has_selected_existing_circle(context): if self.has_selected_existing_circle(context):
self.change_radius(context) self.change_radius(context)
else: else:
@@ -622,6 +636,9 @@ class AddIfcArcIndexFillet(bpy.types.Operator):
layout.prop(self, prop) layout.prop(self, prop)
def execute(self, context): def execute(self, context):
si_conversion = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
self.radius = self.radius * si_conversion
if self.has_selected_existing_arc(context): if self.has_selected_existing_arc(context):
self.change_radius(context) self.change_radius(context)
else: else:
@@ -786,8 +803,8 @@ class AlignViewToProfile(bpy.types.Operator):
class AddRectangle(bpy.types.Operator): class AddRectangle(bpy.types.Operator):
bl_idname = "bim.add_rectangle" bl_idname = "bim.add_rectangle"
bl_label = "Add Rectangle" bl_label = "Add Rectangle"
x: bpy.props.FloatProperty(name="X", default=0.1) x: bpy.props.FloatProperty(name="X", default=1)
y: bpy.props.FloatProperty(name="Y", default=0.1) y: bpy.props.FloatProperty(name="Y", default=1)
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
@@ -795,6 +812,10 @@ class AddRectangle(bpy.types.Operator):
return bool(obj) and obj.type == "MESH" return bool(obj) and obj.type == "MESH"
def execute(self, context): def execute(self, context):
si_conversion = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
self.x = self.x * si_conversion
self.y = self.y * si_conversion
obj = context.active_object obj = context.active_object
bm = bmesh.from_edit_mesh(obj.data) bm = bmesh.from_edit_mesh(obj.data)
cursor = obj.matrix_world.inverted() @ context.scene.cursor.location cursor = obj.matrix_world.inverted() @ context.scene.cursor.location