From f12fdc7bb88ab76b6eeb95b9d7463a39e56f4f41 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Wed, 24 Mar 2010 18:12:42 +0000
Subject: [PATCH] new MinMax plugin

---
 Plugin/CMakeLists.txt    |  2 +-
 Plugin/MinMax.cpp        | 79 ++++++++++++++++++++++++++++++++++++++++
 Plugin/MinMax.h          | 31 ++++++++++++++++
 Plugin/PluginManager.cpp |  3 ++
 4 files changed, 114 insertions(+), 1 deletion(-)
 create mode 100644 Plugin/MinMax.cpp
 create mode 100644 Plugin/MinMax.h

diff --git a/Plugin/CMakeLists.txt b/Plugin/CMakeLists.txt
index bd3c5e2622..dee3492d33 100644
--- a/Plugin/CMakeLists.txt
+++ b/Plugin/CMakeLists.txt
@@ -20,7 +20,7 @@ set(SRC
   MakeSimplex.cpp
   Integrate.cpp Gradient.cpp Curl.cpp Divergence.cpp
   Annotate.cpp Remove.cpp
-  Probe.cpp
+  Probe.cpp MinMax.cpp
   HarmonicToTime.cpp ModulusPhase.cpp
   HomologyComputation.cpp
   Distance.cpp ExtractEdges.cpp
diff --git a/Plugin/MinMax.cpp b/Plugin/MinMax.cpp
new file mode 100644
index 0000000000..1825393bcb
--- /dev/null
+++ b/Plugin/MinMax.cpp
@@ -0,0 +1,79 @@
+// Gmsh - Copyright (C) 1997-2010 C. Geuzaine, J.-F. Remacle
+//
+// See the LICENSE.txt file for license information. Please report all
+// bugs and problems to <gmsh@geuz.org>.
+
+#include "MinMax.h"
+#include "shapeFunctions.h"
+#include "PViewOptions.h"
+
+StringXNumber MinMaxOptions_Number[] = {
+  {GMSH_FULLRC, "View", NULL, -1.}
+};
+
+extern "C"
+{
+  GMSH_Plugin *GMSH_RegisterMinMaxPlugin()
+  {
+    return new GMSH_MinMaxPlugin();
+  }
+}
+
+std::string GMSH_MinMaxPlugin::getHelp() const
+{
+  return "Plugin(MinMax) computes the min/max of a view.\n\n"
+    "If `View' < 0, the plugin is run on the current view.\n\n"
+    "Plugin(MinMax) creates one new view.";
+}
+
+int GMSH_MinMaxPlugin::getNbOptions() const
+{
+  return sizeof(MinMaxOptions_Number) / sizeof(StringXNumber);
+}
+
+StringXNumber *GMSH_MinMaxPlugin::getOption(int iopt)
+{
+  return &MinMaxOptions_Number[iopt];
+}
+
+PView *GMSH_MinMaxPlugin::execute(PView * v)
+{
+  int iView = (int)MinMaxOptions_Number[0].def;
+  
+  PView *v1 = getView(iView, v);
+  if(!v1) return v;
+
+  PViewData *data1 = v1->getData();
+  PView *vMin = new PView();
+  PView *vMax = new PView();
+  PViewDataList *dataMin = getDataList(vMin);
+  PViewDataList *dataMax = getDataList(vMax);
+  
+  double x = data1->getBoundingBox().center().x();
+  double y = data1->getBoundingBox().center().y();
+  double z = data1->getBoundingBox().center().z();
+  dataMin->SP.push_back(x); dataMin->SP.push_back(y); dataMin->SP.push_back(z);
+  dataMax->SP.push_back(x); dataMax->SP.push_back(y); dataMax->SP.push_back(z);
+  for(int step = 0; step < data1->getNumTimeSteps(); step++){
+    dataMin->SP.push_back(data1->getMin(step));
+    dataMax->SP.push_back(data1->getMax(step));
+  }
+  dataMin->NbSP = 1;
+  dataMax->NbSP = 1;
+  vMin->getOptions()->intervalsType = PViewOptions::Numeric;
+  vMax->getOptions()->intervalsType = PViewOptions::Numeric;
+  
+  for(int i = 0; i < data1->getNumTimeSteps(); i++){
+    double time = data1->getTime(i);
+    dataMin->Time.push_back(time);
+    dataMax->Time.push_back(time);
+  }
+  dataMin->setName(data1->getName() + "_Min");
+  dataMin->setFileName(data1->getName() + "_Min.pos");
+  dataMin->finalize();
+  dataMax->setName(data1->getName() + "_Max");
+  dataMax->setFileName(data1->getName() + "_Max.pos");
+  dataMax->finalize();
+  
+  return 0;
+}
diff --git a/Plugin/MinMax.h b/Plugin/MinMax.h
new file mode 100644
index 0000000000..ae37f205d8
--- /dev/null
+++ b/Plugin/MinMax.h
@@ -0,0 +1,31 @@
+// Gmsh - Copyright (C) 1997-2010 C. Geuzaine, J.-F. Remacle
+//
+// See the LICENSE.txt file for license information. Please report all
+// bugs and problems to <gmsh@geuz.org>.
+
+#ifndef _MIN_MAX_H_
+#define _MIN_MAX_H_
+
+#include "Plugin.h"
+
+extern "C"
+{
+  GMSH_Plugin *GMSH_RegisterMinMaxPlugin();
+}
+
+class GMSH_MinMaxPlugin : public GMSH_PostPlugin
+{
+ public:
+  GMSH_MinMaxPlugin(){}
+  std::string getName() const { return "MinMax"; }
+  std::string getShortHelp() const
+  {
+    return "Get the min/max of a dataset";
+  }
+  std::string getHelp() const;
+  int getNbOptions() const;
+  StringXNumber* getOption(int iopt);  
+  PView *execute(PView *);
+};
+
+#endif
diff --git a/Plugin/PluginManager.cpp b/Plugin/PluginManager.cpp
index 592f1eb8ef..073486e699 100644
--- a/Plugin/PluginManager.cpp
+++ b/Plugin/PluginManager.cpp
@@ -23,6 +23,7 @@
 #include "HarmonicToTime.h"
 #include "ModulusPhase.h"
 #include "Integrate.h"
+#include "MinMax.h"
 #include "Gradient.h"
 #include "Curl.h"
 #include "Divergence.h"
@@ -186,6 +187,8 @@ void PluginManager::registerDefaultPlugins()
                       ("ModulusPhase", GMSH_RegisterModulusPhasePlugin()));
     allPlugins.insert(std::pair<std::string, GMSH_Plugin*>
                       ("Integrate", GMSH_RegisterIntegratePlugin()));
+    allPlugins.insert(std::pair<std::string, GMSH_Plugin*>
+                      ("MinMax", GMSH_RegisterMinMaxPlugin()));
     allPlugins.insert(std::pair<std::string, GMSH_Plugin*>
                       ("Gradient", GMSH_RegisterGradientPlugin()));
     allPlugins.insert(std::pair<std::string, GMSH_Plugin*>
-- 
GitLab