def RunCommand(is_interactive): if 'TNA' not in sc.sticky: raise Exception("Initialise the plugin first!") TNA = sc.sticky['TNA'] settings = TNA['settings'] options = ['obj', 'json', 'lines', 'mesh'] option = rs.GetString("Initialise FormDiagram from", options[0], options) if not option: return if option == 'obj': filepath = compas_rhino.select_file(folder=compas_tna.DATA, filter='OBJ files (*.obj)|*.obj||') if not filepath: return form = FormDiagram.from_obj(filepath) elif option == 'json': filepath = compas_rhino.select_file( folder=compas_tna.DATA, filter='JSON files (*.json)|*.json||') if not filepath: return form = FormDiagram.from_json(filepath) elif option == 'lines': guids = compas_rhino.select_lines() if not guids: return lines = compas_rhino.get_line_coordinates(guids) form = FormDiagram.from_lines(lines) elif option == 'mesh': guid = compas_rhino.select_mesh() if not guid: return form = FormDiagram.from_rhinomesh(guid) else: raise NotImplementedError del TNA['form'] del TNA['force'] TNA['form'] = form TNA['force'] = None compas_rhino.clear_layer(settings['layer.force']) form.draw(layer=settings['layer.form'], clear_layer=True, settings=settings)
def randomise_form(form): """ Randomises the FormDiagram by shuffling the edges. Parameters ---------- form : obj Original FormDiagram. Returns ------- obj Shuffled FormDiagram. """ # Edges edges = [form.edge_coordinates(u, v) for u, v in form.edges()] edges = [[sp[:2] + [0], ep[:2] + [0]] for sp, ep in edges] shuffle(edges) form_ = FormDiagram.from_lines(edges, delete_boundary_face=False) form_.update_default_edge_attributes({'is_symmetry': False}) sym = [ geometric_key(form.edge_midpoint(u, v)[:2] + [0]) for u, v in form.edges_where({'is_symmetry': True}) ] for u, v in form_.edges(): if geometric_key(form_.edge_midpoint(u, v)) in sym: form_.set_edge_attribute((u, v), 'is_symmetry', True) # Vertices gkey_key = form_.gkey_key() for key, vertex in form.vertex.items(): gkey = geometric_key(form.vertex_coordinates(key)[:2] + [0]) form_.vertex[gkey_key[gkey]] = vertex form_.attributes['indset'] = [] return form_
from __future__ import print_function import compas import compas_rhino import compas_tna from compas_tna.diagrams import FormDiagram from compas_tna.rhino import DiagramHelper # create a form diagram from a set of lines guids = compas_rhino.select_lines() lines = compas_rhino.get_line_coordinates(guids) form = FormDiagram.from_lines(lines) # identify the supports # as the vertices that lie on the support curves guids = compas_rhino.select_curves() keys = DiagramHelper.identify_vertices_on_curves(form, guids) form.set_vertices_attribute('is_anchor', True, keys) # update the boundaries to include the horizontal reaction forces form.update_boundaries() # serialise the result form.to_json('aag_00_formdiagram_from_lines.json')
from compas.utilities import geometric_key import rhinoscriptsyntax as rs __author__ = ['Andrew Liew <*****@*****.**>'] __copyright__ = 'Copyright 2018, BLOCK Research Group - ETH Zurich' __license__ = 'MIT License' __email__ = '*****@*****.**' # Form guids = rs.ObjectsByLayer('Lines') + rs.ObjectsByLayer('Symmetry') lines = [[rs.CurveStartPoint(i), rs.CurveEndPoint(i)] for i in guids if rs.IsCurve(i)] form = FormDiagram.from_lines(lines, delete_boundary_face=False) form.update_default_vertex_attributes({'is_roller': False}) form.update_default_edge_attributes({'q': 1, 'is_symmetry': False}) form.attributes['loadpath'] = 0 form.attributes['indset'] = [] gkey_key = form.gkey_key() # Pins for i in rs.ObjectsByLayer('Pins'): gkey = geometric_key(rs.PointCoordinates(i)) form.set_vertex_attribute(gkey_key[gkey], 'is_fixed', True) # Loads