From 6747236cb451203aa567609aba22dcc187595b6b Mon Sep 17 00:00:00 2001 From: Durman Date: Tue, 31 Aug 2021 14:36:26 +0400 Subject: [PATCH] fixes #4310 --- utils/__init__.py | 2 +- utils/modules/edge_utils.py | 67 +++++++++++------------------- utils/modules/polygon_utils.py | 76 ++++++++-------------------------- 3 files changed, 42 insertions(+), 103 deletions(-) diff --git a/utils/__init__.py b/utils/__init__.py index 05ac8a2da..80aa47fc7 100644 --- a/utils/__init__.py +++ b/utils/__init__.py @@ -127,7 +127,7 @@ utils_modules = [ "csg_core", "csg_geom", "geom", "sv_easing_functions", "sv_text_io_common", "sv_obj_baker", "snlite_utils", "snlite_importhelper", "context_managers", "sv_node_utils", "sv_noise_utils", "profile", "logging", "testing", "sv_requests", "sv_shader_sources", "tree_structure", - "avl_tree", "sv_nodeview_draw_helper", "sv_font_xml_parser", + "avl_tree", "sv_nodeview_draw_helper", "sv_font_xml_parser", "modules.edge_utils", "modules.polygon_utils", "wfc_algorithm", "handling_nodes", "handle_blender_data", "nodes_mixins.generating_objects", "nodes_mixins.show_3d_properties", "modules_inspection", "sv_json_export", "sv_json_import", "meshes", "tree_walk", "mesh_functions", 'mesh.inset_faces', 'mesh.extrude_edges', "sv_json_struct", diff --git a/utils/modules/edge_utils.py b/utils/modules/edge_utils.py index 7396eab2e..ce40e7905 100644 --- a/utils/modules/edge_utils.py +++ b/utils/modules/edge_utils.py @@ -129,60 +129,49 @@ def connected_edges_num(verts, edges): def adjacent_faces_number(edges, pols): - ''' + """ calculate number of adjacent faces edges: list as [edge, edge,..], being each edge [int, int]. pols: list as [polygon, polygon,..], being each polygon [int, int, ...]. returns number of faces connected to each edge as [int, int,...] - ''' - e_sorted = [sorted(e) for e in edges] - ad_faces = [0 for e in edges] - for pol in pols: - for edge in zip(pol, pol[1:] + [pol[0]]): - e_s = sorted(edge) - if e_s in e_sorted: - idx = e_sorted.index(e_s) - ad_faces[idx] += 1 - return ad_faces + """ + return [len(face_indexes) for face_indexes in adjacent_faces_idx(edges, pols)] + def adjacent_faces(edges, pols): - ''' + """ calculates of adjacent faces edges: list as [edge, edge,..], being each edge [int, int]. pols: list as [polygon, polygon,..], being each polygon [int, int, ...]. returns polygon connected to each edge as [[polygon, polygon, ...], [polygon, ...],...] - ''' - e_sorted = [sorted(e) for e in edges] - ad_faces = [[] for e in edges] - for pol in pols: - for edge in zip(pol, pol[1:] + [pol[0]]): - e_s = sorted(edge) - if e_s in e_sorted: - idx = e_sorted.index(e_s) - ad_faces[idx] += [pol] - return ad_faces + """ + edge_to_adj_face = [[] for _ in edges] + for adj_faces, face_indexes in zip(edge_to_adj_face, adjacent_faces_idx(edges, pols)): + for fi in face_indexes: + adj_faces.append(pols[fi]) + return edge_to_adj_face + def adjacent_faces_idx(edges, pols): - ''' + """ calculates of adjacent faces edges: list as [edge, edge,..], being each edge [int, int]. pols: list as [polygon, polygon,..], being each polygon [int, int, ...]. returns polygon connected to each edge as [[polygon, polygon, ...], [polygon, ...],...] - ''' - e_sorted = [sorted(e) for e in edges] + """ + edge_to_index = {tuple(sorted(e)): i for i, e in enumerate(edges)} ad_faces = [[] for e in edges] for p_idx, pol in enumerate(pols): for edge in zip(pol, pol[1:] + [pol[0]]): - e_s = sorted(edge) + e_s = tuple(sorted(edge)) try: - e_idx = e_sorted.index(e_s) + e_idx = edge_to_index[e_s] ad_faces[e_idx].append(p_idx) except ValueError: pass - - return ad_faces + def faces_angle_full(vertices, edges, faces): ''' angle between faces of each edge (only first two faces) @@ -199,32 +188,24 @@ def faces_angle_full(vertices, edges, faces): def faces_angle(normals, edges, pols): - ''' + """ angle between faces of each edge (only first two faces) normals: list as [vertex, vertex, ...], being each vertex Vector([float, float, float]). edges: list as [edge, edge,..], being each edge [int, int]. faces: list as [polygon, polygon,..], being each polygon [int, int, ...]. returns angle of faces (in radians) connected to each edge as [int, int,...] - ''' - ad_faces = adjacent_faces_number(edges, pols) - e_sorted = [sorted(e) for e in edges] - ad_faces = [[] for e in edges] - for idp, pol in enumerate(pols): - for edge in zip(pol, pol[1:] + [pol[0]]): - e_s = sorted(edge) - if e_s in e_sorted: - idx = e_sorted.index(e_s) - ad_faces[idx].append(idp) + """ angles = [] - for edg in ad_faces: - if len(edg) > 1: - dot_p = Vector(normals[edg[0]]).dot(Vector(normals[edg[1]])) + for face_indexes in adjacent_faces_idx(edges, pols): + if len(face_indexes) > 1: + dot_p = Vector(normals[face_indexes[0]]).dot(Vector(normals[face_indexes[1]])) ang = acos(dot_p) else: ang = 2*pi angles.append(ang) return angles + def edges_normal(vertices, edges, faces): ''' Average of vertex normals of the edge diff --git a/utils/modules/polygon_utils.py b/utils/modules/polygon_utils.py index c4d44aedb..17bb4ed2a 100644 --- a/utils/modules/polygon_utils.py +++ b/utils/modules/polygon_utils.py @@ -15,6 +15,7 @@ from sverchok.utils.sv_bmesh_utils import bmesh_from_pydata from sverchok.utils.modules.matrix_utils import vectors_center_axis_to_matrix from sverchok.utils.modules.vertex_utils import vertex_shell_factor, adjacent_edg_pol, adjacent_edg_pol_idx from sverchok.nodes.analyzer.mesh_filter import Faces +from .edge_utils import adjacent_faces_idx def areas_from_polygons(verts, polygons, sum_faces=False): @@ -112,78 +113,35 @@ def pols_sides(faces, sum_sides=False): vals = [sum(vals)] return vals + def pols_adjacent(pols): - ''' + """ returns the polygons that share a vertex with each polygon [[pol, pol,..], [pol,..]] pols: list as [polygon, polygon,..], being each polygon [int, int, ...]. - ''' - vals = [] - edges = [] - pols_eds = [] - for pol in pols: - pol_edgs = [] - for edge in zip(pol, pol[1:] + [pol[0]]): - e_s = tuple(sorted(edge)) - pol_edgs.append(e_s) - edges.append(e_s) - pols_eds.append(pol_edgs) - edges = list(set(edges)) - - ad_faces = [[] for e in edges] - for pol, eds in zip(pols, pols_eds): - for edge in eds: - idx = edges.index(edge) - ad_faces[idx] += [pol] - - for pol, edgs in zip(pols, pols_eds): - col_pol = [] - for edge in edgs: - idx = edges.index(edge) - col_pol.extend(ad_faces[idx]) - col_pol.remove(pol) - vals.append(col_pol) + """ + return [[pols[i] for i in p_indexes] for p_indexes in pols_adjacent_idx(pols)] - return vals def pols_adjacent_idx(pols): - ''' + """ returns the polygons that share a vertex with each polygon [[pol, pol,..], [pol,..]] pols: list as [polygon, polygon,..], being each polygon [int, int, ...]. - ''' - vals = [] - edges = [] - pols_eds = [] - for pol in pols: - pol_edgs = [] - for edge in zip(pol, pol[1:] + [pol[0]]): - e_s = tuple(sorted(edge)) - pol_edgs.append(e_s) - edges.append(e_s) - pols_eds.append(pol_edgs) - edges = list(set(edges)) - - ad_faces = [[] for e in edges] - for pol_idx, eds in zip(range(len(pols)), pols_eds): - for edge in eds: - idx = edges.index(edge) - ad_faces[idx] += [pol_idx] - - for pol_idx, edgs in zip(range(len(pols)), pols_eds): - col_pol = [] - for edge in edgs: - idx = edges.index(edge) - col_pol.extend(ad_faces[idx]) - col_pol.remove(pol_idx) - vals.append(col_pol) + """ + edges = {tuple(sorted(e)): None for pol_edges in pols_edges(pols) for e in pol_edges} + edges = {e: adj_indexes for e, adj_indexes in zip(edges.keys(), adjacent_faces_idx(edges.keys(), pols))} + adj_pols = [] + for ei, pol_edges in enumerate(pols_edges(pols)): + adj_pols.append(list({fi for e in pol_edges for fi in edges[tuple(sorted(e))]} - {ei})) + return adj_pols - return vals def pols_adjacent_num(pols): - ''' + """ returns the number polygons that share a vertex with each polygon [int, int,..]] pols: list as [polygon, polygon,..], being each polygon [int, int, ...]. - ''' - return [len(p) for p in pols_adjacent(pols)] + """ + return [len(p) for p in pols_adjacent_idx(pols)] + def pols_neighbor(verts, pols): ''' -- GitLab