从IronPython脚本

时间:2015-07-29 10:16:55

标签: ironpython tibco spotfire

我们为Spotfire Web Player开发了CustomTool。在TablePlot上标记了一行,右键单击该工具会在上下文菜单中显示一个菜单项。选择该菜单项后,会显示一个弹出窗口。用户可以填写一些数据,然后在弹出窗口中单击“确定”,数据将保存到数据库中。这很棒!

此工具在AddIn中注册了Spotfire,如下所示:

protected override void RegisterTools(ToolRegistrar registrar)
{
    base.RegisterTools(registrar);
    registrar.Register<TablePlotCellContext>(new CustomToolOneWeb());
}

弹出窗口在AddIn中注册了Spotfire,如下所示:

protected override void RegisterViews(AddIn.ViewRegistrar registrar)
{
    base.RegisterViews(registrar);
    registrar.Register(typeof(PromptControl), typeof(PopupModel), typeof(Popup));
}

以下代码中的yield行会导致弹出窗口。

public class CustomToolOneWeb: CustomTool<TablePlotCellContext>
{
    ...
    protected override IEnumerable<object> ExecuteAndPromptCore(TablePlotCellContext context)
    {
        PopupModel popupSettings = null;
        try
        {
            popupSettings = new PopupModel();
            ...
            yield return popupSettings;
        }
        finally
        {
            ...
        }
        yield break; 
    }
    ...
}

以上代码效果很好!

现在,该公司提出要求弹出窗口也需要通过TextArea中的按钮进行访问。

所以我创建了一个新的CustomTool,其功能与原始工具几乎相同。 TextArea中的按钮执行IronPython脚本,该脚本又执行我的新CustomTool。但是弹出窗口没有显示。通过调试我发现我的新CustomTool确实被执行了。在我希望弹出窗口启动时,没有任何事情发生,调试器跳转到下一行。

对于新的CustomTool,我在RegisterTools方法中添加了以下行:

registrar.Register<Spotfire.Dxp.Application.Page>(new CustomToolTwoWeb());

新的CustomTool的类只在泛型级别(Page而不是TablePlotCellContext)上进行了更改:

public class CustomToolTwoWeb : CustomTool<Page>
{
    protected override IEnumerable<object> ExecuteAndPromptCore(Page context)
    {
        PopupModel popupSettings = null;
        try
        {
            popupSettings = new PopupModel();
            ...
            yield return popupSettings;
        }
        finally
        {
            ...
        }
        yield break; 
    }
    ...
}

Spotfire中使用的IronPython脚本启动新的CustomTool(页面是类型页面的脚本参数):

import clr
clr.AddReference(".......")
import Spotfire.Dxp.Application
from CustomToolsWeb import CustomToolTwoWeb

found, tool = Application.Toolbox.TryGetTool[CustomToolTwoWeb]()
if found:
    tool.Execute(page)

为什么新的CustomTool不会显示Popup和原始的CustomTool。 如何解决这个问题?

PS:在IronPython脚本中已经尝试了tool.ExecuteAndPrompt(page)但它没有执行我的代码(使用调试器检查)并且它也不会抛出错误。

更新2015-08-14:来自TIBCO的人我得到以下简短回答:

  

使用Web Player,IronPython正在服务器上执行   可能是问题。因此,IronPython代码可能不行   打开一个向用户显示的弹出窗口。

这对我来说似乎是一个看似合理的技术解释。

还有其他方法,开箱即用,按钮可以在不使用IronPython的情况下触发我的工具吗?可能通过Javascript?

或者我应该尝试将自己的Ajax请求构建到/SpotfireWeb/AjaxService.asmx吗?这还有可能吗?

0 个答案:

没有答案