Преглед изворни кода

Add non-blocking mode of show and an example

hyhuang пре 7 година
родитељ
комит
4ea1200e9d
2 измењених фајлова са 67 додато и 10 уклоњено
  1. 46 0
      examples/nonblock.cpp
  2. 21 10
      matplotlibcpp.h

+ 46 - 0
examples/nonblock.cpp

@@ -0,0 +1,46 @@
+#define _USE_MATH_DEFINES
+#include <cmath>
+#include "matplotlibcpp.h"
+
+namespace plt = matplotlibcpp;
+
+
+using namespace matplotlibcpp;
+using namespace std;
+
+int main()
+{
+    // Prepare data.
+    int n = 5000;
+    std::vector<double> x(n), y(n), z(n), w(n,2);
+    for(int i=0; i<n; ++i) {
+        x.at(i) = i*i;
+        y.at(i) = sin(2*M_PI*i/360.0);
+        z.at(i) = log(i);
+    }
+
+    // Plot line from given x and y data. Color is selected automatically.
+    plt::subplot(2,2,1);
+    plt::plot(x, y);
+
+    // Plot a red dashed line from given x and y data.
+    plt::subplot(2,2,2);
+    plt::plot(x, w,"r--");
+
+    // Plot a line whose name will show up as "log(x)" in the legend.
+    plt::subplot(2,2,3);
+    plt::named_plot("log(x)", x, z);
+
+    // Set x-axis to interval [0,1000000]
+    plt::xlim(0, 1000*1000);
+
+    // Add graph title
+    plt::title("Sample figure");
+    // Enable legend.
+    plt::legend();
+
+    plt::show(false);
+
+    cout << "matplotlibcpp::show() is working in an non-blocking mode" << endl;
+    getchar();
+}

+ 21 - 10
matplotlibcpp.h

@@ -648,16 +648,27 @@ namespace matplotlibcpp {
 		// if PyDeCRFF, the function doesn't work on Mac OS
 	}
 
-	inline void show()
-	{
-		PyObject* res = PyObject_CallObject(
-			detail::_interpreter::get().s_python_function_show,
-			detail::_interpreter::get().s_python_empty_tuple);
-
-		if (!res) throw std::runtime_error("Call to show() failed.");
-
-		Py_DECREF(res);
-	}
+    inline void show(const bool block = true)
+    {
+        PyObject* res;
+        if(block)
+        {
+            res = PyObject_CallObject(
+                    detail::_interpreter::get().s_python_function_show,
+                    detail::_interpreter::get().s_python_empty_tuple);
+        }
+        else
+        {
+            PyObject *kwargs = PyDict_New();
+            PyDict_SetItemString(kwargs, "block", Py_False);
+            res = PyObject_Call( detail::_interpreter::get().s_python_function_show, detail::_interpreter::get().s_python_empty_tuple, kwargs);
+        }
+
+
+        if (!res) throw std::runtime_error("Call to show() failed.");
+
+        Py_DECREF(res);
+    }
 
 	inline void draw()
 	{