diff --git a/scripts/addons/cam/curvecamcreate.py b/scripts/addons/cam/curvecamcreate.py index f238f27f..3759e83e 100644 --- a/scripts/addons/cam/curvecamcreate.py +++ b/scripts/addons/cam/curvecamcreate.py @@ -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'} diff --git a/scripts/addons/cam/joinery.py b/scripts/addons/cam/joinery.py index a787e114..33a33c89 100644 --- a/scripts/addons/cam/joinery.py +++ b/scripts/addons/cam/joinery.py @@ -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"