<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Palette Communication Failure: Python-&amp;gt;JS (sendInfoToHTML) Messages Not Received by JS Handler in Fusion Support Forum</title>
    <link>https://forums.autodesk.com/t5/fusion-support-forum/palette-communication-failure-python-gt-js-sendinfotohtml/m-p/13421602#M1289</link>
    <description>&lt;P class=""&gt;&lt;SPAN class=""&gt;I am developing an Add-In that uses a standard HTML Palette (&lt;/SPAN&gt;&lt;SPAN class=""&gt;adsk.core.Palettes.add&lt;/SPAN&gt;&lt;SPAN class=""&gt;) for user interaction. The Add-In requires bi-directional communication:&lt;/SPAN&gt;&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;&lt;P class=""&gt;&lt;SPAN class=""&gt;JavaScript -&amp;gt; Python&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class=""&gt;:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN class=""&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Sending user actions/data from the palette JS to the Python backend using&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=""&gt;window.adsk.fusionSendData(action, data)&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P class=""&gt;&lt;SPAN class=""&gt;Python -&amp;gt; JavaScript&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class=""&gt;:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN class=""&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Sending status updates, results, or commands from the Python backend to the palette JS using&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=""&gt;palette.sendInfoToHTML(action, data)&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;P class=""&gt;&lt;SPAN class=""&gt;While developing, I've encountered a persistent issue where communication from&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=""&gt;Python to JavaScript appears to be broken or unreliable.&lt;/SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp;Messages sent using&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;palette.sendInfoToHTML&lt;/SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp;from Python are logged as completing successfully on the Python side, but the corresponding&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;window.fusionJavaScriptHandler.handle&lt;/SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp;function in JavaScript is&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;never invoked&lt;/SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp;for these messages.&lt;/SPAN&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;SPAN class=""&gt;Interestingly, communication from&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;JavaScript to Python seems partially functional&lt;/SPAN&gt;&lt;SPAN class=""&gt;, although I sometimes observe duplicate events or spurious 'response' events being received by my Python&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;HTMLEventHandler.notify&lt;/SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp;method immediately after a valid event from JavaScript.&lt;/SPAN&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;SPAN class=""&gt;The primary symptom, however, is the failure of Python-to-JavaScript messaging, preventing UI updates, status reporting, and result display within the palette.&lt;BR /&gt;&lt;BR /&gt;To isolate the issue, I created a minimal test Add-In:&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;SPAN class=""&gt;Observed Behavior with Minimal Test:&lt;/SPAN&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;P class=""&gt;&lt;SPAN class=""&gt;Python receives the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;html_ready&lt;/SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp;signal successfully.&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P class=""&gt;&lt;SPAN class=""&gt;Python attempts to send&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;py_ack_ready&lt;/SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp;back to JS - Python logs show&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;sendInfoToHTML completed&lt;/SPAN&gt;&lt;SPAN class=""&gt;, but&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;JS logs/UI never show receipt&lt;/SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp;of&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;py_ack_ready&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P class=""&gt;&lt;SPAN class=""&gt;Clicking "Send PING" successfully sends&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;ping&lt;/SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp;from JS to Python. Python logs receipt.&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P class=""&gt;&lt;SPAN class=""&gt;Python attempts to send&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;pong&lt;/SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp;back to JS - Python logs show&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;sendInfoToHTML completed&lt;/SPAN&gt;&lt;SPAN class=""&gt;, but&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;JS logs/UI never show receipt&lt;/SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp;of&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;pong&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&lt;SPAN class=""&gt;Could this indicate a potential issue with the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;palette.sendInfoToHTML&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;window.fusionJavaScriptHandler.handle&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;communication bridge in this version of Fusion 360 ( installed March 25 2025 ) on Mac?&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&lt;SPAN&gt;Thank you for any assistance.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P class=""&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="general"&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Minimal Test&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h3&amp;gt;Minimal Test&amp;lt;/h3&amp;gt;
    &amp;lt;button id="pingButton"&amp;gt;Send PING&amp;lt;/button&amp;gt;
    &amp;lt;p&amp;gt;Status: &amp;lt;span id="status"&amp;gt;Loading...&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;Py Response: &amp;lt;span id="response"&amp;gt;N/A&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;
    &amp;lt;script&amp;gt;
        const statusElem = document.getElementById('status');
        const responseElem = document.getElementById('response');
        function logJs(msg) { console.log(`JS: ${msg}`); statusElem.textContent = msg; }

        if (window.fusionJavaScriptHandler) {
             if (!window.fusionJavaScriptHandler.isMinimalHandlerAssigned_XYZ) {
                logJs("Assigning JS handler...");
                window.fusionJavaScriptHandler.handle = function (action, dataStr) {
                    logJs(`Handler called! Action: ${action}`); // *** THIS LOG IS NOT APPEARING for 'pong' or 'py_ack_ready' ***
                    responseElem.textContent = `Action=${action}, Data=${dataStr}`;
                };
                window.fusionJavaScriptHandler.isMinimalHandlerAssigned_XYZ = true;
                logJs("JS Handler assigned.");
                try {
                    logJs("Sending 'html_ready'...");
                    window.adsk.fusionSendData('html_ready', '{}'); // Signal Python
                    logJs("'html_ready' sent.");
                } catch (e) { logJs("Error sending 'html_ready'"); console.error(e); }
            }
        } else { logJs("CRITICAL: fusionJavaScriptHandler not found!"); }

        document.getElementById('pingButton').addEventListener('click', () =&amp;gt; {
            logJs("Ping clicked. Sending 'ping'...");
            try {
                 window.adsk.fusionSendData('ping', '{}');
                 logJs("'ping' sent.");
            } catch (e) { logJs("Error sending 'ping'"); console.error(e); }
        });
        logJs("Script loaded.");
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;


##################### PYTHON STARTS HERE  #############


import adsk.core
import adsk.fusion
import traceback
import json

_app = None
_ui = None
_handlers = []
_palette = None
_palette_id = 'minimal'
_html_is_ready = False

def log_py(message): print(f"PY LOG: {message}")

def send_to_js_minimal(action, data={}):
    global _palette, _html_is_ready
    if not _html_is_ready:
        log_py(f"PY: HTML not ready, discarding {action}")
        return
    if _palette:
        try:
            payload_str = json.dumps(data)
            log_py(f"PY: Attempting sendInfoToHTML: Action='{action}'")
            _palette.sendInfoToHTML(action, payload_str)
            log_py(f"PY: sendInfoToHTML completed for '{action}'.")
        except Exception as e:
            log_py(f"PY ERROR sending '{action}': {e}")
            log_py(traceback.format_exc())
    else: log_py("PY ERROR: Palette object lost.")

class MinimalHTMLEventHandler(adsk.core.HTMLEventHandler):
    def __init__(self): super().__init__()
    def notify(self, args: adsk.core.HTMLEventArgs):
        global _html_is_ready
        action = "ERR"; data = "ERR"
        try:
            action = args.action; data = args.data
            log_py(f"PY Received: Action='{action}', Data='{data[:50]}...'")

            if action == 'html_ready':
                log_py("PY: HTML is ready!")
                _html_is_ready = True
                # Attempt to send an immediate response after ready
                send_to_js_minimal('py_ack_ready', {'status': 'Python Acknowledged Ready'})
                return

            if action == 'ping':
                 log_py("PY: Received PING, sending PONG...")
                 send_to_js_minimal('pong', {'reply': 'PONG from Python'})

            # Ignore spurious response if it occurs
            if action == 'response':
                 log_py("PY: Ignoring spurious 'response'.")
                 return

        except Exception as e:
            log_py(f"PY ERROR in notify for action '{action}': {e}")
            log_py(traceback.format_exc())

def run(context):
    global _ui, _app, _palette, _handlers, _html_is_ready
    try:
        _html_is_ready = False # Reset flag
        _app = adsk.core.Application.get(); _ui = _app.userInterface; _handlers = []
        log_py("Minimal Add-In Starting...")
        palettes = _ui.palettes; _palette = palettes.itemById(_palette_id)
        if _palette: _palette.deleteMe(); _palette = None # Force recreation
        _palette = palettes.add(_palette_id, 'Minimal Test', 'resources/test_palette.html', True, True, True, 300, 200)
        if not _palette: log_py("PY ERROR: Failed to create palette."); return
        onHTMLEvent = MinimalHTMLEventHandler(); _palette.incomingFromHTML.add(onHTMLEvent); _handlers.append(onHTMLEvent)
        _palette.isVisible = True
        log_py("Minimal Add-In Running. Waiting for html_ready...")
    except Exception as e: log_py(f"PY ERROR during run: {e}"); log_py(traceback.format_exc())

def stop(context):
    global _ui, _handlers, _palette, _palette_id, _html_is_ready
    log_py("Minimal Add-In Stopping...")
    _html_is_ready = False
    if _ui:
         palette = _ui.palettes.itemById(_palette_id)
         if palette: palette.deleteMe()
    _handlers = []; _palette = None; log_py("Minimal Add-In Stopped.")&lt;/LI-CODE&gt;&lt;P class=""&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Fri, 11 Apr 2025 17:47:55 GMT</pubDate>
    <dc:creator>samaksh_khandelwal</dc:creator>
    <dc:date>2025-04-11T17:47:55Z</dc:date>
    <item>
      <title>Palette Communication Failure: Python-&gt;JS (sendInfoToHTML) Messages Not Received by JS Handler</title>
      <link>https://forums.autodesk.com/t5/fusion-support-forum/palette-communication-failure-python-gt-js-sendinfotohtml/m-p/13421602#M1289</link>
      <description>&lt;P class=""&gt;&lt;SPAN class=""&gt;I am developing an Add-In that uses a standard HTML Palette (&lt;/SPAN&gt;&lt;SPAN class=""&gt;adsk.core.Palettes.add&lt;/SPAN&gt;&lt;SPAN class=""&gt;) for user interaction. The Add-In requires bi-directional communication:&lt;/SPAN&gt;&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;&lt;P class=""&gt;&lt;SPAN class=""&gt;JavaScript -&amp;gt; Python&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class=""&gt;:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN class=""&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Sending user actions/data from the palette JS to the Python backend using&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=""&gt;window.adsk.fusionSendData(action, data)&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P class=""&gt;&lt;SPAN class=""&gt;Python -&amp;gt; JavaScript&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class=""&gt;:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN class=""&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Sending status updates, results, or commands from the Python backend to the palette JS using&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=""&gt;palette.sendInfoToHTML(action, data)&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;P class=""&gt;&lt;SPAN class=""&gt;While developing, I've encountered a persistent issue where communication from&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=""&gt;Python to JavaScript appears to be broken or unreliable.&lt;/SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp;Messages sent using&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;palette.sendInfoToHTML&lt;/SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp;from Python are logged as completing successfully on the Python side, but the corresponding&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;window.fusionJavaScriptHandler.handle&lt;/SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp;function in JavaScript is&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;never invoked&lt;/SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp;for these messages.&lt;/SPAN&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;SPAN class=""&gt;Interestingly, communication from&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;JavaScript to Python seems partially functional&lt;/SPAN&gt;&lt;SPAN class=""&gt;, although I sometimes observe duplicate events or spurious 'response' events being received by my Python&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;HTMLEventHandler.notify&lt;/SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp;method immediately after a valid event from JavaScript.&lt;/SPAN&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;SPAN class=""&gt;The primary symptom, however, is the failure of Python-to-JavaScript messaging, preventing UI updates, status reporting, and result display within the palette.&lt;BR /&gt;&lt;BR /&gt;To isolate the issue, I created a minimal test Add-In:&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;SPAN class=""&gt;Observed Behavior with Minimal Test:&lt;/SPAN&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;P class=""&gt;&lt;SPAN class=""&gt;Python receives the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;html_ready&lt;/SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp;signal successfully.&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P class=""&gt;&lt;SPAN class=""&gt;Python attempts to send&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;py_ack_ready&lt;/SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp;back to JS - Python logs show&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;sendInfoToHTML completed&lt;/SPAN&gt;&lt;SPAN class=""&gt;, but&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;JS logs/UI never show receipt&lt;/SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp;of&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;py_ack_ready&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P class=""&gt;&lt;SPAN class=""&gt;Clicking "Send PING" successfully sends&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;ping&lt;/SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp;from JS to Python. Python logs receipt.&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P class=""&gt;&lt;SPAN class=""&gt;Python attempts to send&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;pong&lt;/SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp;back to JS - Python logs show&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;sendInfoToHTML completed&lt;/SPAN&gt;&lt;SPAN class=""&gt;, but&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;JS logs/UI never show receipt&lt;/SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp;of&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;pong&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&lt;SPAN class=""&gt;Could this indicate a potential issue with the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;palette.sendInfoToHTML&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=""&gt;window.fusionJavaScriptHandler.handle&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;communication bridge in this version of Fusion 360 ( installed March 25 2025 ) on Mac?&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&lt;SPAN&gt;Thank you for any assistance.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P class=""&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="general"&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Minimal Test&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h3&amp;gt;Minimal Test&amp;lt;/h3&amp;gt;
    &amp;lt;button id="pingButton"&amp;gt;Send PING&amp;lt;/button&amp;gt;
    &amp;lt;p&amp;gt;Status: &amp;lt;span id="status"&amp;gt;Loading...&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;Py Response: &amp;lt;span id="response"&amp;gt;N/A&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;
    &amp;lt;script&amp;gt;
        const statusElem = document.getElementById('status');
        const responseElem = document.getElementById('response');
        function logJs(msg) { console.log(`JS: ${msg}`); statusElem.textContent = msg; }

        if (window.fusionJavaScriptHandler) {
             if (!window.fusionJavaScriptHandler.isMinimalHandlerAssigned_XYZ) {
                logJs("Assigning JS handler...");
                window.fusionJavaScriptHandler.handle = function (action, dataStr) {
                    logJs(`Handler called! Action: ${action}`); // *** THIS LOG IS NOT APPEARING for 'pong' or 'py_ack_ready' ***
                    responseElem.textContent = `Action=${action}, Data=${dataStr}`;
                };
                window.fusionJavaScriptHandler.isMinimalHandlerAssigned_XYZ = true;
                logJs("JS Handler assigned.");
                try {
                    logJs("Sending 'html_ready'...");
                    window.adsk.fusionSendData('html_ready', '{}'); // Signal Python
                    logJs("'html_ready' sent.");
                } catch (e) { logJs("Error sending 'html_ready'"); console.error(e); }
            }
        } else { logJs("CRITICAL: fusionJavaScriptHandler not found!"); }

        document.getElementById('pingButton').addEventListener('click', () =&amp;gt; {
            logJs("Ping clicked. Sending 'ping'...");
            try {
                 window.adsk.fusionSendData('ping', '{}');
                 logJs("'ping' sent.");
            } catch (e) { logJs("Error sending 'ping'"); console.error(e); }
        });
        logJs("Script loaded.");
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;


##################### PYTHON STARTS HERE  #############


import adsk.core
import adsk.fusion
import traceback
import json

_app = None
_ui = None
_handlers = []
_palette = None
_palette_id = 'minimal'
_html_is_ready = False

def log_py(message): print(f"PY LOG: {message}")

def send_to_js_minimal(action, data={}):
    global _palette, _html_is_ready
    if not _html_is_ready:
        log_py(f"PY: HTML not ready, discarding {action}")
        return
    if _palette:
        try:
            payload_str = json.dumps(data)
            log_py(f"PY: Attempting sendInfoToHTML: Action='{action}'")
            _palette.sendInfoToHTML(action, payload_str)
            log_py(f"PY: sendInfoToHTML completed for '{action}'.")
        except Exception as e:
            log_py(f"PY ERROR sending '{action}': {e}")
            log_py(traceback.format_exc())
    else: log_py("PY ERROR: Palette object lost.")

class MinimalHTMLEventHandler(adsk.core.HTMLEventHandler):
    def __init__(self): super().__init__()
    def notify(self, args: adsk.core.HTMLEventArgs):
        global _html_is_ready
        action = "ERR"; data = "ERR"
        try:
            action = args.action; data = args.data
            log_py(f"PY Received: Action='{action}', Data='{data[:50]}...'")

            if action == 'html_ready':
                log_py("PY: HTML is ready!")
                _html_is_ready = True
                # Attempt to send an immediate response after ready
                send_to_js_minimal('py_ack_ready', {'status': 'Python Acknowledged Ready'})
                return

            if action == 'ping':
                 log_py("PY: Received PING, sending PONG...")
                 send_to_js_minimal('pong', {'reply': 'PONG from Python'})

            # Ignore spurious response if it occurs
            if action == 'response':
                 log_py("PY: Ignoring spurious 'response'.")
                 return

        except Exception as e:
            log_py(f"PY ERROR in notify for action '{action}': {e}")
            log_py(traceback.format_exc())

def run(context):
    global _ui, _app, _palette, _handlers, _html_is_ready
    try:
        _html_is_ready = False # Reset flag
        _app = adsk.core.Application.get(); _ui = _app.userInterface; _handlers = []
        log_py("Minimal Add-In Starting...")
        palettes = _ui.palettes; _palette = palettes.itemById(_palette_id)
        if _palette: _palette.deleteMe(); _palette = None # Force recreation
        _palette = palettes.add(_palette_id, 'Minimal Test', 'resources/test_palette.html', True, True, True, 300, 200)
        if not _palette: log_py("PY ERROR: Failed to create palette."); return
        onHTMLEvent = MinimalHTMLEventHandler(); _palette.incomingFromHTML.add(onHTMLEvent); _handlers.append(onHTMLEvent)
        _palette.isVisible = True
        log_py("Minimal Add-In Running. Waiting for html_ready...")
    except Exception as e: log_py(f"PY ERROR during run: {e}"); log_py(traceback.format_exc())

def stop(context):
    global _ui, _handlers, _palette, _palette_id, _html_is_ready
    log_py("Minimal Add-In Stopping...")
    _html_is_ready = False
    if _ui:
         palette = _ui.palettes.itemById(_palette_id)
         if palette: palette.deleteMe()
    _handlers = []; _palette = None; log_py("Minimal Add-In Stopped.")&lt;/LI-CODE&gt;&lt;P class=""&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 11 Apr 2025 17:47:55 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/fusion-support-forum/palette-communication-failure-python-gt-js-sendinfotohtml/m-p/13421602#M1289</guid>
      <dc:creator>samaksh_khandelwal</dc:creator>
      <dc:date>2025-04-11T17:47:55Z</dc:date>
    </item>
  </channel>
</rss>

