Spotfire - 标记记录并发送到剪贴板

Spotfire - mark records and send to clipboard

我想创建一个执行以下操作的 Spotfire 按钮操作控件

  1. Select table 可视化中的所有行
  2. 将选定的行发送到剪贴板

第一步很容易处理(借鉴自 here). For the second step, I was unsuccessful in my initial attempts to send to clipboard with script (e.g. as suggested here)。通过以编程方式将 ctrl-c 发送到 spotfire,我在后续尝试中取得了部分成功(请参阅 spotfired.blogspot.co.id/2014/04/pressing-keys-programatically.html)。

这里是[主要]功能代码:

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

代码按预期工作,除了我必须点击按钮两次 脚本的 ctrl-c 部分才能工作(即点击一次导致标记所有行在 table 可视化中)。

我似乎已经解决的另一个问题是,最初建议的发送 ctrl-c 击键命令的语法是 SendKeys.Send("(^+C)").然而,这没有用,所以我重写为 SendKeys.Send("^c"),它确实有效,除了我按下按钮两次之后。

关于如何解决两次点击动作控制按钮的问题有什么想法吗? 一种解决方法是避免使用脚本发送击键并重新访问我第一次尝试编写复制到剪贴板功能的代码,但我的 Ironpython 技能在这里是一个限制因素。

使用相同的 post 作为参考 我使用此代码来使用 windows 剪贴板

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)

谢谢,sayTibco,代码现在为我工作。请参阅下面的更新版本。仍然很想知道如何更好地利用 SendKeys.Send(),但在我有时间进行实验后,会将其作为单独的 post 的主题。

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)