You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
372 lines
9.7 KiB
372 lines
9.7 KiB
2 years ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: $RCSfile: vtkTkAppInit.cxx,v $
|
||
|
|
||
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
||
|
All rights reserved.
|
||
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
||
|
|
||
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
||
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||
|
PURPOSE. See the above copyright notice for more information.
|
||
|
|
||
|
=========================================================================*/
|
||
|
/*
|
||
|
* tkAppInit.c --
|
||
|
*
|
||
|
* Provides a default version of the Tcl_AppInit procedure for
|
||
|
* use in wish and similar Tk-based applications.
|
||
|
*
|
||
|
* Copyright (c) 1993 The Regents of the University of California.
|
||
|
* Copyright (c) 1994 Sun Microsystems, Inc.
|
||
|
*
|
||
|
* See the file "license.terms" for information on usage and redistribution
|
||
|
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||
|
*/
|
||
|
|
||
|
#ifdef VTK_COMPILED_USING_MPI
|
||
|
# include <mpi.h>
|
||
|
# include "vtkMPIController.h"
|
||
|
#endif // VTK_COMPILED_USING_MPI
|
||
|
|
||
|
#include "vtkConfigure.h"
|
||
|
#include "vtkSystemIncludes.h"
|
||
|
#include "vtkToolkits.h"
|
||
|
#include "Wrapping/Tcl/vtkTkAppInitConfigure.h"
|
||
|
|
||
|
#ifdef VTK_TCL_TK_COPY_SUPPORT_LIBRARY
|
||
|
#include <sys/stat.h>
|
||
|
#endif
|
||
|
|
||
|
#ifdef VTK_USE_TK
|
||
|
# include "vtkTk.h"
|
||
|
#else
|
||
|
# include "vtkTcl.h"
|
||
|
#endif
|
||
|
|
||
|
/*
|
||
|
* Make sure all the kits register their classes with vtkInstantiator.
|
||
|
*/
|
||
|
#include "vtkCommonInstantiator.h"
|
||
|
#include "vtkFilteringInstantiator.h"
|
||
|
#include "vtkIOInstantiator.h"
|
||
|
#include "vtkImagingInstantiator.h"
|
||
|
#include "vtkGraphicsInstantiator.h"
|
||
|
|
||
|
#ifdef VTK_USE_RENDERING
|
||
|
#include "vtkRenderingInstantiator.h"
|
||
|
#include "vtkVolumeRenderingInstantiator.h"
|
||
|
#include "vtkHybridInstantiator.h"
|
||
|
#include "vtkWidgetsInstantiator.h"
|
||
|
#endif
|
||
|
|
||
|
#ifdef VTK_USE_PARALLEL
|
||
|
#include "vtkParallelInstantiator.h"
|
||
|
#endif
|
||
|
|
||
|
#include "vtkTclUtil.h"
|
||
|
|
||
|
static void vtkTkAppInitEnableMSVCDebugHook();
|
||
|
|
||
|
// I need those two Tcl functions. They usually are declared in tclIntDecls.h,
|
||
|
// but Unix build do not have access to VTK's tkInternals include path.
|
||
|
// Since the signature has not changed for years (at least since 8.2),
|
||
|
// let's just prototype them.
|
||
|
|
||
|
EXTERN Tcl_Obj* TclGetLibraryPath _ANSI_ARGS_((void));
|
||
|
EXTERN void TclSetLibraryPath _ANSI_ARGS_((Tcl_Obj * pathPtr));
|
||
|
|
||
|
/*
|
||
|
*----------------------------------------------------------------------
|
||
|
*
|
||
|
* main --
|
||
|
*
|
||
|
* This is the main program for the application.
|
||
|
*
|
||
|
* Results:
|
||
|
* None: Tk_Main never returns here, so this procedure never
|
||
|
* returns either.
|
||
|
*
|
||
|
* Side effects:
|
||
|
* Whatever the application does.
|
||
|
*
|
||
|
*----------------------------------------------------------------------
|
||
|
*/
|
||
|
#ifdef VTK_COMPILED_USING_MPI
|
||
|
class vtkMPICleanup {
|
||
|
public:
|
||
|
vtkMPICleanup()
|
||
|
{
|
||
|
this->Controller = 0;
|
||
|
}
|
||
|
void Initialize(int *argc, char ***argv)
|
||
|
{
|
||
|
MPI_Init(argc, argv);
|
||
|
this->Controller = vtkMPIController::New();
|
||
|
this->Controller->Initialize(argc, argv, 1);
|
||
|
vtkMultiProcessController::SetGlobalController(this->Controller);
|
||
|
}
|
||
|
~vtkMPICleanup()
|
||
|
{
|
||
|
if ( this->Controller )
|
||
|
{
|
||
|
this->Controller->Finalize();
|
||
|
this->Controller->Delete();
|
||
|
}
|
||
|
}
|
||
|
private:
|
||
|
vtkMPIController *Controller;
|
||
|
};
|
||
|
|
||
|
static vtkMPICleanup VTKMPICleanup;
|
||
|
|
||
|
#endif // VTK_COMPILED_USING_MPI
|
||
|
|
||
|
int
|
||
|
main(int argc, char **argv)
|
||
|
{
|
||
|
ios::sync_with_stdio();
|
||
|
vtkTkAppInitEnableMSVCDebugHook();
|
||
|
|
||
|
#ifdef VTK_COMPILED_USING_MPI
|
||
|
VTKMPICleanup.Initialize(&argc, &argv);
|
||
|
#endif // VTK_COMPILED_USING_MPI
|
||
|
|
||
|
// This is mandatory *now*, it does more than just finding the executable
|
||
|
// (like finding the encodings, setting variables depending on the value
|
||
|
// of TCL_LIBRARY, TK_LIBRARY
|
||
|
|
||
|
vtkTclApplicationInitExecutable(argc, argv);
|
||
|
|
||
|
#ifdef VTK_USE_TK
|
||
|
Tk_Main(argc, argv, Tcl_AppInit);
|
||
|
#else
|
||
|
Tcl_Main(argc, argv, Tcl_AppInit);
|
||
|
#endif
|
||
|
|
||
|
return 0; /* Needed only to prevent compiler warning. */
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
*----------------------------------------------------------------------
|
||
|
*
|
||
|
* Tcl_AppInit --
|
||
|
*
|
||
|
* This procedure performs application-specific initialization.
|
||
|
* Most applications, especially those that incorporate additional
|
||
|
* packages, will have their own version of this procedure.
|
||
|
*
|
||
|
* Results:
|
||
|
* Returns a standard Tcl completion code, and leaves an error
|
||
|
* message in interp->result if an error occurs.
|
||
|
*
|
||
|
* Side effects:
|
||
|
* Depends on the startup script.
|
||
|
*
|
||
|
*----------------------------------------------------------------------
|
||
|
*/
|
||
|
|
||
|
extern "C" int Vtkcommontcl_Init(Tcl_Interp *interp);
|
||
|
extern "C" int Vtkfilteringtcl_Init(Tcl_Interp *interp);
|
||
|
extern "C" int Vtkimagingtcl_Init(Tcl_Interp *interp);
|
||
|
extern "C" int Vtkgraphicstcl_Init(Tcl_Interp *interp);
|
||
|
extern "C" int Vtkiotcl_Init(Tcl_Interp *interp);
|
||
|
|
||
|
#ifdef VTK_USE_RENDERING
|
||
|
extern "C" int Vtkrenderingtcl_Init(Tcl_Interp *interp);
|
||
|
|
||
|
#if defined(VTK_USE_TK)
|
||
|
extern "C" int Vtktkrenderwidget_Init(Tcl_Interp *interp);
|
||
|
extern "C" int Vtktkimageviewerwidget_Init(Tcl_Interp *interp);
|
||
|
#endif
|
||
|
|
||
|
extern "C" int Vtkvolumerenderingtcl_Init(Tcl_Interp *interp);
|
||
|
extern "C" int Vtkhybridtcl_Init(Tcl_Interp *interp);
|
||
|
extern "C" int Vtkwidgetstcl_Init(Tcl_Interp *interp);
|
||
|
#endif
|
||
|
|
||
|
#ifdef VTK_USE_PARALLEL
|
||
|
extern "C" int Vtkparalleltcl_Init(Tcl_Interp *interp);
|
||
|
#endif
|
||
|
|
||
|
void help()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
int Tcl_AppInit(Tcl_Interp *interp)
|
||
|
{
|
||
|
#ifdef __CYGWIN__
|
||
|
Tcl_SetVar(interp, "tclDefaultLibrary", "/usr/share/tcl" TCL_VERSION, TCL_GLOBAL_ONLY);
|
||
|
#endif
|
||
|
|
||
|
// Help Tcl find the Tcl/Tk helper files.
|
||
|
const char* relative_dirs[] =
|
||
|
{
|
||
|
"TclTk/lib",
|
||
|
".." VTK_INSTALL_TCL_DIR,
|
||
|
0
|
||
|
};
|
||
|
vtkTclApplicationInitTclTk(interp, relative_dirs);
|
||
|
|
||
|
if (Tcl_Init(interp) == TCL_ERROR)
|
||
|
{
|
||
|
return TCL_ERROR;
|
||
|
}
|
||
|
|
||
|
#ifdef VTK_USE_TK
|
||
|
if (Tk_Init(interp) == TCL_ERROR)
|
||
|
{
|
||
|
return TCL_ERROR;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/* init the core vtk stuff */
|
||
|
if (Vtkcommontcl_Init(interp) == TCL_ERROR)
|
||
|
{
|
||
|
return TCL_ERROR;
|
||
|
}
|
||
|
if (Vtkfilteringtcl_Init(interp) == TCL_ERROR)
|
||
|
{
|
||
|
return TCL_ERROR;
|
||
|
}
|
||
|
if (Vtkimagingtcl_Init(interp) == TCL_ERROR)
|
||
|
{
|
||
|
return TCL_ERROR;
|
||
|
}
|
||
|
if (Vtkgraphicstcl_Init(interp) == TCL_ERROR)
|
||
|
{
|
||
|
return TCL_ERROR;
|
||
|
}
|
||
|
if (Vtkiotcl_Init(interp) == TCL_ERROR)
|
||
|
{
|
||
|
return TCL_ERROR;
|
||
|
}
|
||
|
|
||
|
#ifdef VTK_USE_RENDERING
|
||
|
if (Vtkrenderingtcl_Init(interp) == TCL_ERROR)
|
||
|
{
|
||
|
return TCL_ERROR;
|
||
|
}
|
||
|
|
||
|
#if defined(VTK_USE_TK)
|
||
|
if (Vtktkrenderwidget_Init(interp) == TCL_ERROR)
|
||
|
{
|
||
|
return TCL_ERROR;
|
||
|
}
|
||
|
if (Vtktkimageviewerwidget_Init(interp) == TCL_ERROR)
|
||
|
{
|
||
|
return TCL_ERROR;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
if (Vtkvolumerenderingtcl_Init(interp) == TCL_ERROR)
|
||
|
{
|
||
|
return TCL_ERROR;
|
||
|
}
|
||
|
|
||
|
if (Vtkhybridtcl_Init(interp) == TCL_ERROR)
|
||
|
{
|
||
|
return TCL_ERROR;
|
||
|
}
|
||
|
|
||
|
if (Vtkwidgetstcl_Init(interp) == TCL_ERROR)
|
||
|
{
|
||
|
return TCL_ERROR;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef VTK_USE_PARALLEL
|
||
|
if (Vtkparalleltcl_Init(interp) == TCL_ERROR)
|
||
|
{
|
||
|
return TCL_ERROR;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef VTK_EXTRA_TCL_INIT
|
||
|
VTK_EXTRA_TCL_INIT;
|
||
|
#endif
|
||
|
|
||
|
/*
|
||
|
* Append path to VTK packages to auto_path
|
||
|
*/
|
||
|
static char script[] =
|
||
|
"foreach dir [list "
|
||
|
#if defined(CMAKE_INTDIR)
|
||
|
" [file join [file dirname [file dirname [file dirname [info nameofexecutable]]]] Wrapping Tcl " CMAKE_INTDIR "]"
|
||
|
#else
|
||
|
" [file join [file dirname [file dirname [info nameofexecutable]]] Wrapping Tcl]"
|
||
|
#endif
|
||
|
" ] {\n"
|
||
|
" if {[file isdirectory \"$dir\"]} {\n"
|
||
|
" lappend auto_path $dir\n"
|
||
|
" }\n"
|
||
|
"}\n"
|
||
|
"rename package package.orig\n"
|
||
|
"proc package {args} {\n"
|
||
|
" if {[catch {set package_res [eval package.orig $args]} catch_res]} {\n"
|
||
|
" global errorInfo env\n"
|
||
|
" if {[lindex $args 0] == \"require\"} {\n"
|
||
|
" set expecting {can\'t find package vtk}\n"
|
||
|
" if {![string compare -length [string length $expecting] $catch_res $expecting]} {\n"
|
||
|
" set msg {The Tcl interpreter was probably not able to find the"
|
||
|
" VTK packages. Please check that your TCLLIBPATH environment variable"
|
||
|
" includes the path to your VTK Tcl directory. You might find it under"
|
||
|
" your VTK binary directory in Wrapping/Tcl, or under your"
|
||
|
" site-specific installation directory.}\n"
|
||
|
" if {[info exists env(TCLLIBPATH)]} {\n"
|
||
|
" append msg \" The TCLLIBPATH current value is: $env(TCLLIBPATH).\"\n"
|
||
|
" }\n"
|
||
|
" set errorInfo \"$msg The TCLLIBPATH variable is a set of"
|
||
|
" space separated paths (hence, path containing spaces should be"
|
||
|
" surrounded by quotes first). Windows users should use forward"
|
||
|
" (Unix-style) slashes \'/\' instead of the usual backward slashes. "
|
||
|
" More informations can be found in the Wrapping/Tcl/README source"
|
||
|
" file (also available online at"
|
||
|
" http://www.vtk.org/cgi-bin/cvsweb.cgi/~checkout~/VTK/Wrapping/Tcl/README).\n"
|
||
|
"$errorInfo\"\n"
|
||
|
" }\n"
|
||
|
" }\n"
|
||
|
" error $catch_res $errorInfo\n"
|
||
|
" }\n"
|
||
|
" return $package_res\n"
|
||
|
"}\n";
|
||
|
Tcl_Eval(interp, script);
|
||
|
|
||
|
/*
|
||
|
* Specify a user-specific startup file to invoke if the application
|
||
|
* is run interactively. Typically the startup file is "~/.apprc"
|
||
|
* where "app" is the name of the application. If this line is deleted
|
||
|
* then no user-specific startup file will be run under any conditions.
|
||
|
*/
|
||
|
|
||
|
Tcl_SetVar(interp,
|
||
|
(char *) "tcl_rcFileName",
|
||
|
(char *) "~/.vtkrc",
|
||
|
TCL_GLOBAL_ONLY);
|
||
|
return TCL_OK;
|
||
|
}
|
||
|
|
||
|
// For a DEBUG build on MSVC, add a hook to prevent error dialogs when
|
||
|
// being run from DART.
|
||
|
#if defined(_MSC_VER) && defined(_DEBUG)
|
||
|
# include <crtdbg.h>
|
||
|
static int vtkTkAppInitDebugReport(int, char* message, int*)
|
||
|
{
|
||
|
fprintf(stderr, message);
|
||
|
exit(1);
|
||
|
}
|
||
|
void vtkTkAppInitEnableMSVCDebugHook()
|
||
|
{
|
||
|
if(getenv("DART_TEST_FROM_DART"))
|
||
|
{
|
||
|
_CrtSetReportHook(vtkTkAppInitDebugReport);
|
||
|
}
|
||
|
}
|
||
|
#else
|
||
|
void vtkTkAppInitEnableMSVCDebugHook()
|
||
|
{
|
||
|
}
|
||
|
#endif
|