8
8
from . import WorkerFinder
9
from ..params import parse_paramtypelist
9
from ..params import parse_paramtypelist, get_param_pullantennas
11
11
class WorkerManager(object):
12
12
_workerfinderclass = WorkerFinder
14
workerbuilder, workerinstancemanager, pmanager,
14
workerbuilder, workerinstancemanager, pmanager,
15
15
pworkercreator, pdronecreator = None,
26
26
self._workerfinder_local = None
27
27
self._worker_parameters = {}
28
28
self._worker_metaparameters = {}
29
self._antennafoldstate = None
29
30
self._typelist_listeners = []
30
31
self._used_typelist = set()
31
32
self._with_blocks = with_blocks
33
def set_antennafoldstate(self, antennafoldstate):
34
self._antennafoldstate = antennafoldstate
33
36
def _remove_workerfinder(self, wf):
35
38
workers = wf.workers
225
228
args = parse_paramtypelist(wi.paramtypelist, arglist)
226
229
for paramname, a in zip(wi.paramnames,args):
227
230
if a is not None: pvalues[paramname] = a
228
self._worker_parameters[workerid] = [workertype, wi.paramnames, wi.paramtypelist, pvalues]
231
self._worker_parameters[workerid] = [workertype, wi.paramnames, wi.paramtypelist, pvalues, wi.guiparams]
232
if self._antennafoldstate is not None:
235
if wi.guiparams is not None:
236
gp = wi.guiparams.get("guiparams", {})
237
antennas = wi.guiparams.get("antennas", {})
238
pullantennas = get_param_pullantennas(antennas)
239
self._antennafoldstate.create_worker(
229
244
self._wim.set_parameters(workerid, pvalues)
231
246
def _select(self, workerids):
253
268
def _pwindow_select_worker_params(self, workerid):
254
269
params = self._worker_parameters[workerid]
270
workertype = params[0]
272
wi = self._wim.get_workerinstance(workerid)
273
if wi.guiparams is not None:
274
pullantennas = get_param_pullantennas(wi.guiparams.get("antennas", {}))
275
pullantennas = [p[0] for p in pullantennas]
276
pureparams = [p for p in params[1] if p not in pullantennas]
255
277
up = functools.partial(
256
self._update_worker_parameters, workerid
258
self._pmanager.select_pwidget(workerid, "params",
259
params[1], params[2], params[3], up
278
self._update_worker_parameters, workerid, pureparams
281
if workerid in self._worker_metaparameters:
282
metaparams = self._worker_metaparameters[workerid][4]
283
form_manipulators = self._workerbuilder.get_form_manipulators(workertype, metaparams)
284
if self._antennafoldstate is not None:
285
f = functools.partial(self._antennafoldstate.init_form, workerid)
286
form_manipulators = form_manipulators + [f]
287
widget, controller = self._pmanager.select_pwidget(workerid, "params",
288
params[1], params[2], params[3], up, [], form_manipulators
290
if widget is not None and self._antennafoldstate is not None:
291
self._antennafoldstate.init_widget(workerid, widget, controller)
262
293
def _pwindow_select_worker_metaparams(self, workerid):
263
294
params = self._worker_metaparameters[workerid]
268
299
up = functools.partial(
269
300
self._update_worker_metaparameters, workerid
302
form_manipulators = self._workerbuilder.get_form_manipulators(params[0], None)
271
303
self._pmanager.select_pwidget(workerid, "metaparams",
272
params[2], params[3], params[4], up, buttons
304
params[2], params[3], params[4], up, buttons, form_manipulators
275
307
def get_new_empty_workerid(self):
355
387
workerid = self.get_new_workerid(workertype)
357
389
self.instantiate(workerid, workertype, x, y, metaparamvalues)
390
if self._antennafoldstate is not None:
391
self._antennafoldstate.sync(workerid, onload=False)
358
392
self.select([workerid])
394
def _meta_autocreate(self, workertype, workerid, x, y):
395
t = self._workerbuilder.get_metaworker(workertype)
396
metaguiparams = t[0].metaguiparams
398
if "autocreate" not in metaguiparams: return False
399
autocreate = metaguiparams["autocreate"]
400
if not isinstance(autocreate, dict):
401
raise ValueError("%s.metaguiparams[\"autocreate\"] must be a dict with default values for all metaparameters, not '%s'" % (workertype, autocreate))
403
if p not in autocreate:
404
raise ValueError("%s.metaguiparams[\"autocreate\"] must be a dict with default values for all metaparameters; missing parameter '%s'" % (workertype, p))
405
self.instantiate(workerid, workertype, x, y, autocreate)
361
409
workerid, workertype, x, y, metaparamvalues = None, paramvalues = None
370
418
if metaparamvalues is None and self._workerbuilder.has_metaworker(workertype):
371
419
assert paramvalues is None
420
autocreate = self._meta_autocreate(workertype, workerid, x, y)
422
if self._antennafoldstate is not None:
423
self._antennafoldstate.sync(workerid, onload=False)
372
425
empty_workerid = self.get_new_empty_workerid()
373
426
self.meta_empty_instantiate(empty_workerid, workertype, x, y)
374
427
return empty_workerid
376
429
self.instantiate(workerid, workertype, x, y, metaparamvalues, paramvalues)
430
if self._antennafoldstate is not None:
431
self._antennafoldstate.sync(workerid, onload=False)
379
434
def create_drone(self,workerid, dronetype, x, y, paramvalues = None):
392
447
def _remove(self, workerid):
393
448
self._pmanager.delete_pwidget(workerid)
394
449
self._worker_parameters.pop(workerid, None)
450
if self._antennafoldstate is not None:
451
self._antennafoldstate.remove_worker(workerid)
395
452
m = self._worker_metaparameters.pop(workerid, None)
396
453
if m is not None:
420
477
raise ValueError("workerid already exists: '%s'" % new_workerid)
421
478
self._pmanager.rename_pwidget(old_workerid, new_workerid)
422
479
self._wim.rename_workerinstance(old_workerid, new_workerid)
480
if self._antennafoldstate is not None:
481
self._antennafoldstate.rename_worker(old_workerid, new_workerid)
424
483
def gui_renames_worker(self, old_workerid, new_workerid):
428
487
ok = self._rename_worker(old_workerid, new_workerid)
429
488
if not ok: return False
430
489
self._wim.rename_workerinstance(old_workerid, new_workerid)
490
if self._antennafoldstate is not None:
491
self._antennafoldstate.rename_worker(old_workerid, new_workerid)
433
def _update_worker_parameters(self, workerid, parameters):
494
def _update_worker_parameters(self, workerid, paramnames, parameters):
434
495
#print("UP", workerid, parameters)
435
496
params_old = self._worker_parameters[workerid][3]
436
497
if parameters is None:
437
498
if params_old is None: return
440
if params_old is None: params_old = {}
442
for param,value in parameters.items():
443
if param not in params_old or value != params_old[param]:
444
new_parameters[param] = value
445
self._wim.set_parameters(workerid, new_parameters)
503
if p in paramnames: paramcopy[p] = parameters[p]
504
parameters = paramcopy
505
self._wim.set_parameters(workerid, parameters)
446
506
self._worker_parameters[workerid][3] = parameters
448
508
def _update_worker_metaparameters(self, workerid, parameters):
450
510
if parameters is None: return #TODO: may not be the sane thing to do
451
511
self._worker_metaparameters[workerid][4] = parameters
513
def _update_variable(self, varid, value):
514
self._update_worker_parameters(varid, ["value"], {"value":value})
453
516
def get_worker_descriptor(self, workerid):
454
517
node, mapping = self._wim.get_node(workerid)
455
518
if node.empty: return None
456
profile = self._wim.get_workerinstance(workerid).curr_profile
519
inst = self._wim.get_workerinstance(workerid)
520
profile = inst.curr_profile
457
522
workertype, params, metaparams = self.get_parameters(workerid)
458
523
x,y = node.position
459
desc = (workerid,workertype,x,y,metaparams,params, profile)
524
desc = (workerid,workertype,x,y,metaparams,params, profile, gp)
462
527
def workerids(self):
476
541
if workerid in self._worker_parameters:
477
542
p = self._worker_parameters[workerid]
478
543
workertype = p[0]
480
545
if len(params) == 0: params = None
481
546
if workerid in self._worker_metaparameters:
482
547
p = self._worker_metaparameters[workerid]
538
603
self._workerfinder_local = None
605
def sync_antennafoldstate(self):
606
if self._antennafoldstate is None: return
607
for workerid in self._wim.get_workerinstances():
608
self._antennafoldstate.sync(workerid, onload=True)
b'\\ No newline at end of file'