# Is there a way to custom poke a face in blender?

This question might seem weird but, I would go with it since I don't know what to call this.

So I know that blender has a poke face option, which is very handy to make tower structures by combining it with a wireframe modifier.

I ran into a problem where the faces has to be in this pattern.

I don't know a way to make this without using a knife tool. Since I have a lot of faces it wouldn't be ideal to use the knife tool.

So my question is that "is there a way to make this topology in a easy way ?"

• Since it's for a tower, can we presume that it is only vertical faces, with the extra poke edge being horizontal? Could do something akin to blender.stackexchange.com/a/214722/15543 Commented Jul 7, 2021 at 17:58

"Scaffold Poke" Bmesh script.

Of the selected quad faces, bisect all vertical edges, then poke the face.

Result on defaults: Cube and UV Sphere

Similarly to

https://blender.stackexchange.com/a/118497/15543

select faces in edit mode run script,

• of those faces reduce to only quads.

• Find all the connected edges aligned with the Z axis, and bisect them

• Any selected face now with 6 verts is "scaffold poked" by poking the ngon

Test script.

import bpy
import bmesh
from mathutils import Vector

context = bpy.context
ob = context.edit_object
me = ob.data
bm = bmesh.from_edit_mesh(me)
axis = Vector((0, 0, 1))
faces = [f for f in bm.faces if f.select and len(f.verts) == 4]

def aligned(e):
d = (e.verts[1].co - e.verts[0].co).normalized()
return abs(d.dot(axis)) > 0.5

bmesh.ops.bisect_edges(bm,
edges=[e for e in bm.edges
if any(f.select for f in e.link_faces)
and aligned(e)
],
cuts=1,
)
# poke
bmesh.ops.poke(
bm,
faces=[f for f in faces if len(f.verts) == 6],
)

bmesh.update_edit_mesh(me)


• Add a new vert at face center

• List the faces edges, remove face and make tris from edge verts + center verts.

Replace from #poke

# poke
for f in faces:

if len(f.edges) != 6:
f.select_set(False)
continue
v = bm.verts.new(f.calc_center_median())
v.normal = f.normal
edges = f.edges[:]
bm.faces.remove(f)
for e in edges:
f = bm.faces.new([v] + e.verts[:])
f.select_set(True)
bm.normal_update()
bmesh.update_edit_mesh(me)

• that worked ! it's very handy to have python for these stuff but still hard to write it on my own. anyway thanks for your quick reply! :D Have a nice day! Commented Jul 7, 2021 at 20:49