假设我有一个可视化,它由面板按一些分类变量进行格式化,每页有一个面板。我想循环遍历面板并将每个图像导出到一个文件,文件名与分类变量匹配。
根据一些已发布的示例,图像导出完全正常。但是,实际获取当前面板的名称时遇到很多麻烦,以便我可以正确命名图像。
这是我的代码:
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
我似乎已经查看了VisualContent
和Trellis
的所有方法,但还没有找到它。
另一种方法是循环访问数据并获取分类变量的值。但是,订单不一定得到保留,因此效果不佳。如果我能得到与每个格子面板相对应的数据,当然我可以从中做到。
答案 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)