From 731732f397d61f8076b573e3dc95e1a516cbcf7e Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Thu, 25 Oct 2001 07:22:46 +0000
Subject: [PATCH] Triangulate plugin

---
 Plugin/Makefile        |   5 +-
 Plugin/Plugin.cpp      |   5 +-
 Plugin/Triangulate.cpp | 210 +++++++++++++++++++++++++++++++++++++++++
 Plugin/Triangulate.h   |  24 +++++
 4 files changed, 241 insertions(+), 3 deletions(-)
 create mode 100644 Plugin/Triangulate.cpp
 create mode 100644 Plugin/Triangulate.h

diff --git a/Plugin/Makefile b/Plugin/Makefile
index 655ad4da8e..c1762de639 100644
--- a/Plugin/Makefile
+++ b/Plugin/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.18 2001-08-20 08:25:24 geuzaine Exp $
+# $Id: Makefile,v 1.19 2001-10-25 07:22:46 geuzaine Exp $
 #
 # Makefile for "libAdapt.a"
 #
@@ -11,7 +11,7 @@ RM        = rm
 RANLIB    = ranlib
 
 LIB       = ../lib/libPlugin.a
-INCLUDE   = -I../Common -I../Graphics -I../DataStr -I../Mesh
+INCLUDE   = -I../Common -I../Graphics -I../DataStr -I../Geo -I../Mesh -I../Triangle
 
 OPT_FLAGS     = -g -Wall
 OS_FLAGS      = 
@@ -25,6 +25,7 @@ SRC = Plugin.cpp\
           CutPlane.cpp CutSphere.cpp CutMap.cpp\
         Smooth.cpp\
         Transform.cpp\
+        Triangulate.cpp\
         Skin.cpp
 
 OBJ = $(SRC:.cpp=.o)
diff --git a/Plugin/Plugin.cpp b/Plugin/Plugin.cpp
index 4c90490991..affcc20ed6 100644
--- a/Plugin/Plugin.cpp
+++ b/Plugin/Plugin.cpp
@@ -1,4 +1,4 @@
-// $Id: Plugin.cpp,v 1.20 2001-08-07 21:00:10 remacle Exp $
+// $Id: Plugin.cpp,v 1.21 2001-10-25 07:22:46 geuzaine Exp $
 
 #ifndef _NODLL
 #include <dlfcn.h>
@@ -19,6 +19,7 @@
 #include "Skin.h"
 #include "Smooth.h"
 #include "Transform.h"
+#include "Triangulate.h"
 
 using namespace std;
 
@@ -118,6 +119,8 @@ void GMSH_PluginManager::RegisterDefaultPlugins(){
 						  GMSH_RegisterSmoothPlugin()));
   allPlugins.insert(std::pair<char*,GMSH_Plugin*>("Transform",
 						  GMSH_RegisterTransformPlugin()));
+  allPlugins.insert(std::pair<char*,GMSH_Plugin*>("Triangulate",
+						  GMSH_RegisterTriangulatePlugin()));
 
 #ifdef _FLTK
   char *homeplugins = getenv ("GMSHPLUGINSHOME");
diff --git a/Plugin/Triangulate.cpp b/Plugin/Triangulate.cpp
new file mode 100644
index 0000000000..76244403a9
--- /dev/null
+++ b/Plugin/Triangulate.cpp
@@ -0,0 +1,210 @@
+// $Id: Triangulate.cpp,v 1.1 2001-10-25 07:22:46 geuzaine Exp $
+
+#include "Gmsh.h"
+#include "Plugin.h"
+#include "Triangulate.h"
+#include "List.h"
+#include "Tree.h"
+#include "Views.h"
+#include "Context.h"
+#include "Malloc.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "Utils.h"
+#include "Create.h"
+
+
+extern Context_T CTX;
+
+StringXNumber TriangulateOptions_Number[] = {
+  { GMSH_FULLRC, "iView" , NULL , -1. }
+};
+
+extern "C"
+{
+  GMSH_Plugin *GMSH_RegisterTriangulatePlugin ()
+  {
+    return new GMSH_TriangulatePlugin();
+  }
+}
+
+GMSH_TriangulatePlugin::GMSH_TriangulatePlugin()
+{
+}
+
+void GMSH_TriangulatePlugin::getName(char *name) const
+{
+  strcpy(name,"Triangulate");
+}
+
+void GMSH_TriangulatePlugin::getInfos(char *author, char *copyright, char *help_text) const
+{
+  strcpy(author, "C. Geuzaine (geuz@geuz.org)");
+  strcpy(copyright, "DGR (www.multiphysics.com)");
+  strcpy(help_text, 
+	 "Triangulates a scalar point view\n"
+	 "and outputs a scalar triangle view.\n"
+	 "Script name: Plugin(Triangulate).\n");
+}
+
+int GMSH_TriangulatePlugin::getNbOptions() const
+{
+  return sizeof(TriangulateOptions_Number)/sizeof(StringXNumber);
+}
+
+StringXNumber *GMSH_TriangulatePlugin:: GetOption (int iopt)
+{
+  return &TriangulateOptions_Number[iopt];
+}
+
+void GMSH_TriangulatePlugin::CatchErrorMessage (char *errorMessage) const
+{
+  strcpy(errorMessage,"Triangulate failed...");
+}
+
+
+#define ANSI_DECLARATORS
+#define REAL double
+
+extern "C" {
+#include "triangle.h"
+}
+
+void Triangulate(Post_View *vin, Post_View *vout){
+  int i, j=0, j0, j1, j2;
+  Surface *s;
+  Vertex *v;
+  struct triangulateio in, out;
+
+  int nb = List_Nbr(vin->SP)/vin->NbSP ;
+  List_T *points = List_Create(nb,1,sizeof(Vertex*));
+
+  for(i = 0 ; i < List_Nbr(vin->SP) ; i+=nb){
+    v = Create_Vertex(j++,
+		      *(double*)List_Pointer_Fast(vin->SP,i), 
+		      *(double*)List_Pointer_Fast(vin->SP,i+1), 
+		      *(double*)List_Pointer_Fast(vin->SP,i+2),
+		      1., 0.);
+    List_Add(points, &v);
+  }
+
+  s = Create_Surface(1,MSH_SURF_PLAN,0);
+  MeanPlane(points, s);
+
+  for(i=0;i<List_Nbr(points);i++){
+    List_Read(points, i, &v);
+    Projette (v, s->plan);
+  }
+
+  Free_Surface(&s,NULL);
+
+  in.numberofpoints = List_Nbr(points);
+  in.pointlist = (REAL *) Malloc(in.numberofpoints * 2 * sizeof(REAL));
+  in.numberofpointattributes = 0;
+  in.pointattributelist = NULL;
+  in.pointmarkerlist = NULL; 
+  in.numberofsegments = 0;
+  in.segmentlist = NULL;    
+  in.segmentmarkerlist = NULL;
+  in.numberofregions = 0;
+  in.regionlist = NULL; 
+  in.numberofholes = 0;
+  in.holelist = NULL;
+
+  j=0;
+  for(i=0;i<List_Nbr(points);i++){
+    List_Read(points, i, &v);
+    in.pointlist[j] = v->Pos.X;
+    in.pointlist[j+1] = v->Pos.Y;
+    j+=2;
+  }
+
+  for(i=0;i<List_Nbr(points);i++){
+    List_Read(points, i, &v);
+    Free_Vertex(&v,NULL);
+  }
+  List_Delete(points);
+
+  out.pointlist = NULL; 
+  out.pointattributelist = NULL;
+  out.pointmarkerlist = NULL;
+  out.trianglelist = NULL;
+  out.triangleattributelist = NULL;
+  out.neighborlist = NULL;
+  out.segmentlist = NULL;
+  out.segmentmarkerlist = NULL;
+  out.edgelist = NULL;
+  out.edgemarkerlist = NULL;
+
+  char opts[128]="z";
+  if(CTX.verbosity < 3) strcat(opts, "Q");
+  triangulate(opts, &in, &out, NULL);
+
+  Free(in.pointlist);
+  Free(out.pointlist);
+
+  for (i = 0; i < out.numberoftriangles; i++) {
+    j0 = out.trianglelist[i * out.numberofcorners + 0];
+    j1 = out.trianglelist[i * out.numberofcorners + 1];
+    j2 = out.trianglelist[i * out.numberofcorners + 2];
+    for(j=0;j<3;j++){
+      List_Add(vout->ST, List_Pointer(vin->SP,(j0*nb)+j));
+      List_Add(vout->ST, List_Pointer(vin->SP,(j1*nb)+j));
+      List_Add(vout->ST, List_Pointer(vin->SP,(j2*nb)+j));
+    }
+    for(j=0;j<vin->NbTimeStep;j++){
+      List_Add(vout->ST, List_Pointer(vin->SP,(j0*nb)+3+j));
+      List_Add(vout->ST, List_Pointer(vin->SP,(j1*nb)+3+j));
+      List_Add(vout->ST, List_Pointer(vin->SP,(j2*nb)+3+j));
+    }
+    vout->NbST++;
+  }
+
+  Free(out.trianglelist);
+
+}
+
+
+extern List_T * Post_ViewList;
+
+Post_View *GMSH_TriangulatePlugin::execute (Post_View *v)
+{
+  Post_View *vv, *View;
+
+  int iView = (int)TriangulateOptions_Number[0].def;
+
+  if(v && iView < 0)
+    vv = v;
+  else{
+    if(!v && iView < 0) iView = 0;
+    if(!(vv = (Post_View*)List_Pointer_Test(Post_ViewList,iView))){
+      Msg(WARNING,"View[%d] does not exist",iView);
+      return 0;
+    }
+  }
+
+  if(vv->NbSP > 2){
+    View = BeginView(1);
+    Triangulate(vv,View);
+    char name[1024], filename[1024];
+    sprintf(name,"triangulate-%s",vv->Name);
+    sprintf(filename,"triangulate-%s",vv->FileName);
+    EndView(View, 1, filename, name);
+    Msg(INFO, "Created view '%s'", name);
+    return View;
+  }
+  else{
+    Msg(WARNING, "No scalar points to triangulate in view '%s'", vv->Name);
+    return 0;
+  }
+
+}
+
+void GMSH_TriangulatePlugin::Run ()
+{
+  execute(0);
+}
+
+void GMSH_TriangulatePlugin::Save ()
+{
+}
diff --git a/Plugin/Triangulate.h b/Plugin/Triangulate.h
new file mode 100644
index 0000000000..384d1039e3
--- /dev/null
+++ b/Plugin/Triangulate.h
@@ -0,0 +1,24 @@
+#ifndef _TRIANGULATE_H_
+#define _TRIANGULATE_H_
+
+extern "C"
+{
+  GMSH_Plugin *GMSH_RegisterTriangulatePlugin ();
+}
+
+class GMSH_TriangulatePlugin : public GMSH_Post_Plugin
+{
+public:
+  GMSH_TriangulatePlugin();
+  virtual void Run();
+  virtual void Save();
+  virtual void getName  (char *name) const;
+  virtual void getInfos (char *author, 
+			 char *copyright,
+			 char *help_text) const;
+  virtual void CatchErrorMessage (char *errorMessage) const;
+  virtual int getNbOptions() const;
+  virtual StringXNumber* GetOption (int iopt);  
+  virtual Post_View *execute (Post_View *);
+};
+#endif
-- 
GitLab