Hi all,
Fist post here and not at all a python guy but I have managed to get my stuff going which is exciting. I was wondering if the internet in its wisdom knew about a way of splitting planes using Bmesh.
I would like to specify a point say (0,0,0) and test if that point is within a face somewhere in the space. I am using (bmesh.geometry.intersect_face_point) which works. Once I have identified that the point projection is in that face, I want to split that face in a specific direction say, along the x-axis or parallel to it.
Ultimately if I do this for a full mesh I can knife cut it along a specific axis on a certain point. I am struggling to get a split function going (mesh.ops.split) and would like to avoid creating vertices in each individual face I find to then create edges to then delete those faces and recreate them with the included edges, it just seems like a slow process for thousands of faces. I am going for efficiency here if possible. Code below and trying to make it work with a 2x2 plane in the X-Y planes centered on (0,0,0). Commented stuff is what I have been trying.
import bpy
import bmesh
from mathutils import (
Vector,
Matrix,
)
import math
"""
bpy.ops.mesh.primitive_plane_add(size=0.25, enter_editmode=False, align='WORLD', location=(0, 0, 0), rotation=(0, 1.5708, 0), scale=(1, 1, 1))
bpy.ops.mesh.primitive_plane_add(size=0.25, enter_editmode=False, align='WORLD', location=(0, 0, 0), rotation=(0, 0, 0), scale=(1, 1, 1))
me = bpy.context.object.data
me1=bpy.data.objects["Plane"].data
me2=bpy.data.objects["Plane.001"].data
bm = bmesh.new() # create an empty BMesh
bm.from_mesh(me1)
bm.from_mesh(me2)
bm.to_mesh(me)
bm.free()
#"""
highest_point=[0,0,0,0,0]
i=0
me=bpy.data.objects["Plane"].data
bm = bmesh.new()
bm.from_mesh(me)
"""
bmesh.ops.duplicate(bm,
geom = bm.faces)
bmesh.ops.rotate(
bm,
verts = bm.verts[0:4],
cent = (0,0,0),
matrix = Matrix.Rotation(math.radians(90.0), 4, 'Y'))
"""
bm.faces.ensure_lookup_table()
bm.verts.ensure_lookup_table()
# Checks if the projection of the point is on the plane
point_to_check = [0.5,0.5,0]
if bmesh.geometry.intersect_face_point(bm.faces[0],point_to_check): # for a 2m plane in the XY planes, any Z values will contain the point as long as X or Y is <1 (also <0.999999)
print ("The point is in the face")
for v in bm.faces[0].verts: # all the points in that face
highest_point[i]=v.co.z
i += 1
print (v.co) # Prints the number of vertices that makes up that face
i=0
#pt1 = bm.verts.new([0,0.5,0])
#pt2 = bm.verts.new([0,1,0])
#bm.verts.ensure_lookup_table()
#bmesh.ops.connect_verts(bm,
# verts = (pt1,pt2),
# check_degenerate = 1)
#bm.verts.remove(pt1)
#bm.verts.remove(pt2)
bm.verts.ensure_lookup_table()
#bmesh.utils.face_split(bm.faces[0],bm.verts[0],bm.verts[3])
print("The hight point in the face is", max(highest_point))
print("The hight point in the face is", min(highest_point))
else:
print ("The point is NOT in the face")
bm.to_mesh(me) # Writes the bmesh back into the mesh
bm.free() #Frees the mesh
Thanks for the help!