experimenting with interlocking twist joints

pull/200/head
palain 2021-12-26 11:19:43 -04:00
rodzic 7e57ada111
commit c96df022c2
2 zmienionych plików z 36 dodań i 8 usunięć

Wyświetl plik

@ -182,6 +182,7 @@ class CamCurveMortise(bpy.types.Operator):
top_bottom: bpy.props.BoolProperty(name="Side Top & bottom fingers", default=True)
opencurve: bpy.props.BoolProperty(name="OpenCurve", default=False)
interlocking_groove: bpy.props.BoolProperty(name="interlocking_groove", default=False)
twist: bpy.props.BoolProperty(name="twist_interlock", default=False)
finger_amount: bpy.props.IntProperty(name="Finger Amount", default=2, min=1, max=100)
tangent_angle: bpy.props.FloatProperty(name="Tangent deviation", default=0.0, min=0.000, max=2, subtype="ANGLE",
unit="ROTATION")
@ -251,7 +252,10 @@ class CamCurveMortise(bpy.types.Operator):
self.flex_pocket)
elif self.interlocking_groove:
joinery.distributed_interlock(c, length, self.finger_size, self.plate_thickness, self.finger_tolerance, self.finger_amount, fixed_angle=self.fixed_angle, tangent=self.tangent_angle,closed=not self.opencurve)
if self.twist:
joinery.distributed_interlock(c, length, self.finger_size, self.plate_thickness, self.finger_tolerance, self.finger_amount, fixed_angle=self.fixed_angle, tangent=self.tangent_angle,closed=not self.opencurve, type='twist')
else:
joinery.distributed_interlock(c, length, self.finger_size, self.plate_thickness, self.finger_tolerance, self.finger_amount, fixed_angle=self.fixed_angle, tangent=self.tangent_angle,closed=not self.opencurve)
return {'FINISHED'}

Wyświetl plik

@ -62,7 +62,30 @@ def interlock_groove(length, thickness, finger_play, cx=0, cy=0, rotation=0):
bpy.ops.object.transform_apply(location=True, rotation=False, scale=False)
bpy.context.active_object.rotation_euler.z = rotation
bpy.ops.transform.translate(value=(cx, cy, 0.0))
# bpy.context.active_object.name = "_groove"
bpy.context.active_object.name = "_groove"
def interlock_twist(length, thickness, finger_play, cx=0, cy=0, rotation=0, percentage=0.5,):
mortise(length, thickness, finger_play, 0, 0, 0)
bpy.context.active_object.name = "_tmp"
mortise(length*percentage, thickness, finger_play, 0, 0, math.pi/2)
bpy.context.active_object.name = "_tmp"
h = math.hypot(thickness, length*percentage)
oangle = math.degrees(math.asin(length*percentage/h))
bpy.ops.curve.simple(align='WORLD', location=(0, 0, 0), rotation=(0, 0, 0), Simple_Type='Sector',
Simple_startangle=90+oangle, Simple_endangle=180-oangle, Simple_radius=h/2, use_cyclic_u=True, edit_mode=False)
bpy.context.active_object.name = "_tmp"
bpy.ops.curve.simple(align='WORLD', location=(0, 0, 0), rotation=(0, 0, 0), Simple_Type='Sector',
Simple_startangle=270+oangle, Simple_endangle=360-oangle, Simple_radius=h/2, use_cyclic_u=True, edit_mode=False)
bpy.context.active_object.name = "_tmp"
simple.selectMultiple('_tmp')
bpy.ops.object.curve_boolean(boolean_type='UNION')
bpy.context.active_object.rotation_euler.z = rotation
bpy.ops.transform.translate(value=(cx, cy, 0.0))
bpy.context.active_object.name = "_groove"
simple.removeMultiple('_tmp')
def horizontal_finger(length, thickness, finger_play, amount, center=True):
@ -413,7 +436,7 @@ def variable_finger(loop, loop_length, min_finger, finger_size, finger_thick, fi
return hpos
def distributed_interlock(loop, loop_length, finger_depth, finger_thick, finger_tolerance, finger_amount, tangent=0, fixed_angle=0, start=0.01, end=0.01, closed=True):
def distributed_interlock(loop, loop_length, finger_depth, finger_thick, finger_tolerance, finger_amount, tangent=0, fixed_angle=0, start=0.01, end=0.01, closed=True, type='groove'):
# distributes interlocking joints of a fixed amount
# dynamically changes the finger tolerance with the angle differences
# loop = takes in a shapely shape
@ -454,14 +477,15 @@ def distributed_interlock(loop, loop_length, finger_depth, finger_thick, finger_
groove_point = loop.interpolate(distance)
print(j, "groove_angle", round(180*(groove_angle)/math.pi),"distance", round(distance * 1000),"mm")
interlock_groove(finger_depth, finger_thick, finger_tolerance, groove_point.x, groove_point.y,
if type == "groove":
interlock_groove(finger_depth, finger_thick, finger_tolerance, groove_point.x, groove_point.y,groove_angle)
elif type == "twist":
interlock_twist(finger_depth, finger_thick, finger_tolerance, groove_point.x, groove_point.y,
groove_angle)
j += 1
distance = j * spacing + start
oldp = p
simple.joinMultiple("_mort")
bpy.context.active_object.name = "mortise"
simple.joinMultiple("_groove")
bpy.context.active_object.name = "groove"