Skip to content
Snippets Groups Projects
Commit 731732f3 authored by Christophe Geuzaine's avatar Christophe Geuzaine
Browse files

Triangulate plugin

parent 2f193b33
No related branches found
No related tags found
No related merge requests found
# $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" # Makefile for "libAdapt.a"
# #
...@@ -11,7 +11,7 @@ RM = rm ...@@ -11,7 +11,7 @@ RM = rm
RANLIB = ranlib RANLIB = ranlib
LIB = ../lib/libPlugin.a 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 OPT_FLAGS = -g -Wall
OS_FLAGS = OS_FLAGS =
...@@ -25,6 +25,7 @@ SRC = Plugin.cpp\ ...@@ -25,6 +25,7 @@ SRC = Plugin.cpp\
CutPlane.cpp CutSphere.cpp CutMap.cpp\ CutPlane.cpp CutSphere.cpp CutMap.cpp\
Smooth.cpp\ Smooth.cpp\
Transform.cpp\ Transform.cpp\
Triangulate.cpp\
Skin.cpp Skin.cpp
OBJ = $(SRC:.cpp=.o) OBJ = $(SRC:.cpp=.o)
......
// $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 #ifndef _NODLL
#include <dlfcn.h> #include <dlfcn.h>
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include "Skin.h" #include "Skin.h"
#include "Smooth.h" #include "Smooth.h"
#include "Transform.h" #include "Transform.h"
#include "Triangulate.h"
using namespace std; using namespace std;
...@@ -118,6 +119,8 @@ void GMSH_PluginManager::RegisterDefaultPlugins(){ ...@@ -118,6 +119,8 @@ void GMSH_PluginManager::RegisterDefaultPlugins(){
GMSH_RegisterSmoothPlugin())); GMSH_RegisterSmoothPlugin()));
allPlugins.insert(std::pair<char*,GMSH_Plugin*>("Transform", allPlugins.insert(std::pair<char*,GMSH_Plugin*>("Transform",
GMSH_RegisterTransformPlugin())); GMSH_RegisterTransformPlugin()));
allPlugins.insert(std::pair<char*,GMSH_Plugin*>("Triangulate",
GMSH_RegisterTriangulatePlugin()));
#ifdef _FLTK #ifdef _FLTK
char *homeplugins = getenv ("GMSHPLUGINSHOME"); char *homeplugins = getenv ("GMSHPLUGINSHOME");
......
// $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 ()
{
}
#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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment