取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
The Discovery Summit 2025 Call for Content is open! Submit an abstract today to present at our premier analytics conference.
See how to use to use Text Explorer to glean valuable information from text data at April 25 webinar.
选择语言 隐藏翻译栏
查看原发布的话题

帮助解决 JSL Throw() 未按预期运行的问题

SDF1
Super User

各位,

 

(JMP 专业版 16.1.0、Win10)

 

我有一个与我之前的帖子相关的问题这里,如果您对一些“背景故事”感兴趣。

 

我现在遇到的主要问题是 Throw() 命令没有按预期工作。 在我的代码中(完整代码请参阅末尾),我在几个地方进行了测试,以查看当前是否存在打开的图形生成器报告,如下所示,并且它包含在 Expr() 语句中:

 

If( Is Empty( Current Report() ) == 1,
  Throw( "No Graph Builder Window is Open" )
 );

问题是,每当我运行代码(就像从工具栏热按钮运行它一样),它似乎会跳过这些行并忽略是否没有打开的报告。 但是,当我“逐行”运行代码时,它将正确捕获没有打开的报告并通知用户。

 

 

我正在尝试编写要分发给整个组织中的用户的代码,并尝试使其足够强大以处理不同类型的情况,例如,如果用户打开了一个或多个数据表和/或打开了一个或多个项目(其中可以包含多个数据表)。

 

代码的概念如下(问题出现在第 6 项):用户正在 Graph Builder 中创建图形,然后想要对图形进行常规修改(有关详细信息,请参阅上面的链接),然后用户单击工具栏执行上述操作的热按钮。

 

  1. 该代码运行 Graphic_Expr 表达式来确定图形的位置 - 是在“独立”数据表中,还是在项目内(只能选择一个选项)。 ->(转到)
  2. 根据选择的复选框,代码然后运行 dt_win_Expr 或 prj_win_Expr 代码(现在,我在测试代码时只为数据表选项设置了它,但理想情况下最终的功能应该大致相同) 。 ->(转到)
  3. 如果是独立数据表,则它运行 dt_win_Expr 并创建一个窗口,供用户选择要编辑的图形所在的数据表。 回想一下,用户可能会打开多个数据表,并且可能会打开多个图形生成器。 | (或者)
  4. 同样,如果用户选择一个项目,它将运行 prj_win_Expr(尚未完成)来让用户选择哪个项目(如果打开多个项目)以及该项目中的后续数据表。 ->(转到)
  5. 选择数据表后,无论是独立的还是在项目内,代码都会运行 SquarifyWin_Expr 表达式。 它在这里做的第一件事是测试是否确实存在当前报告 - 上面的 If() 代码(我可能需要修改和测试当前报告是否是图形生成器)。 **这是代码无法按预期运行的地方。 即使没有打开图形生成器,当它应该抛出警告时,它也会继续执行其余代码。** 如果一切正常...->(转到)
  6. 根据像素尺寸和是否方形化,代码然后运行 RprtUpdate_Expr 表达式,将所需的更新发送到图形生成器报告。

 

我希望这个描述有意义,并有助于将我想要的编程路径/功能放在上下文中。

 

预先非常感谢您为寻找解决方案提供的任何帮助。 完整的 JSL 代码在最后。

 

谢谢!,

DS

Names Default To Here( 1 );
Clear Symbols();

RprtUpdate_Expr = Expr(

 gb = Current Report()[Outline Box( 1 )] << Get Scriptable Object;

 Report( gb )[framebox( 1 )] << FrameSize( widthN, heightN );
 theMax = Max( Report( gb )[axisbox( 1 )] << get max, Report( gb )[axisbox( 2 )] << get max );
 theMin = Min( Report( gb )[axisbox( 1 )] << get min, Report( gb )[axisbox( 2 )] << get min );
 Report( gb )[framebox( 1 )] << Xaxis( Min( theMin ), Max( theMax ) );
 Report( gb )[framebox( 1 )] << Yaxis( Min( theMin ), Max( theMax ) );
 Report( gb )[framebox( 1 )] << AddGraphicsScript(
  xmin = X Origin();
  xmax = X Origin() + X Range();
  ymin = Y Origin();
  ymax = Y Origin() + Y Range();
  Pen Color( "blue" );
  Pen Size( 1 );
  Line Style( "solid" );
  Line( {xmin, ymin}, {xmax, ymax} );
 );
 
);

SquarifyWin_Expr = Expr(

 If( Is Empty( Current Report() ) == 1,
  Throw( "No Graph Builder Window is Open" )
 );
 
 nwin = New Window( "Enter Size of Desired Graph",
  <

这篇帖子最初是用 English (US) 书写的,已做计算机翻译处理。当您回复时,文字也会被翻译成 English (US)。

2 个已接受解答

已接受的解答
jthi
Super User

回复:有关 JSL Throw() 未按预期运行的帮助

您检查过 JMP Log 中是否有打印内容吗? 抛出可能会触发,但只是没有“错误窗口”。 至少当我使用插件时,我使用自定义错误模式窗口,因为 Throw 不会像作为脚本运行时那样创建错误窗口。

模态对话框有相当简单的警报功能,您可以使用它来代替抛出(您也可以抛出但使用模式窗口向用户显示错误)。

 

编辑:

找到了我用于信息模式窗口的一个函数:

Names Default To Here(1);


mini_modal_window = function({title, text, text_icon = "BlankIndex", window_icon = "NewApplication"}, {Default Local},
 New Window(title, <
David_Burnham
Super User (Alumni)

回复:有关 JSL Throw() 未按预期运行的帮助

扫描图形生成器窗口的示例:

 

getGraphBuilderWindows = function({},{default local},
 
 lst = {};

 winList = getWindowList();
 for each({win},winList,
  winTitle = win << getWindowTitle;
  if (contains(winTitle,"Graph Builder"),
   insertinto(lst,win)
  )
 );
 return(lst);

 
);

lstGBWindows = getGraphBuilderWindows();
5 条回复5
jthi
Super User

回复:有关 JSL Throw() 未按预期运行的帮助

您检查过 JMP Log 中是否有打印内容吗? 抛出可能会触发,但只是没有“错误窗口”。 至少当我使用插件时,我使用自定义错误模式窗口,因为 Throw 不会像作为脚本运行时那样创建错误窗口。

模态对话框有相当简单的警报功能,您可以使用它来代替抛出(您也可以抛出但使用模式窗口向用户显示错误)。

 

编辑:

找到了我用于信息模式窗口的一个函数:

Names Default To Here(1);


mini_modal_window = function({title, text, text_icon = "BlankIndex", window_icon = "NewApplication"}, {Default Local},
 New Window(title, <

这篇帖子最初是用 English (US) 书写的,已做计算机翻译处理。当您回复时,文字也会被翻译成 English (US)。

David_Burnham
Super User (Alumni)

回复:有关 JSL Throw() 未按预期运行的帮助

尝试将诊断放入您的代码中。

 

我放

 

show ( Current Report() );

在你的测试之前,它报告了这一点:

 

Current Report() = DisplayBox[HeadBox];

不是空的。

这篇帖子最初是用 English (US) 书写的,已做计算机翻译处理。当您回复时,文字也会被翻译成 English (US)。

David_Burnham
Super User (Alumni)

回复:有关 JSL Throw() 未按预期运行的帮助

另请注意,CurrentReport 将查找任何打开的窗口,包括您正在创建的窗口。您需要检查显示树(例如 OutlineBox(1) )以将窗口标识为图形生成器,如果您打开了其他窗口,它可能不是当前的,因此可能会搜索打开的窗口列表。

这篇帖子最初是用 English (US) 书写的,已做计算机翻译处理。当您回复时,文字也会被翻译成 English (US)。

David_Burnham
Super User (Alumni)

回复:有关 JSL Throw() 未按预期运行的帮助

扫描图形生成器窗口的示例:

 

getGraphBuilderWindows = function({},{default local},
 
 lst = {};

 winList = getWindowList();
 for each({win},winList,
  winTitle = win << getWindowTitle;
  if (contains(winTitle,"Graph Builder"),
   insertinto(lst,win)
  )
 );
 return(lst);

 
);

lstGBWindows = getGraphBuilderWindows();

这篇帖子最初是用 English (US) 书写的,已做计算机翻译处理。当您回复时,文字也会被翻译成 English (US)。

SDF1
Super User

回复:有关 JSL Throw() 未按预期运行的帮助

你好@jthi@大卫_伯纳姆,

 

感谢你们的反馈和想法。 我喜欢迷你模式窗口,在测试是否有任何图形生成器打开时它派上用场。

 

我决定改变一切并完全重写代码。 它现在可以执行我想要的操作,但它还通过关联数组跟踪哪个图形生成器实例适用于哪个项目。 对于数据表,即使多个打开,区分图形构建器的不同实例也不存在问题,即使在单个数据表中也是如此,但由于项目有多个选项卡,我必须确保抓取构建器的分配可编写脚本的对象与正确的项目相关联。 我很高兴能够使用 AA 并让他们也帮助我! 新代码还会更改第一个窗口,具体取决于您是否仅打开数据表(或项目)或两者都打开。

 

这是一个很好的小尝试,我很享受为它工作。 经过更多测试后,我将与我的组织分享。 如果您有兴趣,下面是代码。 在遍历所有可能的项目,然后遍历项目中的所有窗口时,我无法弄清楚如何让 For Each() 工作,因此我改为使用 For() 循环。

 

谢谢!,

DS

//JSL to add diagonal line and automatically resize to desired size
//Written by SDF1 with help/input from jthi, txnelson, Craige_Hales, David_Burnham, and Mark_Bailey

Names Default To Here( 1 );
Clear Symbols();

lb_width = 80;

Lines_n = 6;

mmw = Function( {title, text, text_icon = "BlankIndex", window_icon = "NewApplication"},
 {Default Local},
 New Window( title,
  <

这篇帖子最初是用 English (US) 书写的,已做计算机翻译处理。当您回复时,文字也会被翻译成 English (US)。