|
1 | 1 | import os
|
2 | 2 | from math import fabs
|
3 | 3 | from turtle import position
|
4 |
| -from typing import List |
5 | 4 |
|
6 |
| -from compas_view2.app import App |
7 |
| -from compas_view2.objects import Collection |
8 |
| -from compas_view2.shapes import Arrow |
| 5 | +from compas_viewer import Viewer |
9 | 6 |
|
10 | 7 | import compas
|
11 | 8 | from compas.colors import Color
|
12 | 9 | from compas.geometry import Cylinder
|
13 |
| - |
14 |
| -# from compas.geometry import Line |
| 10 | +from compas.geometry import Line |
15 | 11 | from compas.geometry import Polygon
|
16 | 12 | from compas.geometry import Vector
|
17 | 13 | from compas.geometry import sum_vectors
|
|
89 | 85 | radii = [fabs(f) for f in network.edges_attribute("f")]
|
90 | 86 | radii = remap_values(radii, 0.01, 0.2)
|
91 | 87 |
|
92 |
| -viewer = App() |
| 88 | +viewer = Viewer() |
93 | 89 |
|
94 | 90 | anchors = []
|
95 |
| -anchor_properties = [] |
96 | 91 | for node in network.nodes_where(is_anchor=True):
|
97 | 92 | anchors.append(network.node_point(node))
|
98 |
| - anchor_properties.append({"pointcolor": Color.black(), "pointsize": 50}) |
99 |
| -viewer.add(Collection(anchors, anchor_properties), pointsize=20) |
| 93 | +viewer.scene.add(anchors, pointsize=20) |
100 | 94 |
|
| 95 | +reactions = [] |
101 | 96 | for node in network.nodes_where(is_anchor=True):
|
102 | 97 | point = network.node_point(node)
|
103 | 98 | nbrs = network.neighbors(node)
|
104 | 99 | edges = [(node, nbr) if network.has_edge((node, nbr)) else (nbr, node) for nbr in nbrs]
|
105 | 100 | forces = network.edges_attribute("f", keys=edges)
|
106 |
| - edgevectors: List[Vector] = [network.node_point(nbr) - point for nbr in nbrs] |
| 101 | + edgevectors: list[Vector] = [network.node_point(nbr) - point for nbr in nbrs] |
107 | 102 | edgevector = Vector(*sum_vectors(edgevectors))
|
108 | 103 | forcevectors = [vector.scaled(force) for force, vector in zip(forces, edgevectors)]
|
109 | 104 | forcevector = Vector(*sum_vectors(forcevectors))
|
110 | 105 | color = Color.green().darkened(50)
|
111 | 106 | vector = network.node_reaction(node)
|
112 |
| - vector.scale(0.0005) |
113 |
| - if vector.length > 0.1: |
114 |
| - if edgevector.dot(forcevector) > 0: |
115 |
| - position = point |
116 |
| - else: |
117 |
| - position = point - vector |
118 |
| - arrow = Arrow( |
119 |
| - position, |
120 |
| - vector, |
121 |
| - head_portion=0.2, |
122 |
| - head_width=0.07, |
123 |
| - body_width=0.02, |
124 |
| - ) |
125 |
| - viewer.add(arrow, u=16, facecolor=color) |
| 107 | + vector.scale(0.2) |
| 108 | + if edgevector.dot(forcevector) > 0: |
| 109 | + position = point |
| 110 | + else: |
| 111 | + position = point - vector |
| 112 | + line = Line.from_point_and_vector(position, vector) |
| 113 | + reactions.append((line, {"linecolor": color, "linewidth": 3})) |
| 114 | +viewer.scene.add(reactions) |
126 | 115 |
|
127 | 116 | for spline in splines:
|
128 | 117 | pipes = []
|
129 |
| - pipe_properties = [] |
| 118 | + polygons = [] |
| 119 | + |
130 | 120 | for u, v in spline["edges"]:
|
131 | 121 | edge = (u, v) if network.has_edge((u, v)) else (v, u)
|
132 | 122 | index = edge_index[edge]
|
133 | 123 | # bending moment
|
134 | 124 | ma = Vector(*network.node_attributes(u, ["mx", "my", "mz"]))
|
135 | 125 | mb = Vector(*network.node_attributes(v, ["mx", "my", "mz"]))
|
136 |
| - a = network.node_point(u) |
137 |
| - b = network.node_point(v) |
138 |
| - aa = a + ma * 0.001 |
139 |
| - bb = b + mb * 0.001 |
140 |
| - viewer.add(Polygon([a, b, bb, aa]), facecolor=(1, 1, 0)) |
| 126 | + if ma and mb: |
| 127 | + a = network.node_point(u) |
| 128 | + b = network.node_point(v) |
| 129 | + aa = a + ma * 0.001 |
| 130 | + bb = b + mb * 0.001 |
| 131 | + polygons.append((Polygon([a, b, bb, aa]), {"color": Color.yellow()})) |
141 | 132 | # axial force
|
142 | 133 | force = network.edge_attribute(edge, "f")
|
143 | 134 | line = network.edge_line((u, v))
|
144 |
| - radius = radii[index] |
| 135 | + radius = radii[index] * 0.5 |
145 | 136 | color = Color.red() if force > 0 else Color.blue()
|
146 | 137 | pipe = Cylinder.from_line_and_radius(line, radius)
|
147 |
| - pipes.append(pipe) |
148 |
| - pipe_properties.append({"facecolor": color}) |
149 |
| - viewer.add(Collection(pipes, pipe_properties)) |
| 138 | + pipes.append((pipe, {"color": color})) |
| 139 | + viewer.scene.add(pipes) |
| 140 | + viewer.scene.add(polygons) |
150 | 141 |
|
151 | 142 | for cable in cables:
|
152 | 143 | pipes = []
|
153 |
| - pipe_properties = [] |
154 | 144 | for edge in cable["edges"]:
|
155 | 145 | index = edge_index[edge]
|
156 | 146 | force = network.edge_attribute(edge, "f")
|
157 | 147 | line = network.edge_line((u, v))
|
158 | 148 | radius = radii[index]
|
159 | 149 | color = Color.red() if force > 0 else Color.blue()
|
160 | 150 | pipe = Cylinder.from_line_and_radius(line, radius)
|
161 |
| - pipes.append(pipe) |
162 |
| - pipe_properties.append({"facecolor": color}) |
163 |
| - viewer.add(Collection(pipes, pipe_properties)) |
| 151 | + pipes.append((pipe, {"color": color})) |
| 152 | + viewer.scene.add(pipes) |
164 | 153 |
|
165 | 154 | pipes = []
|
166 |
| -pipe_properties = [] |
167 | 155 | for edge in ties:
|
168 | 156 | index = edge_index[edge]
|
169 | 157 | force = network.edge_attribute(edge, "f")
|
170 | 158 | line = network.edge_line(edge)
|
171 | 159 | radius = radii[index]
|
172 | 160 | color = Color.red() if force > 0 else Color.blue()
|
173 | 161 | pipe = Cylinder.from_line_and_radius(line, radius)
|
174 |
| - pipes.append(pipe) |
175 |
| - pipe_properties.append({"facecolor": color}) |
176 |
| -viewer.add(Collection(pipes, pipe_properties)) |
| 162 | + pipes.append((pipe, {"color": color})) |
| 163 | +viewer.scene.add(pipes) |
177 | 164 |
|
178 |
| -viewer.add(network, show_points=False, linewidth=2) |
| 165 | +viewer.scene.add(network, show_points=False, linewidth=2) |
179 | 166 | viewer.show()
|
0 commit comments