Copy Figure Elements to System Clipboard
18 次查看(过去 30 天)
显示 更早的评论
Hi,
I frequently use matlab on multiple adjacent computers running their own instances of matlab, and sometimes I want to share a trace or a title or an axis across figures in different computers.
I have third party software (search sharemouse or inputdirector for example) that enables clipboard sharing across multiple computers, so if there is any way that I can copy a figure element to the system clipboard and not just within the plot editing mode's internal version of the clipboard, i'll be good to go.
Perhaps a simpler problem that would be equally useful is if there is some way to copy an entire figure to the clipboard in a way that it can be pasted back into another instance of matlab, rather than as a bitmap for opening in word like the 'copy figure' option enables.
Thanks!
0 个评论
采纳的回答
Jan
2013-9-19
编辑:Jan
2013-10-5
You can create a menu to copy the contents of a fig file as byte stream in the clipboard. Simply create a FIG file by hgsave, import the contents by fread and copy the data as string to the clibboard with a meaningful header:
[EDITED, code refreshed]
function FigClipboard(command, FigH)
% Copy & paste a figure through the clipboard
% Copy a figure: FigClipboard('copy', FigH)
% Open a new copy: FigClipboard('paste')
%
% License: Copy, modify, use like you want.
file = fullfile(tempdir, 'FigForClipboard.fig');
magic = '$FigToClipboard$';
switch command
case 'copy' %
if nargin == 1
FigH = gcf;
end
hgsave(FigH, file);
fid = fopen(file, 'r');
stream = fread(fid, Inf, 'uint8');
fclose(fid);
clipboard('copy', [magic, sprintf('%02x', stream)]);
delete(file);
case 'paste'
str = clipboard('paste');
if ischar(str) && strncmp(str, magic, length(magic))
fid = fopen(file, 'w');
if fid == 1
error('Cannot open file for writing: %s', file);
end
stream = sscanf(str(length(magic) + 1:end), '%2x');
fwrite(fid, stream, 'uint8');
fclose(fid);
openfig(file);
end
end
[/EDITED]
There must be a function which avoids the indirection over the hard disk. FIG files have the same format as MAT files and they contain a struct only. So it should be possible to re-create the figure directly from this struct instead from writing a file. But I do not find these methods directly and the additional speed is nice, but not a must-have.
5 个评论
更多回答(1 个)
Björn
2013-9-18
For the last part you could consider saving the figure as .fig and then copy the file to the other computer. Here you can open de figure with full compatibility and all data preserved.
To display certain parameters of the figure you can use the get function. For example for getting the title you use:
get(get(gca,'title'),'string')
The inner 'get' retrieves the title of the current axes ('gca'). The outer 'get' converts it to a string.
In case you have more figures open then you have to have the axes-handle of figure-handle for the right figure but this is a bit more complicated. If you need that too, just let me know.
3 个评论
Björn
2013-9-19
Hi David,
If the main problem now is to get it automatically to the clipboard, you can make script that does the following:
function str = clipboard_plot_data(parameters,axes_handle)
[par_nr,~]=size(parameters);
str='';
for i=1:par_nr
if nargin < 2
str_test=get(get(gca,parameters{i}),'string');
str_t=['\' parss '=' str_test ' \' parss '\'];
else
str_test=get(get(axes_handle,parameters{i}),'string');
str_t=['\' parss '=' str_test ' \' parss '\'];
end
str=[str str_t];
end
clipboard('copy',str)
This will copy a string with all the data to the clipboard. You can use
clipboard('paste')
to paste is to the clipboard again. The input parameters of the function are of the form:
parameters={'title';'xlabel';'ylabel'}
If you don't input the axes-handle it will use the current axes.
The actual parameters are located between '\title=' and '\title\' Hence, finding those parts in the string will get you the title.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Environment and Settings 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!