Spotfire IronPython脚本运行后过滤器消失及服务器错误求助
Spotfire IronPython脚本过滤器异常及列消失修复方案
问题现象
- 运行生成可视化的IronPython脚本后,右侧过滤器栏内容消失
- 抛出内部服务器错误,具体信息如下:
XmlHttpRequest failed. Internal Server Error
Read error (-1): {"viewId":"ceb0fbf6-5bd1-4b3f-a191-a431f1ffaa0a","method":"InitializeFilter","args":"{"id":"97b12241-cb78-46c1-8b24-97cb789b34d2","filterContainerId":"poppedFilter11"}"}
XMLHttpRequest: {"readyState":4,"responseText":"","status":500,"statusText":"Internal Server Error"}
- 数据表中未在可视化中使用的过滤列自动消失
原脚本
from Spotfire.Dxp.Data import DataTableSaveSettings from Spotfire.Dxp.Application.Visuals import ScatterPlot, BoxPlot from Spotfire.Dxp.Application import Layout page = Document.Pages.AddNew() #visualization (I copy this for a total of 4 visualizations) myVis = Document.ActivePageReference.Visuals.AddNew[ScatterPlot]() myVis.Data.DataTableReference = input_table myVis.Title = "Title" myVis.XAxis.Expression = '\[Date\]' myVis.YAxis.Expression = '\[Item1\]' myVis.ColorAxis.Expression = '\[Item2\]' myVis.YAxis.ManualZoom = True myVis.LineConnection.ConnectionAxis.Expression = '\<\[Item3\]\>' myVis.LineConnection.UseMarkerColor = True #format lst = [] for visual in page.Visuals: lst.append(visual) format = Layout.LayoutDefinition() format.BeginStackedSection(1) format.Add(lst\[0\]) format.Add(lst\[2\]) format.BeginSideBySideSection(1) format.Add(lst\[1\]) format.Add(lst\[3\]) format.EndSection() format.EndSection() page.ApplyLayout(format)
修复方案
1. 修正可视化页面引用错误
原脚本创建新页面后,错误地将可视化添加到旧的活跃页面,导致布局操作与可视化所在页面不匹配,引发资源加载异常。修改为直接在新创建的页面上添加可视化:
# 替换原可视化添加代码 myVis = page.Visuals.AddNew[ScatterPlot]() # 使用新创建的page对象
2. 强制保留所有数据表列
Spotfire默认会隐藏未在可视化中使用的列,需显式设置所有列可见:
# 在脚本开头添加,确保input_table的所有列不被隐藏 for col in input_table.Columns: col.Properties["Hidden"] = False
3. 修正布局列表索引问题
原脚本通过遍历页面可视化构建列表,若新页面存在默认元素(如文本框),会导致索引错位。建议在添加可视化时直接存入列表:
# 重构可视化添加与列表构建逻辑 lst = [] # 添加第一个可视化 vis1 = page.Visuals.AddNew[ScatterPlot]() vis1.Data.DataTableReference = input_table vis1.Title = "Title 1" # ... 其他配置项 lst.append(vis1) # 添加第二个可视化 vis2 = page.Visuals.AddNew[ScatterPlot]() vis2.Data.DataTableReference = input_table vis2.Title = "Title 2" # ... 其他配置项 lst.append(vis2) # 同理添加第三、第四个可视化并加入lst # 应用布局 layout_def = Layout.LayoutDefinition() layout_def.BeginStackedSection(1) layout_def.Add(lst[0]) layout_def.Add(lst[2]) layout_def.BeginSideBySideSection(1) layout_def.Add(lst[1]) layout_def.Add(lst[3]) layout_def.EndSection() layout_def.EndSection() page.ApplyLayout(layout_def)
4. 页面刷新确保过滤器容器初始化
布局应用完成后,显式刷新页面,确保过滤器容器正常加载:
# 在布局应用后添加 page.Refresh()
内容的提问来源于stack exchange,提问作者intergalactic
相关产品推荐
相关产品推荐

