Tongue and Groove Separator

This creates a shape which can be applied to other shapes to cut them with a Tongue-and-Groove pattern The sizes and gaps can be adjusted in mm's by changing the constants. This could be made into a more formal Add-On.

This code is contained within my file “reflexPortExtension.blend”.

2/7/2022

import bpy
 
import bpy
 
verts = []
edges = []
faces = []
 
tongueHeight = .002
tongueWidth = .002
gap = .0004
margin = .02
panelDepth = .02
 
# Offset from universe center to draw this thing
drawCoord = []
drawCoord.extend([
  .5, .5, .5
])
 
print("Length: ", len(drawCoord))
 
# Drawing one loop
 
# Draw origin
verts.append([ #index 0
  drawCoord[0], #x
  drawCoord[1], #y
  drawCoord[2] #z
])
 
verts.append([
  drawCoord[0], #x
  drawCoord[1], #y
  drawCoord[2] + tongueHeight #z
])
 
verts.append([
  drawCoord[0] + tongueWidth, #x
  drawCoord[1], #y
  drawCoord[2] + tongueHeight #z
])
 
verts.append([
  drawCoord[0] + tongueWidth, #x
  drawCoord[1], #y
  drawCoord[2] #z
])
 
verts.append([ # index 4
  drawCoord[0] + tongueWidth + margin + gap, #x
  drawCoord[1], #y
  drawCoord[2] #z
])
 
verts.append([
  drawCoord[0] + tongueWidth + margin + gap, #x
  drawCoord[1], #y
  drawCoord[2] + gap #z
])
 
verts.append([ # index 6
  drawCoord[0] + tongueWidth + gap, #x
  drawCoord[1], #y
  drawCoord[2] + gap #z
])
 
verts.append([
  drawCoord[0] + tongueWidth + gap, #x
  drawCoord[1], #y
  drawCoord[2] + tongueHeight + gap #z
])
 
verts.append([ # index 8
  drawCoord[0] - gap, #x
  drawCoord[1], #y
  drawCoord[2] + tongueHeight + gap #z
])
 
verts.append([
  drawCoord[0] - gap, #x
  drawCoord[1], #y
  drawCoord[2] + gap #z
])
 
verts.append([ # index 10
  drawCoord[0] - gap - margin, #x
  drawCoord[1], #y
  drawCoord[2] + gap #z
])
 
verts.append([
  drawCoord[0] - gap - margin, #x
  drawCoord[1], #y
  drawCoord[2] #z
])
 
print("Front Loop vertex count:", len(verts))
 
 
# make back loop, same as front loop
backLoop = []
for v in verts:
    backLoop.append([
        v[0], #x
        v[1] - panelDepth, #y
        v[2] #z
    ])
verts.extend(backLoop)
 
# values are indexes
print("All vertexes: ")
for i, v in enumerate(verts):
    print("    vert ", i, v)
 
loopVertexCount = int(len(verts)/2)
 
for f in range(loopVertexCount - 1):
    faces.append([f,f + 1,loopVertexCount + f + 1,loopVertexCount + f])
 
# Do last face
faces.append([loopVertexCount - 1, 0, loopVertexCount, 2*loopVertexCount - 1])
 
# End Caps
faces.append(range(loopVertexCount - 1, -1, -1))
 
faces.append(range(loopVertexCount, 2*loopVertexCount))
 
for myFace in faces:
    print("Face: ", myFace)
 
if (1 == 1):
    name = "Tongue And Groove Separator"
    mesh = bpy.data.meshes.new(name)
    obj = bpy.data.objects.new(name, mesh)
    col = bpy.data.collections.get("Objects")
    col.objects.link(obj)
    # bpy.context.view_layer.objects.active = obj
    mesh.from_pydata(verts, edges, faces)