Anyone know the pythonic way to get edge rings?
It looks like the bmesh polygon loops could be used to generate them but It also looks like that will take some work.
Cheers!
Anyone know the pythonic way to get edge rings?
It looks like the bmesh polygon loops could be used to generate them but It also looks like that will take some work.
Cheers!
Yes and yes Here’s a simple example of walking on edge rings (it doesn’t consider edges with more than two faces connected, can go into infinite loop if mesh is water-tight, etc., etc.):
import bpy
import bmesh
# Walk rings from currently selected edges.
# Run this in edit mode!
def rings(loop):
while True:
# If radial loop links back here, we're boundary, thus done
if loop.link_loop_radial_next == loop:
break
# Jump to adjacent face and walk two edges forward
loop = loop.link_loop_radial_next.link_loop_next.link_loop_next
loop.edge.select = True
bm = bmesh.from_edit_mesh(bpy.context.object.data)
selected_edges = [ e for e in bm.edges if e.select ]
for edge in selected_edges:
# Get rings from "forward" loop
rings(edge.link_loops[0])
# Get rings from "backward" loop
rings(edge.link_loops[1])
bm.select_flush_mode()
bpy.context.object.data.update()
Wow. Thanks Pancakes.
Looks like you’ve already done the work.
I don’t suppose you have a similar method for getting the edge loops?
I don’t have a ready code to extract here, but it’s straightforward: you jump one loop forward, jump radial loop onto adjacent face and walk one loop forward once again.
Taken from this post on Stack Exchange:
https://blender.stackexchange.com/questions/110104/how-to-find-a-mesh-loops-and-rings
import bpy
import bmesh
# Walk rings from currently selected edges.
# Run this in edit mode!
def find_edge_loops(loop,max_loops=1000):
i=0
first_loop=loop
while i<max_loops:
# Jump to adjacent face and walk two edges forward
loop = loop.link_loop_next.link_loop_radial_next.link_loop_next
loop.edge.select = True
i += 1
# If radial loop links back here, we're boundary, thus done
if loop == first_loop:
break
bm = bmesh.from_edit_mesh(bpy.context.object.data)
selected_edges = [ e for e in bm.edges if e.select ]
for edge in selected_edges:
# Get rings from "forward" loop
find_edge_loops(edge.link_loops[0])
# Get rings from "backward" loop
# rings(edge.link_loops[1])
bm.select_flush_mode()
bpy.context.object.data.update()