Skip to content

Commit bf12738

Browse files
authored
Merge pull request #1029 from compas-dev/plotter-remove-collection
Fix remove collection
2 parents 3f6d495 + 63974ff commit bf12738

File tree

4 files changed

+124
-98
lines changed

4 files changed

+124
-98
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1919
### Changed
2020

2121
* Set `jinja >= 3.0` to dev dependencies to fix docs build error.
22+
* Fixed removing of collections for `compas_plotters`.
2223

2324
### Removed
2425

src/compas/artists/colordict.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import compas
22
from collections import defaultdict
3+
34
if compas.PY2:
45
from collections import Mapping
56
else:
@@ -12,7 +13,7 @@ class DescriptorProtocol(type):
1213

1314
def __init__(cls, name, bases, attrs):
1415
for k, v in iter(attrs.items()):
15-
if hasattr(v, '__set_name__'):
16+
if hasattr(v, "__set_name__"):
1617
v.__set_name__(cls, k)
1718

1819

@@ -58,8 +59,8 @@ def __set_name__(self, owner, name):
5859
5960
"""
6061
self.public_name = name
61-
self.private_name = '_' + name
62-
self.default_name = 'default_' + ''.join(name.split('_'))
62+
self.private_name = "_" + name
63+
self.default_name = "default_" + "".join(name.split("_"))
6364

6465
def __get__(self, obj, otype=None):
6566
"""Get the color dict stored in the private attribute corresponding to the public attribute name of the descriptor.

src/compas_plotters/artists/networkartist.py

Lines changed: 70 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -55,19 +55,21 @@ class NetworkArtist(PlotterArtist, NetworkArtist):
5555
5656
"""
5757

58-
def __init__(self,
59-
network: Network,
60-
nodes: Optional[List[int]] = None,
61-
edges: Optional[List[int]] = None,
62-
nodecolor: Color = (1.0, 1.0, 1.0),
63-
edgecolor: Color = (0.0, 0.0, 0.0),
64-
edgewidth: float = 1.0,
65-
show_nodes: bool = True,
66-
show_edges: bool = True,
67-
nodesize: int = 5,
68-
sizepolicy: Literal['relative', 'absolute'] = 'relative',
69-
zorder: int = 1000,
70-
**kwargs):
58+
def __init__(
59+
self,
60+
network: Network,
61+
nodes: Optional[List[int]] = None,
62+
edges: Optional[List[int]] = None,
63+
nodecolor: Color = (1.0, 1.0, 1.0),
64+
edgecolor: Color = (0.0, 0.0, 0.0),
65+
edgewidth: float = 1.0,
66+
show_nodes: bool = True,
67+
show_edges: bool = True,
68+
nodesize: int = 5,
69+
sizepolicy: Literal["relative", "absolute"] = "relative",
70+
zorder: int = 1000,
71+
**kwargs,
72+
):
7173

7274
super().__init__(network=network, **kwargs)
7375

@@ -101,21 +103,31 @@ def item(self, item: Network):
101103

102104
@property
103105
def data(self) -> List[List[float]]:
104-
return self.network.nodes_attributes('xy')
106+
return self.network.nodes_attributes("xy")
105107

106108
@property
107109
def node_size(self):
108110
if not self._node_size:
109-
factor = self.plotter.dpi if self.sizepolicy == 'absolute' else self.network.number_of_nodes()
111+
factor = (
112+
self.plotter.dpi
113+
if self.sizepolicy == "absolute"
114+
else self.network.number_of_nodes()
115+
)
110116
size = self.default_nodesize / factor
111117
self._node_size = {node: size for node in self.network.nodes()}
112118
return self._node_size
113119

114120
@node_size.setter
115121
def node_size(self, nodesize):
116-
factor = self.plotter.dpi if self.sizepolicy == 'absolute' else self.network.number_of_nodes()
122+
factor = (
123+
self.plotter.dpi
124+
if self.sizepolicy == "absolute"
125+
else self.network.number_of_nodes()
126+
)
117127
if isinstance(nodesize, dict):
118-
self.node_size.update({node: size / factor for node, size in nodesize.items()})
128+
self.node_size.update(
129+
{node: size / factor for node, size in nodesize.items()}
130+
)
119131
elif isinstance(nodesize, (int, float)):
120132
self._node_size = {node: nodesize / factor for node in self.network.nodes()}
121133

@@ -132,7 +144,7 @@ def clear_nodes(self):
132144
133145
"""
134146
if self._nodecollection:
135-
self.plotter.axes.remove_collection(self._nodecollection)
147+
self._nodecollection.remove()
136148
self._nodecollection = None
137149

138150
def clear_edges(self):
@@ -144,14 +156,16 @@ def clear_edges(self):
144156
145157
"""
146158
if self._edgecollection:
147-
self.plotter.axes.remove_collection(self._edgecollection)
159+
self._edgecollection.remove()
148160
self._edgecollection = None
149161

150-
def draw(self,
151-
nodes: Optional[List[int]] = None,
152-
edges: Optional[Tuple[int, int]] = None,
153-
nodecolor: Optional[Union[str, Color, List[Color], Dict[int, Color]]] = None,
154-
edgecolor: Optional[Union[str, Color, List[Color], Dict[int, Color]]] = None) -> None:
162+
def draw(
163+
self,
164+
nodes: Optional[List[int]] = None,
165+
edges: Optional[Tuple[int, int]] = None,
166+
nodecolor: Optional[Union[str, Color, List[Color], Dict[int, Color]]] = None,
167+
edgecolor: Optional[Union[str, Color, List[Color], Dict[int, Color]]] = None,
168+
) -> None:
155169
"""Draw the network.
156170
157171
Parameters
@@ -178,9 +192,11 @@ def draw(self,
178192
if self.show_edges:
179193
self.draw_edges(edges=edges, color=edgecolor)
180194

181-
def draw_nodes(self,
182-
nodes: Optional[List[int]] = None,
183-
color: Optional[Union[str, Color, List[Color], Dict[int, Color]]] = None) -> None:
195+
def draw_nodes(
196+
self,
197+
nodes: Optional[List[int]] = None,
198+
color: Optional[Union[str, Color, List[Color], Dict[int, Color]]] = None,
199+
) -> None:
184200
"""Draw a selection of nodes.
185201
186202
Parameters
@@ -215,17 +231,16 @@ def draw_nodes(self,
215231
circles.append(circle)
216232

217233
collection = PatchCollection(
218-
circles,
219-
match_original=True,
220-
zorder=self.zorder_nodes,
221-
alpha=1.0
234+
circles, match_original=True, zorder=self.zorder_nodes, alpha=1.0
222235
)
223236
self.plotter.axes.add_collection(collection)
224237
self._nodecollection = collection
225238

226-
def draw_edges(self,
227-
edges: Optional[Tuple[int, int]] = None,
228-
color: Optional[Union[str, Color, List[Color], Dict[int, Color]]] = None) -> None:
239+
def draw_edges(
240+
self,
241+
edges: Optional[Tuple[int, int]] = None,
242+
color: Optional[Union[str, Color, List[Color], Dict[int, Color]]] = None,
243+
) -> None:
229244
"""Draw a selection of edges.
230245
231246
Parameters
@@ -259,9 +274,9 @@ def draw_edges(self,
259274
lines,
260275
linewidths=widths,
261276
colors=colors,
262-
linestyle='solid',
277+
linestyle="solid",
263278
alpha=1.0,
264-
zorder=self.zorder_edges
279+
zorder=self.zorder_edges,
265280
)
266281
self.plotter.axes.add_collection(collection)
267282
self._edgecollection = collection
@@ -292,19 +307,20 @@ def draw_nodelabels(self, text: Optional[Dict[int, str]] = None) -> None:
292307
color = (0, 0, 0) if is_color_light(bgcolor) else (1, 1, 1)
293308

294309
text = self.node_text.get(node, None)
295-
print(text)
296310
if text is None:
297311
continue
298312

299313
x, y = self.node_xyz[node][:2]
300314
artist = self.plotter.axes.text(
301-
x, y,
302-
f'{text}',
315+
x,
316+
y,
317+
f"{text}",
303318
fontsize=self.plotter.fontsize,
304-
family='monospace',
305-
ha='center', va='center',
319+
family="monospace",
320+
ha="center",
321+
va="center",
306322
zorder=10000,
307-
color=color
323+
color=color,
308324
)
309325
labels.append(artist)
310326

@@ -343,13 +359,21 @@ def draw_edgelabels(self, text: Optional[Dict[int, str]] = None) -> None:
343359
y = 0.5 * (y0 + y1)
344360

345361
artist = self.plotter.axes.text(
346-
x, y, f'{text}',
362+
x,
363+
y,
364+
f"{text}",
347365
fontsize=self.plotter.fontsize,
348-
family='monospace',
349-
ha='center', va='center',
366+
family="monospace",
367+
ha="center",
368+
va="center",
350369
zorder=10000,
351370
color=(0, 0, 0),
352-
bbox=dict(boxstyle='round, pad=0.3', facecolor=(1, 1, 1), edgecolor=None, linewidth=0)
371+
bbox=dict(
372+
boxstyle="round, pad=0.3",
373+
facecolor=(1, 1, 1),
374+
edgecolor=None,
375+
linewidth=0,
376+
),
353377
)
354378
labels.append(artist)
355379

src/compas_rhino/artists/__init__.py

Lines changed: 49 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,6 @@
8787
from compas.plugins import plugin
8888
from compas.artists import Artist
8989
from compas.artists import ShapeArtist
90-
9190
from compas.geometry import Circle
9291
from compas.geometry import Frame
9392
from compas.geometry import Line
@@ -141,6 +140,7 @@
141140

142141
BaseArtist = RhinoArtist
143142

143+
144144
ShapeArtist.default_color = (255, 255, 255)
145145

146146
# MeshArtist.default_color = (0, 0, 0)
@@ -158,64 +158,64 @@
158158
VolMeshArtist.default_cellcolor = (255, 0, 0)
159159

160160

161-
@plugin(category='drawing-utils', pluggable_name='clear', requires=['Rhino'])
161+
@plugin(category="drawing-utils", pluggable_name="clear", requires=["Rhino"])
162162
def clear_rhino():
163163
compas_rhino.clear()
164164

165165

166-
@plugin(category='drawing-utils', pluggable_name='redraw', requires=['Rhino'])
166+
@plugin(category="drawing-utils", pluggable_name="redraw", requires=["Rhino"])
167167
def redraw_rhino():
168168
compas_rhino.redraw()
169169

170170

171-
@plugin(category='factories', requires=['Rhino'])
171+
@plugin(category="factories", requires=["Rhino"])
172172
def register_artists():
173-
Artist.register(Circle, CircleArtist, context='Rhino')
174-
Artist.register(Frame, FrameArtist, context='Rhino')
175-
Artist.register(Line, LineArtist, context='Rhino')
176-
Artist.register(Plane, PlaneArtist, context='Rhino')
177-
Artist.register(Point, PointArtist, context='Rhino')
178-
Artist.register(Polygon, PolygonArtist, context='Rhino')
179-
Artist.register(Polyline, PolylineArtist, context='Rhino')
180-
Artist.register(Vector, VectorArtist, context='Rhino')
181-
Artist.register(Box, BoxArtist, context='Rhino')
182-
Artist.register(Capsule, CapsuleArtist, context='Rhino')
183-
Artist.register(Cone, ConeArtist, context='Rhino')
184-
Artist.register(Cylinder, CylinderArtist, context='Rhino')
185-
Artist.register(Polyhedron, PolyhedronArtist, context='Rhino')
186-
Artist.register(Sphere, SphereArtist, context='Rhino')
187-
Artist.register(Torus, TorusArtist, context='Rhino')
188-
Artist.register(Mesh, MeshArtist, context='Rhino')
189-
Artist.register(Network, NetworkArtist, context='Rhino')
190-
Artist.register(VolMesh, VolMeshArtist, context='Rhino')
191-
Artist.register(RobotModel, RobotModelArtist, context='Rhino')
192-
Artist.register(Curve, CurveArtist, context='Rhino')
193-
Artist.register(Surface, SurfaceArtist, context='Rhino')
194-
print('Rhino Artists registered.')
173+
Artist.register(Circle, CircleArtist, context="Rhino")
174+
Artist.register(Frame, FrameArtist, context="Rhino")
175+
Artist.register(Line, LineArtist, context="Rhino")
176+
Artist.register(Plane, PlaneArtist, context="Rhino")
177+
Artist.register(Point, PointArtist, context="Rhino")
178+
Artist.register(Polygon, PolygonArtist, context="Rhino")
179+
Artist.register(Polyline, PolylineArtist, context="Rhino")
180+
Artist.register(Vector, VectorArtist, context="Rhino")
181+
Artist.register(Box, BoxArtist, context="Rhino")
182+
Artist.register(Capsule, CapsuleArtist, context="Rhino")
183+
Artist.register(Cone, ConeArtist, context="Rhino")
184+
Artist.register(Cylinder, CylinderArtist, context="Rhino")
185+
Artist.register(Polyhedron, PolyhedronArtist, context="Rhino")
186+
Artist.register(Sphere, SphereArtist, context="Rhino")
187+
Artist.register(Torus, TorusArtist, context="Rhino")
188+
Artist.register(Mesh, MeshArtist, context="Rhino")
189+
Artist.register(Network, NetworkArtist, context="Rhino")
190+
Artist.register(VolMesh, VolMeshArtist, context="Rhino")
191+
Artist.register(RobotModel, RobotModelArtist, context="Rhino")
192+
Artist.register(Curve, CurveArtist, context="Rhino")
193+
Artist.register(Surface, SurfaceArtist, context="Rhino")
194+
print("Rhino Artists registered.")
195195

196196

197197
__all__ = [
198-
'BaseArtist',
199-
'RhinoArtist',
200-
'CircleArtist',
201-
'FrameArtist',
202-
'LineArtist',
203-
'PlaneArtist',
204-
'PointArtist',
205-
'PolygonArtist',
206-
'PolylineArtist',
207-
'VectorArtist',
208-
'BoxArtist',
209-
'CapsuleArtist',
210-
'ConeArtist',
211-
'CylinderArtist',
212-
'PolyhedronArtist',
213-
'SphereArtist',
214-
'TorusArtist',
215-
'MeshArtist',
216-
'NetworkArtist',
217-
'VolMeshArtist',
218-
'RobotModelArtist',
219-
'CurveArtist',
220-
'SurfaceArtist',
198+
"BaseArtist",
199+
"RhinoArtist",
200+
"CircleArtist",
201+
"FrameArtist",
202+
"LineArtist",
203+
"PlaneArtist",
204+
"PointArtist",
205+
"PolygonArtist",
206+
"PolylineArtist",
207+
"VectorArtist",
208+
"BoxArtist",
209+
"CapsuleArtist",
210+
"ConeArtist",
211+
"CylinderArtist",
212+
"PolyhedronArtist",
213+
"SphereArtist",
214+
"TorusArtist",
215+
"MeshArtist",
216+
"NetworkArtist",
217+
"VolMeshArtist",
218+
"RobotModelArtist",
219+
"CurveArtist",
220+
"SurfaceArtist",
221221
]

0 commit comments

Comments
 (0)