def test_from_ploygons(): polygon = [[[1.0, 0.0, 3.0], [1.0, 1.25, 0.0], [1.5, 0.5, 0.0]], [[1.0, 0.0, 3.0], [1.0, 5.25, 0.0], [1.5, 0.5, 0.0]]] mesh = Mesh.from_polygons(polygon) assert mesh.number_of_faces() == 2 assert mesh.number_of_vertices() == 4 assert mesh.number_of_edges() == 5
for fkey in mesh.faces(): centroids[geometric_key(mesh.face_centroid(fkey))] = fkey vectors[fkey] = mesh.face_attribute(fkey, tag) # ========================================================================== # Rebuild mesh - necessary to match ordering of collection.set(array)! # ========================================================================== polygons = [] for fkey in mesh.faces(): x, y, z = mesh.face_centroid(fkey) if x >= x_lim and y >= y_lim: polygons.append(mesh.face_coordinates(fkey)) mesh = Mesh.from_polygons(polygons) mesh_unify_cycles(mesh) for fkey in mesh.faces(): gkey = geometric_key(mesh.face_centroid(fkey)) ofkey = centroids[gkey] vector = vectors[ofkey] mesh.face_attribute(fkey, tag, vector) # ============================================================================= # Align vectors # ============================================================================= # convexity of the resulting distribution seems to be beneficial. # in other words, single mode distributions produce nicer results than double # mode. double mode distributions arise aligning with global y, whereas the good
# Viz # ============================================================================== viewer = App() nodes = [] blocks = [] interfaces = [] interactions = [] for node in assembly.nodes(): nodes.append(Point(* assembly.node_coordinates(node))) blocks.append(assembly.node_attribute(node, 'block')) for edge in assembly.edges(): interface = assembly.edge_attribute(edge, 'interface') polygon = Polygon(interface.points) interfaces.append(Mesh.from_polygons([polygon])) for edge in assembly.edges(): a = Point(* assembly.node_coordinates(edge[0])) b = Point(* assembly.node_coordinates(edge[1])) interactions.append(Line(a, b)) viewer.add(Collection(nodes)) viewer.add(Collection(blocks), show_faces=False, show_edges=True) viewer.add(Collection(interfaces), show_edges=False, color=(0, 0, 1), opacity=0.5) viewer.add(Collection(interactions)) viewer.run()
viewer = App() nodes = [] blocks = [] interfaces = [] sides = [] colors = [] for node in assembly.nodes(): nodes.append(Point(* assembly.node_coordinates(node))) blocks.append(assembly.node_attribute(node, 'block')) for node in assembly.nodes(): block = assembly.node_attribute(node, 'block') faces = sorted(block.faces(), key=lambda face: block.face_area(face))[:-2] for face in faces: side = Polygon(block.face_coordinates(face)) mesh = Mesh.from_polygons([side]) sides.append(mesh) for mesh in sides: face = list(mesh.faces())[0] dev = mesh.face_flatness(face) colors.append(i_to_red(dev, normalize=True)) viewer.add(Collection(blocks), show_faces=False, show_edges=True) viewer.add(Collection(sides), colors=colors, show_edges=False) viewer.run()
# Visualisation # ============================================================================== Object.register(Block, MeshObject) viewer = App() for node in assembly.nodes(): point = Point(*assembly.node_attributes(node, 'xyz')) block = assembly.node_attribute(node, 'block') viewer.add(point, size=10, color=(0, 0, 0)) viewer.add(block, show_faces=assembly.node_attribute(node, 'is_support'), show_edges=True, facecolor=(1.0, 0, 0)) for edge in assembly.edges(): line = Line(*assembly.edge_coordinates(*edge)) interface = assembly.edge_attribute(edge, 'interface') viewer.add(line, linewidth=3, color=(0, 0.7, 0)) viewer.add(Mesh.from_polygons([interface.points]), show_edges=False, facecolor=(0.5, 0.5, 1.0), linecolor=(0, 0, 1.0)) viewer.show()