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