Ответ 1
Я обыскал и обыскал несколько раз и, наконец, обратился к поддержке TIBCO. к сожалению, нет доступа к заголовкам решетки.
Предположим, что у меня есть визуализация, которая решена панелью с помощью некоторой категориальной переменной, с одной панелью на странице. Я хотел бы перебрать панели и экспортировать каждое изображение в файл с именем файла, соответствующим категориальной переменной.
Экспорт изображений работает полностью, следуя некоторым опубликованным примерам. Тем не менее, у меня много проблем с получением имени текущей панели, чтобы я мог правильно назвать изображение.
Здесь мой код:
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
и не нашел его.
Альтернативой является цикл данных и просто получить значения категориальной переменной. Однако порядок не обязательно сохраняется, поэтому это не работает. Если я могу получить только данные, соответствующие каждой панели решетки, конечно, я мог бы с этим справиться.
Я обыскал и обыскал несколько раз и, наконец, обратился к поддержке TIBCO. к сожалению, нет доступа к заголовкам решетки.
Вот то, с чем я закончил. Кажется, что это работает, когда переменная имеет тип string
и сортируется как standard sort order for datatype
.
Если кто-то может сделать сортировку более надежной, она, безусловно, будет оценена. Я, по сути, должен был определить буквенно-цифровую сортировку, используемую пятнистостью, загружая текстовые данные и проверяя сортировку. Вероятно, я забыл несколько персонажей - сейчас это работает для моих данных.
Я не смог получить доступ к методу TryGetCustomSortOrder
, предложенному Niko - я работаю в 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