diff options
Diffstat (limited to 'precision_drawing_tools/pdt_cad_module.py')
-rw-r--r-- | precision_drawing_tools/pdt_cad_module.py | 92 |
1 files changed, 54 insertions, 38 deletions
diff --git a/precision_drawing_tools/pdt_cad_module.py b/precision_drawing_tools/pdt_cad_module.py index 21a5c6c7..6e6294e6 100644 --- a/precision_drawing_tools/pdt_cad_module.py +++ b/precision_drawing_tools/pdt_cad_module.py @@ -3,7 +3,7 @@ # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. +# of the License, or (at your ointersect_pointion) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -28,19 +28,20 @@ from mathutils import Vector from mathutils.geometry import intersect_line_line, intersect_point_line from .pdt_functions import debug -def point_on_edge(p, edge): + +def point_on_edge(point, edge): """Find Point on Edge. Args: - p: vector + point: vector edge: tuple containing 2 vectors. Returns: True if point p happens to lie on the edge, False otherwise. """ - pt, _percent = intersect_point_line(p, *edge) - on_line = (pt - p).length < 1.0e-5 + intersect_point, _percent = intersect_point_line(point, *edge) + on_line = (intersect_point - point).length < 1.0e-5 return on_line and (0.0 <= _percent <= 1.0) @@ -56,8 +57,10 @@ def line_from_edge_intersect(edge1, edge2): Output of intersect_line_line. """ - [p1, p2], [p3, p4] = edge1, edge2 - return intersect_line_line(p1, p2, p3, p4) + [intersect_point1, intersect_point2], [intersect_point3, intersect_point4] = edge1, edge2 + return intersect_line_line( + intersect_point1, intersect_point2, intersect_point3, intersect_point4 + ) def get_intersection(edge1, edge2): @@ -73,6 +76,7 @@ def get_intersection(edge1, edge2): line = line_from_edge_intersect(edge1, edge2) if line: return (line[0] + line[1]) / 2 + return None def test_coplanar(edge1, edge2): @@ -92,50 +96,53 @@ def test_coplanar(edge1, edge2): line = line_from_edge_intersect(edge1, edge2) if line: return (line[0] - line[1]).length < 1.0e-5 + return None -def closest_idx(pt, e): +def closest_idx(intersect_point, edge): """Get Closest Vertex to input point. - If both points in e are equally far from pt, then v1 is returned. + If both points in e are equally far from intersect_point, then v1 is returned. Args: - pt: vector - e: bmesh edge + intersect_point: vector + edge: bmesh edge Returns: - Index of vertex closest to pt. + Index of vertex closest to intersect_point. """ - if isinstance(e, bmesh.types.BMEdge): - ev = e.verts - v1 = ev[0].co - v2 = ev[1].co - distance_test = (v1 - pt).length <= (v2 - pt).length - return ev[0].index if distance_test else ev[1].index + if isinstance(edge, bmesh.types.BMEdge): + edge_verts = edge.verts + vector_a = edge_verts[0].co + vector_b = edge_verts[1].co + distance_test = (vector_a - intersect_point).length <= (vector_b - intersect_point).length + return edge_verts[0].index if distance_test else edge_verts[1].index - debug(f"Received {e}, check expected input in docstring ") + debug(f"Received {edge}, check expected input in docstring ") + return None -def closest_vector(pt, e): +def closest_vector(intersect_point, edge): """Return Closest Vector to input Point. - If both points in e are equally far from pt, then v1 is returned. + If both points in e are equally far from intersect_point, then v1 is returned. Args: - pt: vector - e: tuple containing 2 vectors + intersect_point: vector + edge: tuple containing 2 vectors Returns: - Vector closest to pt. + Vector closest to intersect_point. """ - if isinstance(e, tuple) and all([isinstance(co, Vector) for co in e]): - v1, v2 = e - distance_test = (v1 - pt).length <= (v2 - pt).length - return v1 if distance_test else v2 + if isinstance(edge, tuple) and all([isinstance(co, Vector) for co in edge]): + vector_a, vector_b = edge + distance_test = (vector_a - intersect_point).length <= (vector_b - intersect_point).length + return vector_a if distance_test else vector_b - debug(f"Received {e}, check expected input in docstring ") + debug(f"Received {edge}, check expected input in docstring ") + return None def coords_tuple_from_edge_idx(bm, idx): @@ -159,8 +166,8 @@ def vertex_indices_from_edges_tuple(bm, edge_tuple): The vertex indices of edge_tuple. """ - def k(v, w): - return bm.edges[edge_tuple[v]].verts[w].index + def k(ind_v, ind_w): + return bm.edges[edge_tuple[ind_v]].verts[ind_w].index return [k(i >> 1, i % 2) for i in range(4)] @@ -182,29 +189,38 @@ def get_vert_indices_from_bmedges(edges): return temp_edges -def num_edges_point_lies_on(pt, edges): +def num_edges_point_lies_on(intersect_point, edges): """Returns the number of edges that a point lies on.""" - res = [point_on_edge(pt, edge) for edge in [edges[:2], edges[2:]]] + res = [point_on_edge(intersect_point, edge) for edge in [edges[:2], edges[2:]]] return len([i for i in res if i]) -def find_intersecting_edges(bm, pt, idx1, idx2): +def find_intersecting_edges(bm, intersect_point, idx1, idx2): """Find Intercecting Edges. Args: - pt: Vector + intersect_point: Vector idx1, ix2: edge indices Returns: - The list of edge indices where pt is on those edges. + The list of edge indices where intersect_point is on those edges. """ - if not pt: + if not intersect_point: return [] idxs = [idx1, idx2] edges = [coords_tuple_from_edge_idx(bm, idx) for idx in idxs] - return [idx for edge, idx in zip(edges, idxs) if point_on_edge(pt, edge)] + return [idx for edge, idx in zip(edges, idxs) if point_on_edge(intersect_point, edge)] def vert_idxs_from_edge_idx(bm, idx): + """Find Vertex Indices form Edge Indices. + + Args: + Object Bmesh as bm + Selection Index as idx + + Returns: + Vertex Indices of Edge. + """ edge = bm.edges[idx] return edge.verts[0].index, edge.verts[1].index |