mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-19 06:39:13 +00:00
allow SI with CAD tools.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user