load(draw); probe_file (pfile) := block ([aa,as], aa : ?probe\-file (pfile), if not aa then return (false), as : string (aa), parse_string (simplode (rest (charlist (as),sposition ("p",as)))))$ /* i -означает интерактивный */ idraw(model,param_set,name_model) := block( [old_plot_format,t1,pipe_view_name,pipe_view,plt_fmt,cmd,ll], pipe_view_inter_n:sconcat(maxima_tempdir, "/maxima.pipe_interact"), pipe_view_param_n:sconcat(maxima_tempdir, "/maxima.pipe_param"), /*подготовим канал для взаимодествия с процессом интерактивного представления модели вид-контроллер*/ if not probe_file(pipe_view_inter_n) then system(sconcat("mkfifo ", pipe_view_inter_n)), if not probe_file(pipe_view_param_n) then system(sconcat("mkfifo ", pipe_view_param_n)), /*запомним предыдущий способ отрисовки графиков и установим свой*/ old_plot:gnuplot_command, gnuplot_command:name_model, gnuplot_close(), /*выполним отрисовку интерактивной модели с установками по умолчанию*/ t1:map(lambda([x],x[1]=x[2]),param_set), ev(model,nouns,t1), /*через канал взаимодействия максимы и интерактивного вида-контроллера настроим контроллер*/ /*с обратной стороны канала уже должен работать процесс считывающий данные из него*/ pipe_view:openw(sconcat("| cat >",pipe_view_param_n)), /*в цикле передадим имеющиеся параметры*/ map(lambda([x],printf(pipe_view,"~a:~d:~a~%", x[1],x[2],x[3]),0),param_set), printf(pipe_view,"end~%"), close(pipe_view), /*теперь используя тот же канал, открываем его на чтение*/ kill(pipe_view), pipe_view:openr(pipe_view_inter_n), /*запускаем цикл чтения данных из канала*/ cmd:1, while cmd=1 do block( if stringp(ll : readline(pipe_view)) then block ( print("read from pipe_view: ", ll), /*для отладки*/ /*вид приходящей строки (cmd:1,t1:[a = 1,b = 1,c = 2])*/ eval_string(ll), /*устанавливаем переменные t1,cmd*/ /*получая новые значения параметров, пересчитываем модель и перерисовываем view*/ if cmd=1 then ev(model,nouns,t1 ) ) else cmd:0 ), close(pipe_view), gnuplot_close(), gnuplot_command:old_plot );