kopia lustrzana https://github.com/vilemduha/blendercam
experimenting with interlocking twist joints
rodzic
7e57ada111
commit
c96df022c2
|
|
@ -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'}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
Ładowanie…
Reference in New Issue