====== 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)