Files
2026-06-17 14:00:51 +02:00

692 lines
34 KiB
Python

# Script to automatically Generate a Network graph of a layout
# Used to create a path between stations on layout
#
# Author: Bill Fitch, copyright 2020
# Part of the JMRI distribution
import sys
import jmri
import os
my_path_to_jars = jmri.util.FileUtil.getExternalFilename('program:jython/DispatcherSystem/jars/jgrapht.jar')
sys.path.append(my_path_to_jars) # add the jar to your path
#Jgrapht reference
#http://www.java2s.com/Code/Jar/j/Downloadjgraphtjar.htm
from org.jgrapht.graph import DefaultEdge
from org.jgrapht.graph import DefaultWeightedEdge
from org.jgrapht.graph import DirectedWeightedMultigraph
class StationGraph(jmri.jmrit.automat.AbstractAutomaton):
def __init__(self):
self.logLevel = 0
if self.logLevel > 0: print "initialising graph"
self.g = DirectedWeightedMultigraph(DefaultWeightedEdge)
self.g_stopping = DirectedWeightedMultigraph(DefaultWeightedEdge)
self.g_express = DirectedWeightedMultigraph(DefaultWeightedEdge)
self.station_block_list = []
self.station_blk_list = []
self.dict_path_stopping = {}
self.dict_path_express = {}
self.dict_path_name_stopping= {}
self.dict_path_name_express= {}
if self.logLevel > 2: print "graph block list"
self.setup_station_block_list()
if self.logLevel > 0: print "graph vertices"
self.setup_graph_vertices()
if self.logLevel > 0: print "graph inhibited blocks"
self.get_list_inhibited_blocks()
if self.logLevel > 0: print "graph edges"
self.setup_graph_edges()
if self.logLevel > 0: print "finished graph init"#
# **************************************************
# Set up station block list either from manual list or from Block Table
# **************************************************
def setup_station_block_list(self):
BlockManager = jmri.InstanceManager.getDefault(jmri.BlockManager)
if self.logLevel > 1: print "Block", BlockManager.getNamedBeanSet()
for block in BlockManager.getNamedBeanSet():
#blocks with the word stop in the comment are stations
comment = block.getComment()
if comment != None:
if "stop" in comment.lower():
station_block_name = block.getUserName()
self.station_block_list.append(station_block_name)
self.station_blk_list.append(self.get_layout_block(station_block_name))
# Also add any blocks associated with turntables
for panel in jmri.InstanceManager.getDefault(jmri.jmrit.display.EditorManager).getAll(jmri.jmrit.display.layoutEditor.LayoutEditor):
turntables = panel.getLayoutTurntables()
if not turntables:
continue
for turntable in turntables:
if turntable.getLayoutBlock() is not None:
station_block_name = turntable.getLayoutBlock().getUserName()
if station_block_name not in self.station_block_list:
if self.logLevel > 0: print "Found turntable block: " + station_block_name
self.station_block_list.append(station_block_name)
self.station_blk_list.append(self.get_layout_block(station_block_name))
# Add any blocks associated with traversers
if self.logLevel > 0: print "adding traverser blocks, before ", 'self.station_block_list' , self.station_block_list
for panel in jmri.InstanceManager.getDefault(jmri.jmrit.display.EditorManager).getAll(jmri.jmrit.display.layoutEditor.LayoutEditor):
if self.logLevel > 0: print "panel", panel
traversers = panel.getLayoutTraversers()
if not traversers:
if self.logLevel > 0: print "no traversers"
continue
else:
if self.logLevel > 0: print "traversers", traversers
for traverser in traversers:
if self.logLevel > 0: print "traverser", traverser.getLayoutBlock()
if traverser.getLayoutBlock() is not None:
station_block_name = traverser.getLayoutBlock().getUserName()
if station_block_name not in self.station_block_list:
if self.logLevel > 0: print "Found traverser block: " + station_block_name
self.station_block_list.append(station_block_name)
self.station_blk_list.append(self.get_layout_block(station_block_name))
if self.logLevel > 0: print 'self.station_block_list' , self.station_block_list
def get_layout_block(self, block_name):
LayoutBlockManager=jmri.InstanceManager.getDefault(jmri.jmrit.display.layoutEditor.LayoutBlockManager)
layoutBlock = LayoutBlockManager.getLayoutBlock(block_name)
return layoutBlock
def setup_graph_vertices(self):
for station_block_name in self.station_block_list:
station_block_name = station_block_name
if self.logLevel > 1: print "station_block_name",station_block_name
lblk = self.get_layout_block(station_block_name)
if self.logLevel > 1: print "lblk",lblk
if lblk != None:
self.g.addVertex(lblk)
self.g_express.addVertex(station_block_name)
if self.logLevel > 2: print station_block_name , ",",
self.g_stopping.addVertex(station_block_name)
else:
self.displayMessage("Probably trying to set a station for non-existant block. Examine the stop comments in the blocks")
xxxxstopxxxxx # stop the program with non-python statement
if self.logLevel > 2: print
if self.logLevel > 3: print 'end setup_graph_vertices"
# except Exception, e:
# self.logLevel > 0: print "help"
# self.logLevel > 0: print("Probably trying to set a station (look at stop comments in the blocks) for non-existant block")
# finally:
# pass
def setup_graph_edges(self):
global le
self.logLevel = 0
if self.logLevel > 3: print "*****************************"
if self.logLevel > 2: print "****setup_graph_edges********"
if self.logLevel > 3: print "*****************************"
LayoutBlockConnectivityTools=jmri.jmrit.display.layoutEditor.LayoutBlockConnectivityTools()
index = 0
if self.logLevel > 3: print "self.station_block_list", self.station_block_list
for station in self.station_block_list:
if self.logLevel > 1: print "*********************"
if self.logLevel > 1: print "station = " ,station
if self.logLevel > 1: print "*********************"
station_block = self.get_layout_block(station)
station_block_name = station_block.getUserName()
if self.logLevel > 3: print "station_block_name",station_block_name
if self.logLevel > 2: print "number of neighbors", station_block.getNumberOfNeighbours()
for i in range(station_block.getNumberOfNeighbours()):
if self.logLevel > 1: print "+++++++++++++++++++++++++"
neighbor_name = station_block.getNeighbourAtIndex(i).getDisplayName()
if self.logLevel > 1: print "neighbor_name",neighbor_name
other_stations = [block for block in self.station_block_list if block not in [station]]
if self.logLevel > 3: print "other_stations",other_stations
j = 0
for destination in other_stations:
index +=1
j += 1
if self.logLevel > 3: print "--------------------------"
if self.logLevel > 3: print "destination", j ,destination
if self.logLevel > 3: print "--------------------------"
sourceLayoutBlock = station_block
destinationLayoutBlock = self.get_layout_block(destination)
protectingLayoutBlock = self.get_layout_block(neighbor_name)
validateOnly = False
pathMethod = LayoutBlockConnectivityTools.Routing.NONE
path = []
success = False
if self.logLevel > 1: print "trying: ", sourceLayoutBlock.getUserName(), \
" --> ", destinationLayoutBlock.getUserName()
try:
[path, path_weight] = self.get_optimal_path(sourceLayoutBlock, destinationLayoutBlock, protectingLayoutBlock, validateOnly, pathMethod) #take account of inhibited directions
path_name = [str(x.getUserName()) for x in path]
if self.logLevel > 3: print path, path_name
success = True
except jmri.JmriException as e:
#print "exception in path"
#print "exception: sourceLayoutBlock", sourceLayoutBlock.getUserName(), \
# "destinationLayoutBlock", destinationLayoutBlock.getUserName()
# print (e)
# Was not able to find a direct path. This is expected for many stations.
# Continue and find the connected stations
continue
finally:
if success:
x = "yes"
else:
x = "no"
if x == "yes":
if self.logLevel > 1: print "found: ", sourceLayoutBlock.getUserName(), \
" --> ", destinationLayoutBlock.getUserName() , x,
if sourceLayoutBlock.getUserName() == "SidingBottomLHS" and \
destinationLayoutBlock.getUserName() == "SidingMiddlleRHS":
if self.logLevel > 3: print "for SidingBottomLHS path is " , path_name
if path != [] and path != None :
#add an edge for all paths to form the express train graph
path_name = [str(x.getUserName()) for x in path]
if self.logLevel > 1: print "path_name", path_name
edge = self._create_and_populate_edge(index, path, path_name, neighbor_name)
if self.Sufficient_signal_masts_in_edge(edge):
self.g_express.addEdge(station_block_name,destination, edge)
self.g_express.setEdgeWeight(edge, path_weight)
if self.logLevel > 3: print edge.to_string()
if self.logLevel > 3: print "got here 4a3"
if self.logLevel > 3: print "self.g_express",self.g_express
#add only edges for paths that do not go through a station for stopping train graph
through_stations = [str(block_name) for block_name in self.station_block_list if block_name not in [station,destination]]
# if self.logLevel > 3: print "path", path_name
# if self.logLevel > 3: print "all through_stations not at start and end", through_stations
# if self.logLevel > 3: print "through stations check" ,[item in through_stations for item in path_name]
# if self.logLevel > 3: print "through stations in path" ,[ item for item in path_name if item in through_stations]
path_blocks_are_through_stations = [item in through_stations for item in path_name]
if self.logLevel > 3: print "any through stations" ,any(path_blocks_are_through_stations)
if self.logLevel > 3: print "not any through stations" , not any(path_blocks_are_through_stations)
if not any(path_blocks_are_through_stations):
#add to stopping graph
if self.logLevel > 3: print "adding to stopping graph"
edge = self._create_and_populate_edge(index, path, path_name, neighbor_name)
self.g_stopping.addEdge(station_block_name,destination,edge)
self.g_stopping.setEdgeWeight(edge, path_weight)
if self.logLevel > 3: print edge.to_string()
else:
if self.logLevel > 3: print "not adding to stopping graph as insufficient masts", "edge " , path_name
else:
if self.logLevel > 3: print "not adding to stopping graph"
pass
if self.logLevel > 3: print "*********************************"
else:
if self.logLevel > 3: print "got here 4b"
pass
if self.logLevel > 3: print "&&&&&&&&&&&&&&&&&&&&&"
if self.logLevel > 3: print "&& graph up to now &&"
if self.logLevel > 3: print "&&&&&&&&&&&&&&&&&&&&&"
# for e in self.g_express.edgeSet():
# self.logLevel > 0: print e.to_string()
if self.logLevel > 3: print "&&&&&&&&&&&&&&&&&&&&&"
if self.logLevel > 3: print "&& end graph up to now &&"
if self.logLevel > 3: print "&&&&&&&&&&&&&&&&&&&&&
if self.logLevel > 3: print "&&&&&&&&&&&&&&&&&&&&&"
if self.logLevel > 2: print "&& express"
if self.logLevel > 3: print "&&&&&&&&&&&&&&&&&&&&&"
for e in self.g_express.edgeSet():
if self.logLevel > 2: print (self.g_express.getEdgeSource(e) + " --> " + self.g_express.getEdgeTarget(e))
if self.logLevel > 3: print "&&&&&&&&&&&&&&&&&&&&&"
if self.logLevel > 2: print "&& stopping"
if self.logLevel > 3: print "&&&&&&&&&&&&&&&&&&&&&"
for e in self.g_stopping.edgeSet():
if self.logLevel > 2: print (self.g_stopping.getEdgeSource(e) + " --> " + self.g_stopping.getEdgeTarget(e))
#set the indicators for the train to reverse
for e in self.g_stopping.edgeSet():
if self.logLevel > 3: print "edge = ",e
try:
if self.logLevel > 3: print e, "Target", e.getTarget()
if self.logLevel > 3: print e, "Source", e.getSource()
opposite_direction_edge = self.g_stopping.getEdge(e.getTarget(),e.getSource())
opposite_direction_neighbor_name = opposite_direction_edge.getItem("neighbor_name")
e.setItem(opposite_direction_neighbor_name=opposite_direction_neighbor_name)
if self.logLevel > 3: print "set opposite direction neighbor_name for edge" , e.to_string()
except:
if self.logLevel > 3: print "unable to set opposite direction neighbor_name for edge" , e.to_string()
continue
def _create_and_populate_edge(self, index, path, path_name, neighbor_name):
"""
Creates a new LabelledEdge and populates it with path information.
This is a helper method to reduce code duplication.
"""
if self.logLevel > 0: print "create_and_populate_edge", "path", path, "path_name", path_name, "neighbor_name", neighbor_name, "index", index
global le
edge = le() # le = LabelledEdge() set up outside CreateGraph.py
edge.setItem(index=index)
edge.setItem(path=path)
edge.setItem(path_name=path_name)
edge.setItem(neighbor_name=neighbor_name)
LayoutBlockManager = jmri.InstanceManager.getDefault(jmri.jmrit.display.layoutEditor.LayoutBlockManager)
firstLayoutBlock = LayoutBlockManager.getLayoutBlock(path_name[0])
if self.logLevel > 0: print "firstLayoutBlock", firstLayoutBlock
if firstLayoutBlock:
first_block_name = firstLayoutBlock.getUserName()
edge.setItem(first_block_name=first_block_name)
else:
if self.logLevel > 0: print "ERROR: firstLayoutBlock is None for path_name[0] = ", path_name[0]
secondLayoutBlock = LayoutBlockManager.getLayoutBlock(path_name[1])
if self.logLevel > 0: print "secondLayoutBlock", secondLayoutBlock
if secondLayoutBlock:
second_block_name = secondLayoutBlock.getUserName()
edge.setItem(second_block_name=second_block_name)
else:
if self.logLevel > 0: print "ERROR: secondLayoutBlock is None for path_name[1] = ", path_name[1]
lastLayoutBlock = LayoutBlockManager.getLayoutBlock(path_name[-1])
if self.logLevel > 0: print "lastLayoutBlock", lastLayoutBlock
if lastLayoutBlock:
last_block_name = lastLayoutBlock.getUserName()
edge.setItem(last_block_name=last_block_name)
else:
if self.logLevel > 0: print "ERROR: lastLayoutBlock is None for path_name[-1] = ", path_name[-1]
penultimateLayoutBlock = LayoutBlockManager.getLayoutBlock(path_name[-2])
if self.logLevel > 0: print "penultimateLayoutBlock", penultimateLayoutBlock
if penultimateLayoutBlock:
penultimate_block_name = penultimateLayoutBlock.getUserName()
edge.setItem(penultimate_block_name=penultimate_block_name)
if self.logLevel > 0: print "returning _create_and_populate_edge", edge
return edge
def path_weight(self, path):
path_name = [str(x.getUserName()) for x in path]
path_weight = [x.getBlock().getLengthMm() for x in path]
pweight = sum(path_weight) + 1 # add 1 so paths of equal length will have a smaller weight if the train stops less
path_inhibited = self.path_is_inhibited(path_name)
if path_inhibited: pweight = pweight + 10000 # allow a very long alternate route
return pweight
def get_optimal_path(self,sourceLayoutBlock, destinationLayoutBlock, protectingLayoutBlock, validateOnly, pathMethod):
# print "in get_optimal_patha"
self.allow_all_blocks()
LayoutBlockConnectivityTools=jmri.jmrit.display.layoutEditor.LayoutBlockConnectivityTools()
# print "in get_optimal_pathb"
# print "sourceLayoutBlock", sourceLayoutBlock.getUserName()
# print "destinationLayoutBlock", destinationLayoutBlock.getUserName()
# print "protectingLayoutBlock", protectingLayoutBlock.getUserName()
# get the first path with no inhibited blocks
validateOnly = True
# print "calculating path"
path = LayoutBlockConnectivityTools.getLayoutBlocks(sourceLayoutBlock, destinationLayoutBlock, protectingLayoutBlock, validateOnly, pathMethod)
# print "path", path
path_name = [str(x.getUserName()) for x in path]
# print "path_name", path_name
#block_names = [x.getBlock().getUserName() for x in path]
# print "in get_optimal_pathc"
weight = self.path_weight(path)
# print "weight", weight
if self.logLevel > 3: print "*****************"
msg = "path is not null" if path != [] else "path is null"
if self.logLevel > 3: print sourceLayoutBlock.getUserName(), destinationLayoutBlock.getUserName(), msg
# print
# print "in get_optimal_path d"
# print "first path name", path_name
# print "block_names", block_names
# print "self.path_is_inhibited(path)", self.path_is_inhibited(path_name)
# print
paths = []
# get an alternate path if the path found is inhibited `
# if sourceLayoutBlock.getUserName() == "SidingMiddlleLHS" \
# and destinationLayoutBlock.getUserName() == "SidingMiddlleRHS":
# # print "bingo"
# # print "first path name", path_name, "weight", weight
# inhibited = self.path_is_inhibited(path_name)
# # print "self.path_is_inhibited(path)", self.path_is_inhibited(path_name)
paths.append([path,weight])
if self.path_is_inhibited(path_name):
# print "path is inhibited"
# print "paths1", paths
# get the path and weight with blocks not allowed
not_allowed_blocks = self.get_blocks_to_not_allow(path)
# print "not_allowed_blocks", not_allowed_blocks
self.set_do_not_allow_blocks(not_allowed_blocks)
validateOnly = False
try:
#try calculating a new path without the inhibited blocks
new_path = LayoutBlockConnectivityTools.getLayoutBlocks(sourceLayoutBlock, destinationLayoutBlock, protectingLayoutBlock, validateOnly, pathMethod)
# if we get this far there is an alternate path which avoids the inhibited blocks.
# Use this for the express route
# print "calculated new path"
# print "new path", new_path
path_name = [str(x.getUserName()) for x in new_path]
self.allow_all_blocks()
new_weight = self.path_weight(new_path)
# print "new path", path
# print "new path", path_name, "weight", weight
if [new_path, new_weight] not in paths:
paths.append([new_path, new_weight])
# print "paths2", paths
# get the best one
# print "paths", paths
[path, weight] = self.path_with_smallest_weight(paths)
# print "path", path, "weight", weight
path_name = [str(x.getUserName()) for x in path]
# print "best path", path_name, "weight", weight
except:
# if the try does not work we continue using the original calucated path
pass
return [path, weight]
def blocks_to_allow(self, path):
source_block = path[0].getUserName()
protecting_block = path[1].getUserName()
destination_block = path[-1].getUserName()
protecting_destination_block = path[-2].getUserName()
return [source_block,protecting_block,protecting_destination_block,destination_block]
def get_blocks_to_not_allow(self, path):
# print "+++++++ get_blocks_to_not_allow +++++"
path_name = [str(x.getUserName()) for x in path]
inhibited_blocks = self.list_inhibited_blocks
list_blocks_to_not_allow = []
if inhibited_blocks != None:
for block_pair in inhibited_blocks:
# print "block_pair", block_pair
# print "inhibited_blocks", inhibited_blocks
if self.sublist_in_list(block_pair, path_name):
# block_pair contains the blocks to inhibit
blocks_to_not_allow = [blk for blk in block_pair if blk not in self.blocks_to_allow(path)]
# print "self.blocks_to_allow(path)", self.blocks_to_allow(path)
# print "blocks_to_not_allow", blocks_to_not_allow
# print "block_pair", block_pair
list_blocks_to_not_allow.extend(blocks_to_not_allow)
# print "list_blocks_to_not_allow", list_blocks_to_not_allow
path_name = [str(x.getUserName()) for x in path]
#print "path_name", path_name
# print "list_blocks_to_not_allow", list_blocks_to_not_allow
# print "+++++++ end get_blocks_to_not_allow +++++"
return list_blocks_to_not_allow
def set_do_not_allow_blocks(self, inhibited_blocks):
#need to set extra color of blocks
layoutBlocks = [self.get_layout_block(block_name) for block_name in inhibited_blocks]
for layoutBlock in layoutBlocks:
if layoutBlock != None:
layoutBlock.setUseExtraColor(True)
def allow_all_blocks(self):
layoutBlocks = [self.get_layout_block(block) for block in blocks.getNamedBeanSet()]
for layoutBlock in layoutBlocks:
if layoutBlock != None:
layoutBlock.setUseExtraColor(False)
def get_list_inhibited_blocks(self):
list_inhibited_blocks = self.read_list()
self.list_inhibited_blocks = list_inhibited_blocks
# print "list_inhibited_blocks", list_inhibited_blocks
def path_is_inhibited(self, path_name):
existing = self.list_inhibited_blocks
#print "existing", existing
# print "*****path is inhibited *****"
ret = False
if existing != None:
for check in existing:
# print "check", check
# print "path_name", path_name
# print "self.sublist_in_list(check, path_name)", self.sublist_in_list(check, path_name)
# print "*****"
if self.sublist_in_list(check, path_name):
# print "setting ret True"
ret = True
# print "ret", ret
# print "***** end path is inhibited *****"
return ret
def path_with_smallest_weight(self, paths):
best_path = paths[0][0]
best_weight = paths[0][1]
# print "path_with_smallest_weight: best_path", best_path, "BEST_WEIGHT", best_weight
for [path, weight] in paths:
if weight < best_weight:
best_path = path
best_weight = weight
return [best_path, best_weight]
def sublist_in_list(self,sublist, test_list):
res = False
#print "(len(test_list) - len(sublist) + 1)", (len(test_list) - len(sublist) + 1)
for idx in range(len(test_list) - len(sublist) + 1):
#print "test_list[idx : idx + len(sublist)]", test_list[idx : idx + len(sublist)], "sublist", sublist
if test_list[idx : idx + len(sublist)] == sublist:
res = True
break
#print "test_list", test_list, "sublist", sublist, "in_list", res
return res
def directory(self):
path = jmri.util.FileUtil.getUserFilesPath() + "dispatcher" + java.io.File.separator + "blockDirections"
if not os.path.exists(path):
os.makedirs(path)
return path + java.io.File.separator
def write_list(self, a_list):
# store list in binary file so 'wb' mode
file = self.directory() + "blockDirections.txt"
if self.logLevel > 3: print "block_info" , a_list
if self.logLevel > 3: print "file" +file
with open(file, 'wb') as fp:
for items in a_list:
i = 0
for item in items:
fp.write('%s' %item)
if i == 0: fp.write(",")
i+=1
fp.write('\n')
#fp.write('\n'.join(item))
#fp.write(items)
# Read list to memory
def read_list(self):
# for reading also binary mode is important
file = self.directory() + "blockDirections.txt"
n_list = []
try:
with open(file, 'rb') as fp:
for line in fp:
x = line[:-1]
y = x.split(",")
n_list.append(y)
return n_list
except:
return ["",""]
def Sufficient_signal_masts_in_edge(self, e):
global g
if self.logLevel > 0: print "Sufficient_signal_masts_in_edge", e
EditorManager = jmri.InstanceManager.getDefault(jmri.jmrit.display.EditorManager)
layoutPanels = []
for panel in EditorManager.getList():
if type(panel) == jmri.jmrit.display.layoutEditor.LayoutEditor:
layoutPanels.append(panel)
if self.logLevel > 3: print "******* signal_mast_list *******"
if self.logLevel > 3: print "&&&&&&&&&&&&&&&&&&&&&&&&&&&&"
if self.logLevel > 3: print "&&&& producing signal mast list for &&&&", e.getItem("path_name")
if self.logLevel > 3: print "&&&&&&&&&&&&&&&&&&&&&&&&&&&&"
signal_mast_list = java.util.ArrayList()
signal_mast_list_all = java.util.ArrayList() #all the signal masts, possibly in a jumbled list, due to them being appended haphazardly
signal_mast_list_view = []
signal_mast_list_views = java.util.ArrayList()
panelNo = 0
no_panels_used = 0
for panel in layoutPanels:
if panel.getLayoutName() == "Dispatcher System" : continue
panelNo += 1
if self.logLevel > 3: print "*****panel" ,panelNo,"**********panelName", panel.getLayoutName()
# 1) get the signal mast list excluding the last signal mast
#if self.logLevel > 3: print "stopping",g.dict_path_stopping
if self.logLevel > 3: print "edge = " , e.to_string()
#layout_block_list = g.dict_path_stopping[e]
layout_block_list = e.getItem("path")
if self.logLevel > 3: print "layout_block_list",layout_block_list
layout_block_list_name = e.getItem("path_name")
if self.logLevel > 3: print "layout_block_list_name",layout_block_list_name
#get the list of signal masts
#panel = jmri.InstanceManager.getDefault(jmri.jmrit.display.EditorManager).get('My Layout')
signal_mast_class = jmri.SignalMast
lbctools= jmri.jmrit.display.layoutEditor.LayoutBlockConnectivityTools()
if self.logLevel > 0: print "Sufficient_signal_masts_in_edge: layout_block_list", layout_block_list
if self.logLevel > 3: print "layout_block_list"
signal_mast_list_for_panel=lbctools.getBeansInPath(layout_block_list,panel,signal_mast_class)
#signal_mast_list_for_panel=lbctools.getBeansInPath(layout_block_list,None,signal_mast_class)
if self.logLevel > 3: print "signal_mast_list_for_panel",[sm.getUserName() for sm in signal_mast_list_for_panel]
if signal_mast_list_for_panel == [] :
if self.logLevel > 3: print "continuing"
continue #ignore panels where list of signal masts is blank
no_panels_used += 1
signal_mast_list_views.append([sm.getUserName() for sm in signal_mast_list_for_panel])
if len(signal_mast_list_for_panel) > len(signal_mast_list):
signal_mast_list = signal_mast_list_for_panel
signal_mast_list_all.addAll([sm for sm in signal_mast_list_for_panel])
#remove duplicates
if self.logLevel > 3: print "signal_mast_list_all with dups", signal_mast_list_all
signal_mast_list_all = java.util.ArrayList(java.util.LinkedHashSet(signal_mast_list_all))
if self.logLevel > 3: print "signal_mast_list_all without dups", signal_mast_list_all
#if self.logLevel > 3: print "signal_mast_list",[sm.getUserName() for sm in signal_mast_list]
if self.logLevel > 3: print "signalmast list ", [sm.getUserName() for sm in signal_mast_list]
if self.logLevel > 3: print "signal_mast_list_views ", signal_mast_list_views
if self.logLevel > 3: print
if self.logLevel > 3: print "signal_mast_list_all", signal_mast_list_all
if self.logLevel > 3: print "signal_mast_list_all", [s.getUserName() for s in signal_mast_list_all]
if self.logLevel > 3: print "no_panels_used", no_panels_used
if signal_mast_list_all.size() == 0 :
return False
else:
return True
def displayMessage(self, msg, title = ""):
self.CLOSED_OPTION = False
s = JOptionPane.showOptionDialog(None,
msg,
title,
JOptionPane.YES_NO_OPTION,
JOptionPane.PLAIN_MESSAGE,
None,
["OK"],
None)
#JOptionPane.showMessageDialog(None, msg, 'Message', JOptionPane.WARNING_MESSAGE)
if s == JOptionPane.CLOSED_OPTION:
self.CLOSED_OPTION = True
return
return s
# /**
# * Custom edge class labeled with relationship type.
# */
# @example:edgeclass:begin
class LabelledEdge(DefaultWeightedEdge):
#label = ""
logLevel = 0
# /**
# * Constructs a relationship edge
# *
# * @param label the label of the new edge.
# *
# */
def __init__(self):
self.dict = {}
#self.label = label
# for key, value in kwargs.items():
# self.dict[key]=value
# /**
# * Gets the label associated with this edge.
# *
# * @return edge label
# */
def setItem(self, **kwargs):
for key, value in kwargs.items():
self.dict[key]=value
def getItem(self, item):
if self.logLevel > 3: print self.dict
if self.logLevel > 3: print "item = ", item
return self.dict[item]
def getTarget(self):
line = self.toString()
line = line.lstrip("( ").rstrip(" )").split(" : ")
if self.logLevel > 3: print "Target line", line
target = str(line[1])
if self.logLevel > 3: print "Target =", target
return target
def getSource(self):
line = self.toString()
line = line.lstrip("( ").rstrip(" )").split(" : ")
if self.logLevel > 3: print "Source line", line
source = str(line[0])
if self.logLevel > 3: print "Source =", source
return source
def to_string_one_line(self):
item_list = ""
for item, value in self.dict.items():
item_list = item_list + str(item) + " = " + str(value) +" : "
if self.logLevel > 3: print "item_list", item_list
if self.logLevel > 3: print item_list
return "*****to_string*****(" + self.getSource() + " : " + self.getTarget() + " : " + item_list.rstrip(": ") + ")"
def to_string(self):
item_list = "\n"
for item, value in self.dict.items():
item_list = item_list + str(item) + " = " + str(value) +" :\n "
if self.logLevel > 3: print "item_list", item_list
if self.logLevel > 3: print item_list
return "*****to_string*****(\n" + self.getSource() + " : " + self.getTarget() + " : " + item_list.rstrip(": ") + ")*****to_string end*******"