Beispiel #1
0
def get_intersection_dictionary(bm, edge_indices):

    bm.verts.ensure_lookup_table()
    bm.edges.ensure_lookup_table()

    permutations = get_valid_permutations(bm, edge_indices)

    k = defaultdict(list)
    d = defaultdict(list)

    for edges in permutations:
        raw_vert_indices = cm.vertex_indices_from_edges_tuple(bm, edges)
        vert_vectors = cm.vectors_from_indices(bm, raw_vert_indices)

        points = LineIntersect(*vert_vectors)

        # some can be skipped.    (NaN, None, not on both edges)
        if can_skip(points, vert_vectors):
            continue

        # reaches this point only when an intersection happens on both edges.
        [k[edge].append(points[0]) for edge in edges]

    # k will contain a dict of edge indices and points found on those edges.
    for edge_idx, unordered_points in k.items():
        tv1, tv2 = bm.edges[edge_idx].verts
        v1 = bm.verts[tv1.index].co
        v2 = bm.verts[tv2.index].co
        ordered_points = order_points((v1, v2), unordered_points)
        d[edge_idx].extend(ordered_points)

    return d
def line_from_edge_intersect(edge1, edge2):
    '''
    > takes 2 tuples, each tuple contains 2 vectors
    - prepares input for sending to intersect_line_line
    < returns output of intersect_line_line
    '''
    [p1, p2], [p3, p4] = edge1, edge2
    return LineIntersect(p1, p2, p3, p4)
def get_intersection_from_idxs(bm, idx1, idx2):
    '''
    > takes reference to bm and 2 indices
    < returns intersection or None
    '''
    p1, p2 = coords_tuple_from_edge_idx(bm, idx1)
    p3, p4 = coords_tuple_from_edge_idx(bm, idx2)
    a, b = LineIntersect(p1, p2, p3, p4)
    if (a - b).length < CAD_prefs.VTX_PRECISION:
        return a
Beispiel #4
0
def operate(context, bm, selected):
    edge_1, edge_2 = selected
    edge_1_co_1 = edge_1.verts[0].co
    edge_1_co_2 = edge_1.verts[1].co
    edge_2_co_1 = edge_2.verts[0].co
    edge_2_co_2 = edge_2.verts[1].co
    isect = LineIntersect(edge_1_co_1, edge_1_co_2, edge_2_co_1, edge_2_co_2)

    if (not isect) or ((isect[0] - isect[1]).length >= 1.0e-5):
        print('these edges do not intersect')
        return
    else:
        print('definite intersection found')

    p0 = isect[0]
    p1 = point_on_edge(p0, edge_1)
    p2 = point_on_edge(p0, edge_2)
    if (p1 and p2):
        print('point lies on both edges')
        return
    elif (p1 or p2):
        print('point lies on 1 edge')
        return

    # reaches this point if the intersection doesnt lie on either edge
    def get_vertex(edge):
        IDX_BOOL = bool(
            (edge.verts[0].co - p0).length > (edge.verts[1].co - p0).length)
        return edge.verts[IDX_BOOL]

    bm.select_mode = {'VERT'}
    bm.select_flush_mode()
    v1 = bm.verts.new(p0)
    e1 = bm.edges.new([v1, get_vertex(edge_1)])
    e2 = bm.edges.new([v1, get_vertex(edge_2)])
    edge_1.select = False
    edge_2.select = False
    v1.select = True

    return True
def checkEdges(Edge, obj):
    (p1, p2, p3, p4) = edges_to_points(Edge)
    line = LineIntersect(p1, p2, p3, p4)
    point = ((line[0] + line[1]) / 2)  # or point = line[0]
    return point
def checkIsMatrixCoplanar(verti):
    (v1, v2, v3, v4) = edges_to_points(verti)  #unpack
    shortest_line = LineIntersect(v1, v2, v3, v4)
    if mDist(shortest_line[1], shortest_line[0]) > VTX_PRECISION: return False
    else: return True