Files
JIMRI/jython/AddOccupancyIconsToPanel.py
2026-06-17 14:00:51 +02:00

131 lines
5.1 KiB
Python

# AddOccupancyIconsToPanel.py
# Script to create and place SensorIcons and BlockContentIcons for each occupancy Block on a panel
# will remove and replace any existing ones before adding new ones
# icons are centered on longest track segment of each block
# based on Bill Fitch's CreateIcons.py
import jmri
import java
import javax
import org.slf4j.LoggerFactory
import java.awt.Font
dels = 0
adds = 0
def removeBlockContentIcons(panel):
deleteList = [] # Prevent concurrent modification
icons = panel.getBlockContentsLabelList()
for icon in icons:
blk = icon.getBlock()
if blk is not None:
deleteList.append(icon)
for item in deleteList:
panel.removeFromContents(item)
def removeSensorIcons(panel):
global dels
blockSensors = []
for block in blocks.getNamedBeanSet():
sensor = block.getSensor()
if sensor is not None:
blockSensors.append(sensor)
deleteList = [] # Prevent concurrent modification
icons = panel.getSensorList()
for icon in icons:
sensor = icon.getSensor()
if (sensor) and (sensor in blockSensors) :
deleteList.append(icon)
for item in deleteList:
panel.removeFromContents(item)
dels += 1
# ************************************************************
# find and store the x,y to place a sensorIcon for each Block
# places it in segment center of longest track segment
# ************************************************************
def getBlockCenterPoints(panel):
blockPoints.clear()
maxSegSizes.clear()
for tsv in panel.getTrackSegmentViews():
blk = tsv.getBlockName()
xy = tsv.getCentreSeg()
pt1 = panel.getCoords(tsv.getConnect1(), tsv.getType1())
pt2 = panel.getCoords(tsv.getConnect2(), tsv.getType2())
segSize = jmri.util.MathUtil.distance(pt1, pt2)
if blk not in blockPoints :
blockPoints[blk] = xy
maxSegSizes[blk] = segSize
elif (segSize > maxSegSizes[blk]) : # replace only if seg is longer
blockPoints[blk] = xy
maxSegSizes[blk] = segSize
# **************************************************
# create and place the SensorIcon for each Block
# **************************************************
def addOccupancyIconsAndLabels(panel):
for blockName in blockPoints.keys():
x = blockPoints[blockName].getX() - 5 # icon is 10x10
y = blockPoints[blockName].getY() - 5
block = blocks.getBlock(blockName)
if (block) :
sensor = block.getSensor()
if (sensor) :
addSmallIcon(panel, sensor.getDisplayName(), x, y)
addBlockContentLabel(panel, block, x+10, y-5)
# **************************************************
# small icon
# **************************************************
def addSmallIcon(panel, sensorName, x, y):
global adds
icn = jmri.jmrit.display.SensorIcon(panel)
icn.setIcon("SensorStateActive", jmri.jmrit.catalog.NamedIcon("resources/icons/smallschematics/tracksegments/circuit-occupied.gif", "active"));
icn.setIcon("SensorStateInactive", jmri.jmrit.catalog.NamedIcon("resources/icons/smallschematics/tracksegments/circuit-empty.gif", "inactive"));
icn.setIcon("BeanStateInconsistent", jmri.jmrit.catalog.NamedIcon("resources/icons/smallschematics/tracksegments/circuit-error.gif", "incons"));
icn.setIcon("BeanStateUnknown", jmri.jmrit.catalog.NamedIcon("resources/icons/smallschematics/tracksegments/circuit-error.gif", "unknown"));
# Assign the sensor and set the location
icn.setSensor(sensorName)
icn.setLocation(int(x), int(y))
icn.setLevel(7)
# Add the icon to the layout editor panel
panel.putSensor(icn)
adds += 1
# **************************************************
# block content label
# **************************************************
def addBlockContentLabel(panel, block, x, y):
label = jmri.jmrit.display.BlockContentsIcon(block.getDisplayName(), panel)
label.setBlock(block.getDisplayName())
label.setLocation(int(x), int(y))
label.setLevel(7)
# label.setBorder(javax.swing.BorderFactory.createMatteBorder(1,1,1,1, java.awt.Color.gray))
label.setFont(java.awt.Font(java.awt.Font.DIALOG, java.awt.Font.BOLD, 14))
label.setForeground(java.awt.Color.gray)
panel.putItem(label)
#=====================================================================================
log = org.slf4j.LoggerFactory.getLogger("jmri.jmrit.jython.exec.script.AddOccupancyIconsToPanel")
log.info( "AddOccupancyIconsToPanel.py started" )
blockPoints = {} # Block center segment points
maxSegSizes = {} # Look for longest segment in each block
panels = jmri.InstanceManager.getDefault(jmri.jmrit.display.EditorManager)
layoutPanels = panels.getList(jmri.jmrit.display.layoutEditor.LayoutEditor)
# update all layoutEditor panels loaded
for panel in layoutPanels:
removeSensorIcons(panel)
removeBlockContentIcons(panel)
getBlockCenterPoints(panel)
addOccupancyIconsAndLabels(panel)
log.info("AddOccupancyIconsToPanel.py completed, {} icons removed, {} icons added.",dels,adds)