C ++ GNU-Plot在x11窗口中是非交互式的

时间:2015-01-16 10:41:58

标签: c++ gnuplot x11

当我编写C ++程序时,包括通过管道使用GNU-Plot,但是渲染图,但是缺少所有x11交互性,例如,我已经采用以下代码HERE

int main()
{
    FILE *pipe = popen("gnuplot -persist","w");
    fprintf(pipe, "set samples 40\n");
    fprintf(pipe, "set isosamples 40\n");
    fprintf(pipe, "set hidden3d\n");
    fprintf(pipe, "set xrange [-8.000:8.000]\n");
    fprintf(pipe, "set yrange [-8.000:8.000]\n");
    fprintf(pipe, "set zrange [-2.000:2.000]\n");
    fprintf(pipe, "set terminal x11\n");
    fprintf(pipe, "set title 'We are plotting from C'\n");
    fprintf(pipe, "set xlabel 'Label X'\n");
    fprintf(pipe, "set ylabel 'Label Y'\n");
    fprintf(pipe, "splot cos(x)+cos(y)\n");

  pclose(pipe);
  return 0;
}

但是,如果我打开命令行,运行gnuplot,并手动输入所有命令,则存在完整的交互性,即缩放,旋转等......

当通过C ++程序调用GNU-Plot时,是否有人知道如何使交互性工作?

1 个答案:

答案 0 :(得分:4)

只有在gnuplot主进程运行时才能与gnuplot进行交互。关闭管道后,主gnuplot进程退出,它留下的gnuplot_x11进程不再处理输入。

解决方案是保持管道打开,只有在您不想再使用该情节时才关闭它。您可以尝试以下更改:

#include <stdio.h>

int main()
{
  FILE *pipe = popen("gnuplot -persist","w");
  fprintf(pipe, "set samples 40\n");
  fprintf(pipe, "set isosamples 40\n");
  fprintf(pipe, "set hidden3d\n");
  fprintf(pipe, "set xrange [-8.000:8.000]\n");
  fprintf(pipe, "set yrange [-8.000:8.000]\n");
  fprintf(pipe, "set zrange [-2.000:2.000]\n");
  fprintf(pipe, "set terminal x11\n");
  fprintf(pipe, "set title 'We are plotting from C'\n");
  fprintf(pipe, "set xlabel 'Label X'\n");
  fprintf(pipe, "set ylabel 'Label Y'\n");
  fprintf(pipe, "splot cos(x)+cos(y)\n");

  fflush(pipe); // force the input down the pipe, so gnuplot
                // handles the commands right now.

  getchar();    // wait for user input (to keep pipe open)

  pclose(pipe);
  return 0;
}

这样,窗口中的图可以被处理,直到您在程序运行的控制台中按Enter键(然后程序关闭管道,gnuplot退出,输入处理停止)。