5
5
import threading
6
6
7
7
import nengo
8
- from nengo import spa
9
8
import json
10
9
11
10
from nengo_gui .components .component import Component
15
14
import nengo_gui .user_action
16
15
import nengo_gui .layout
17
16
17
+
18
18
class NetGraph (Component ):
19
19
"""Handles computations and communications for NetGraph on the JS side.
20
20
@@ -53,6 +53,7 @@ def attach(self, page, config, uid):
53
53
self .last_modify_time = None
54
54
except TypeError : # happens if self.filename is None
55
55
self .last_modify_time = None
56
+
56
57
self .last_reload_check = time .time ()
57
58
58
59
def check_for_reload (self ):
@@ -85,7 +86,7 @@ def reload(self, code=None):
85
86
with self .page .lock :
86
87
self ._reload (code = code )
87
88
88
- def _reload (self , code = None ):
89
+ def _reload (self , code = None ): # noqa: C901
89
90
"""Loads and executes the code, removing old items,
90
91
updating changed items
91
92
and adding new ones"""
@@ -138,7 +139,8 @@ def _reload(self, code=None):
138
139
new_item = None
139
140
140
141
same_class = False
141
- for cls in [nengo .Ensemble , nengo .Node , nengo .Network , nengo .Connection ]:
142
+ for cls in [nengo .Ensemble , nengo .Node , nengo .Network ,
143
+ nengo .Connection ]:
142
144
if isinstance (new_item , cls ) and isinstance (old_item , cls ):
143
145
same_class = True
144
146
break
@@ -151,7 +153,8 @@ def _reload(self, code=None):
151
153
elif not same_class :
152
154
# don't allow changing classes
153
155
keep_object = False
154
- elif self .get_extra_info (new_item ) != self .get_extra_info (old_item ):
156
+ elif (self .get_extra_info (new_item ) !=
157
+ self .get_extra_info (old_item )):
155
158
keep_object = False
156
159
157
160
if not keep_object :
@@ -191,7 +194,8 @@ def _reload(self, code=None):
191
194
removed_items = list (removed_uids .values ())
192
195
for c in self .page .components [:]:
193
196
for item in c .code_python_args (old_default_labels ):
194
- if item not in self .uids .keys () and item not in collapsed_items :
197
+ if (item not in self .uids .keys () and
198
+ item not in collapsed_items ):
195
199
196
200
# item is a python string that is an argument to the
197
201
# constructor for the Component. So it could be 'a',
@@ -203,7 +207,7 @@ def _reload(self, code=None):
203
207
# The following lambda should do this, handling both
204
208
# the normal argument case and the keyword argument case.
205
209
safe_eval = ('(lambda *a, **b: '
206
- 'list(a) + list(b.values()))(%s)[0]' )
210
+ 'list(a) + list(b.values()))(%s)[0]' )
207
211
208
212
# this Component depends on an item inside a collapsed
209
213
# Network, so we need to check if that component has
@@ -270,8 +274,8 @@ def _reload(self, code=None):
270
274
index = component_uids .index (name )
271
275
old_component = self .page .components [index ]
272
276
if isinstance (obj , (nengo_gui .components .SimControlTemplate ,
273
- nengo_gui .components .AceEditorTemplate ,
274
- nengo_gui .components .NetGraphTemplate )):
277
+ nengo_gui .components .AceEditorTemplate ,
278
+ nengo_gui .components .NetGraphTemplate )):
275
279
# just keep these ones
276
280
components .append (old_component )
277
281
else :
@@ -292,12 +296,14 @@ def _reload(self, code=None):
292
296
# notifies SimControl to pause the simulation
293
297
self .page .changed = True
294
298
295
- def _reload_update_item (self , uid , old_item , new_item , new_name_finder ):
299
+ def _reload_update_item (self , uid , old_item , new_item , new_name_finder ): # noqa: C901
296
300
"""Tell the client about changes to the item due to reload."""
297
301
changed = False
302
+
298
303
if isinstance (old_item , (nengo .Node ,
299
304
nengo .Ensemble ,
300
305
nengo .Network )):
306
+
301
307
old_label = self .page .get_label (old_item )
302
308
new_label = self .page .get_label (
303
309
new_item , default_labels = new_name_finder .known_name )
@@ -351,6 +357,7 @@ def _reload_update_item(self, uid, old_item, new_item, new_name_finder):
351
357
return changed
352
358
353
359
def get_parents (self , uid , default_labels = None ):
360
+ """Get parent networks for a connection"""
354
361
while uid not in self .parents :
355
362
net = self .networks_to_search .pop (0 )
356
363
net_uid = self .page .get_uid (net , default_labels = default_labels )
@@ -479,6 +486,8 @@ def act_create_modal(self, uid, **info):
479
486
self .to_be_sent .append (dict (type = 'js' , code = js ))
480
487
481
488
def expand_network (self , network , client ):
489
+ """Display an expanded network, including the root network"""
490
+
482
491
if not self .page .config [network ].has_layout :
483
492
pos = self .layout .make_layout (network )
484
493
for obj , layout in pos .items ():
@@ -491,36 +500,45 @@ def expand_network(self, network, client):
491
500
else :
492
501
parent = self .page .get_uid (network )
493
502
for ens in network .ensembles :
494
- self .create_object (client , ens , type = 'ens' , parent = parent )
503
+ self .create_object (client , ens , obj_type = 'ens' , parent = parent )
495
504
for node in network .nodes :
496
- self .create_object (client , node , type = 'node' , parent = parent )
505
+ self .create_object (client , node , obj_type = 'node' , parent = parent )
497
506
for net in network .networks :
498
- self .create_object (client , net , type = 'net' , parent = parent )
507
+ self .create_object (client , net , obj_type = 'net' , parent = parent )
499
508
for conn in network .connections :
500
509
self .create_connection (client , conn , parent = parent )
501
510
self .page .config [network ].expanded = True
502
511
503
- def create_object (self , client , obj , type , parent ):
512
+ def create_object (self , client , obj , obj_type , parent ):
513
+ """Send the JSON of the newly created objects to client-side"""
504
514
uid = self .page .get_uid (obj )
515
+
516
+ # if the uid already exists, then it's already been inserted in
517
+ # the netgraph, so don't send anything
505
518
if uid in self .uids :
506
519
return
507
520
521
+ self .uids [uid ] = obj
522
+
508
523
pos = self .page .config [obj ].pos
509
524
if pos is None :
510
525
import random
511
526
pos = random .uniform (0 , 1 ), random .uniform (0 , 1 )
512
527
self .page .config [obj ].pos = pos
528
+
513
529
size = self .page .config [obj ].size
514
530
if size is None :
515
531
size = (0.1 , 0.1 )
516
532
self .page .config [obj ].size = size
533
+
517
534
label = self .page .get_label (obj )
518
- self . uids [ uid ] = obj
519
- info = dict (uid = uid , label = label , pos = pos , type = type , size = size ,
535
+
536
+ info = dict (uid = uid , label = label , pos = pos , type = obj_type , size = size ,
520
537
parent = parent )
538
+ info .update (self .get_extra_info (obj ))
539
+
521
540
if type == 'net' :
522
541
info ['expanded' ] = self .page .config [obj ].expanded
523
- info .update (self .get_extra_info (obj ))
524
542
525
543
client .write_text (json .dumps (info ))
526
544
0 commit comments