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

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)