1396 lines
68 KiB
Python
1396 lines
68 KiB
Python
import java
|
|
import jmri
|
|
|
|
###########################################################################
|
|
# Progress Bar
|
|
###########################################################################
|
|
|
|
from javax.swing import JButton, JFrame, JPanel, JProgressBar, \
|
|
JScrollPane, JTextArea, JTextField, WindowConstants
|
|
|
|
###########################################################################
|
|
|
|
class CreateTransits(jmri.jmrit.automat.AbstractAutomaton):
|
|
|
|
logLevel = 0
|
|
|
|
def __init__(self):
|
|
pass
|
|
|
|
def run_transits(self):
|
|
|
|
#self.msg = "About to create all transits and train info files\nrequired for dispatcher operation"
|
|
|
|
|
|
self.process_panels()
|
|
#msg = "All Transits and TrainInfo Files produced\n and saved in " + filename_run +"\n - Restart JMRI and \n - load the file " + filename_run + "\n - instead of " + filename_icon + "\nThen run Stage3 to set the dispatcher options\nand run the dispatcher system from the panel"
|
|
|
|
# msg = msg + "A backup of the original file has been saved in " + backupfilename + "\n\n"
|
|
|
|
#self.displayMessage(msg)
|
|
msg = "All Sections, Transits and TrainInfo Files produced.\n\n"
|
|
msg = msg + 'The JMRI tables and panels have been updated to support the Dispatcher System\nA store and restart is recommended.'
|
|
self.displayMessage(msg)
|
|
#self.store_panel(filename)
|
|
|
|
def store_panel(self, filename):
|
|
if self.logLevel > 1: print "storing file"
|
|
file = java.io.File(filename)
|
|
cm = jmri.InstanceManager.getNullableDefault(jmri.ConfigureManager)
|
|
result = cm.storeUser(file)
|
|
if result :
|
|
msg = "store was successful"
|
|
else:
|
|
msg = "store failed"
|
|
if self.logLevel > 1: print(msg)
|
|
|
|
def process_panels(self):
|
|
EditorManager = jmri.InstanceManager.getDefault(jmri.jmrit.display.EditorManager)
|
|
if self.logLevel > 1: print "finding panels"
|
|
LayoutPanels = []
|
|
for panel in EditorManager.getList():
|
|
if self.logLevel > 1: print "Panel = ", panel
|
|
if self.logLevel > 1: print "type = " , type(panel)
|
|
if self.logLevel > 1: print "****"
|
|
if type(panel) == jmri.jmrit.display.layoutEditor.LayoutEditor:
|
|
LayoutPanels.append(panel)
|
|
# self.displayMessage("about to call create_transits_and_trainTrainInfos");
|
|
self.create_transits_and_trainTrainInfos(LayoutPanels)
|
|
|
|
def displayMessage(self, msg):
|
|
JOptionPane.showMessageDialog(None, msg, 'information', JOptionPane.INFORMATION_MESSAGE)
|
|
|
|
# function to return key for any value
|
|
def get_key(self,val, my_dict):
|
|
for key, value in my_dict.items():
|
|
if val == value:
|
|
return key
|
|
return "key doesn't exist"
|
|
|
|
move_button_list = []
|
|
|
|
def set_button_list(self):
|
|
for i in range (1,13):
|
|
self.move_button_list.append("MoveTo" + str(i) + "_stored")
|
|
|
|
#********************************************
|
|
|
|
signal_mast_dict = {}
|
|
transit_dict = {}
|
|
transit_name_dict = {}
|
|
frame = None
|
|
doreverse = False
|
|
frame_list = []
|
|
|
|
|
|
## ***********************************************************************************
|
|
## produce transits routines
|
|
## ***********************************************************************************
|
|
|
|
def create_transits_and_trainTrainInfos(self, layoutPanels):
|
|
if self.logLevel > 1: print "*********************************** producing transit ******************************"
|
|
# produce all the transits, so use the stopping graph which is more complete than the stopping graph
|
|
|
|
self.delete_transits()
|
|
self.delete_train_TrainInfos()
|
|
# self.displayMessage("about to call get_signal_mast_lists")
|
|
|
|
if self.logLevel > 0: print "&&&&&&&&&&&&&&&&&&&&&&&&&&&&"
|
|
if self.logLevel > 0: print "&&&& get_signal_mast_lists &&&&"
|
|
if self.logLevel > 0: print "&&&&&&&&&&&&&&&&&&&&&&&&&&&&"
|
|
self.logLevel = 0
|
|
self.get_signal_mast_lists(layoutPanels)
|
|
if self.logLevel > 0: print;print
|
|
self.logLevel = 0
|
|
|
|
# self.displayMessage("created signal mast list")
|
|
|
|
if self.logLevel > 0: print "&&&&&&&&&&&&&&&&&&&&&&&&&&&&"
|
|
if self.logLevel > 0 : print "&&&& produce_transits &&&&"
|
|
if self.logLevel > 0: print "&&&&&&&&&&&&&&&&&&&&&&&&&&&&"
|
|
|
|
display_progress = True
|
|
self.produce_transits(display_progress)
|
|
|
|
if self.logLevel > 0: print "&&&&&&&&&&&&&&&&&&&&&&&&&&&&"
|
|
if self.logLevel > 0: print "&&&& end produce_transits &&&&"
|
|
if self.logLevel > 0: print "&&&&&&&&&&&&&&&&&&&&&&&&&&&&"
|
|
|
|
|
|
def delete_train_TrainInfos(self):
|
|
import os
|
|
import shutil
|
|
|
|
folder = jmri.util.FileUtil.getExternalFilename('preference:dispatcher/traininfo/')
|
|
|
|
#create the folder if it does not exist
|
|
if not os.path.exists(folder):
|
|
os.makedirs(folder)
|
|
|
|
for filename in os.listdir(folder):
|
|
file_path = os.path.join(folder, filename)
|
|
try:
|
|
if os.path.isfile(file_path) or os.path.islink(file_path):
|
|
os.unlink(file_path)
|
|
elif os.path.isdir(file_path):
|
|
shutil.rmtree(file_path)
|
|
except Exception as e:
|
|
if self.logLevel > 1: print('Failed to delete %s. Reason: %s' % (file_path, e))
|
|
|
|
def get_first_signal_mast(self,signal_mast,layout_block, layoutPanels):
|
|
|
|
# # Check if the signal mast is a turntable's exit mast.
|
|
# # If so, it's the start of a path, and there is no "first" signal mast before it.
|
|
# for panel in layoutPanels:
|
|
# for turntable in panel.getLayoutTurntables():
|
|
# if turntable.getExitSignalMast() == signal_mast:
|
|
# if self.logLevel > 0: print "Signal mast '{}' is a turntable exit mast. No preceding mast.".format(signal_mast.getUserName())
|
|
# return None
|
|
|
|
# 1) get_sections containing_block_with_second_signal_mast
|
|
if self.logLevel > 1: print "block - ", layout_block.getUserName(), layout_block
|
|
block = layout_block.getBlock()
|
|
SectionManager = jmri.InstanceManager.getDefault(jmri.SectionManager)
|
|
sections = [section for section in SectionManager.getNamedBeanSet() if block in section.getBlockList()]
|
|
if self.logLevel > 0: print "sections for first signal mast = " , [s.getUserName() for s in sections]
|
|
|
|
# 2) of these sections find the one that contains the second signal mast
|
|
|
|
signal_mast_name = str(signal_mast.getUserName())
|
|
found_section_name = None
|
|
for section in sections:
|
|
if self.logLevel > 1: print "mast", signal_mast.getUserName() , "section",section.getUserName()
|
|
section_name = str(section.getUserName())
|
|
test = self.signal_mast_name_in_section_name(signal_mast_name, section_name)
|
|
|
|
|
|
if self.logLevel > 1: print test
|
|
if self.signal_mast_name_in_section_name(signal_mast_name, section_name):
|
|
found_section_name = section_name
|
|
if self.logLevel > 1: print " signal_mast_name", signal_mast_name, "section_name", section_name, "found_section", found_section_name
|
|
break
|
|
if self.logLevel > 1: print " signal_mast_name", signal_mast_name, "section_name", section_name, "found_section", found_section_name
|
|
|
|
if self.logLevel > 1: print "*************"
|
|
if self.logLevel > 0: print "found_section", found_section_name,"signal_mast_name",signal_mast_name
|
|
|
|
# 3) if the section has two signal masts. return the signal mast that isn't the previous signal mast
|
|
# for stubs/sidings no signal mast will be returned, and we will start with the second signal mast
|
|
|
|
# This routine needs improvement It gets the name of the signal masts by assuming that the section name contains two signal mast names
|
|
# This is a good assumption if the section has not been modified (which it should not have been) but if it has been edited by hand and not given a standard name
|
|
# the routine will crash
|
|
# At least we try to pick this up
|
|
if found_section_name != None:
|
|
other_signal_mast_in_section = self.get_other_signal_mast_in_section(found_section_name, signal_mast_name)
|
|
#if other_signal_mast is None, then the section is a stub originating at the buffer and going to the first signal mast
|
|
if self.logLevel > 0: print "other_signal_mast_in_section", other_signal_mast_in_section
|
|
SignalMastManager = jmri.InstanceManager.getDefault(jmri.SignalMastManager)
|
|
if other_signal_mast_in_section != None:
|
|
first_signal_mast = SignalMastManager.getByUserName(other_signal_mast_in_section)
|
|
if self.logLevel > 0: print "first_signal_mast", first_signal_mast.getUserName()
|
|
if first_signal_mast == None:
|
|
msg = "The routine at present requires section names to be the names of the signal masts separated by a :"
|
|
msg = msg + "\nEither rename the section or (recommended)"
|
|
msg = msg + "\nRerun the automatic signal logic and section generation"
|
|
msg = msg + "\nproblematical section name: " + section_name
|
|
if self.logLevel > 1: JOptionPane.showMessageDialog(None, msg, 'Correct and re-run', JOptionPane.WARNING_MESSAGE)
|
|
else:
|
|
first_signal_mast = None
|
|
else:
|
|
first_signal_mast = None
|
|
return first_signal_mast
|
|
|
|
def signal_mast_name_in_section_name(self, signal_mast_name, section_name):
|
|
#need to check whether the signal_mast_name is one of the masts comprising the section_name
|
|
# section_nam e is of the form [signal_mast_name1 : signal_mast_name2]
|
|
|
|
#split the section_name into two signal_masts
|
|
|
|
if section_name.find(":") != -1:
|
|
# get the two signal masts
|
|
signal_masts = section_name.split(":")
|
|
if signal_mast_name == signal_masts[0]:
|
|
return True
|
|
elif signal_mast_name == signal_masts[1]:
|
|
return True
|
|
else:
|
|
return False
|
|
if self.logLevel > 1: print "signal_masts",signal_masts,"signal_mast_name",signal_mast_name
|
|
else:
|
|
return None
|
|
|
|
def get_signal_masts(self, layout_block, signal_mast_list_all):
|
|
signal_masts_associated_with_current_block = []
|
|
block = layout_block.getBlock()
|
|
SectionManager = jmri.InstanceManager.getDefault(jmri.SectionManager)
|
|
sections = [section for section in SectionManager.getNamedBeanSet() if block in section.getBlockList()]
|
|
if self.logLevel > 1: print "sections", sections
|
|
if self.logLevel > 1: print "signal_mast_list_all", signal_mast_list_all
|
|
#there may be several sections containing the block
|
|
for signal_mast in signal_mast_list_all:
|
|
signal_mast_name = signal_mast.getUserName()
|
|
for section in sections:
|
|
if self.logLevel > 1: print "signal_mast_name",signal_mast_name
|
|
if self.logLevel > 1: print "section.getUserName()", section.getUserName()
|
|
if self.logLevel > 1: print "signal_mast_name in section.getUserName()",signal_mast_name in section.getUserName()
|
|
if signal_mast_name in section.getUserName():
|
|
signal_masts_associated_with_current_block.append(signal_mast)
|
|
if self.logLevel > 1: print "signal_masts_associated_with_current_block",signal_masts_associated_with_current_block
|
|
return signal_masts_associated_with_current_block
|
|
|
|
def get_signal_mast_lists(self, layoutPanels):
|
|
global g
|
|
# print;print
|
|
# print "in get_signal_mast_lists",g.g_express.edgeSet()
|
|
for e in g.g_express.edgeSet():
|
|
# print "self.logLevel", self.logLevel
|
|
if self.logLevel > 1: print "******* signal_mast_list *******"
|
|
|
|
if self.logLevel > 0: print "&&&&&&&&&&&&&&&&&&&&&&&&&&&&"
|
|
if self.logLevel > 0: print "&&&& producing signal mast list for1 &&&&", e.getItem("path_name")
|
|
if self.logLevel > 0: 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:
|
|
# print "A", panel.getLayoutName()
|
|
if panel.getLayoutName() == "Dispatcher System" : continue
|
|
# print "B", panel.getLayoutName()
|
|
panelNo += 1
|
|
if self.logLevel > 1: print "*****panel" ,panelNo,"**********panelName", panel.getLayoutName()
|
|
# 1) get the signal mast list excluding the last signal mast
|
|
|
|
#if self.logLevel > 1: print "stopping",g.dict_path_stopping
|
|
if self.logLevel > 1: print "edge = " , e.to_string()
|
|
#layout_block_list = g.dict_path_stopping[e]
|
|
layout_block_list = e.getItem("path")
|
|
if self.logLevel > 0: print "layout_block_list",layout_block_list
|
|
layout_block_list_name = e.getItem("path_name")
|
|
# layout_block_list = [blocks("ILB1"), blocks("ILB3")]
|
|
# if self.logLevel > 0: print "layout_block_list",layout_block_list
|
|
if self.logLevel > 0: 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 "layout_block_list"
|
|
signal_mast_list_for_panel=lbctools.getBeansInPath(layout_block_list,panel,signal_mast_class)
|
|
|
|
# msg = "signal_mast_list_for_panel",[sm.getUserName() for sm in signal_mast_list_for_panel],"layout_block_list", layout_block_list_name,
|
|
# self.displayMessage(msg)
|
|
if self.logLevel > 0: 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 > 0: 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 > 1: 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 > 1: print "signal_mast_list_all without dups", signal_mast_list_all
|
|
#if self.logLevel > 1: print "signal_mast_list",[sm.getUserName() for sm in signal_mast_list]
|
|
if self.logLevel > 1: print "signalmast list ", [sm.getUserName() for sm in signal_mast_list]
|
|
if self.logLevel > 1: print "signal_mast_list_views ", signal_mast_list_views
|
|
if self.logLevel > 1: print
|
|
if self.logLevel > 1: print "signal_mast_list_all", signal_mast_list_all
|
|
if self.logLevel > 1: print "signal_mast_list_all", [s.getUserName() for s in signal_mast_list_all]
|
|
if self.logLevel > 1: print "no_panels_used", no_panels_used
|
|
|
|
if signal_mast_list_all.size() == 0 :
|
|
msg = "there must be signal masts between and beyond each pair of stopping points. "
|
|
msg = msg + "please insert a signal mast, or remove a station for the station pair: "
|
|
msg = msg + e.getItem("first_block_name") + " : " + e.getItem("last_block_name")
|
|
dpg=DisplayProgress_global()
|
|
dpg.resize()
|
|
dpg.Update(msg)
|
|
|
|
if no_panels_used > 1:
|
|
|
|
# signal_mast-list_all now has all the signal masts, but not necessarily in the right sequence
|
|
# we now sort them bearing in mind the name of the section has the two signal masts joining them in the name
|
|
#
|
|
# create a list of the final sorted values
|
|
signal_mast_list.clear()
|
|
#
|
|
# a) make a useful list (itermediate task)
|
|
#
|
|
signal_mast_useful_list = []
|
|
sorted_list = []
|
|
if self.logLevel > 1: print "***********"
|
|
if self.logLevel > 1: print "make useful signal mast list"
|
|
if self.logLevel > 1: print "***********"
|
|
signal_mast_useful_list = self.set_up_useful_signal_mast_list(signal_mast_list_all, signal_mast_useful_list)
|
|
if self.logLevel > 1: print "signal_mast_useful_list", signal_mast_useful_list
|
|
if self.logLevel > 1: print
|
|
if self.logLevel > 1: print "***********"
|
|
if self.logLevel > 1: print "sorted_list to be done"
|
|
if self.logLevel > 1: print "***********"
|
|
#
|
|
# b) setup sorted_list
|
|
#
|
|
sorted_list = self.setup_sorted_list(signal_mast_useful_list)
|
|
if self.logLevel > 1: print
|
|
if self.logLevel > 1: print "***********"
|
|
if self.logLevel > 1: print "sorted_list_list done"
|
|
if self.logLevel > 1: print "***********"
|
|
if self.logLevel > 1: print "sorted_list_list", sorted_list
|
|
if self.logLevel > 1: print "signal_mast_useful_list should be []", signal_mast_useful_list
|
|
#
|
|
# c) get the final signal_mast_list
|
|
#
|
|
|
|
sm1_tag, sm1_name_tag, sm2_tag, sm2_name_tag, section_tag, section_name_tag = range(6)
|
|
signal_mast_list = [s[sm1_tag] for s in sorted_list]
|
|
if self.logLevel > 1: print
|
|
if self.logLevel > 1: print "****************"
|
|
if self.logLevel > 1: print "signal_mast_list done"
|
|
if self.logLevel > 1: print "****************"
|
|
if self.logLevel > 1: print "signal_mast_list", signal_mast_list
|
|
|
|
if self.logLevel > 1: print "signal_mast_list (names)", [s.getUserName() for s in signal_mast_list]
|
|
|
|
else:
|
|
signal_mast_list = signal_mast_list_all
|
|
|
|
# If, after all that, we have no signal masts, this path is invalid.
|
|
# Warn the user and skip to the next path to prevent a crash.
|
|
if not signal_mast_list: # check if empty
|
|
print
|
|
print "********************************************************************************************"
|
|
print "WARNING: No signal masts could be found for path '", e.getItem(
|
|
"path_name"), "'. This path will be skipped."
|
|
print "********************************************************************************************"
|
|
print
|
|
e.setItem(signal_mast_list=signal_mast_list) # Store the empty list to prevent future KeyErrors
|
|
continue
|
|
|
|
# 2b) get the last signal mast
|
|
if self.logLevel > 0: print "about to get last signal mast: signal_mast_list",signal_mast_list
|
|
last_block = layout_block_list[-1]
|
|
penultimate_signal_mast = signal_mast_list[-1]
|
|
last_signal_mast = self.get_last_signal_mast(penultimate_signal_mast, last_block)
|
|
if self.logLevel > 0: print "last_signal_mast",last_signal_mast.getUserName()
|
|
|
|
# get first signal mast if not in a stub/siding
|
|
# 2a) get the first signal mast
|
|
if self.logLevel > 1: print "get_first_signal_mast"
|
|
if self.logLevel > 1: print "---------------------"
|
|
first_block = layout_block_list[0]
|
|
second_signal_mast = signal_mast_list[0]
|
|
first_signal_mast = self.get_first_signal_mast(second_signal_mast, first_block, layoutPanels)
|
|
if self.logLevel > 0: print "first_signal_mast", first_signal_mast
|
|
|
|
if self.logLevel > 1: print "signal_mast_list",[sm.getUserName() for sm in signal_mast_list]
|
|
|
|
# need to know if we are in the block outside a stub/siding. If we are we need to start at second block in transit
|
|
if first_signal_mast != None:
|
|
e.setItem(neighbor_is_stub=self.neighbor_is_stub(first_block, first_signal_mast))
|
|
else:
|
|
e.setItem(neighbor_is_stub=False)
|
|
|
|
# 3a) add the first signal mast if it was possible to get it
|
|
if first_signal_mast !=None:
|
|
signal_mast_list.insert(0, first_signal_mast)
|
|
first_signal_mast_not_present = False
|
|
else:
|
|
first_signal_mast_not_present = True
|
|
if self.logLevel > 1: print "signal mast list 3a" , signal_mast_list
|
|
if self.logLevel > 1: print "signal mast list with fsm" , [ signal.getUserName() for signal in signal_mast_list]
|
|
|
|
# 3b) add the last signal mast
|
|
signal_mast_list.append(last_signal_mast)
|
|
if self.logLevel > 1: print "final signal mast list " , signal_mast_list
|
|
if self.logLevel > 0: print "final signal mast list " , [ str(signal.getUserName()) for signal in signal_mast_list]
|
|
|
|
# 4) store signal_mast_list
|
|
e.setItem(signal_mast_list=signal_mast_list)
|
|
e.setItem(first_signal_mast_not_present=first_signal_mast_not_present)
|
|
|
|
# print "signal_mast_list", signal_mast_list
|
|
|
|
def add_item_to_end_of_list(self, item, list):
|
|
list.append(item)
|
|
|
|
def add_item_to_beginning_of_list(self, item, list):
|
|
list.insert(0, item)
|
|
|
|
def get_first_signal_mast_name_from_list_item(self, useful_list_item):
|
|
sm1_tag, sm1_name_tag, sm2_tag, sm2_name_tag, section_tag, section_name_tag = range(6)
|
|
section_name = useful_list_item[section_tag].getUserName() #3rd item is section 4th item is section_name
|
|
#print "useful_list_item", useful_list_item
|
|
#print "section", useful_list_item[section_tag] #3rd item is section 4th item is section_name
|
|
#print "section_name", section_name
|
|
[signal_mast,signal_mast_name] = self.get_first_signal_mast_name(section_name)
|
|
return signal_mast_name
|
|
|
|
def get_first_signal_mast_name(self, section_name):
|
|
#sm1, sm1_name, sm2, sm2_name, section, section_name = range(6)
|
|
SignalMastManager = jmri.InstanceManager.getDefault(jmri.SignalMastManager)
|
|
signal_mast_names = []
|
|
#print "section_name",section_name
|
|
signal_mast_names = section_name.split(":")
|
|
#print "get_first_signal_mast_name: signal_mast_names",signal_mast_names,"section_name",section_name
|
|
signal_mast = SignalMastManager.getSignalMast(signal_mast_names[0])
|
|
return [signal_mast,signal_mast_names[0]]
|
|
|
|
def get_second_signal_mast_name_from_list_item(self,useful_list_item):
|
|
if self.logLevel > 1: print "useful_list_item",useful_list_item
|
|
sm1_tag, sm1_name_tag, sm2_tag, sm2_name_tag, section_tag, section_name_tag = range(6)
|
|
section_name = useful_list_item[section_name_tag]
|
|
if self.logLevel > 1: print "section_name", section_name
|
|
[signal_mast,signal_mast_name] = self.get_second_signal_mast_name(section_name)
|
|
return signal_mast_name
|
|
|
|
|
|
def get_second_signal_mast_name(self, section_name):
|
|
#if self.logLevel > 1: print "get_second_signal_mast_name: section_name",section_name
|
|
SignalMastManager = jmri.InstanceManager.getDefault(jmri.SignalMastManager)
|
|
signal_mast_names = []
|
|
signal_mast_names = section_name.split(":")
|
|
#if self.logLevel > 1: print "get_second_signal_mast_name: signal_mast_names",signal_mast_names,"section_name",section_name
|
|
if len(signal_mast_names) == 2:
|
|
#if self.logLevel > 1: print "qwe"
|
|
signal_mast = SignalMastManager.getSignalMast(signal_mast_names[1])
|
|
#if self.logLevel > 1: print "qwert"
|
|
x = signal_mast_names[1]
|
|
#if self.logLevel > 1: print "x", x
|
|
return [signal_mast,signal_mast_names[1]]
|
|
else:
|
|
#if self.logLevel > 1: print"asdf"
|
|
return [None, None] # section_name is the name of a stub-block
|
|
|
|
#sm1, sm1_name, sm2, sm2_name, section, section_name = range(6)
|
|
|
|
def set_up_useful_signal_mast_list(self, signal_mast_list_all, useful_signal_mast_list):
|
|
if self.logLevel > 1: print
|
|
if self.logLevel > 1: print "*********************"
|
|
if self.logLevel > 1: print "**setup_useful_list**"
|
|
if self.logLevel > 1: print "*********************"
|
|
# look at all sections.
|
|
# For each section get the start and end signal mast,
|
|
# If the first and last signalmast is in the signal_mast_list_all, then we have found the corresponding section.
|
|
# we store this in useful_signal_mast_list
|
|
item_to_be_added = None
|
|
list_of_signal_mast_names = [sm.getUserName() for sm in signal_mast_list_all]
|
|
if self.logLevel > 1: print "list_of_signal_mast_names", list_of_signal_mast_names
|
|
SectionManager = jmri.InstanceManager.getDefault(jmri.SectionManager)
|
|
for signal_mast in signal_mast_list_all:
|
|
signal_mast_name = signal_mast.getUserName()
|
|
if self.logLevel > 1: print "looking for",signal_mast_name
|
|
for section in SectionManager.getNamedBeanSet():
|
|
section_name = section.getUserName()
|
|
[signalmast1, signalmast1name] = self.get_first_signal_mast_name(section_name)
|
|
[signalmast2, signalmast2name] = self.get_second_signal_mast_name(section_name)
|
|
if self.logLevel > 1: print "*************"
|
|
#if self.logLevel > 1: print "signalmast1", signalmast1, "signal_mast_name", signal_mast_name
|
|
if signalmast1name == signal_mast_name:
|
|
#if self.logLevel > 1: print "\tfound sm1", "signalmast1", signalmast1, "signalmast2", signalmast2, "looking for", signal_mast_name
|
|
# store signalmast1
|
|
item_to_be_added = [signalmast1, signalmast1name, None, None, section, section_name]
|
|
if signalmast2 != None and signalmast2name in list_of_signal_mast_names:
|
|
item_to_be_added = [signalmast1, signalmast1name, signalmast2, signalmast2name, section, section_name]
|
|
# if self.logLevel > 1: print "\t\tfound sm2 in list of sms", "sm1", signalmast1, "sm2", signalmast2, "list of poss s2", list_of_signal_mast_names
|
|
# we have the correct section
|
|
break
|
|
else:
|
|
pass
|
|
if self.logLevel > 1: print "found ", "item_to_be_added", item_to_be_added, "list_of_signal_mast_names", list_of_signal_mast_names
|
|
if item_to_be_added != None:
|
|
useful_signal_mast_list.append(item_to_be_added)
|
|
return useful_signal_mast_list
|
|
|
|
def setup_sorted_list(self, signal_mast_useful_list):
|
|
# the useful lst has all the information to sort it
|
|
# each node has the previous node and the next node
|
|
|
|
if self.logLevel > 1: print
|
|
if self.logLevel > 1: print "********************"
|
|
if self.logLevel > 1: print "**setup_sorted_list**"
|
|
if self.logLevel > 1: print "**************************"
|
|
sorted_list = []
|
|
if self.logLevel > 1: print "signal_mast_useful_list before", signal_mast_useful_list
|
|
#initialise
|
|
#delete the 0th item from signal_mast_list_all, and puts it in signal_mast_list
|
|
sorted_list.append(signal_mast_useful_list[0])
|
|
signal_mast_useful_list.pop(0)
|
|
if self.logLevel > 1: print "Initialise: sorted_list", sorted_list
|
|
if self.logLevel > 1: print "Initialise: signal_mast_useful_list", signal_mast_useful_list
|
|
if self.logLevel > 1: print "len(signal_mast_useful_list)", len(signal_mast_useful_list)
|
|
|
|
#additems to end of list
|
|
while len(signal_mast_useful_list) > 0:
|
|
item_added = True
|
|
while item_added == True: #only keep on round this loop until we cannot add any more
|
|
item_added = False
|
|
if len(signal_mast_useful_list) == 0:
|
|
break
|
|
if self.logLevel > 1: print "sorted_list x", sorted_list
|
|
if self.logLevel > 1: print "sorted_list y", sorted_list[-1]
|
|
required_signal_mast_name = self.get_second_signal_mast_name_from_list_item(sorted_list[-1])
|
|
if required_signal_mast_name == None : break #None has been inserted if end of path
|
|
if self.logLevel > 1: print "required signal mast", required_signal_mast_name
|
|
item_added = False
|
|
for sm in signal_mast_useful_list:
|
|
if self.get_first_signal_mast_name_from_list_item(sm) == required_signal_mast_name:
|
|
item_added = True
|
|
sorted_list.append(sm)
|
|
signal_mast_useful_list.remove(sm)
|
|
if self.logLevel > 1: print "item",sm, "added"
|
|
break
|
|
else:
|
|
if self.logLevel > 1: print "item",sm, " not added"
|
|
|
|
if self.logLevel > 1: print "after adding to end", sorted_list
|
|
|
|
#add items to end of list
|
|
while len(signal_mast_useful_list) > 0:
|
|
required_signal_mast_name = self.get_first_signal_mast_name_from_list_item(sorted_list[0])
|
|
if len(signal_mast_useful_list) == 0:
|
|
break
|
|
for sm in signal_mast_useful_list:
|
|
if self.get_second_signal_mast_name_from_list_item(sm) == required_signal_mast_name:
|
|
sorted_list.insert(0,sm)
|
|
signal_mast_useful_list.remove(sm)
|
|
if self.logLevel > 1: print "after adding to beginning", sorted_list
|
|
if self.logLevel > 1: print "final sorted_list", sorted_list
|
|
return sorted_list
|
|
|
|
def get_masts_for_first_two_blocks(self, first_layout_block, second_layout_block, signal_mast_list_all):
|
|
|
|
first_block_signal_masts = self.get_signal_masts(first_layout_block, signal_mast_list_all)
|
|
second_block_signal_masts = self.get_signal_masts(second_layout_block, signal_mast_list_all)
|
|
if self.logLevel > 1: print "first_block_signal_masts",first_block_signal_masts
|
|
if self.logLevel > 1: print "second_block_signal_masts",second_block_signal_masts
|
|
|
|
if self.logLevel > 1: print("remove duplicates")
|
|
first_block_signal_masts=self.remove_duplicates_in_java_list(java.util.ArrayList(first_block_signal_masts))
|
|
second_block_signal_masts=self.remove_duplicates_in_java_list(java.util.ArrayList(second_block_signal_masts))
|
|
if self.logLevel > 1: print "first_block_signal_masts",first_block_signal_masts
|
|
if self.logLevel > 1: print "second_block_signal_masts",second_block_signal_masts
|
|
|
|
#many of the below may be None
|
|
first_signal_mast = set(first_block_signal_masts).intersection(set(second_block_signal_masts))
|
|
second_signal_mast = set(second_block_signal_masts).difference(set(first_signal_mast))
|
|
third_signal_mast = set(second_block_signal_masts).difference(set(second_signal_mast))
|
|
#there may be a zeroth mast
|
|
zeroth_signal_mast = set(first_block_signal_masts).difference(set(first_signal_mast))
|
|
|
|
#return the signal masts in order
|
|
signal_masts = java.util.ArrayList()
|
|
if self.logLevel > 1: print java.util.ArrayList(zeroth_signal_mast)
|
|
if len(java.util.ArrayList(zeroth_signal_mast))>0:
|
|
signal_masts.append(java.util.ArrayList(zeroth_signal_mast)[0])
|
|
if len(java.util.ArrayList(first_signal_mast))>0:
|
|
signal_masts.append(java.util.ArrayList(first_signal_mast)[0])
|
|
if len(java.util.ArrayList(second_signal_mast))>0:
|
|
signal_masts.append(java.util.ArrayList(second_signal_mast)[0])
|
|
if len(java.util.ArrayList(third_signal_mast))>0:
|
|
signal_masts.append(java.util.ArrayList(third_signal_mast)[0])
|
|
if self.logLevel > 1: print "signal_masts",signal_masts
|
|
return signal_masts
|
|
|
|
def remove_duplicates (self, mylist):
|
|
return list(dict.fromkeys(mylist))
|
|
|
|
def remove_duplicates_in_java_list (self, list):
|
|
set = java.util.LinkedHashSet()
|
|
|
|
# Add the elements to set
|
|
set.addAll(list);
|
|
|
|
# Clear the list
|
|
list.clear();
|
|
|
|
# add the elements of set
|
|
# with no duplicates to the list
|
|
list.addAll(set);
|
|
return list
|
|
|
|
|
|
def get_signal_masts(self, layout_block, signal_mast_list_all):
|
|
signal_masts_associated_with_current_block = []
|
|
block = layout_block.getBlock()
|
|
SectionManager = jmri.InstanceManager.getDefault(jmri.SectionManager)
|
|
sections = [section for section in SectionManager.getNamedBeanSet() if block in section.getBlockList()]
|
|
if self.logLevel > 1: print "sections", sections
|
|
if self.logLevel > 1: print "signal_mast_list_all", signal_mast_list_all
|
|
#there may be several sections containing the block
|
|
for signal_mast in signal_mast_list_all:
|
|
signal_mast_name = signal_mast.getUserName()
|
|
for section in sections:
|
|
if self.logLevel > 1: print "signal_mast_name",signal_mast_name
|
|
if self.logLevel > 1: print "section.getUserName()", section.getUserName()
|
|
if self.logLevel > 1: print "signal_mast_name in section.getUserName()",signal_mast_name in section.getUserName()
|
|
if signal_mast_name in section.getUserName():
|
|
signal_masts_associated_with_current_block.append(signal_mast)
|
|
if self.logLevel > 1: print "signal_masts_associated_with_current_block",signal_masts_associated_with_current_block
|
|
return signal_masts_associated_with_current_block
|
|
|
|
|
|
|
|
# def get_next_mast(self,signal_mast,previous_layout_block,layout_block):
|
|
# print "layout_block",layout_block
|
|
# print "signal_mast", signal_mast.getUserName()
|
|
# next_mast = self.get_last_signal_mast(signal_mast,layout_block)
|
|
# return next_mast
|
|
|
|
def get_next_mast(self, first_layout_block, second_layout_block, signal_mast_list_all):
|
|
|
|
first_block_signal_masts = self.get_signal_masts(first_layout_block, signal_mast_list_all)
|
|
second_block_signal_masts = self.get_signal_masts(second_layout_block, signal_mast_list_all)
|
|
if self.logLevel > 1: print "first_block_signal_masts",first_block_signal_masts
|
|
if self.logLevel > 1: print "second_block_signal_masts",second_block_signal_masts
|
|
|
|
if self.logLevel > 1: print("remove duplicates")
|
|
first_block_signal_masts=self.remove_duplicates_in_java_list(java.util.ArrayList(first_block_signal_masts))
|
|
second_block_signal_masts=self.remove_duplicates_in_java_list(java.util.ArrayList(second_block_signal_masts))
|
|
if self.logLevel > 1: print "first_block_signal_masts",first_block_signal_masts
|
|
if self.logLevel > 1: print "second_block_signal_masts",second_block_signal_masts
|
|
|
|
#many of the below may be None
|
|
first_signal_mast = set(first_block_signal_masts).intersection(set(second_block_signal_masts))
|
|
second_signal_mast = set(second_block_signal_masts).difference(set(first_signal_mast))
|
|
third_signal_mast = set(second_block_signal_masts).difference(set(second_signal_mast))
|
|
#there may be a zeroth mast
|
|
zeroth_signal_mast = set(first_block_signal_masts).difference(set(first_signal_mast))
|
|
|
|
#return the signal masts in order
|
|
signal_masts = java.util.ArrayList()
|
|
if self.logLevel > 1: print java.util.ArrayList(zeroth_signal_mast)
|
|
if len(java.util.ArrayList(zeroth_signal_mast))>0:
|
|
#signal_masts.append(java.util.ArrayList(zeroth_signal_mast)[0])
|
|
pass
|
|
if len(java.util.ArrayList(first_signal_mast))>0:
|
|
signal_masts.append(java.util.ArrayList(first_signal_mast)[0])
|
|
if len(java.util.ArrayList(second_signal_mast))>0:
|
|
#signal_masts.append(java.util.ArrayList(second_signal_mast)[0])
|
|
pass
|
|
if len(java.util.ArrayList(third_signal_mast))>0:
|
|
#signal_masts.append(java.util.ArrayList(third_signal_mast)[0])
|
|
pass
|
|
if self.logLevel > 1: print "signal_masts",signal_masts
|
|
return signal_masts[0]
|
|
|
|
def neighbor_is_stub(self, first_layout_block, first_signal_mast): # UK neighbour_is_siding
|
|
p = 0
|
|
if first_layout_block.getUserName() == "block6" : p = 1
|
|
SignalMastLogicManager = jmri.InstanceManager.getDefault(jmri.SignalMastLogicManager)
|
|
smlForFirstMast = SignalMastLogicManager.getSignalMastLogic(first_signal_mast);
|
|
neighbor = smlForFirstMast.getFacingBlock();
|
|
if p==1 : print "neighbor = " , neighbor.getUserName(), self.section_is_stub(neighbor),
|
|
return self.section_is_stub(neighbor)
|
|
|
|
def section_is_stub(self, layout_block):
|
|
# A stub track block has one neighbor
|
|
SectionManager = jmri.InstanceManager.getDefault(jmri.SectionManager)
|
|
for section in SectionManager.getNamedBeanSet():
|
|
# Look for a user defined section that has one block that matches the layout block
|
|
if section.getSectionType() == jmri.Section.USERDEFINED :
|
|
if section.getNumBlocks() == 1 and section.getEntryBlock() == layout_block.getBlock() :
|
|
#layout_block is stub
|
|
return True
|
|
return False
|
|
|
|
|
|
|
|
def get_last_signal_mast(self,signal_mast,layout_block):
|
|
|
|
if self.logLevel > 0: print "get_last_signal_mast"
|
|
|
|
# 1) get_sections containing_block_with_previous_signal_mast
|
|
|
|
block = layout_block.getBlock()
|
|
if self.logLevel > 0: print "block - ", layout_block.getUserName(), layout_block, block.getUserName(), block
|
|
SectionManager = jmri.InstanceManager.getDefault(jmri.SectionManager)
|
|
# for section in SectionManager.getNamedBeanSet():
|
|
# if self.logLevel > 1: print section.getUserName(), "section.getBlockList()", section.getBlockList()
|
|
# if block in section.getBlockList():
|
|
# section_found = [section ]
|
|
# if self.logLevel > 1: print "section_found" ,section_found
|
|
sections = [section for section in SectionManager.getNamedBeanSet() if block in section.getBlockList()]
|
|
if sections == []:
|
|
s = "You have not put signals between two stopping blocks, one being " + block.getUserName() + ".\n Unfortunately this system needs you to put them in"
|
|
self.displayMessage(s,"fatal error, have a cup of tea!")
|
|
if self.logLevel > 0: print "sections = " , [s.getUserName() for s in sections]
|
|
|
|
# 2) of these sections find the one that contains the previous signal mast
|
|
|
|
signal_mast_name = str(signal_mast.getUserName())
|
|
found_section_name = None
|
|
for section in sections:
|
|
if self.logLevel > 0: print "mast", signal_mast.getUserName() , "section",section.getUserName()
|
|
section_name = str(section.getUserName())
|
|
test = signal_mast_name in section_name
|
|
if self.logLevel > 0: print "signal_mast_name", signal_mast_name
|
|
if self.logLevel > 0: print test
|
|
if self.signal_mast_name_in_section_name(signal_mast_name, section_name):
|
|
found_section_name = section_name
|
|
if self.logLevel > 0: print "found_section", found_section_name
|
|
break
|
|
|
|
# 3) the section has two signal masts. return the signal mast that isn't the previous signal mast
|
|
|
|
# This routine needs improvement It gets the name of the signal masts by assuming that the section name contains two signal mast names
|
|
# This is a good assumption if the section has not been modified (which it should not have been) but if it has been edited by hand and not given a standard name
|
|
# the routine will crash
|
|
# At least we try to pick this up
|
|
# print "found_section_name", found_section_name
|
|
if found_section_name == None:
|
|
self.displayMessage("There is probably a missing signal mast in block "+block.getUserName(),"Fatal Error that needs correcting")
|
|
other_signal_mast_in_section = self.get_other_signal_mast_in_section(found_section_name, signal_mast_name)
|
|
|
|
SignalMastManager = jmri.InstanceManager.getDefault(jmri.SignalMastManager)
|
|
if other_signal_mast_in_section != None:
|
|
last_signal_mast = SignalMastManager.getByUserName(other_signal_mast_in_section)
|
|
if self.logLevel > 1: print "last_signal_mast", last_signal_mast
|
|
if last_signal_mast == None:
|
|
msg = "The routine at present requires section names to be the names of the signal masts separated by a :"
|
|
msg = msg + "\nEither rename the section or (recommended)"
|
|
msg = msg + "\nRerun the automatic signal logic and section generation"
|
|
msg = msg + "\nproblematical section name: " + section_name
|
|
JOptionPane.showMessageDialog(None, msg, 'Correct and re-run', JOptionPane.WARNING_MESSAGE)
|
|
return last_signal_mast
|
|
|
|
def displayMessage(self, msg, title = ""):
|
|
|
|
s = JOptionPane.showOptionDialog(None,
|
|
msg,
|
|
title,
|
|
JOptionPane.YES_NO_OPTION,
|
|
JOptionPane.PLAIN_MESSAGE,
|
|
None,
|
|
["OK"],
|
|
None)
|
|
return s
|
|
|
|
def get_other_signal_mast_in_section(self, section_name, signal_mast_name):
|
|
# a section name usually contains two names of signal masts separated by a :
|
|
# if the section is a stub it just consists of the name of the block
|
|
# print "get_other_signal_mast_in_section","section_name",section_name,"signal_mast_name",signal_mast_name
|
|
if section_name.find(":") != -1:
|
|
# get the two signal masts
|
|
signal_masts = section_name.split(":")
|
|
if signal_mast_name == signal_masts[0]:
|
|
return signal_masts[1]
|
|
else:
|
|
return signal_masts[0]
|
|
if self.logLevel > 1: print "signal_masts",signal_masts,"signal_mast_name",signal_mast_name
|
|
else:
|
|
return None
|
|
|
|
def produce_transits(self, display_progress = False):
|
|
global dpg
|
|
max_no_transits = 20000 #always produce transists useful for testing
|
|
t = []
|
|
|
|
if self.logLevel > 1: print "&&&&&&&&&&&&&&&&&&&&&&&&&&&&"
|
|
if self.logLevel > 0: print "&&&& producing transits &&&&"
|
|
if self.logLevel > 1: print "&&&&&&&&&&&&&&&&&&&&&&&&&&&&"
|
|
i = -1
|
|
|
|
if self.logLevel > 1: print "g-",g.g_express
|
|
|
|
no_of_edges = 0
|
|
for e in g.g_express.edgeSet():
|
|
no_of_edges += 1
|
|
|
|
progress = 20
|
|
|
|
interval_percent = int((100.0-progress)/8.0)
|
|
if self.logLevel > 1: print "interval" , interval_percent, "progress", progress, "no_of_edges", no_of_edges
|
|
interval_count = int(no_of_edges/8)
|
|
interval_count_total = interval_count
|
|
|
|
if 'dpg' not in globals():
|
|
dpg=DisplayProgress_global()
|
|
if display_progress:
|
|
dpg.Update("creating transits: " + str(progress) + "% complete")
|
|
|
|
|
|
for e in g.g_express.edgeSet():
|
|
if i > max_no_transits:
|
|
if self.logLevel > 1: print "passing",i
|
|
pass
|
|
else:
|
|
i+=1
|
|
if i > interval_count_total:
|
|
interval_count_total = interval_count_total + interval_count
|
|
progress = int(progress + interval_percent)
|
|
if self.logLevel > 1: print progress, i
|
|
p = int(min(progress, 100))
|
|
if self.logLevel > 1: print "p" , p
|
|
if display_progress:
|
|
dpg.Update("creating transits: " + str(progress)+ "% complete")
|
|
|
|
if self.logLevel > 0: print "creating",i
|
|
filename_fwd = self.get_filename(e, "fwd")
|
|
filename_rvs = self.get_filename(e, "rvs")
|
|
if self.logLevel > 1: print "processing " ,filename_fwd
|
|
|
|
transit = self.create_transit(e)
|
|
if transit != None:
|
|
transit_name = transit.getUserName()
|
|
transit_name = transit_name.replace("_temp","") #we will rename the transits soon so store the renamed transit in the info file
|
|
sml= [signalmast.getUserName() for signalmast in e.getItem("signal_mast_list")]
|
|
if self.logLevel > 1: print "transit info, name, transit", transit_name, transit, e.getItem("transit") , "\n", e.getItem("signal_mast_list"), sml
|
|
self.store_TrainInfo(e, self.store_forward_train_TrainInfo, filename_fwd, transit_name, transit )
|
|
if self.logLevel > 1: print "*************************************"
|
|
self.store_TrainInfo(e, self.store_reverse_train_TrainInfo, filename_rvs, transit_name, transit )
|
|
if self.logLevel > 1: print "*************************************"
|
|
if self.logLevel > 1: print "created transits", i, filename_fwd, " & rvs"
|
|
|
|
self.rename_temp_transits() #the transits above have _temp put on the end. We need to remove this
|
|
if display_progress:
|
|
dpg.killLabel()
|
|
|
|
def get_existing_transit(self, e):
|
|
|
|
signal_mast_list = e.getItem("signal_mast_list")
|
|
start_signal_mast = signal_mast_list[0].getUserName()
|
|
end_signal_mast = signal_mast_list[-1].getUserName()
|
|
transit_name = "From " + start_signal_mast + " to " + end_signal_mast
|
|
if self.logLevel > 1: print "transit_name",transit_name
|
|
transits = jmri.InstanceManager.getDefault(jmri.TransitManager)
|
|
transit_list = [transit for transit in transits.getNamedBeanSet() if transit.getUserName() == transit_name]
|
|
if self.logLevel > 1: print "transit_list",transit_list
|
|
|
|
if transit_list == []:
|
|
return None
|
|
else:
|
|
transit = transit_list[0]
|
|
if self.logLevel > 1: print "transit", transit.getUserName()
|
|
if self.logLevel > 1: print "transit_username", transit.getUserName()
|
|
if self.logLevel > 1: print "transit exists", transit.getUserName(), transit
|
|
e.setItem(transit=transit)
|
|
return transit
|
|
|
|
def create_transit( self, e):
|
|
|
|
#check if transit already exists
|
|
transit = self.get_existing_transit(e)
|
|
if transit != None:
|
|
if self.logLevel > 1: print "TRANSIT =",transit
|
|
return transit
|
|
#create transit
|
|
#if self.logLevel > 1: print " creating transit "
|
|
TransitCreationTool = jmri.jmrit.display.layoutEditor.TransitCreationTool()
|
|
transit = None
|
|
|
|
#iterate through the signalmasts
|
|
signal_mast_list = e.getItem("signal_mast_list")
|
|
if self.logLevel > 0: print "signal_mast_list", [str(sm.getUserName()) for sm in signal_mast_list]
|
|
# self.displayMessage("create_transit" + str([str(sm.getUserName()) for sm in signal_mast_list]))
|
|
for signal_mast in signal_mast_list:
|
|
if self.logLevel > 0: print "adding ", signal_mast.getUserName()
|
|
TransitCreationTool.addNamedBean(signal_mast)
|
|
if self.logLevel > 0: print "added", signal_mast.getUserName(), "to TransitCreationTool"
|
|
#if self.logLevel > 1: print "about to create transit"
|
|
#create transit
|
|
try:
|
|
transit = TransitCreationTool.createTransit()
|
|
if self.logLevel > 0: print "transit after calling transitcreationtool = ", transit
|
|
#make note of the transit in the graph
|
|
e.setItem(transit=transit)
|
|
|
|
#turn on the "transit in progress" sensor in case it has been turned off by another transit
|
|
transit_section_list = transit.getTransitSectionList()
|
|
if self.logLevel > 0: print "transit_section_list", transit_section_list
|
|
|
|
#last_section = transit_section_list.get(transit_section_list.size() - 1)
|
|
last_section = transit_section_list[-1]
|
|
|
|
if self.logLevel > 0: print "last_section", last_section.getSectionName()
|
|
|
|
transit_action = None
|
|
to_station_name = g.g_express.getEdgeTarget(e)
|
|
sensor_name = self.sensor_name(to_station_name)
|
|
transit_action=self.transit_action_turn_on(sensor_name)
|
|
last_section.addAction(transit_action)
|
|
except jmri.JmriException as ex:
|
|
if self.logLevel > 1: print(ex),
|
|
if self.logLevel > 0: print "could not create transit", signal_mast_list
|
|
except Exception as ex:
|
|
if self.logLevel > 1: print(ex),
|
|
if self.logLevel > 0: print "could not create transit", signal_mast_list
|
|
if self.logLevel > 1: print "finished transit"
|
|
|
|
#set username temporarily so that it is not overwritten by another
|
|
if transit.getUserName() == None:
|
|
JOptionPane.showMessageDialog(None, 'transit name null', "", JOptionPane.WARNING_MESSAGE)
|
|
if self.logLevel > 0: print "transit_section_list",transit_section_list
|
|
via = e.getItem("second_block_name")
|
|
temp_name = transit.getUserName() + " via " + via + "_temp"
|
|
TransitManager = jmri.InstanceManager.getDefault(jmri.TransitManager)
|
|
if TransitManager.getTransit(temp_name) == None:
|
|
transit.setUserName(temp_name)
|
|
else:
|
|
TransitManager.deleteTransit(transit)
|
|
transit = TransitManager.getTransit(temp_name)
|
|
return transit
|
|
|
|
def getSignalMastName(self, section):
|
|
#we get the mast name from the name of the section. section will be a : b and the signal mast that we get will be b
|
|
# as the section is to a buffer and we want the buffer signal mast
|
|
section_name = section.getUserName()
|
|
signal_masts = section_name.split(":")
|
|
if self.logLevel > 1: print "signal_masts",signal_masts
|
|
return signal_masts[1]
|
|
|
|
def get_section_containing_block(self, block, section_list):
|
|
|
|
for section in section_list:
|
|
if section.containsBlock(block):
|
|
return section
|
|
return None
|
|
|
|
|
|
def delete_transits(self):
|
|
|
|
# need to avoid concurrency issues when deleting more that one transit
|
|
# use java.util.concurrent.CopyOnWriteArrayList so can iterate through the transits while deleting
|
|
|
|
TransitManager = jmri.InstanceManager.getDefault(jmri.TransitManager)
|
|
#if self.logLevel > 1: print "Section"
|
|
TransitList = java.util.concurrent.CopyOnWriteArrayList()
|
|
for transit in TransitManager.getNamedBeanSet():
|
|
TransitList.add(transit)
|
|
|
|
for transit in TransitList:
|
|
if self.logLevel > 1: print "deleting Transit ", transit.getUserName()
|
|
TransitManager.deleteTransit(transit)
|
|
|
|
def rename_temp_transits(self):
|
|
TransitManager = jmri.InstanceManager.getDefault(jmri.TransitManager)
|
|
for transit in TransitManager.getNamedBeanSet():
|
|
temp_name = transit.getUserName()
|
|
orig_name = temp_name.replace("_temp","")
|
|
transit.setUserName(orig_name)
|
|
|
|
def get_filename(self, e, suffix):
|
|
|
|
# suffix is "fwd" or "rvs"
|
|
# graph is g.g_stopping
|
|
# e is edge
|
|
|
|
from_station_name = g.g_stopping.getEdgeSource(e)
|
|
to_station_name = g.g_stopping.getEdgeTarget(e)
|
|
neighbor_name = e.getItem("neighbor_name")
|
|
index = e.getItem("index")
|
|
|
|
filename = "From " + str(from_station_name) + " To " + str(to_station_name) + " Via " + str(neighbor_name) + " " + str(index)
|
|
filename = filename.replace(" ", "_")
|
|
# filename_fwd = filename + "_fwd.xml"
|
|
# filename_rvs = filename + "_rvs.xml"
|
|
filename = filename + "_" + suffix + ".xml"
|
|
|
|
return filename
|
|
|
|
def store_TrainInfo(self, e, store_fn, filename, transit_name, transit):
|
|
|
|
#store_fn is either store_forward_train_TrainInfo or store_reverse_train_TrainInfo
|
|
|
|
#if self.logLevel > 1: print " storing transit "
|
|
|
|
# or self.doreverse:
|
|
#store the transit if it has not already been stored
|
|
e.setItem(transitname=filename)
|
|
self.transit_name_dict[e] = filename #store here to check for duplicates
|
|
|
|
dispatcherframe = store_fn(e, filename, transit_name, transit)
|
|
return dispatcherframe
|
|
|
|
|
|
def is_duplicate(self,a,dict):
|
|
|
|
z=False
|
|
if a in dict:
|
|
z = True
|
|
return z
|
|
|
|
def delete_transit(self, transit):
|
|
#**** Delete current Transit *******
|
|
TransitManager = jmri.InstanceManager.getDefault(jmri.TransitManager)
|
|
if transit != None:
|
|
TransitManager.deleteTransit(transit)
|
|
|
|
|
|
|
|
def sensor_name(self,station_name):
|
|
|
|
to_block_name = station_name
|
|
|
|
# to_alias_name = self.anti_alias_block(to_block_name)
|
|
# to_index = to_alias_name.replace("block","")
|
|
|
|
#if we don't want to do the above then we need to create sensors with name MoveInProgress+trim(to_block_name)
|
|
|
|
sensor_move_name = "MoveInProgress" + to_block_name.replace(" ","_")
|
|
|
|
return sensor_move_name
|
|
|
|
def transit_action_turn_on(self, sensor_name):
|
|
when = jmri.TransitSectionAction.ENTRY
|
|
what = jmri.TransitSectionAction.SETSENSORACTIVE
|
|
swhat = sensor_name
|
|
TransitSectionAction = jmri.TransitSectionAction(when, what)
|
|
TransitSectionAction.setStringWhat(swhat)
|
|
#mWhen = when;
|
|
#mWhat = what;
|
|
#mDataWhen = dataWhen;
|
|
#mDataWhat1 = dataWhat1;
|
|
#mDataWhat2 = dataWhat2;
|
|
#mStringWhen = sWhen;
|
|
#mStringWhat = sWhat;
|
|
return TransitSectionAction
|
|
|
|
def transit_action_turn_off(self, sensor_name):
|
|
when = jmri.TransitSectionAction.TRAINSTOP
|
|
what = jmri.TransitSectionAction.SETSENSORINACTIVE
|
|
swhat = sensor_name
|
|
TransitSectionAction = jmri.TransitSectionAction(when, what)
|
|
TransitSectionAction.setStringWhat(swhat)
|
|
#mWhen = when;
|
|
#mWhat = what;
|
|
#mDataWhen = dataWhen;
|
|
#mDataWhat1 = dataWhat1;
|
|
#mDataWhat2 = dataWhat2;
|
|
#mStringWhen = sWhen;
|
|
#mStringWhat = sWhat;
|
|
return TransitSectionAction
|
|
|
|
def transit_action_turn_off_delay(self, sensor_name, delay):
|
|
when = jmri.TransitSectionAction.ENTRY
|
|
what = jmri.TransitSectionAction.SETSENSORINACTIVE
|
|
swhat = sensor_name
|
|
delay = 20000
|
|
TransitSectionAction = TransitSectionAction = jmri.TransitSectionAction(when, what)
|
|
TransitSectionAction.setStringWhat(swhat)
|
|
TransitSectionAction.setDataWhen(delay)
|
|
|
|
#mWhen = when;
|
|
#mWhat = what;
|
|
#mDataWhen = dataWhen;
|
|
#mDataWhat1 = dataWhat1;
|
|
#mDataWhat2 = dataWhat2;
|
|
#mStringWhen = sWhen;
|
|
#mStringWhat = sWhat;
|
|
return TransitSectionAction
|
|
|
|
# **************************************************
|
|
# new produce TrainInfo file routines
|
|
# **************************************************
|
|
|
|
def store_forward_train_TrainInfo(self, e, filename, transit_name, transit):
|
|
|
|
TrainInfo = jmri.jmrit.dispatcher.TrainInfo()
|
|
|
|
self.set_standard_items(e, TrainInfo, transit_name, transit)
|
|
|
|
#set reverse flag
|
|
TrainInfo.setRunInReverse(False)
|
|
|
|
jmri.jmrit.dispatcher.TrainInfoFile().writeTrainInfo(TrainInfo, filename)
|
|
|
|
def store_reverse_train_TrainInfo(self, e, filename, transit_name, transit):
|
|
|
|
TrainInfo = jmri.jmrit.dispatcher.TrainInfo()
|
|
|
|
self.set_standard_items(e, TrainInfo, transit_name, transit)
|
|
|
|
#set reverse flag
|
|
TrainInfo.setRunInReverse(True)
|
|
|
|
jmri.jmrit.dispatcher.TrainInfoFile().writeTrainInfo(TrainInfo, filename)
|
|
|
|
def get_all_roster_entries_with_speed_profile(self):
|
|
roster_entries_with_speed_profile = []
|
|
r = jmri.jmrit.roster.Roster.getDefault()
|
|
for roster_entry in jmri.jmrit.roster.Roster.getAllEntries(r):
|
|
#if self.logLevel > 1: print roster_entry.getId(), roster_entry.getSpeedProfile()
|
|
if roster_entry.getSpeedProfile() != None:
|
|
roster_entries_with_speed_profile.append(roster_entry.getId())
|
|
return roster_entries_with_speed_profile
|
|
|
|
def set_standard_items(self, e, TrainInfo, transit_name, transit):
|
|
|
|
#find one of the trains in the roster
|
|
|
|
my_list = self.get_all_roster_entries_with_speed_profile()
|
|
if my_list == []:
|
|
JOptionPane.showMessageDialog(None, "No roster entries\nCannot produce train info files", 'Stopping', JOptionPane.WARNING_MESSAGE)
|
|
raise Exception
|
|
else:
|
|
if self.logLevel > 1: print "list of transits" , my_list
|
|
train_name = str(my_list[0]) #use the first roster entry with a speed profile
|
|
|
|
TrainInfo.setTrainName(train_name)
|
|
TrainInfo.setTransitId(transit_name)
|
|
TrainInfo.setTransitName(transit_name)
|
|
TrainInfo.setTrainInTransit(False)
|
|
TrainInfo.setTrainFromRoster(True)
|
|
TrainInfo.setTrainFromTrains(False)
|
|
TrainInfo.setTrainFromUser(False)
|
|
TrainInfo.setDccAddress(" ")
|
|
# special action for stubs
|
|
path_name = e.getItem("path_name")
|
|
if e.getItem("neighbor_is_stub") == False:
|
|
TrainInfo.setStartBlockId(path_name[0])
|
|
TrainInfo.setStartBlockName(path_name[0])
|
|
# start block seq starts counting at 1 at the first block in path_name
|
|
# we want the first block
|
|
TrainInfo.setStartBlockSeq(1)
|
|
else:
|
|
TrainInfo.setStartBlockId(path_name[0])
|
|
TrainInfo.setStartBlockName(path_name[0])
|
|
# start block seq starts counting at 1 at the first block in path_name
|
|
# we want the second block
|
|
TrainInfo.setStartBlockSeq(2)
|
|
TrainInfo.setDestinationBlockId(path_name[-1])
|
|
TrainInfo.setDestinationBlockName(path_name[-1])
|
|
TrainInfo.setDestinationBlockId(path_name[-1])
|
|
no_of_blocks_in_path = len(path_name)
|
|
#end block seq starts counting at 0 at the second block in path_name
|
|
#we want the last block
|
|
if self.logLevel > 1: print "got here"
|
|
if self.logLevel > 1: print "transit = ", transit
|
|
blocks = jmri.InstanceManager.getDefault(jmri.BlockManager)
|
|
startBlock = blocks.getBlock(path_name[0])
|
|
transit.getDestinationBlocksList(startBlock, False)
|
|
destinationBlockSeqList = transit.getDestBlocksSeqList()
|
|
if self.logLevel > 1: print "got destinationBlockSeqList", destinationBlockSeqList
|
|
if self.logLevel > 1: print "no_of_blocks_in_path-1",no_of_blocks_in_path-1
|
|
if self.logLevel > 1: print "path_name", path_name
|
|
seq = destinationBlockSeqList.get(0)
|
|
if self.logLevel > 1: print "seq",seq
|
|
TrainInfo.setDestinationBlockSeq(seq)
|
|
ALLOCATE_AS_FAR_AS_IT_CAN = -1 # this value can go in TrainInfo.setAllocationMethod()
|
|
ALLOCATE_BY_SAFE_SECTIONS = 0 # this value can go in TrainInfo.setAllocationMethod()
|
|
No_Blocks_Ahead = 3 # or other values. These values can go in TrainInfo.setAllocationMethod()
|
|
|
|
TrainInfo.setAllocationMethod(ALLOCATE_AS_FAR_AS_IT_CAN) #as far as possible (set to this for now to see the dispatch, but change to...
|
|
TrainInfo.setResetWhenDone(False)
|
|
#TrainInfo.setResetRestartSensor(boolean b)
|
|
#TrainInfo.setResetStartSensor(boolean b)
|
|
TrainInfo.setReverseAtEnd(False)
|
|
TrainInfo.setTerminateWhenDone(True)
|
|
TrainInfo.setPriority(5)
|
|
|
|
# public static final int NONE = 0x00; // no train type defined
|
|
#LOCAL_PASSENGER = 0x01 ## low priority local passenger train
|
|
# public static final int LOCAL_FREIGHT = 0x02; // low priority freight train performing local tasks
|
|
# public static final int THROUGH_PASSENGER = 0x03; // normal priority through passenger train
|
|
# public static final int THROUGH_FREIGHT = 0x04; // normal priority through freight train
|
|
# public static final int EXPRESS_PASSENGER = 0x05; // high priority passenger train
|
|
# public static final int EXPRESS_FREIGHT = 0x06; // high priority freight train
|
|
# public static final int MOW = 0x07; // low priority maintenance of way train
|
|
|
|
TrainInfo.setTrainType("LOCAL_PASSENGER")
|
|
#TrainInfo.setDelaySensorName(String sen)
|
|
|
|
#TrainInfo.setDelayedRestart(int ds)
|
|
#TrainInfo.setDelayedStart(int ds)
|
|
# TrainInfo.setRestartDelayMin(int s)
|
|
# TrainInfo.setRestartSensorName(String sen)
|
|
#TrainInfo.setDepartureTimeHr(int hr)
|
|
#TrainInfo.setDepartureTimeMin(int min) #accept defaults
|
|
|
|
#TrainInfo.setLoadAtStartup(False) #accept default
|
|
|
|
|
|
TrainInfo.setAutoRun(True)
|
|
TrainInfo.setSpeedFactor(1)
|
|
TrainInfo.setMaxSpeed(0.6)
|
|
TrainInfo.setRampRate("Medium Slow")
|
|
TrainInfo.setUseSpeedProfile(True)
|
|
TrainInfo.setStopBySpeedProfile(True)
|
|
TrainInfo.setStopBySpeedProfileAdjust(1.0)
|
|
TrainInfo.setSoundDecoder(False)
|
|
|
|
|
|
TrainInfo.setResistanceWheels(True)
|
|
TrainInfo.setMaxTrainLength(20.0)
|
|
|
|
# **************************************************
|
|
# produce TrainInfo file routines
|
|
# **************************************************
|
|
|
|
def addToClipBoard(self, text):
|
|
command = 'echo | set /p nul=' + text.strip() + '| clip'
|
|
os.system(command)
|
|
|
|
|
|
def closeframe(self,frame):
|
|
# frame.setVisible(True);
|
|
# frame.toFront();
|
|
# frame.requestFocus()
|
|
frame.dispatchEvent(java.awt.event.WindowEvent(frame, java.awt.event.WindowEvent.WINDOW_CLOSING));
|
|
#frame = None
|
|
#if self.logLevel > 1: print frame
|
|
|
|
|
|
def append_station_block_list(self,*blocks):
|
|
for block_alias in blocks:
|
|
station_block_name = alias_block(block_alias)
|
|
g.station_block_list.append(station_block_name)
|
|
g.station_blk_list.append(layoutblocks.getLayoutBlock(station_block_name))
|
|
#if self.logLevel > 1: print g.station_block_list
|
|
|
|
def set_memory_all(self, train_name):
|
|
for station_block_name in g.station_block_list:
|
|
## Build Diagram
|
|
#if self.logLevel > 1: print station_block_name
|
|
layoutBlock = layoutblocks.getLayoutBlock(station_block_name)
|
|
sensor = layoutBlock.getOccupancySensor()
|
|
if sensor.getKnownState() == ACTIVE:
|
|
#if self.logLevel > 1: print "layoutblock =", layoutBlock
|
|
#if self.logLevel > 1: print "sensor =", sensor
|
|
mem=layoutBlock.getMemory()
|
|
#if self.logLevel > 1: print "mem =", mem, mem.getValue()
|
|
if mem.getValue() == None:
|
|
mem.setValue(train_name)
|
|
|
|
def wait_sensor(self, sensorName, sensorState):
|
|
sensor = sensors.getSensor(sensorName)
|
|
if sensor is None:
|
|
self.displayMessage('Sensor {} not found'.format(sensorName))
|
|
return
|
|
if sensorState == 'active':
|
|
#if self.logLevel > 1: print ("wait_sensor active: sensorName {} sensorState {}",format(sensorName, sensorState))
|
|
self.waitSensorActive(sensor)
|
|
elif sensorState == 'inactive':
|
|
self.waitSensorInactive(sensor)
|
|
else:
|
|
self.displayMessage('Sensor state, {}, is not valid'.format(sensorState))
|
|
|
|
## ***********************************************************************************
|
|
|
|
## set routines
|
|
|
|
## ***********************************************************************************
|
|
|
|
def set_sensor(self, sensorName, sensorState):
|
|
sensor = sensors.getSensor(sensorName)
|
|
if sensor is None:
|
|
self.displayMessage('Sensor {} not found'.format(sensorName))
|
|
return
|
|
if sensorState == 'active':
|
|
newState = ACTIVE
|
|
elif sensorState == 'inactive':
|
|
newState = INACTIVE
|
|
else:
|
|
self.displayMessage('{} - Sensor state, {}, is not valid'.format(self.threadName, sensorState))
|
|
return
|
|
sensor.setKnownState(newState)
|
|
|
|
def setTurnout(self,turnoutName, turnoutState, turnoutDelay=0):
|
|
#turnouts = jmri.TurnoutManager
|
|
turnout = turnouts.getTurnout(turnoutName)
|
|
if turnout is None:
|
|
self.displayMessage('Turnout {} not found'.format(turnoutName))
|
|
return
|
|
if turnoutState == 'closed':
|
|
newState = CLOSED
|
|
elif turnoutState == 'thrown':
|
|
newState = THROWN
|
|
else:
|
|
self.displayMessage('Turnout state, {}, is not valid'.format(turnoutState))
|
|
return
|
|
turnout.setCommandedState(newState)
|
|
# Wait up to 5 seconds for feedback
|
|
for i in range(0, 20):
|
|
if turnout.getKnownState() == newState:
|
|
break;
|
|
if self.logLevel > 1: print 'Turnout feedback loop: {}'.format(i)
|
|
self.waitMsec(250)
|
|
self.waitMsec(turnoutDelay)
|
|
|
|
def set_memory(self, block_name, train_name):
|
|
#if self.logLevel > 1: print "in set_memory"
|
|
#if self.logLevel > 1: print "train_name =", train_name
|
|
#if self.logLevel > 1: print "block_name =", block_name
|
|
layoutBlock = layoutblocks.getLayoutBlock(block_name)
|
|
if layoutBlock == None:
|
|
block_name = alias_block(block_name)
|
|
layoutBlock = layoutblocks.getLayoutBlock(block_name)
|
|
#if self.logLevel > 1: print "layoutblock =", layoutBlock
|
|
mem = layoutBlock.getMemory()
|
|
#if self.logLevel > 1: print "mem =", mem, mem.getValue()
|
|
if mem.getValue() == None:
|
|
mem.setValue(train_name)
|
|
|
|
|
|
#********************************************
|
|
|
|
|
|
|
|
def get_block(self, block_name):
|
|
layoutBlock = layoutblocks.getLayoutBlock(block_name)
|
|
return layoutBlock
|
|
|
|
def get_memory(self, block_name):
|
|
layoutBlock = layoutblocks.getLayoutBlock(block_name)
|
|
#if self.logLevel > 1: print "layoutNlock =", layoutBlock
|
|
mem = layoutBlock.getMemory()
|
|
mem_val = mem.getValue()
|
|
return mem_val
|
|
|
|
|
|
import java.util.concurrent.ConcurrentHashMap
|
|
import java.util.concurrent.CopyOnWriteArrayList
|
|
|
|
class ClearTransits(CreateTransits):
|
|
|
|
def __init__(self):
|
|
#if self.logLevel > 1: print "deleting transits"
|
|
self.delete_transits()
|
|
#if self.logLevel > 1: print "deleted transits"
|
|
|
|
def handle(self): #just to make it close down
|
|
pass
|
|
|
|
|
|
def delete_transits(self):
|
|
|
|
# need to avoid concurrency issues when deleting more that one transit
|
|
# use java.util.concurrent.CopyOnWriteArrayList so can iterate through the transits while deleting
|
|
|
|
TransitManager = jmri.InstanceManager.getDefault(jmri.TransitManager)
|
|
#if self.logLevel > 1: print "Section"
|
|
TransitList = java.util.concurrent.CopyOnWriteArrayList()
|
|
for transit in TransitManager.getNamedBeanSet():
|
|
TransitList.add(transit)
|
|
|
|
for transit in TransitList:
|
|
if self.logLevel > 1: print "deleting Transit ", transit.getUserName()
|
|
TransitManager.deleteTransit(transit)
|
|
|
|
|
|
class DisplayProgress:
|
|
|
|
|
|
def __init__(self):
|
|
#labels don't seem to work. This is the only thing I could get to work. Improvements welcome
|
|
progress = 0
|
|
self.frame1 = JFrame("creating transits: " + str(progress) + "% complete", defaultCloseOperation=JFrame.DISPOSE_ON_CLOSE, size=(500, 50), locationRelativeTo=None)
|
|
|
|
self.frame1.setVisible(True)
|
|
|
|
def Update(self,msg):
|
|
self.frame1.setTitle(msg)
|
|
|
|
def killLabel(self):
|
|
self.frame1.setVisible(False)
|
|
self.frame1 = None
|
|
|
|
def resize(self):
|
|
self.frame1.size=(1300, 50)
|