If you have two lines crossing each other in the same plane
is there a way to create a vertex a the point of intersection?
Tanks & Salutations
If you have two lines crossing each other in the same plane
is there a way to create a vertex a the point of intersection?
Tanks & Salutations
Select both edges, zoom right in to intersection point, press k use knife exact slice across intersection point, if neccesary adjust the verts to intersection point , then remove doubles, there isnt a create intersection point like in cad program as far as i know.
Select two edges, go in object mode and run this:
import Blender
mesh = Blender.Object.GetSelected()[0].getData()
edges = [e for e in mesh.edges if (e.v1.sel & e.v2.sel)]
intersection = Blender.Mathutils.LineIntersect(edges[0].v1.co,edges[0].v2.co,edges[1].v1.co,edges[1].v2.co)
mesh.verts.append(Blender.NMesh.Vert(intersection[0][0],intersection[0][1],intersection[0][2]))
mesh.update()
Adding a vertex at the intersection of two edges. This script works great. Is there a better way directly inside Blender now?
This worked for me in Blender 2.53 Beta:
import bpy
import geometry
sel_obj = bpy.context.selected_objects[0]
sel_obj_mesh = sel_obj.data
sel_edges = [e for e in sel_obj_mesh.edges if (e.select == 1)]
edge1_v1 = sel_obj_mesh.verts[sel_edges[0].verts[0]].co
edge1_v2 = sel_obj_mesh.verts[sel_edges[0].verts[1]].co
edge2_v1 = sel_obj_mesh.verts[sel_edges[1].verts[0]].co
edge2_v2 = sel_obj_mesh.verts[sel_edges[1].verts[1]].co
intersection = geometry.LineIntersect (edge1_v1, edge1_v2, edge2_v1, edge2_v2)
bpy.ops.object.mode_set (mode = 'OBJECT')
sel_obj_mesh.add_geometry (1, 0, 0)
sel_obj_mesh.verts[len (sel_obj_mesh.verts) - 1].co = intersection[0]
sel_obj_mesh.update()
bpy.ops.object.mode_set (mode = 'EDIT')
this seems to be for 2.5
why don’t you open up a thread in python forum and show this might be usefull snippet for 2,5
happy 2.5
You should be able to do it without scripts… just select one of the edges, subdivide it, do the same for the other edge, then select both new vertices and press alt-m to merge. hope this helps!
You should be able to do it without scripts… just select one of the edges, subdivide it, do the same for the other edge, then select both new vertices and press alt-m to merge. hope this helps!
That will only work if the lines intersect at both of their middles.
In 2.49 you can use the knife: snap cut marks to the ends of one line, and it will create a new vertex at the appropriate point on the other. Unfortunately, that functionality (snapping the knife) is missing from 2.53.
Best wishes,
Matthew
@zysstar
i tested your little sript in 2.5
and it’s giving an error on line 6
do you know how to correct this?
i need to get access to vertex coordinates so this may do it but not certain
Thanks
Here’s an updated version which also prints all vertex coordinates:
import bpy
import geometry
bpy.ops.object.mode_set (mode = 'OBJECT')
print ("------------------------")
sel_obj = bpy.context.selected_objects[0]
sel_obj_mesh = sel_obj.data
sel_edges = [e for e in sel_obj_mesh.edges if (e.select == 1)]
print ("Number of selected edges: ", len(sel_edges))
edge1_v1 = sel_obj_mesh.verts[sel_edges[0].verts[0]].co
edge1_v2 = sel_obj_mesh.verts[sel_edges[0].verts[1]].co
edge2_v1 = sel_obj_mesh.verts[sel_edges[1].verts[0]].co
edge2_v2 = sel_obj_mesh.verts[sel_edges[1].verts[1]].co
print (edge1_v1)
print (edge1_v2)
print (edge2_v1)
print (edge2_v2)
intersection = geometry.LineIntersect (edge1_v1, edge1_v2, edge2_v1, edge2_v2)
print ("Intersection vertex:
", intersection[0])
sel_obj_mesh.add_geometry (1, 0, 0)
sel_obj_mesh.verts[len (sel_obj_mesh.verts) - 1].co = intersection[0]
sel_obj_mesh.update()
bpy.ops.object.mode_set (mode = 'EDIT')
i was testing in last week version 175
then i got yesterday the 31197 and tested it and now it works ok
the only thing is that the new point is not part of the 2lines it’s and independant object !
but i guess there is a way to create a nw line by re doing a new line with this point
thanks
are you going to open a thread on python or i do it to share this finding
for line intersect ?
might be usefull for someone else in 2.5
happy 2.5
Updated script for Blender 2.54 Beta
import bpy
import geometry
bpy.ops.object.mode_set (mode = 'OBJECT')
print ("------------------------")
sel_obj = bpy.context.selected_objects[0]
sel_obj_mesh = sel_obj.data
sel_edges = [e for e in sel_obj_mesh.edges if (e.select == 1)]
print ("Number of selected edges: ", len(sel_edges))
edge1_v1 = sel_obj_mesh.vertices[sel_edges[0].vertices[0]].co
edge1_v2 = sel_obj_mesh.vertices[sel_edges[0].vertices[1]].co
edge2_v1 = sel_obj_mesh.vertices[sel_edges[1].vertices[0]].co
edge2_v2 = sel_obj_mesh.vertices[sel_edges[1].vertices[1]].co
print (edge1_v1)
print (edge1_v2)
print (edge2_v1)
print (edge2_v2)
intersection = geometry.LineIntersect (edge1_v1, edge1_v2, edge2_v1, edge2_v2)
print ("Intersection vertex:
", intersection[0])
sel_obj_mesh.vertices.add (1)
sel_obj_mesh.vertices[-1].co = intersection[0]
sel_obj_mesh.update()
bpy.ops.object.mode_set (mode = 'EDIT')
Please do whatever you feel is right.
the 2.55 version doesnt seem to have the geometry module anymore. this one is based on the above code and code taken from addons/space_view3d_spacebar_menu.py:
import bpy
from bpy import *
from mathutils import Vector
def LineLineIntersect (p1, p2, p3, p4):
# based on Paul Bourke's Shortest Line Between 2 lines
min = 0.0000001
v1 = Vector((p1.x - p3.x, p1.y - p3.y, p1.z - p3.z))
v2 = Vector((p4.x - p3.x, p4.y - p3.y, p4.z - p3.z))
if abs(v2.x) < min and abs(v2.y) < min and abs(v2.z) < min:
return None
v3 = Vector((p2.x - p1.x, p2.y - p1.y, p2.z - p1.z))
if abs(v3.x) < min and abs(v3.y) < min and abs(v3.z) < min:
return None
d1 = v1.dot(v2)
d2 = v2.dot(v3)
d3 = v1.dot(v3)
d4 = v2.dot(v2)
d5 = v3.dot(v3)
d = d5 * d4 - d2 * d2
if abs(d) < min:
return None
n = d1 * d2 - d3 * d4
mua = n / d
mub = (d1 + d2 * (mua)) / d4
return [Vector((p1.x + mua * v3.x, p1.y + mua * v3.y, p1.z + mua * v3.z)),
Vector((p3.x + mub * v2.x, p3.y + mub * v2.y, p3.z + mub * v2.z))]
print ("------------------------")
sel_obj = bpy.context.selected_objects[0]
sel_obj_mesh = sel_obj.data
sel_edges = [e for e in sel_obj_mesh.edges if (e.select == 1)]
print ("Number of selected edges: ", len(sel_edges))
edge1_v1 = sel_obj_mesh.vertices[sel_edges[0].vertices[0]].co
edge1_v2 = sel_obj_mesh.vertices[sel_edges[0].vertices[1]].co
edge2_v1 = sel_obj_mesh.vertices[sel_edges[1].vertices[0]].co
edge2_v2 = sel_obj_mesh.vertices[sel_edges[1].vertices[1]].co
print (edge1_v1)
print (edge1_v2)
print (edge2_v1)
print (edge2_v2)
intersection = LineLineIntersect (edge1_v1, edge1_v2, edge2_v1, edge2_v2)
print ("Intersection vertex:
", intersection[0])
bpy.ops.object.mode_set (mode = 'OBJECT')
#sel_obj_mesh.add_geometry (1, 0, 0)
sel_obj_mesh.vertices.add(1)
sel_obj_mesh.vertices[-1].co = intersection[0]
sel_obj_mesh.update()
bpy.ops.object.mode_set (mode = 'EDIT')
Try
import mathutils.geometry
:EDIT:
or better still…
from mathutils import geometry