Newer
Older
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA.
//
// Please report all bugs and problems to "gmsh@geuz.org".
#include <unistd.h>
#include "Gmsh.h"
#include "GmshUI.h"
#include "GmshVersion.h"
#include "Numeric.h"
#include "Context.h"
#include "Options.h"
#include "Geo.h"
#include "Mesh.h"
#include "Views.h"
#include "OpenFile.h"
#include "Parser.h"
#error Please run 'make tag'.
#error
#endif
char *TheFileNameTab[MAX_OPEN_FILES];
char *TheBgmFileName = NULL, *TheOptString = NULL;
char gmsh_progname[] = "This is Gmsh" ;
char gmsh_copyright[] = "Copyright (C) 1997-2003 Jean-Francois Remacle and Christophe Geuzaine";
char gmsh_version[] = "Version : " ;
char gmsh_gui[] = "GUI toolkit : " ;
char gmsh_os[] = "Build OS : " GMSH_OS ;
char gmsh_options[] = "Build options : " ;
char gmsh_date[] = "Build date : " GMSH_DATE ;
char gmsh_host[] = "Build host : " GMSH_HOST ;
char gmsh_packager[] = "Packager : " GMSH_PACKAGER ;
char gmsh_url[] = "Web site : http://www.geuz.org/gmsh/" ;
char gmsh_email[] = "Mailing list : gmsh@geuz.org" ;
// If you change the following, please also change
// * the texinfo documentation (doc/texinfo/command_line.texi)
// * the man page (doc/gmsh.1)
void Print_Usage(char *name){
Msg(DIRECT, "Usage: %s [options] [files]", name);
Msg(DIRECT, "Geometry options:");
Msg(DIRECT, " -0 parse input files, output unrolled geometry, and exit");
Msg(DIRECT, "Mesh options:");
Msg(DIRECT, " -1, -2, -3 perform batch 1D, 2D and 3D mesh generation");
Msg(DIRECT, " -saveall save all elements (discard physical group definitions)");
Msg(DIRECT, " -o file specify mesh output file name");
Msg(DIRECT, " -format msh|unv|gref set output mesh format (default: msh)");
Msg(DIRECT, " -algo iso|tri|aniso select 2D mesh algorithm (default: iso)");
Msg(DIRECT, " -smooth int set mesh smoothing (default: 0)");
// Msg(DIRECT, " -degree int set mesh degree (default: 1)");
Msg(DIRECT, " -scale float set global scaling factor (default: 1.0)");
Msg(DIRECT, " -meshscale float set mesh scaling factor (default: 1.0)");
Msg(DIRECT, " -clscale float set characteristic length scaling factor (default: 1.0)");
Msg(DIRECT, " -rand float set random perturbation factor (default: 1.e-4)");
Msg(DIRECT, " -bgm file load backround mesh from file");
Msg(DIRECT, " -constrain constrain background mesh with characteristic lengths");
Msg(DIRECT, " -histogram print mesh quality histogram");
Msg(DIRECT, " -extrude use old extrusion mesh generator");
Msg(DIRECT, " -recombine recombine meshes from old extrusion mesh generator");
Msg(DIRECT, " -interactive display 2D mesh construction interactively");
Msg(DIRECT, "Post-processing options:");
Msg(DIRECT, " -dl enable display lists");
Msg(DIRECT, " -noview hide all views on startup");
Msg(DIRECT, " -link int select link mode between views (default: 0)");
Msg(DIRECT, " -smoothview smooth views");
Msg(DIRECT, " -convert file file convert an ascii view into a binary one");
Msg(DIRECT, "Display options:");
Msg(DIRECT, " -nodb disable double buffering");
Msg(DIRECT, " -fontsize int specify the font size for the GUI (default: 12)");
Msg(DIRECT, " -alpha enable alpha blending");
Msg(DIRECT, " -notrack don't use trackball mode for rotations");
Msg(DIRECT, " -display string specify display");
Msg(DIRECT, " -perspective set projection mode to perspective");
#endif
Msg(DIRECT, "Other options:");
Msg(DIRECT, " -a, -g, -m, -s, -p start in automatic, geometry, mesh, solver or");
Msg(DIRECT, " post-processing mode (default: automatic)");
#endif
Msg(DIRECT, " -v int set verbosity level (default: 2)");
Msg(DIRECT, " -string \"string\" parse string before project file");
Msg(DIRECT, " -option file parse option file before GUI creation");
Msg(DIRECT, " -version show version number");
Msg(DIRECT, " -info show detailed version information");
Msg(DIRECT, " -help show this message");
}
char *Get_BuildOptions(void)
{
static int first=1;
static char opt[128] = "";
if(first){
#if defined(HAVE_GSL)
strcat(opt, "JPEG ");
#endif
#if defined(HAVE_LIBPNG)
strcat(opt, "PNG ");
void Get_Options(int argc, char *argv[], int *nbfiles)
{
int i = 1;
// This symbol context is local to option parsing (the symbols will
// not interfere with subsequent OpenFiles)
// Parse session and option files
ParseFile(CTX.sessionrc_filename, 1);
ParseFile(CTX.optionsrc_filename, 1);
// Get command line options
while(i < argc) {
if(argv[i][0] == '-') {
if(!strcmp(argv[i] + 1, "string")) {
i++;
if(argv[i] != NULL)
TheOptString = argv[i++];
else {
fprintf(stderr, ERROR_STR "Missing string\n");
exit(1);
else if(!strcmp(argv[i] + 1, "a")) {
CTX.initial_context = 0;
i++;
else if(!strcmp(argv[i] + 1, "g")) {
CTX.initial_context = 1;
i++;
else if(!strcmp(argv[i] + 1, "m")) {
CTX.initial_context = 2;
i++;
else if(!strcmp(argv[i] + 1, "s")) {
CTX.initial_context = 3;
i++;
else if(!strcmp(argv[i] + 1, "p")) {
CTX.initial_context = 4;
i++;
else if(!strcmp(argv[i] + 1, "saveall")) {
CTX.mesh.save_all = 1;
i++;
else if(!strcmp(argv[i] + 1, "extrude")) { //old extrusion mesh generator
CTX.mesh.oldxtrude = 1;
i++;
else if(!strcmp(argv[i] + 1, "recombine")) { //old extrusion mesh generator
CTX.mesh.oldxtrude_recombine = 1;
i++;
else if(!strcmp(argv[i] + 1, "dupli")) {
CTX.mesh.check_duplicates = 1;
i++;
else if(!strcmp(argv[i] + 1, "histogram")) {
CTX.mesh.histogram = 1;
i++;
fprintf(stderr, ERROR_STR "Missing file name\n");
exit(1);
}
}
if(argv[i] != NULL)
CTX.output_filename = argv[i++];
else {
fprintf(stderr, ERROR_STR "Missing file name\n");
exit(1);
}
}
fprintf(stderr, ERROR_STR "Missing file name\n");
exit(1);
}
}
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
else if(!strcmp(argv[i] + 1, "constrain")) {
CTX.mesh.constrained_bgmesh = 1;
i++;
}
else if(!strcmp(argv[i] + 1, "convert")) {
i++;
CTX.terminal = 1;
if(argv[i] && argv[i + 1]) {
ParseFile(argv[i], 0);
if(List_Nbr(CTX.post.list))
WriteView(1, (Post_View *) List_Pointer(CTX.post.list, 0),
argv[i + 1]);
else
fprintf(stderr, ERROR_STR "No view to convert\n");
}
else
fprintf(stderr, "Usage: %s -convert view.ascii view.binary\n",
argv[0]);
exit(1);
}
else if(!strcmp(argv[i] + 1, "old")) {
CTX.geom.old_circle = 1;
i++;
}
else if(!strcmp(argv[i] + 1, "initial")) {
i++;
if(argv[i] != NULL)
CTX.mesh.initial_only = atoi(argv[i++]);
else {
fprintf(stderr, ERROR_STR "Missing number\n");
exit(1);
}
}
if(argv[i] != NULL)
CTX.mesh.quality = atof(argv[i++]);
else {
fprintf(stderr, ERROR_STR "Missing number\n");
exit(1);
}
}
if(argv[i] != NULL)
CTX.geom.scaling_factor = atof(argv[i++]);
else {
fprintf(stderr, ERROR_STR "Missing number\n");
exit(1);
}
}
if(argv[i] != NULL)
CTX.mesh.scaling_factor = atof(argv[i++]);
else {
fprintf(stderr, ERROR_STR "Missing number\n");
exit(1);
}
}
if(argv[i] != NULL)
CTX.mesh.rand_factor = atof(argv[i++]);
else {
fprintf(stderr, ERROR_STR "Missing number\n");
exit(1);
}
}
CTX.mesh.lc_factor = atof(argv[i++]);
"Characteristic length factor must be > 0\n");
exit(1);
}
}
fprintf(stderr, ERROR_STR "Missing number\n");
exit(1);
}
}
if(argv[i] != NULL)
CTX.mesh.nb_smoothing = atoi(argv[i++]);
else {
fprintf(stderr, ERROR_STR "Missing number\n");
exit(1);
}
}
opt_mesh_degree(0, GMSH_SET, atof(argv[i++]));
fprintf(stderr, ERROR_STR "Missing number\n");
exit(1);
}
}
else if(!strcmp(argv[i] + 1, "format") || !strcmp(argv[i] + 1, "f")) {
if(argv[i] != NULL) {
if(!strcmp(argv[i], "msh") ||
!strcmp(argv[i], "MSH") || !strcmp(argv[i], "gmsh")) {
CTX.mesh.format = FORMAT_MSH;
else if(!strcmp(argv[i], "unv") ||
!strcmp(argv[i], "UNV") || !strcmp(argv[i], "ideas")) {
CTX.mesh.format = FORMAT_UNV;
else if(!strcmp(argv[i], "gref") ||
!strcmp(argv[i], "GREF") || !strcmp(argv[i], "Gref")) {
CTX.mesh.format = FORMAT_GREF;
fprintf(stderr, ERROR_STR "Unknown mesh format\n");
exit(1);
}
i++;
}
fprintf(stderr, ERROR_STR "Missing format\n");
exit(1);
}
}
if(argv[i] != NULL) {
if(!strncmp(argv[i], "iso", 3))
CTX.mesh.algo = DELAUNAY_ISO;
else if(!strncmp(argv[i], "tri", 3))
CTX.mesh.algo = DELAUNAY_SHEWCHUK;
else if(!strncmp(argv[i], "aniso", 5))
CTX.mesh.algo = DELAUNAY_ANISO;
else {
fprintf(stderr, ERROR_STR "Unknown mesh algorithm\n");
exit(1);
}
i++;
}
fprintf(stderr, ERROR_STR "Missing algorithm\n");
exit(1);
}
}
else if(!strcmp(argv[i] + 1, "version") ||
!strcmp(argv[i] + 1, "-version")) {
fprintf(stderr, "%d.%d.%d\n", GMSH_MAJOR_VERSION, GMSH_MINOR_VERSION,
GMSH_PATCH_VERSION);
else if(!strcmp(argv[i] + 1, "info") || !strcmp(argv[i] + 1, "-info")) {
fprintf(stderr, "%s%d.%d.%d\n", gmsh_version, GMSH_MAJOR_VERSION,
GMSH_MINOR_VERSION, GMSH_PATCH_VERSION);
fprintf(stderr, "%sFLTK %d.%d.%d\n", gmsh_gui, FL_MAJOR_VERSION,
FL_MINOR_VERSION, FL_PATCH_VERSION);
#else
fprintf(stderr, "%snone\n", gmsh_gui);
#endif
fprintf(stderr, "%s\n", gmsh_license);
fprintf(stderr, "%s\n", gmsh_os);
fprintf(stderr, "%s%s\n", gmsh_options, Get_BuildOptions());
fprintf(stderr, "%s\n", gmsh_date);
fprintf(stderr, "%s\n", gmsh_host);
fprintf(stderr, "%s\n", gmsh_packager);
fprintf(stderr, "%s\n", gmsh_url);
fprintf(stderr, "%s\n", gmsh_email);
else if(!strcmp(argv[i] + 1, "help") || !strcmp(argv[i] + 1, "-help")) {
fprintf(stderr, "%s\n", gmsh_progname);
fprintf(stderr, "%s\n", gmsh_copyright);
Print_Usage(argv[0]);
exit(1);
}
if(argv[i] != NULL)
CTX.verbosity = atoi(argv[i++]);
else {
fprintf(stderr, ERROR_STR "Missing number\n");
exit(1);
}
}
else if(!strcmp(argv[i] + 1, "noterm")) {
CTX.terminal = 0;
i++;
else if(!strcmp(argv[i] + 1, "term")) {
CTX.terminal = 1;
i++;
else if(!strcmp(argv[i] + 1, "alpha")) {
CTX.alpha = 1;
i++;
else if(!strcmp(argv[i] + 1, "notrack")) {
CTX.useTrackball = 0;
i++;
else if(!strcmp(argv[i] + 1, "dual")) {
CTX.mesh.dual = 1;
i++;
else if(!strcmp(argv[i] + 1, "interactive")) {
CTX.mesh.interactive = 1;
i++;
else if(!strcmp(argv[i] + 1, "noview")) {
opt_view_visible(0, GMSH_SET, 0);
i++;
else if(!strcmp(argv[i] + 1, "plugin")) {
opt_general_default_plugins(0, GMSH_SET, 1);
i++;
else if(!strcmp(argv[i] + 1, "noplugin")) {
opt_general_default_plugins(0, GMSH_SET, 0);
i++;
else if(!strcmp(argv[i] + 1, "link")) {
i++;
if(argv[i] != NULL)
CTX.post.link = atoi(argv[i++]);
else {
fprintf(stderr, ERROR_STR "Missing number\n");
exit(1);
}
}
else if(!strcmp(argv[i] + 1, "fill")) {
opt_view_intervals_type(0, GMSH_SET, DRAW_POST_CONTINUOUS);
i++;
else if(!strcmp(argv[i] + 1, "smoothview")) {
CTX.post.smooth = 1;
i++;
else if(!strcmp(argv[i] + 1, "nbiso")) {
i++;
if(argv[i] != NULL)
opt_view_nb_iso(0, GMSH_SET, atoi(argv[i++]));
else {
fprintf(stderr, ERROR_STR "Missing number\n");
exit(1);
}
}
else if(!strcmp(argv[i] + 1, "command") || !strcmp(argv[i] + 1, "c")) {
CTX.command_win = 1;
i++;
else if(!strcmp(argv[i] + 1, "nocommand") ||
!strcmp(argv[i] + 1, "noc")) {
CTX.command_win = 0;
i++;
else if(!strcmp(argv[i] + 1, "overlay") || !strcmp(argv[i] + 1, "ov")) {
CTX.overlay = 1;
i++;
else if(!strcmp(argv[i] + 1, "nooverlay") ||
!strcmp(argv[i] + 1, "noov")) {
CTX.overlay = CTX.geom.highlight = 0;
i++;
else if(!strcmp(argv[i] + 1, "hh")) {
CTX.overlay = 0;
CTX.geom.highlight = 1;
i++;
else if(!strcmp(argv[i] + 1, "perspective") ||
!strcmp(argv[i] + 1, "p")) {
CTX.ortho = 0;
i++;
else if(!strcmp(argv[i] + 1, "ortho") || !strcmp(argv[i] + 1, "o")) {
CTX.ortho = 0;
i++;
else if(!strcmp(argv[i] + 1, "threads")) {
CTX.threads = 1;
i++;
else if(!strcmp(argv[i] + 1, "nothreads")) {
CTX.threads = 0;
i++;
else if(!strcmp(argv[i] + 1, "nodb")) {
CTX.db = 0;
CTX.geom.highlight = 0;
i++;
else if(!strcmp(argv[i] + 1, "dl")) {
CTX.post.display_lists = 1;
i++;
else if(!strcmp(argv[i] + 1, "nodl")) {
CTX.post.display_lists = 0;
i++;
fprintf(stderr, ERROR_STR "Missing number\n");
exit(1);
}
}
fprintf(stderr, ERROR_STR "Missing argument\n");
exit(1);
}
}
fprintf(stderr, ERROR_STR "Missing argument\n");
exit(1);
}
}
// The Mac Finder launches programs with special command line
// arguments: just ignore them (and don't exit!)
fprintf(stderr, "Unknown option '%s'\n", argv[i]);
fprintf(stderr, "Unknown option '%s'\n", argv[i]);
Print_Usage(argv[0]);
exit(1);
}
}
else {
if(*nbfiles < MAX_OPEN_FILES)