|
| 1 | +import compas |
| 2 | +from compas.geometry import Point, Line, Vector |
| 3 | +from compas_fd.datastructures import CableMesh |
| 4 | + |
| 5 | +from compas_fd.numdata import FDNumericalData |
| 6 | +from compas_fd.solvers import FDSolver |
| 7 | + |
| 8 | +from compas_view2.app import App |
| 9 | +from compas_view2.objects import Object, MeshObject |
| 10 | + |
| 11 | +Object.register(CableMesh, MeshObject) |
| 12 | + |
| 13 | +mesh = CableMesh.from_obj(compas.get('faces.obj')) |
| 14 | + |
| 15 | +mesh.vertices_attribute('is_anchor', True, keys=list(mesh.vertices_where({'vertex_degree': 2}))) |
| 16 | +mesh.vertices_attribute('t', 0.0) |
| 17 | + |
| 18 | +# input parameters |
| 19 | +vertex_index = mesh.vertex_index() |
| 20 | +vertices = mesh.vertices_attributes('xyz') |
| 21 | +fixed = list(mesh.vertices_where({'is_anchor': True})) |
| 22 | +edges = [(vertex_index[u], vertex_index[v]) for |
| 23 | + u, v in mesh.edges_where({'_is_edge': True})] |
| 24 | +forcedensities = mesh.edges_attribute('q') |
| 25 | +loads = mesh.vertices_attributes(['px', 'py', 'pz']) |
| 26 | + |
| 27 | +# set up single iteration solver |
| 28 | +numdata = FDNumericalData.from_params(vertices, fixed, edges, forcedensities, loads) |
| 29 | +solver = FDSolver(numdata) |
| 30 | + |
| 31 | +# run solver |
| 32 | +result = solver() |
| 33 | + |
| 34 | +# update mesh |
| 35 | +for index, vertex in enumerate(mesh.vertices()): |
| 36 | + mesh.vertex_attributes(vertex, 'xyz', result.vertices[index]) |
| 37 | + mesh.vertex_attributes(vertex, ['_rx', '_ry', '_rz'], result.residuals[index]) |
| 38 | + |
| 39 | + |
| 40 | +# ============================================================================== |
| 41 | +# Viz |
| 42 | +# ============================================================================== |
| 43 | + |
| 44 | +viewer = App() |
| 45 | + |
| 46 | +viewer.add(mesh) |
| 47 | + |
| 48 | +for vertex in fixed: |
| 49 | + viewer.add(Point(* mesh.vertex_attributes(vertex, 'xyz')), size=20, color=(0, 0, 0)) |
| 50 | + |
| 51 | +for vertex in fixed: |
| 52 | + a = Point(* mesh.vertex_attributes(vertex, 'xyz')) |
| 53 | + b = a - Vector(* mesh.vertex_attributes(vertex, ['_rx', '_ry', '_rz'])) |
| 54 | + viewer.add(Line(a, b), linewidth=3, linecolor=(0, 0, 1)) |
| 55 | + |
| 56 | +viewer.run() |
0 commit comments