logger = system.util.getLogger("Popup_Printing")
# Tuneable parameters
PRINT_DELAY_MS = 250 # polling interval (ms) for render check
BETWEEN_PAGES_DELAY_MS = 5000 # delay between finishing one page and starting the next
POPUP_PATH = 'Popups/Popup_Printing'
COMPONENT_NAME = 'P2L'
def openPopup():
try:
win = system.nav.openWindow(POPUP_PATH)
pb = win.rootContainer.getComponent('ProgressBar')
pb.visible = True
except Exception as e:
logger.error("Failed to open popup: {}".format(e))
def closePopup():
try:
win = system.gui.getWindow(POPUP_PATH)
pb = win.rootContainer.getComponent('ProgressBar')
pb.visible = False
system.nav.closeWindow(POPUP_PATH)
except Exception as e:
logger.error("Failed to close popup: {}".format(e))
def doPrint(component, table, page, nextFn):
"""Create and execute the print job, then trigger next page after a pause."""
try:
job = system.vision.createPrintJob(component)
job.setShowPrintDialog(False)
job.setPageHeight(1800)
job.setPageWidth(1200)
job.setMargins(0)
job.setOrientation(1)
job.print()
logger.info("Printed {} page {}".format(table, page))
# Add a delay before moving to the next page
system.util.invokeLater(nextFn, BETWEEN_PAGES_DELAY_MS)
except Exception as e:
logger.error("Print failed on {} page {}: {}".format(table, page, e))
closePopup()
def waitUntilReady(component, callback):
"""
Poll until component is finished rendering.
Falls back to 1 second if no busy flag is available.
"""
try:
if hasattr(component, "isRendering") and component.isRendering:
system.util.invokeLater(lambda: waitUntilReady(component, callback), PRINT_DELAY_MS)
else:
system.util.invokeLater(callback, 3000) # small buffer
except Exception as e:
logger.warn("Render check failed, falling back to delay: {}".format(e))
system.util.invokeLater(callback, 3000)
def printNext(pages, idx, component):
if idx >= len(pages):
system.util.invokeLater(closePopup, 3000)
return
table, page = pages[idx]
logger.info("Preparing {} page {}".format(table, page))
component.currentPage = page
component.repaint()
# Wait until ready, then print
waitUntilReady(
component,
lambda: doPrint(component, table, page,
lambda: printNext(pages, idx + 1, component))
)
def printLabels(event):
try:
serial = system.tag.readBlocking(["[P2L]Serial_No"])[0].value
logger.info("Serial Number: {}".format(serial))
tables_pages = [
('EVAP', 1), ('Hardware', 2), ('Hoses', 3),
('Condenser', 4), ('Heater', 5), ('Inverter', 6),
('Appearance', 7)
]
component = event.source.parent.getComponent(COMPONENT_NAME)
pages_to_print = []
query = "SELECT COUNT(*) AS ERow FROM FCAT_TABLE1 WHERE DESCRIPTION = ? AND ANSWER > 0 AND SERIALNUMBER = ?"
for tbl, pg in tables_pages:
rows = system.db.runPrepQuery(query, [tbl, serial])
if rows and rows[0]['ERow'] > 0:
pages_to_print.append((tbl, pg))
logger.info("Queued {} page {}".format(tbl, pg))
if pages_to_print:
printNext(pages_to_print, 0, component)
else:
system.gui.messageBox("No pages to print.", "Info")
system.util.invokeLater(closePopup, 3000)
except Exception as e:
logger.error("Error preparing labels: {}".format(e))
closePopup()
# --- Entry Point ---
system.util.invokeLater(openPopup, 2500)
system.util.invokeLater(lambda: printLabels(event), 2500)
I am working with vision , and have a report viewer with 7 pages, the script will check if each page has atlest 1 row for a particular serial number tag , if its empty it wont print that page, the only problem here is some times i am printing blank pages, and if i try to run same serial number in the designer the report viewer is loaded with proper data, something is not working sometimes. I cant find it, any suggestions would be greatful.
I am executing the script to print pages 1 after other, i have 3 seconds delay between every page for the report viewer to load, but looks like the page is not loaded with 3 seconds delay, increasing the delay also didnt help. the pages load correctly if i check in designer ( without any delay)