how to access a function in js plugin from xml

  • Hi,
    I have a custom map plugin and I would like to access/call a js function, actually a function from Leaflet.js library, in the plugin. I would like to call this function from the xml file, i.e. from a krpano action called by an event, "onstart" a new scene.
    Can anyone tell me how to do that?

    Many thanks for help,
    Giuseppe

  • Hi,
    I am asking the same question on reverse:
    how to call a js function on a js plugin from a Krpano event (e.g. onnewscene)?
    I did this on the plugin.js:

    krpano.events[onnewscene] = function() {myFunction()};

    function myFunction() {
    //js code, i.e. a function from Leaflet
    krpano.set(//setting an attribute on a krpano layer according to a value from the previous function ...)
    }

    but it does not work.

    Alternatively I would like to do on krpano (xml file):

    <scene name=myscene" onstart="my_Function()">

    <action name="my_Function">

    <!-- a js function: a leaflet function from the plugin.js -->
    set('layer[mylayer].attribute, <!-- a value from the previous js function --> )

    </action>

    but I do not know how to proceed.

    Any suggestions?

    Thank you very much for help.

    Giuseppe

  • In the action of type="Javascript" you can try like this

    Code
    krpano.events.getItem('testevent').onnewscene = "jsget(returnedValue, 'someFunction()');trace('value: ', get(returnedValue));";

    This assumes that you have event 'testevent' in the xml and someFunction returns a value

  • Thank you very much.
    I wil give it a try after some time to figure it out what your code means: I am a complete beginner in any coding.
    You say to use your code in a action of tipe="javascript": as far as I know jsget, jscall and js can be used in "normal" krpano actions.....

  • Yes you can use a basic action. I just saw in your code krpano.events... which is used in Javascript type actions.

    Depends on your project,
    dynamically set onnewscene action in event

    Code
    set(events['testevent'].onnewscene, 'newsceneaction');

    or set in event directly

    Code
    <events keep="true" name="testevent" onnewscene="newsceneaction" />

    The action, which will be executed on new scene


    Code
    <action name="newsceneaction">jsget(returnedValue, 'someFunction()');trace('value: ', get(returnedValue));</action>
  • Thank you very much for explanation!
    Not sure to understand correctly:
    <action name="newsceneaction">jsget(returnedValue, 'someFunction()');trace('value: ', get(returnedValue));</action>

    In my case someFunction() would be a function from the js plugin, i.e. the function map.latLngToContainerPoint() from leaflet.js: it converts latlng geographical coords to x,y coords in the map container.
    Just to explain, I have a testing tour with 3 images .

    In the xml file I have a plugin/layer linked with a file.js where I built the osm map; a layer for an active spot with an icon and a layer for the radar plugin.
    When I change scene (onnewscene) I would like to place the active spot and radar layers on the map layer according to the x,y coords given by the map.latLngToContainerPoint().
    I would like to do that with an action on the xml file.
    So I need "to pass" the returned value of map.latLngToContainerPoint() (which is a function on the js plugin) to an action on the xml file which is called 'onnewscene'.

  • Hi,

    I have a custom map plugin and I would like to access/call a js function, actually a function from Leaflet.js library, in the plugin. I would like to call this function from the xml file, i.e. from a krpano action called by an event, "onstart" a new scene.
    Can anyone tell me how to do that?

    There are several ways - e.g. expose your Javascript function as function on the plugin object:

    Code
    plugin.my_function = function()
    {
      ...
    }

    When that plugins is included in krpano e.g. this way:

    Code
    <plugin name="my_plugin" url="my_plugin.js" ... preload="true" />

    (preload=true to have it loaded before the newscene event)

    Then you can call it from xml this way:

    Code
    <events name="my_events" keep="true"
            onnewscene="plugin[my_plugin].my_function();"/
            />

    (Important: use an 'own' named <events> element to avoid conflicts with other code when using the global ones)

    Or if you want, you can create that event also directly in your plugin:

    Code
    krpano.set("events[my_events].keep",      true);
    krpano.set("events[my_events].onnewscene", my_onnewscene_function);
    ...
    function my_onnewscene_function()
    {
      ...
    }

    For more information please see the documentation about the plugin API:
    https://krpano.com/docu/plugininterface/#top

    and have also a look into the plugin examples sources provided here:
    https://krpano.com/docu/plugininterface/#examples

    Best regards,
    Klaus

  • Klaus,
    thank you very much: I will try to implement.
    Previously I tried:

    krpano.events.onnewscene = function(){ ..

    here map.latLngToContainerPoint() a function from Leaflet which converts geographical coods to x.y coords
    and code to set x, y coords for an activespot/layer in in the xml
    .... }

    The above is in the plugin.js file and It works, but perhaps it is not a clean code, so I will change according to your coding.
    I would prefer to do the following in xml code :

    <scene name="my_ scene" onstart="update_spot_onthemap();">

    <action name="update_spot_onthemap">

    .............//here I would put in some way map.latLngToContainerPoint() which gives x,y coords of a point on the map

    set(layer[activespot].x, 'coord.x');
    set(layer[activespot].y, 'coord.y');

    </action>

    In general (for other use): after plugin.my_function = function(){ } in the plugin.js I can call/use my_function in the xml. Is that correct?


    Thank you and best regards,

    Giuseppe

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!