Spotfire - mark records and send to clipboard

£可爱£侵袭症+ 提交于 2019-12-08 12:59:38

问题


I'd like to create a Spotfire button action control that does the following

  1. Select all rows in a table visualization
  2. Send the selected rows to the clipboard

First step was handled pretty easily (borrowed from here). For the second step, I was unsuccessful in my initial attempts to send to clipboard with script (e.g. as suggested here). I was partially successful in a followup attempt by sending ctrl-c programatically to spotfire (see spotfired.blogspot.co.id/2014/04/pressing-keys-programatically.html).

Here's the [mostly] functioning code:

from Spotfire.Dxp.Application.Visuals import VisualContent
from Spotfire.Dxp.Data import IndexSet
from Spotfire.Dxp.Data import RowSelection

#Get table reference
vc = vis.As[VisualContent]()
dataTable = vc.Data.DataTableReference

#Set marking
marking=vc.Data.MarkingReference

#Setup rows to select from rows to include
rowCount=dataTable.RowCount
rowsToSelect = IndexSet(rowCount, True)

#Set marking
marking.SetSelection(RowSelection(rowsToSelect), dataTable)

#Script to send keystroke to Spotfire
import clr
clr.AddReference("System.Windows.Forms")
from System.Windows.Forms import SendKeys, Control, Keys

#Send keystroke for CTRL-C Copy-to-clipboard 
SendKeys.Send("^c") #Ctrl+C

The code works as expected, except that I have to hit the button twice for the ctrl-c part of the script to work (i.e. hitting once results in marking all rows in the table visualization).

Another issue that I seemed to have resolved is that the originally suggested syntax to send the ctrl-c keystroke command was SendKeys.Send("(^+C)"). However, this didn't work, so I rewrote as SendKeys.Send("^c"), which does work, except only after I hit the button twice.

Any thoughts on how I could fix the issue of having hit the action control button twice? A workaround could be to avoid sending keystrokes with script and revisit my first attempt code the copy-to-clipboard functionality, but my Ironpython skills are a limiting factor here.


回答1:


Using the same post as reference I used this code to use the windows clipboard

tempFolder = Path.GetTempPath()
tempFilename = Path.GetTempFileName()
tp = mytable.As[TablePlot]()
writer = StreamWriter(tempFilename)
tp.ExportText(writer)

f = open(tempFilename)
html=""
for line in f:
   html += "\t".join(line.split("\t")).strip()
   html += "\n"
f.close()


import clr
clr.AddReference('System.Windows.Forms')
from System.Windows.Forms import Clipboard
Clipboard.SetText(html)



回答2:


Thanks, sayTibco, code working for me, now. See below for updated version. Still curious to know how to better utilize SendKeys.Send(), but will make that the subject of a separate post after I have some time to experiment.

from Spotfire.Dxp.Application.Visuals import VisualContent, TablePlot
from Spotfire.Dxp.Data import IndexSet
from Spotfire.Dxp.Data import RowSelection

#get table reference
vc = mytable.As[VisualContent]()
dataTable = vc.Data.DataTableReference

#set marking
marking=vc.Data.MarkingReference

#setup rows to select from rows to include
rowCount=dataTable.RowCount
rowsToSelect = IndexSet(rowCount, True)

#Set marking
marking.SetSelection(RowSelection(rowsToSelect), dataTable)

#Copy marked records to Clipboard
import clr
import sys
clr.AddReference('System.Data')
import System
from System.IO import Path, StreamWriter
from System.Text import StringBuilder

#Temp file for storing the table data
tempFolder = Path.GetTempPath()
tempFilename = Path.GetTempFileName()

#Export TablePlot data to the temp file
tp = mytable.As[TablePlot]()
writer = StreamWriter(tempFilename)
tp.ExportText(writer)
f = open(tempFilename)

#Format table
html=""
for line in f:
   html += "\t".join(line.split("\t")).strip()
   html += "\n"
f.close()

#Paste to system Clipboard
clr.AddReference('System.Windows.Forms')
from System.Windows.Forms import Clipboard
Clipboard.SetText(html)


来源:https://stackoverflow.com/questions/44104978/spotfire-mark-records-and-send-to-clipboard

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!