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)





