diff --git a/messenger/mexa64/messenger.mex b/messenger/mexa64/messenger.mex index 2114d62..3a55f81 100755 Binary files a/messenger/mexa64/messenger.mex and b/messenger/mexa64/messenger.mex differ diff --git a/messenger/mexa64/messenger.mexa64 b/messenger/mexa64/messenger.mexa64 index 80abad4..9ff2538 100755 Binary files a/messenger/mexa64/messenger.mexa64 and b/messenger/mexa64/messenger.mexa64 differ diff --git a/messenger/src/messenger.c b/messenger/src/messenger.c index 8056bb1..4be1b71 100644 --- a/messenger/src/messenger.c +++ b/messenger/src/messenger.c @@ -1,5 +1,6 @@ #include #include +#include #include "mex.h" #include "zmq.h" @@ -12,6 +13,7 @@ static int initialized = 0; /* Initialize a ZMQ server */ int initialize(char *socket_addr) { int rc; + mexLock(); ctx = zmq_ctx_new(); socket_ptr = zmq_socket(ctx, ZMQ_REP); rc = zmq_bind(socket_ptr, socket_addr); @@ -33,7 +35,7 @@ int listen_zmq(char *buffer, int buflen) { mexErrMsgTxt("Error: ZMQ session not initialized"); } - return zmq_recv(socket_ptr, buffer, buflen, 0); + return zmq_recv(socket_ptr, buffer, buflen, ZMQ_NOBLOCK); } /* Sending out a message */ @@ -108,13 +110,19 @@ void mexFunction(int nlhs, mxArray *plhs[], int byte_recvd = listen_zmq(recv_buffer, BUFLEN); + while (byte_recvd == -1 && errno == EAGAIN) { + mexCallMATLAB(0, NULL, 0, NULL, "drawnow"); + byte_recvd = listen_zmq(recv_buffer, BUFLEN); + } + /* Check if the received data is complete and correct */ if ((byte_recvd > -1) && (byte_recvd <= BUFLEN)) { plhs[0] = mxCreateString(recv_buffer); } else if (byte_recvd > BUFLEN){ mexErrMsgTxt("Receiver buffer overflow. Message truncated"); } else { - mexErrMsgTxt("Failed to receive a message due to ZMQ error"); + sprintf(recv_buffer, "Failed to receive a message due to ZMQ error %s", strerror(errno)); + mexErrMsgTxt(recv_buffer); } return; diff --git a/pymatbridge/matlab/util/make_figs.m b/pymatbridge/matlab/util/make_figs.m index 239110e..94c32ba 100644 --- a/pymatbridge/matlab/util/make_figs.m +++ b/pymatbridge/matlab/util/make_figs.m @@ -14,7 +14,9 @@ saveas(h, [filename, '.png']); % Once you've saved it, close it, so it doesn't get dragged into the % scope of other cells - close(h); + if (strcmp(get(h, 'visible'), 'off')) + close(h); + end fig_files{fig} = [filename '.png']; end diff --git a/pymatbridge/matlab/util/pymat_eval.m b/pymatbridge/matlab/util/pymat_eval.m index 60912b2..192670e 100644 --- a/pymatbridge/matlab/util/pymat_eval.m +++ b/pymatbridge/matlab/util/pymat_eval.m @@ -15,6 +15,8 @@ response.content = ''; response.result = ''; +close all hidden; + try % tempname is less likely to get bonked by another process. diary_file = [tempname() '_diary.txt']; diff --git a/pymatbridge/matlab_magic.py b/pymatbridge/matlab_magic.py index 17debc8..acbb239 100644 --- a/pymatbridge/matlab_magic.py +++ b/pymatbridge/matlab_magic.py @@ -130,6 +130,11 @@ def set_matlab_var(self, name, value): help='Pixel size of plots, "width,height.' ) + @argument( + '-g', '--gui', action='store_true', + help='Show plots in a graphical user interface' + ) + @argument( 'code', nargs='*', @@ -148,7 +153,7 @@ def matlab(self, line, cell=None, local_ns=None): local_ns = {} width, height = args.size.split(',') - self.Matlab.set_default_plot_size(width, height) + self.Matlab.set_plot_settings(width, height, not args.gui) if args.input: for input in ','.join(args.input).split(','): diff --git a/pymatbridge/pymatbridge.py b/pymatbridge/pymatbridge.py index ea2da87..7fd4e67 100644 --- a/pymatbridge/pymatbridge.py +++ b/pymatbridge/pymatbridge.py @@ -212,7 +212,7 @@ def start(self): # Test if connection is established if self.is_connected(): print("%s started and connected!" % self._program_name()) - self.set_default_plot_size() + self.set_plot_settings() return True else: print("%s failed to start" % self._program_name()) @@ -318,12 +318,16 @@ def set_variable(self, varname, value): return self._set_sparse_variable(varname, value) return self.run_func('assignin', 'base', varname, value, nargout=0) - def set_default_plot_size(self, width=512, height=384): - code = "set(0, 'defaultfigurepaperunits', 'inches');\n" - code += "set(0, 'defaultfigureunits', 'inches');\n" - size = "set(0, 'defaultfigurepaperposition', [0 0 %s %s])\n;" - code += size % (int(width) / 150., int(height) / 150.) - self.run_code(code) + def set_plot_settings(self, width=512, height=384, inline=True): + if inline: + code = ["set(0, 'defaultfigurevisible', 'off')"] + else: + code = ["set(0, 'defaultfigurevisible', 'on')"] + size = "set(0, 'defaultfigurepaperposition', [0 0 %s %s])" + code += ["set(0, 'defaultfigurepaperunits', 'inches')", + "set(0, 'defaultfigureunits', 'inches')", + size % (int(width) / 150., int(height) / 150.)] + self.run_code(';'.join(code)) def _set_sparse_variable(self, varname, value): value = value.todok() @@ -436,9 +440,9 @@ def __init__(self, executable='matlab', socket_addr=None, platform = sys.platform if startup_options is None: if platform == 'win32': - startup_options = ' -automation -noFigureWindows' + startup_options = ' -automation' else: - startup_options = ' -nodesktop -nodisplay' + startup_options = ' -nodesktop' if log: startup_options += ' -logfile ./pymatbridge/logs/matlablog_%s.txt' % id super(Matlab, self).__init__(executable, socket_addr, id, log, maxtime, @@ -499,7 +503,6 @@ def _preamble_code(self): code = super(Octave, self)._preamble_code() if self.log: code.append("diary('./pymatbridge/logs/octavelog_%s.txt')" % self.id) - code.append("set(0, 'defaultfigurevisible', 'off');") code.append("graphics_toolkit('gnuplot')") return code diff --git a/requirements.txt b/requirements.txt index 02ec117..ae3bcc7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ pyzmq +numpy>=1.7