spotfire得到格子面板的名称

时间:2016-06-13 22:56:56

标签: ironpython spotfire

假设我有一个可视化,它由面板按一些分类变量进行格式化,每页有一个面板。我想循环遍历面板并将每个图像导出到一个文件,文件名与分类变量匹配。

根据一些已发布的示例,图像导出完全正常。但是,实际获取当前面板的名称时遇到很多麻烦,以便我可以正确命名图像。

这是我的代码:

from Spotfire.Dxp.Application.Visuals import VisualContent
from System.Drawing import Bitmap, Graphics, Rectangle, Point
from System.IO import Path
import re

vc=viz.As[VisualContent]() #viz is the visualization parameter passed to the script
trellis=vc.Trellis

originalIndex=trellis.ActivePageIndex

outputDir=Document.Properties["imageOutputDir"]

for i in range(trellis.PageCount):
    #move to the right page
    trellis.ActivePageIndex=i

    #make the actual image - 
    viz_r = Document.ActivePageReference.GetVisualBounds(viz)
    width=viz_r.Width
    height=viz_r.Height
    bm = Bitmap(width,height)
    g = Graphics.FromImage(bm)
    g.TextRenderingHint = g.TextRenderingHint.AntiAlias
    r=Rectangle(0, 0, width,height)
    vc.Render(g, r)

    #save the image

    name="%d"%i
    #here we would like to instead get the current value of the trellis variable!
    #name=?

    clean_name=re.sub(r'[/\\:*?"<>|]', '_',name)
    tempFilename = outputDir+"\\%s.png"%clean_name
    bm.Save(tempFilename)
    print "image saved as " + tempFilename

trellis.ActivePageIndex=originalIndex

我似乎已经查看了VisualContentTrellis的所有方法,但还没有找到它。

另一种方法是循环访问数据并获取分类变量的值。但是,订单不一定得到保留,因此效果不佳。如果我能得到与每个格子面板相对应的数据,当然我可以从中做到。

2 个答案:

答案 0 :(得分:3)

这就是我最终的目标。当变量属于string类型并且排序为standard sort order for datatype时,这似乎有效。

如果有人可以使排序更加健壮,那么肯定会受到赞赏。我基本上必须通过加载文本数据并检查排序来找出spotfire使用的字母数字排序。我可能忘记了一些字符 - 这似乎对我的数据起作用了。

我无法访问Niko建议的TryGetCustomSortOrder方法 - 我在Spotfire 6.5中工作,它只能在7.0中使用

from Spotfire.Dxp.Application.Visuals import VisualContent
import Spotfire.Dxp.Data.DataTable
from Spotfire.Dxp.Data import *
from System.Drawing import Bitmap, Graphics, Rectangle, Point
from System.IO import Path
import re

vc=viz.As[VisualContent]()
trellis=vc.Trellis
name_column=trellis.PanelAxis.Expression.Trim('<').Trim('>').Trim('[').Trim(']')
#get the unique column values
myTable = Document.ActiveDataTableReference
rowCount = myTable.RowCount
rowsToInclude = Document.ActiveFilteringSelectionReference.GetSelection(myTable).AsIndexSet()
cursor1 = DataValueCursor.Create(myTable.Columns[name_column])

S=set()
for row in myTable.GetRows(rowsToInclude,cursor1):
    x=cursor1.CurrentDataValue.Value
    if x not in S:
        S.add(x)
L=list(S)

alphabet=r' _-,;:!.\'"(){}@*/\&#%`^+<=>|~$0123456789abcdefghijklmnopqrstuvwxyz'

L=sorted(L,key=lambda s:[alphabet.index(c) if c in alphabet else -1 for c in s.lower()])
#things not in alphabet probably unicode characters that get sorted to the beginning

originalIndex=trellis.ActivePageIndex
outputDir=Document.Properties["imageOutputDir"]

for i,name in enumerate(L):
    trellis.ActivePageIndex=i
    viz_r = Document.ActivePageReference.GetVisualBounds(viz)
    width=viz_r.Width
    height=viz_r.Height
    bm = Bitmap(width,height)
    g = Graphics.FromImage(bm)
    g.TextRenderingHint = g.TextRenderingHint.AntiAlias

    r=Rectangle(0, 0, width,height)
    vc.Render(g, r)

    clean_name=re.sub(r'[/\\:*?"<>|]', '_',name)
    tempFilename = outputDir+"\\%s.png"%clean_name
    bm.Save(tempFilename)
    print "image saved as " + tempFilename

trellis.ActivePageIndex=originalIndex

答案 1 :(得分:2)

我经过几次搜索和搜索,最后终于找到了TIBCO的支持。很遗憾没有办法访问网格标题。